[PATCH 0/3] scatterlist: sgl-sgl ops: copy, equal

From: Douglas Gilbert
Date: Tue Jan 19 2021 - 12:29:59 EST

Scatter-gather lists (sgl_s) are frequently used as data carriers in
the block layer. For example the SCSI and NVMe subsystems interchange
data with the block layer using sgl_s. The sgl API is declared in

The author has extended these transient sgl use cases to a store (i.e.
a ramdisk) in the scsi_debug driver. Other new potential uses of sgl_s
could be for the target subsystem. When this extra step is taken, the
need to copy between sgl_s becomes apparent. The patchset adds
sgl_copy_sgl(), sgl_equal_sgl() and sgl_memset().

Changes since v6 [posted 20210118]:
- restarted with new patchset name, was "scatterlist: add new
- drop correction patch "sgl_alloc_order: remove 4 GiB limit,
sgl_free() warning"; could be sent separately as a fix
- rename sgl_compare_sgl() to sg_equal_sgl() and the helper
to sg_equal_sgl_idx()

Changes since v5 [posted 20201228]:
- incorporate review requests from Jason Gunthorpe
- replace integer overflow detection code in sgl_alloc_order()
with a pre-condition statement
- rebase on lk 5.11.0-rc4

Changes since v4 [posted 20201105]:
- rebase on lk 5.10.0-rc2

Changes since v3 [posted 20201019]:
- re-instate check on integer overflow of nent calculation in
sgl_alloc_order(). Do it in such a way as to not limit the
overall sgl size to 4 GiB
- introduce sgl_compare_sgl_idx() helper function that, if
requested and if a miscompare is detected, will yield the byte
index of the first miscompare.
- add Reviewed-by tags from Bodo Stroesser
- rebase on lk 5.10.0-rc2 [was on lk 5.9.0]

Changes since v2 [posted 20201018]:
- remove unneeded lines from sgl_memset() definition.
- change sg_zero_buffer() to call sgl_memset() as the former
is a subset.

Changes since v1 [posted 20201016]:
- Bodo Stroesser pointed out a problem with the nesting of
kmap_atomic() [called via sg_miter_next()] and kunmap_atomic()
calls [called via sg_miter_stop()] and proposed a solution that
simplifies the previous code.

- the new implementation of the three functions has shorter periods
when pre-emption is disabled (but has more them). This should
make operations on large sgl_s more pre-emption "friendly" with
a relatively small performance hit.

- sgl_memset return type changed from void to size_t and is the
number of bytes actually (over)written. That number is needed
anyway internally so may as well return it as it may be useful to
the caller.

This patchset is against lk 5.11.0-rc4

Douglas Gilbert (3):
scatterlist: add sgl_copy_sgl() function
scatterlist: add sgl_equal_sgl() function
scatterlist: add sgl_memset()

include/linux/scatterlist.h | 32 ++++-
lib/scatterlist.c | 233 ++++++++++++++++++++++++++++++++----
2 files changed, 243 insertions(+), 22 deletions(-)