[openib-general] Re: [PATCH updated] mthca: fix page shift calculation
Roland Dreier
rdreier at cisco.com
Thu Jan 5 13:06:44 PST 2006
Michael> Hmm. Lets suppose I have a first chunk in bytes 1 to
Michael> 2095, and then another chunk in bytes 0x100000 to
Michael> 0x1ffffff - should not we limit the page size to 4K? Does
Michael> your proposed change do this?
Yes, you're right again. It seems like we can get rid of some special
casing and just do things like this:
--- infiniband/hw/mthca/mthca_provider.c (revision 4754)
+++ infiniband/hw/mthca/mthca_provider.c (working copy)
@@ -771,24 +771,20 @@ static struct ib_mr *mthca_reg_phys_mr(s
if ((*iova_start & ~PAGE_MASK) != (buffer_list[0].addr & ~PAGE_MASK))
return ERR_PTR(-EINVAL);
- if (num_phys_buf > 1 &&
- ((buffer_list[0].addr + buffer_list[0].size) & ~PAGE_MASK))
- return ERR_PTR(-EINVAL);
-
mask = 0;
total_size = 0;
for (i = 0; i < num_phys_buf; ++i) {
- if (i != 0 && buffer_list[i].addr & ~PAGE_MASK)
- return ERR_PTR(-EINVAL);
- if (i != 0 && i != num_phys_buf - 1 &&
- (buffer_list[i].size & ~PAGE_MASK))
- return ERR_PTR(-EINVAL);
+ if (i != 0)
+ mask |= buffer_list[i].addr;
+ if (i != num_phys_buf - 1)
+ mask |= buffer_list[i].addr + buffer_list[i].size;
total_size += buffer_list[i].size;
- if (i > 0)
- mask |= buffer_list[i].addr;
}
+ if (mask & ~PAGE_MASK)
+ return ERR_PTR(-EINVAL);
+
/* Find largest page shift we can use to cover buffers */
for (shift = PAGE_SHIFT; shift < 31; ++shift)
if (num_phys_buf > 1) {
More information about the general
mailing list