Skip to content

Commit

Permalink
IB/srp: Fix infinite loop when FMR sg[0].offset != 0
Browse files Browse the repository at this point in the history
commit 681cc36 upstream.

Avoid that mapping an sg-list in which the first element has a
non-zero offset triggers an infinite loop when using FMR. This
patch makes the FMR mapping code similar to that of ib_sg_to_pages().

Note: older Mellanox HCAs do not support non-zero offsets for FMR.
See also commit 8c4037b ("IB/srp: always avoid non-zero offsets
into an FMR").

Reported-by: Alex Estrin <[email protected]>
Signed-off-by: Bart Van Assche <[email protected]>
Signed-off-by: Doug Ledford <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Bart Van Assche authored and gregkh committed Oct 28, 2016
1 parent 14ec354 commit 9d57a64
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions drivers/infiniband/ulp/srp/ib_srp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1400,7 +1400,9 @@ static int srp_map_sg_entry(struct srp_map_state *state,

while (dma_len) {
unsigned offset = dma_addr & ~dev->mr_page_mask;
if (state->npages == dev->max_pages_per_mr || offset != 0) {

if (state->npages == dev->max_pages_per_mr ||
(state->npages > 0 && offset != 0)) {
ret = srp_map_finish_fmr(state, ch);
if (ret)
return ret;
Expand All @@ -1417,12 +1419,12 @@ static int srp_map_sg_entry(struct srp_map_state *state,
}

/*
* If the last entry of the MR wasn't a full page, then we need to
* If the end of the MR is not on a page boundary then we need to
* close it out and start a new one -- we can only merge at page
* boundaries.
*/
ret = 0;
if (len != dev->mr_page_size)
if ((dma_addr & ~dev->mr_page_mask) != 0)
ret = srp_map_finish_fmr(state, ch);
return ret;
}
Expand Down

0 comments on commit 9d57a64

Please sign in to comment.