Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3a31c41901b6bd3937ec36e0e4a930849e270df6
Commit:     3a31c41901b6bd3937ec36e0e4a930849e270df6
Parent:     c8d8beea0383e47c9d65d45f0ca95626ec435fcd
Author:     Joachim Fenkes <[EMAIL PROTECTED]>
AuthorDate: Thu Sep 13 18:16:20 2007 +0200
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Tue Oct 9 19:59:13 2007 -0700

    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: Joachim Fenkes <[EMAIL PROTECTED]>
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/hw/ehca/ehca_mrmw.c |   25 +++++++++++++++----------
 1 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/infiniband/hw/ehca/ehca_mrmw.c 
b/drivers/infiniband/hw/ehca/ehca_mrmw.c
index e925e84..da88738 100644
--- a/drivers/infiniband/hw/ehca/ehca_mrmw.c
+++ b/drivers/infiniband/hw/ehca/ehca_mrmw.c
@@ -51,6 +51,7 @@
 
 #define NUM_CHUNKS(length, chunk_size) \
        (((length) + (chunk_size - 1)) / (chunk_size))
+
 /* max number of rpages (per hcall register_rpages) */
 #define MAX_RPAGES 512
 
@@ -64,6 +65,11 @@ enum ehca_mr_pgsize {
        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)
 {
        u32 idx = 0;
@@ -347,17 +353,16 @@ struct ib_mr *ehca_reg_user_mr(struct ib_pd *pd, u64 
start, u64 length,
        /* select proper hw_pgsize */
        if (ehca_mr_largepage &&
            (shca->hca_cap_mr_pgsize & HCA_CAP_MR_PGSIZE_16M)) {
-               if (length <= EHCA_MR_PGSIZE4K
-                   && PAGE_SIZE == EHCA_MR_PGSIZE4K)
-                       hwpage_size = EHCA_MR_PGSIZE4K;
-               else if (length <= EHCA_MR_PGSIZE64K)
-                       hwpage_size = EHCA_MR_PGSIZE64K;
-               else if (length <= EHCA_MR_PGSIZE1M)
-                       hwpage_size = EHCA_MR_PGSIZE1M;
-               else
-                       hwpage_size = EHCA_MR_PGSIZE16M;
+               int page_shift = PAGE_SHIFT;
+               if (e_mr->umem->hugetlb) {
+                       /* determine page_shift, clamp between 4K and 16M */
+                       page_shift = (fls64(length - 1) + 3) & ~3;
+                       page_shift = min(max(page_shift, EHCA_MR_PGSHIFT4K),
+                                        EHCA_MR_PGSHIFT16M);
+               }
+               hwpage_size = 1UL << page_shift;
        } else
-               hwpage_size = EHCA_MR_PGSIZE4K;
+               hwpage_size = EHCA_MR_PGSIZE4K; /* ehca1 only supports 4k */
        ehca_dbg(pd->device, "hwpage_size=%lx", hwpage_size);
 
 reg_user_mr_fallback:
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to