IB/mlx5: Modify to work with arbitrary page size

When dealing with umem objects, the driver assumed host page sizes
defined by PAGE_SHIFT. Modify the code to use arbitrary page shift
provided by umem->page_shift to support different page sizes.

Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Eli Cohen <eli@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>

authored by Yishai Hadas and committed by Roland Dreier f39f8697 f83b4263

Changed files
+10 -8
drivers
infiniband
hw
mlx5
+10 -8
drivers/infiniband/hw/mlx5/mem.c
··· 55 55 u64 pfn; 56 56 struct scatterlist *sg; 57 57 int entry; 58 + unsigned long page_shift = ilog2(umem->page_size); 58 59 59 - addr = addr >> PAGE_SHIFT; 60 + addr = addr >> page_shift; 60 61 tmp = (unsigned long)addr; 61 62 m = find_first_bit(&tmp, sizeof(tmp)); 62 63 skip = 1 << m; 63 64 mask = skip - 1; 64 65 i = 0; 65 66 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) { 66 - len = sg_dma_len(sg) >> PAGE_SHIFT; 67 - pfn = sg_dma_address(sg) >> PAGE_SHIFT; 67 + len = sg_dma_len(sg) >> page_shift; 68 + pfn = sg_dma_address(sg) >> page_shift; 68 69 for (k = 0; k < len; k++) { 69 70 if (!(i & mask)) { 70 71 tmp = (unsigned long)pfn; ··· 104 103 105 104 *ncont = 0; 106 105 } 107 - *shift = PAGE_SHIFT + m; 106 + *shift = page_shift + m; 108 107 *count = i; 109 108 } 110 109 111 110 void mlx5_ib_populate_pas(struct mlx5_ib_dev *dev, struct ib_umem *umem, 112 111 int page_shift, __be64 *pas, int umr) 113 112 { 114 - int shift = page_shift - PAGE_SHIFT; 113 + unsigned long umem_page_shift = ilog2(umem->page_size); 114 + int shift = page_shift - umem_page_shift; 115 115 int mask = (1 << shift) - 1; 116 116 int i, k; 117 117 u64 cur = 0; ··· 123 121 124 122 i = 0; 125 123 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) { 126 - len = sg_dma_len(sg) >> PAGE_SHIFT; 124 + len = sg_dma_len(sg) >> umem_page_shift; 127 125 base = sg_dma_address(sg); 128 126 for (k = 0; k < len; k++) { 129 127 if (!(i & mask)) { 130 - cur = base + (k << PAGE_SHIFT); 128 + cur = base + (k << umem_page_shift); 131 129 if (umr) 132 130 cur |= 3; 133 131 ··· 136 134 i >> shift, be64_to_cpu(pas[i >> shift])); 137 135 } else 138 136 mlx5_ib_dbg(dev, "=====> 0x%llx\n", 139 - base + (k << PAGE_SHIFT)); 137 + base + (k << umem_page_shift)); 140 138 i++; 141 139 } 142 140 }