Commit 3a31c419 authored by Joachim Fenkes's avatar Joachim Fenkes Committed by Roland Dreier

IB/ehca: Only use MR large pages for hugetlb regions

...because, on virtualized hardware like System p, we can't be sure
that the physical pages behind them are contiguous otherwise.
Signed-off-by: default avatarJoachim Fenkes <fenkes@de.ibm.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent c8d8beea
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
#define NUM_CHUNKS(length, chunk_size) \ #define NUM_CHUNKS(length, chunk_size) \
(((length) + (chunk_size - 1)) / (chunk_size)) (((length) + (chunk_size - 1)) / (chunk_size))
/* max number of rpages (per hcall register_rpages) */ /* max number of rpages (per hcall register_rpages) */
#define MAX_RPAGES 512 #define MAX_RPAGES 512
...@@ -64,6 +65,11 @@ enum ehca_mr_pgsize { ...@@ -64,6 +65,11 @@ enum ehca_mr_pgsize {
EHCA_MR_PGSIZE16M = 0x1000000L EHCA_MR_PGSIZE16M = 0x1000000L
}; };
#define EHCA_MR_PGSHIFT4K 12
#define EHCA_MR_PGSHIFT64K 16
#define EHCA_MR_PGSHIFT1M 20
#define EHCA_MR_PGSHIFT16M 24
static u32 ehca_encode_hwpage_size(u32 pgsize) static u32 ehca_encode_hwpage_size(u32 pgsize)
{ {
u32 idx = 0; u32 idx = 0;
...@@ -347,17 +353,16 @@ struct ib_mr *ehca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, ...@@ -347,17 +353,16 @@ struct ib_mr *ehca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
/* select proper hw_pgsize */ /* select proper hw_pgsize */
if (ehca_mr_largepage && if (ehca_mr_largepage &&
(shca->hca_cap_mr_pgsize & HCA_CAP_MR_PGSIZE_16M)) { (shca->hca_cap_mr_pgsize & HCA_CAP_MR_PGSIZE_16M)) {
if (length <= EHCA_MR_PGSIZE4K int page_shift = PAGE_SHIFT;
&& PAGE_SIZE == EHCA_MR_PGSIZE4K) if (e_mr->umem->hugetlb) {
hwpage_size = EHCA_MR_PGSIZE4K; /* determine page_shift, clamp between 4K and 16M */
else if (length <= EHCA_MR_PGSIZE64K) page_shift = (fls64(length - 1) + 3) & ~3;
hwpage_size = EHCA_MR_PGSIZE64K; page_shift = min(max(page_shift, EHCA_MR_PGSHIFT4K),
else if (length <= EHCA_MR_PGSIZE1M) EHCA_MR_PGSHIFT16M);
hwpage_size = EHCA_MR_PGSIZE1M; }
else hwpage_size = 1UL << page_shift;
hwpage_size = EHCA_MR_PGSIZE16M;
} else } else
hwpage_size = EHCA_MR_PGSIZE4K; hwpage_size = EHCA_MR_PGSIZE4K; /* ehca1 only supports 4k */
ehca_dbg(pd->device, "hwpage_size=%lx", hwpage_size); ehca_dbg(pd->device, "hwpage_size=%lx", hwpage_size);
reg_user_mr_fallback: reg_user_mr_fallback:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment