diff options
author | Joachim Fenkes <fenkes@de.ibm.com> | 2007-10-16 11:26:54 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2007-10-18 00:46:37 -0400 |
commit | 8c08d50d4fc52a9367c356ebbeb194c30fbc7ac8 (patch) | |
tree | eb1f102cd3a99b3f91b8923996a24f42e165543c /drivers/infiniband/hw | |
parent | 9511724da9c090da5a6dcf6c557b1cedc4f5cfd7 (diff) |
IB/ehca: Fix ehca_encode_hwpage_size() and alloc_fmr()
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 <fenkes@de.ibm.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r-- | drivers/infiniband/hw/ehca/ehca_mrmw.c | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/drivers/infiniband/hw/ehca/ehca_mrmw.c b/drivers/infiniband/hw/ehca/ehca_mrmw.c index 16c9efd8eeac..b9a788c4fdd1 100644 --- a/drivers/infiniband/hw/ehca/ehca_mrmw.c +++ b/drivers/infiniband/hw/ehca/ehca_mrmw.c | |||
@@ -72,17 +72,9 @@ enum ehca_mr_pgsize { | |||
72 | 72 | ||
73 | static u32 ehca_encode_hwpage_size(u32 pgsize) | 73 | static u32 ehca_encode_hwpage_size(u32 pgsize) |
74 | { | 74 | { |
75 | u32 idx = 0; | 75 | int log = ilog2(pgsize); |
76 | pgsize >>= 12; | 76 | WARN_ON(log < 12 || log > 24 || log & 3); |
77 | /* | 77 | return (log - 12) / 4; |
78 | * map mr page size into hw code: | ||
79 | * 0, 1, 2, 3 for 4K, 64K, 1M, 64M | ||
80 | */ | ||
81 | while (!(pgsize & 1)) { | ||
82 | idx++; | ||
83 | pgsize >>= 4; | ||
84 | } | ||
85 | return idx; | ||
86 | } | 78 | } |
87 | 79 | ||
88 | static u64 ehca_get_max_hwpage_size(struct ehca_shca *shca) | 80 | static u64 ehca_get_max_hwpage_size(struct ehca_shca *shca) |
@@ -826,6 +818,7 @@ struct ib_fmr *ehca_alloc_fmr(struct ib_pd *pd, | |||
826 | 818 | ||
827 | /* register MR on HCA */ | 819 | /* register MR on HCA */ |
828 | memset(&pginfo, 0, sizeof(pginfo)); | 820 | memset(&pginfo, 0, sizeof(pginfo)); |
821 | pginfo.hwpage_size = hw_pgsize; | ||
829 | /* | 822 | /* |
830 | * pginfo.num_hwpages==0, ie register_rpages() will not be called | 823 | * pginfo.num_hwpages==0, ie register_rpages() will not be called |
831 | * but deferred to map_phys_fmr() | 824 | * but deferred to map_phys_fmr() |