diff options
Diffstat (limited to 'drivers/infiniband/core')
| -rw-r--r-- | drivers/infiniband/core/verbs.c | 7 | 
1 files changed, 5 insertions, 2 deletions
| diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 26b021f43ba4..11b1c1603aeb 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -2957,15 +2957,18 @@ EXPORT_SYMBOL(__rdma_block_iter_start);  bool __rdma_block_iter_next(struct ib_block_iter *biter)  {  	unsigned int block_offset; +	unsigned int sg_delta;  	if (!biter->__sg_nents || !biter->__sg)  		return false;  	biter->__dma_addr = sg_dma_address(biter->__sg) + biter->__sg_advance;  	block_offset = biter->__dma_addr & (BIT_ULL(biter->__pg_bit) - 1); -	biter->__sg_advance += BIT_ULL(biter->__pg_bit) - block_offset; +	sg_delta = BIT_ULL(biter->__pg_bit) - block_offset; -	if (biter->__sg_advance >= sg_dma_len(biter->__sg)) { +	if (sg_dma_len(biter->__sg) - biter->__sg_advance > sg_delta) { +		biter->__sg_advance += sg_delta; +	} else {  		biter->__sg_advance = 0;  		biter->__sg = sg_next(biter->__sg);  		biter->__sg_nents--; |