mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
IB/srp: Fix infinite loop when FMR sg[0].offset != 0
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 8c4037b501
("IB/srp: always avoid non-zero offsets
into an FMR").
Reported-by: Alex Estrin <alex.estrin@intel.com>
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
52bb8c626e
commit
681cc36083
1 changed files with 5 additions and 3 deletions
|
@ -1402,7 +1402,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;
|
||||
|
@ -1419,12 +1421,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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue