[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8868dc96-52fd-5158-0da0-bbc4a0bc682b@gmail.com>
Date: Tue, 3 Nov 2020 14:24:13 +0100
From: Bodo Stroesser <bostroesser@...il.com>
To: Douglas Gilbert <dgilbert@...erlog.com>,
linux-scsi@...r.kernel.org, linux-block@...r.kernel.org,
linux-kernel@...r.kernel.org
Cc: martin.petersen@...cle.com, axboe@...nel.dk, bvanassche@....org
Subject: Re: [PATCH v3 3/4] scatterlist: add sgl_compare_sgl() function
Am 19.10.20 um 21:19 schrieb Douglas Gilbert:
> After enabling copies between scatter gather lists (sgl_s),
> another storage related operation is to compare two sgl_s.
> This new function is modelled on NVMe's Compare command and
> the SCSI VERIFY(BYTCHK=1) command. Like memcmp() this function
> returns false on the first miscompare and stops comparing.
>
> Signed-off-by: Douglas Gilbert <dgilbert@...erlog.com>
> ---
> include/linux/scatterlist.h | 4 +++
> lib/scatterlist.c | 61 +++++++++++++++++++++++++++++++++++++
> 2 files changed, 65 insertions(+)
>
> diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h
> index 6649414c0749..ae260dc5fedb 100644
> --- a/include/linux/scatterlist.h
> +++ b/include/linux/scatterlist.h
> @@ -325,6 +325,10 @@ size_t sgl_copy_sgl(struct scatterlist *d_sgl, unsigned int d_nents, off_t d_ski
> struct scatterlist *s_sgl, unsigned int s_nents, off_t s_skip,
> size_t n_bytes);
>
> +bool sgl_compare_sgl(struct scatterlist *x_sgl, unsigned int x_nents, off_t x_skip,
> + struct scatterlist *y_sgl, unsigned int y_nents, off_t y_skip,
> + size_t n_bytes);
> +
> /*
> * Maximum number of entries that will be allocated in one piece, if
> * a list larger than this is required then chaining will be utilized.
> diff --git a/lib/scatterlist.c b/lib/scatterlist.c
> index 1f9e093ad7da..49185536acba 100644
> --- a/lib/scatterlist.c
> +++ b/lib/scatterlist.c
> @@ -1049,3 +1049,64 @@ size_t sgl_copy_sgl(struct scatterlist *d_sgl, unsigned int d_nents, off_t d_ski
> }
> EXPORT_SYMBOL(sgl_copy_sgl);
>
> +/**
> + * sgl_compare_sgl - Compare x and y (both sgl_s)
> + * @x_sgl: x (left) sgl
> + * @x_nents: Number of SG entries in x (left) sgl
> + * @x_skip: Number of bytes to skip in x (left) before starting
> + * @y_sgl: y (right) sgl
> + * @y_nents: Number of SG entries in y (right) sgl
> + * @y_skip: Number of bytes to skip in y (right) before starting
> + * @n_bytes: The (maximum) number of bytes to compare
> + *
> + * Returns:
> + * true if x and y compare equal before x, y or n_bytes is exhausted.
> + * Otherwise on a miscompare, returns false (and stops comparing).
> + *
> + * Notes:
> + * x and y are symmetrical: they can be swapped and the result is the same.
> + *
> + * Implementation is based on memcmp(). x and y segments may overlap.
> + *
> + * The notes in sgl_copy_sgl() about large sgl_s _applies here as well.
> + *
> + **/
> +bool sgl_compare_sgl(struct scatterlist *x_sgl, unsigned int x_nents, off_t x_skip,
> + struct scatterlist *y_sgl, unsigned int y_nents, off_t y_skip,
> + size_t n_bytes)
> +{
> + bool equ = true;
> + size_t len;
> + size_t offset = 0;
> + struct sg_mapping_iter x_iter, y_iter;
> +
> + if (n_bytes == 0)
> + return true;
> + sg_miter_start(&x_iter, x_sgl, x_nents, SG_MITER_ATOMIC | SG_MITER_FROM_SG);
> + sg_miter_start(&y_iter, y_sgl, y_nents, SG_MITER_ATOMIC | SG_MITER_FROM_SG);
> + if (!sg_miter_skip(&x_iter, x_skip))
> + goto fini;
> + if (!sg_miter_skip(&y_iter, y_skip))
> + goto fini;
> +
> + while (equ && offset < n_bytes) {
> + if (!sg_miter_next(&x_iter))
> + break;
> + if (!sg_miter_next(&y_iter))
> + break;
> + len = min3(x_iter.length, y_iter.length, n_bytes - offset);
> +
> + equ = !memcmp(x_iter.addr, y_iter.addr, len);
> + offset += len;
> + /* LIFO order is important when SG_MITER_ATOMIC is used */
> + y_iter.consumed = len;
> + sg_miter_stop(&y_iter);
> + x_iter.consumed = len;
> + sg_miter_stop(&x_iter);
> + }
> +fini:
> + sg_miter_stop(&y_iter);
> + sg_miter_stop(&x_iter);
> + return equ;
> +}
> +EXPORT_SYMBOL(sgl_compare_sgl);
>
Reviewed-by: Bodo Stroesser <bostroesser@...il.com>
Powered by blists - more mailing lists