Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 681cc360 authored by Bart Van Assche's avatar Bart Van Assche Committed by Doug Ledford
Browse files

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 8c4037b5 ("IB/srp: always avoid non-zero offsets
into an FMR").

Reported-by: default avatarAlex Estrin <alex.estrin@intel.com>
Signed-off-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 52bb8c62
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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;
}