Message ID | 20210715164544.6827-17-logang@deltatee.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | .map_sg() error cleanup | expand |
On Thu, Jul 15, 2021 at 10:45:44AM -0600, Logan Gunthorpe wrote: > @@ -194,6 +194,8 @@ static int __dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, > else > ents = ops->map_sg(dev, sg, nents, dir, attrs); > > + WARN_ON_ONCE(ents == 0); Turns this into a negative error code while we're at it, just to keep the callers sane?
On 2021-07-16 07:33, Christoph Hellwig wrote: > On Thu, Jul 15, 2021 at 10:45:44AM -0600, Logan Gunthorpe wrote: >> @@ -194,6 +194,8 @@ static int __dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, >> else >> ents = ops->map_sg(dev, sg, nents, dir, attrs); >> >> + WARN_ON_ONCE(ents == 0); > > Turns this into a negative error code while we're at it, just to keep > the callers sane? Right, by this point returning the 0 would pass through dma_map_sg_attrs() OK, but AFAICS dma_map_sgtable() would now get confused and return success but with sgt->nents = 0. Coercing it to an error code (which dma_map_sg_attrs() would then just change right back) seems sensible for the sake of easy robustness. Robin.
On 2021-07-16 12:33 a.m., Christoph Hellwig wrote: > On Thu, Jul 15, 2021 at 10:45:44AM -0600, Logan Gunthorpe wrote: >> @@ -194,6 +194,8 @@ static int __dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, >> else >> ents = ops->map_sg(dev, sg, nents, dir, attrs); >> >> + WARN_ON_ONCE(ents == 0); > > Turns this into a negative error code while we're at it, just to keep > the callers sane? > Sure thing. All the feedback makes sense, we'll fix it up and send a v2 in due course. Thanks, Logan
diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h index eaa969be8284..f299bc1e317b 100644 --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -42,11 +42,9 @@ struct dma_map_ops { unsigned long attrs); /* * map_sg should return a negative error code on error. - * dma_map_sgtable() will return the error code returned and convert - * a zero return (for legacy implementations) into -EINVAL. - * - * dma_map_sg() will always return zero on any negative or zero - * return to satisfy its own calling convention. + * dma_map_sgtable() will return the error code returned by the + * operation and dma_map_sg() will always convert any error to zero + * to satisfy its own calling convention. */ int (*map_sg)(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir, unsigned long attrs); diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 30f89d244566..978a6a16aaf7 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -194,6 +194,8 @@ static int __dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, else ents = ops->map_sg(dev, sg, nents, dir, attrs); + WARN_ON_ONCE(ents == 0); + if (ents > 0) debug_dma_map_sg(dev, sg, nents, ents, dir); @@ -251,9 +253,7 @@ int dma_map_sgtable(struct device *dev, struct sg_table *sgt, int nents; nents = __dma_map_sg_attrs(dev, sgt->sgl, sgt->orig_nents, dir, attrs); - if (nents == 0) - return -EINVAL; - else if (nents < 0) + if (nents < 0) return nents; sgt->nents = nents;
Now that all the .map_sg operations have been converted to returning proper error codes, drop the code to handle a zero return value, add a warning if a zero is returned and update the comment for the map_sg operation. Signed-off-by: Logan Gunthorpe <logang@deltatee.com> --- include/linux/dma-map-ops.h | 8 +++----- kernel/dma/mapping.c | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-)