Skip to content

Commit

Permalink
IB/ehca: Fix ehca_encode_hwpage_size() and alloc_fmr()
Browse files Browse the repository at this point in the history
Simplify ehca_encode_hwpage_size(), fixing an infinite loop for pgsize == 0
in the process. Fix the bug in alloc_fmr() that triggered the loop.

Signed-off-by: Joachim Fenkes <[email protected]>
Signed-off-by: Roland Dreier <[email protected]>
  • Loading branch information
fenkes-ibm authored and Roland Dreier committed Oct 18, 2007
1 parent 9511724 commit 8c08d50
Showing 1 changed file with 4 additions and 11 deletions.
15 changes: 4 additions & 11 deletions drivers/infiniband/hw/ehca/ehca_mrmw.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,17 +72,9 @@ enum ehca_mr_pgsize {

static u32 ehca_encode_hwpage_size(u32 pgsize)
{
u32 idx = 0;
pgsize >>= 12;
/*
* map mr page size into hw code:
* 0, 1, 2, 3 for 4K, 64K, 1M, 64M
*/
while (!(pgsize & 1)) {
idx++;
pgsize >>= 4;
}
return idx;
int log = ilog2(pgsize);
WARN_ON(log < 12 || log > 24 || log & 3);
return (log - 12) / 4;
}

static u64 ehca_get_max_hwpage_size(struct ehca_shca *shca)
Expand Down Expand Up @@ -826,6 +818,7 @@ struct ib_fmr *ehca_alloc_fmr(struct ib_pd *pd,

/* register MR on HCA */
memset(&pginfo, 0, sizeof(pginfo));
pginfo.hwpage_size = hw_pgsize;
/*
* pginfo.num_hwpages==0, ie register_rpages() will not be called
* but deferred to map_phys_fmr()
Expand Down

0 comments on commit 8c08d50

Please sign in to comment.