Skip to content

Commit

Permalink
IB/ehca: Use common error code mapping instead of specific ones
Browse files Browse the repository at this point in the history
Instead of one error mapping function for each potential error source
in ehca_mrmw.c, use a centralized function that handles all cases,
saving a three-figure line count.

Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
  • Loading branch information
Hoang-Nam Nguyen authored and Roland Dreier committed Jul 18, 2007
1 parent 3df78f8 commit a1a6ff1
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 197 deletions.
195 changes: 12 additions & 183 deletions drivers/infiniband/hw/ehca/ehca_mrmw.c
Original file line number Diff line number Diff line change
Expand Up @@ -537,7 +537,7 @@ int ehca_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr)
"hca_hndl=%lx mr_hndl=%lx lkey=%x",
h_ret, mr, shca->ipz_hca_handle.handle,
e_mr->ipz_mr_handle.handle, mr->lkey);
ret = ehca_mrmw_map_hrc_query_mr(h_ret);
ret = ehca2ib_return_code(h_ret);
goto query_mr_exit1;
}
mr_attr->pd = mr->pd;
Expand Down Expand Up @@ -597,7 +597,7 @@ int ehca_dereg_mr(struct ib_mr *mr)
"e_mr=%p hca_hndl=%lx mr_hndl=%lx mr->lkey=%x",
h_ret, shca, e_mr, shca->ipz_hca_handle.handle,
e_mr->ipz_mr_handle.handle, mr->lkey);
ret = ehca_mrmw_map_hrc_free_mr(h_ret);
ret = ehca2ib_return_code(h_ret);
goto dereg_mr_exit0;
}

Expand Down Expand Up @@ -637,7 +637,7 @@ struct ib_mw *ehca_alloc_mw(struct ib_pd *pd)
ehca_err(pd->device, "hipz_mw_allocate failed, h_ret=%lx "
"shca=%p hca_hndl=%lx mw=%p",
h_ret, shca, shca->ipz_hca_handle.handle, e_mw);
ib_mw = ERR_PTR(ehca_mrmw_map_hrc_alloc(h_ret));
ib_mw = ERR_PTR(ehca2ib_return_code(h_ret));
goto alloc_mw_exit1;
}
/* successful MW allocation */
Expand Down Expand Up @@ -680,7 +680,7 @@ int ehca_dealloc_mw(struct ib_mw *mw)
"mw=%p rkey=%x hca_hndl=%lx mw_hndl=%lx",
h_ret, shca, mw, mw->rkey, shca->ipz_hca_handle.handle,
e_mw->ipz_mw_handle.handle);
return ehca_mrmw_map_hrc_free_mw(h_ret);
return ehca2ib_return_code(h_ret);
}
/* successful deallocation */
ehca_mw_delete(e_mw);
Expand Down Expand Up @@ -923,7 +923,7 @@ int ehca_dealloc_fmr(struct ib_fmr *fmr)
"hca_hndl=%lx fmr_hndl=%lx fmr->lkey=%x",
h_ret, e_fmr, shca->ipz_hca_handle.handle,
e_fmr->ipz_mr_handle.handle, fmr->lkey);
ret = ehca_mrmw_map_hrc_free_mr(h_ret);
ret = ehca2ib_return_code(h_ret);
goto free_fmr_exit0;
}
/* successful deregistration */
Expand Down Expand Up @@ -964,7 +964,7 @@ int ehca_reg_mr(struct ehca_shca *shca,
if (h_ret != H_SUCCESS) {
ehca_err(&shca->ib_device, "hipz_alloc_mr failed, h_ret=%lx "
"hca_hndl=%lx", h_ret, shca->ipz_hca_handle.handle);
ret = ehca_mrmw_map_hrc_alloc(h_ret);
ret = ehca2ib_return_code(h_ret);
goto ehca_reg_mr_exit0;
}

Expand Down Expand Up @@ -1079,7 +1079,7 @@ int ehca_reg_mr_rpages(struct ehca_shca *shca,
shca->ipz_hca_handle.handle,
e_mr->ipz_mr_handle.handle,
e_mr->ib.ib_mr.lkey);
ret = ehca_mrmw_map_hrc_rrpg_last(h_ret);
ret = ehca2ib_return_code(h_ret);
break;
} else
ret = 0;
Expand All @@ -1090,7 +1090,7 @@ int ehca_reg_mr_rpages(struct ehca_shca *shca,
e_mr->ib.ib_mr.lkey,
shca->ipz_hca_handle.handle,
e_mr->ipz_mr_handle.handle);
ret = ehca_mrmw_map_hrc_rrpg_notlast(h_ret);
ret = ehca2ib_return_code(h_ret);
break;
} else
ret = 0;
Expand Down Expand Up @@ -1254,7 +1254,7 @@ int ehca_rereg_mr(struct ehca_shca *shca,
h_ret, e_mr, shca->ipz_hca_handle.handle,
e_mr->ipz_mr_handle.handle,
e_mr->ib.ib_mr.lkey);
ret = ehca_mrmw_map_hrc_free_mr(h_ret);
ret = ehca2ib_return_code(h_ret);
goto ehca_rereg_mr_exit0;
}
/* clean ehca_mr_t, without changing struct ib_mr and lock */
Expand Down Expand Up @@ -1351,7 +1351,7 @@ int ehca_unmap_one_fmr(struct ehca_shca *shca,
h_ret, e_fmr, shca->ipz_hca_handle.handle,
e_fmr->ipz_mr_handle.handle,
e_fmr->ib.ib_fmr.lkey);
ret = ehca_mrmw_map_hrc_free_mr(h_ret);
ret = ehca2ib_return_code(h_ret);
goto ehca_unmap_one_fmr_exit0;
}
/* clean ehca_mr_t, without changing lock */
Expand Down Expand Up @@ -1420,7 +1420,7 @@ int ehca_reg_smr(struct ehca_shca *shca,
shca->ipz_hca_handle.handle,
e_origmr->ipz_mr_handle.handle,
e_origmr->ib.ib_mr.lkey);
ret = ehca_mrmw_map_hrc_reg_smr(h_ret);
ret = ehca2ib_return_code(h_ret);
goto ehca_reg_smr_exit0;
}
/* successful registration */
Expand Down Expand Up @@ -1539,7 +1539,7 @@ int ehca_reg_maxmr(struct ehca_shca *shca,
h_ret, e_origmr, shca->ipz_hca_handle.handle,
e_origmr->ipz_mr_handle.handle,
e_origmr->ib.ib_mr.lkey);
return ehca_mrmw_map_hrc_reg_smr(h_ret);
return ehca2ib_return_code(h_ret);
}
/* successful registration */
e_newmr->num_pages = e_origmr->num_pages;
Expand Down Expand Up @@ -2040,177 +2040,6 @@ void ehca_mrmw_reverse_map_acl(const u32 *hipz_acl,
} /* end ehca_mrmw_reverse_map_acl() */


/*----------------------------------------------------------------------*/

/*
* map HIPZ rc to IB retcodes for MR/MW allocations
* Used for hipz_mr_reg_alloc and hipz_mw_alloc.
*/
int ehca_mrmw_map_hrc_alloc(const u64 hipz_rc)
{
switch (hipz_rc) {
case H_SUCCESS: /* successful completion */
return 0;
case H_NOT_ENOUGH_RESOURCES: /* insufficient resources */
case H_CONSTRAINED: /* resource constraint */
case H_NO_MEM:
return -ENOMEM;
case H_BUSY: /* long busy */
return -EBUSY;
default:
return -EINVAL;
}
} /* end ehca_mrmw_map_hrc_alloc() */

/*----------------------------------------------------------------------*/

/*
* map HIPZ rc to IB retcodes for MR register rpage
* Used for hipz_h_register_rpage_mr at registering last page
*/
int ehca_mrmw_map_hrc_rrpg_last(const u64 hipz_rc)
{
switch (hipz_rc) {
case H_SUCCESS: /* registration complete */
return 0;
case H_PAGE_REGISTERED: /* page registered */
case H_ADAPTER_PARM: /* invalid adapter handle */
case H_RH_PARM: /* invalid resource handle */
/* case H_QT_PARM: invalid queue type */
case H_PARAMETER: /*
* invalid logical address,
* or count zero or greater 512
*/
case H_TABLE_FULL: /* page table full */
case H_HARDWARE: /* HCA not operational */
return -EINVAL;
case H_BUSY: /* long busy */
return -EBUSY;
default:
return -EINVAL;
}
} /* end ehca_mrmw_map_hrc_rrpg_last() */

/*----------------------------------------------------------------------*/

/*
* map HIPZ rc to IB retcodes for MR register rpage
* Used for hipz_h_register_rpage_mr at registering one page, but not last page
*/
int ehca_mrmw_map_hrc_rrpg_notlast(const u64 hipz_rc)
{
switch (hipz_rc) {
case H_PAGE_REGISTERED: /* page registered */
return 0;
case H_SUCCESS: /* registration complete */
case H_ADAPTER_PARM: /* invalid adapter handle */
case H_RH_PARM: /* invalid resource handle */
/* case H_QT_PARM: invalid queue type */
case H_PARAMETER: /*
* invalid logical address,
* or count zero or greater 512
*/
case H_TABLE_FULL: /* page table full */
case H_HARDWARE: /* HCA not operational */
return -EINVAL;
case H_BUSY: /* long busy */
return -EBUSY;
default:
return -EINVAL;
}
} /* end ehca_mrmw_map_hrc_rrpg_notlast() */

/*----------------------------------------------------------------------*/

/* map HIPZ rc to IB retcodes for MR query. Used for hipz_mr_query. */
int ehca_mrmw_map_hrc_query_mr(const u64 hipz_rc)
{
switch (hipz_rc) {
case H_SUCCESS: /* successful completion */
return 0;
case H_ADAPTER_PARM: /* invalid adapter handle */
case H_RH_PARM: /* invalid resource handle */
return -EINVAL;
case H_BUSY: /* long busy */
return -EBUSY;
default:
return -EINVAL;
}
} /* end ehca_mrmw_map_hrc_query_mr() */

/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/

/*
* map HIPZ rc to IB retcodes for freeing MR resource
* Used for hipz_h_free_resource_mr
*/
int ehca_mrmw_map_hrc_free_mr(const u64 hipz_rc)
{
switch (hipz_rc) {
case H_SUCCESS: /* resource freed */
return 0;
case H_ADAPTER_PARM: /* invalid adapter handle */
case H_RH_PARM: /* invalid resource handle */
case H_R_STATE: /* invalid resource state */
case H_HARDWARE: /* HCA not operational */
return -EINVAL;
case H_RESOURCE: /* Resource in use */
case H_BUSY: /* long busy */
return -EBUSY;
default:
return -EINVAL;
}
} /* end ehca_mrmw_map_hrc_free_mr() */

/*----------------------------------------------------------------------*/

/*
* map HIPZ rc to IB retcodes for freeing MW resource
* Used for hipz_h_free_resource_mw
*/
int ehca_mrmw_map_hrc_free_mw(const u64 hipz_rc)
{
switch (hipz_rc) {
case H_SUCCESS: /* resource freed */
return 0;
case H_ADAPTER_PARM: /* invalid adapter handle */
case H_RH_PARM: /* invalid resource handle */
case H_R_STATE: /* invalid resource state */
case H_HARDWARE: /* HCA not operational */
return -EINVAL;
case H_RESOURCE: /* Resource in use */
case H_BUSY: /* long busy */
return -EBUSY;
default:
return -EINVAL;
}
} /* end ehca_mrmw_map_hrc_free_mw() */

/*----------------------------------------------------------------------*/

/*
* map HIPZ rc to IB retcodes for SMR registrations
* Used for hipz_h_register_smr.
*/
int ehca_mrmw_map_hrc_reg_smr(const u64 hipz_rc)
{
switch (hipz_rc) {
case H_SUCCESS: /* successful completion */
return 0;
case H_ADAPTER_PARM: /* invalid adapter handle */
case H_RH_PARM: /* invalid resource handle */
case H_MEM_PARM: /* invalid MR virtual address */
case H_MEM_ACCESS_PARM: /* invalid access controls */
case H_NOT_ENOUGH_RESOURCES: /* insufficient resources */
return -EINVAL;
case H_BUSY: /* long busy */
return -EBUSY;
default:
return -EINVAL;
}
} /* end ehca_mrmw_map_hrc_reg_smr() */

/*----------------------------------------------------------------------*/

/*
Expand Down
14 changes: 0 additions & 14 deletions drivers/infiniband/hw/ehca/ehca_mrmw.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,20 +121,6 @@ void ehca_mrmw_set_pgsize_hipz_acl(u32 *hipz_acl);
void ehca_mrmw_reverse_map_acl(const u32 *hipz_acl,
int *ib_acl);

int ehca_mrmw_map_hrc_alloc(const u64 hipz_rc);

int ehca_mrmw_map_hrc_rrpg_last(const u64 hipz_rc);

int ehca_mrmw_map_hrc_rrpg_notlast(const u64 hipz_rc);

int ehca_mrmw_map_hrc_query_mr(const u64 hipz_rc);

int ehca_mrmw_map_hrc_free_mr(const u64 hipz_rc);

int ehca_mrmw_map_hrc_free_mw(const u64 hipz_rc);

int ehca_mrmw_map_hrc_reg_smr(const u64 hipz_rc);

void ehca_mr_deletenew(struct ehca_mr *mr);

#endif /*_EHCA_MRMW_H_*/
3 changes: 3 additions & 0 deletions drivers/infiniband/hw/ehca/ehca_tools.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,11 @@ static inline int ehca2ib_return_code(u64 ehca_rc)
switch (ehca_rc) {
case H_SUCCESS:
return 0;
case H_RESOURCE: /* Resource in use */
case H_BUSY:
return -EBUSY;
case H_NOT_ENOUGH_RESOURCES: /* insufficient resources */
case H_CONSTRAINED: /* resource constraint */
case H_NO_MEM:
return -ENOMEM;
default:
Expand Down

0 comments on commit a1a6ff1

Please sign in to comment.