Roland Dreier wrote:

I think the patch below should be a fix for the problem, although I've
only compile tested it.  The idea is to stop increasing shift once it
reaches a bit position where the first buffer and the iova differ.
What do you think?  If this works for you, I will merge it for 2.6.25.

diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c 
b/drivers/infiniband/hw/mthca/mthca_provider.c
index 6bcde1c..1a15129 100644
--- a/drivers/infiniband/hw/mthca/mthca_provider.c
+++ b/drivers/infiniband/hw/mthca/mthca_provider.c
@@ -948,7 +948,9 @@ static struct ib_mr *mthca_reg_phys_mr(struct ib_pd       
*pd,
                return ERR_PTR(-EINVAL);
/* Find largest page shift we can use to cover buffers */
-       for (shift = PAGE_SHIFT; shift < 31; ++shift)
+       for (shift = PAGE_SHIFT; shift < 31; ++shift) {
+               if ((buffer_list[0].addr ^ *iova_start) & (1ULL << shift))
+                       break;
                if (num_phys_buf > 1) {
                        if ((1ULL << shift) & mask)
                                break;
@@ -958,6 +960,7 @@ static struct ib_mr *mthca_reg_phys_mr(struct ib_pd       
*pd,
                            (buffer_list[0].addr & ((1ULL << shift) - 1)))
                                break;
                }
+       }
buffer_list[0].size += buffer_list[0].addr & ((1ULL << shift) - 1);
        buffer_list[0].addr &= ~0ull << shift;


I wonder if we should make this functionality common and put it in infiniband/drivers/core somewhere? I think mthca and cxgb3 need the same service. Probably ehca and nes too...

Steve.

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to