Commit 6627fa66 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin Committed by Roland Dreier

IB/mthca: fix page shift calculation in mthca_reg_phys_mr()

For all pages except possibly the last one, the byte beyond the buffer
end must be page aligned.  Therefore, when computing the page shift to
use, OR the end addresses of the buffers as well as the start
addresses into the mask we check.
Signed-off-by: default avatarMichael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 5367f2d6
...@@ -783,24 +783,20 @@ static struct ib_mr *mthca_reg_phys_mr(struct ib_pd *pd, ...@@ -783,24 +783,20 @@ static struct ib_mr *mthca_reg_phys_mr(struct ib_pd *pd,
if ((*iova_start & ~PAGE_MASK) != (buffer_list[0].addr & ~PAGE_MASK)) if ((*iova_start & ~PAGE_MASK) != (buffer_list[0].addr & ~PAGE_MASK))
return ERR_PTR(-EINVAL); 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; mask = 0;
total_size = 0; total_size = 0;
for (i = 0; i < num_phys_buf; ++i) { for (i = 0; i < num_phys_buf; ++i) {
if (i != 0 && buffer_list[i].addr & ~PAGE_MASK) if (i != 0)
return ERR_PTR(-EINVAL); mask |= buffer_list[i].addr;
if (i != 0 && i != num_phys_buf - 1 && if (i != num_phys_buf - 1)
(buffer_list[i].size & ~PAGE_MASK)) mask |= buffer_list[i].addr + buffer_list[i].size;
return ERR_PTR(-EINVAL);
total_size += 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 */ /* 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 (num_phys_buf > 1) { if (num_phys_buf > 1) {
......
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