+10
-8
drivers/infiniband/hw/mlx5/mem.c
+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
}