diff options
Diffstat (limited to 'drivers/infiniband/hw/amso1100/c2_provider.c')
| -rw-r--r-- | drivers/infiniband/hw/amso1100/c2_provider.c | 23 | 
1 files changed, 9 insertions, 14 deletions
diff --git a/drivers/infiniband/hw/amso1100/c2_provider.c b/drivers/infiniband/hw/amso1100/c2_provider.c index 07eb3a8067d..8af33cf1fc4 100644 --- a/drivers/infiniband/hw/amso1100/c2_provider.c +++ b/drivers/infiniband/hw/amso1100/c2_provider.c @@ -431,9 +431,9 @@ static struct ib_mr *c2_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,  	u64 *pages;  	u64 kva = 0;  	int shift, n, len; -	int i, j, k; +	int i, k, entry;  	int err = 0; -	struct ib_umem_chunk *chunk; +	struct scatterlist *sg;  	struct c2_pd *c2pd = to_c2pd(pd);  	struct c2_mr *c2mr; @@ -452,10 +452,7 @@ static struct ib_mr *c2_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,  	}  	shift = ffs(c2mr->umem->page_size) - 1; - -	n = 0; -	list_for_each_entry(chunk, &c2mr->umem->chunk_list, list) -		n += chunk->nents; +	n = c2mr->umem->nmap;  	pages = kmalloc(n * sizeof(u64), GFP_KERNEL);  	if (!pages) { @@ -464,14 +461,12 @@ static struct ib_mr *c2_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,  	}  	i = 0; -	list_for_each_entry(chunk, &c2mr->umem->chunk_list, list) { -		for (j = 0; j < chunk->nmap; ++j) { -			len = sg_dma_len(&chunk->page_list[j]) >> shift; -			for (k = 0; k < len; ++k) { -				pages[i++] = -					sg_dma_address(&chunk->page_list[j]) + -					(c2mr->umem->page_size * k); -			} +	for_each_sg(c2mr->umem->sg_head.sgl, sg, c2mr->umem->nmap, entry) { +		len = sg_dma_len(sg) >> shift; +		for (k = 0; k < len; ++k) { +			pages[i++] = +				sg_dma_address(sg) + +				(c2mr->umem->page_size * k);  		}  	}  | 
