From: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
To: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
hch-jcswGhMUV9g@public.gmane.org
Subject: Re: [PATCH] dma-debug: Check scatterlist segments
Date: Wed, 25 Apr 2018 07:58:56 +0200 [thread overview]
Message-ID: <20180425055856.GA10738@lst.de> (raw)
In-Reply-To: <5952922c7980b5c9091692d886bbca220e7371c2.1524586299.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
This looks interesting. I suspect it is going to blow up in
quite a few places, so maybe at least for now it might make sense
to have a separate config option?
On Tue, Apr 24, 2018 at 05:12:19PM +0100, Robin Murphy wrote:
> Drivers/subsystems creating scatterlists for DMA should be taking care
> to respect the scatter-gather limitations of the appropriate device, as
> described by dma_parms. A DMA API implementation cannot feasibly split
> a scatterlist into *more* entries than originally passed, so it is not
> well defined what they should do when given a segment larger than the
> limit they are also required to respect.
>
> Conversely, devices which are less limited than the rather conservative
> defaults, or indeed have no limitations at all (e.g. GPUs with their own
> internal MMU), should be encouraged to set appropriate dma_parms, as
> they may get more efficient DMA mapping performance out of it.
>
> Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
> ---
> lib/dma-debug.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/lib/dma-debug.c b/lib/dma-debug.c
> index 7f5cdc1e6b29..9f158941004d 100644
> --- a/lib/dma-debug.c
> +++ b/lib/dma-debug.c
> @@ -1293,6 +1293,30 @@ static void check_sync(struct device *dev,
> put_hash_bucket(bucket, &flags);
> }
>
> +static void check_sg_segment(struct device *dev, struct scatterlist *sg)
> +{
> + unsigned int max_seg = dma_get_max_seg_size(dev);
> + dma_addr_t start, end, boundary = dma_get_seg_boundary(dev);
> +
> + /*
> + * Either the driver forgot to set dma_parms appropriately, or
> + * whoever generated the list forgot to check them.
> + */
> + if (sg->length > max_seg)
> + err_printk(dev, NULL, "DMA-API: mapping sg segment longer than device claims to support [len=%u] [max=%u]\n",
> + sg->length, max_seg);
> + /*
> + * In some cases this could potentially be the DMA API
> + * implementation's fault, but it would usually imply that
> + * the scatterlist was built inappropriately to begin with.
> + */
> + start = sg_dma_address(sg);
> + end = start + sg_dma_len(sg) - 1;
> + if ((start ^ end) & ~boundary)
> + err_printk(dev, NULL, "DMA-API: mapping sg segment across boundary [start=0x%016llx] [end=0x%016llx] [boundary=0x%016llx]\n",
> + start, end, boundary);
> +}
> +
> void debug_dma_map_page(struct device *dev, struct page *page, size_t offset,
> size_t size, int direction, dma_addr_t dma_addr,
> bool map_single)
> @@ -1423,6 +1447,8 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
> check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s));
> }
>
> + check_sg_segment(dev, s);
> +
> add_dma_entry(entry);
> }
> }
> --
> 2.17.0.dirty
---end quoted text---
WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: Robin Murphy <robin.murphy@arm.com>
Cc: hch@lst.de, m.szyprowski@samsung.com,
iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] dma-debug: Check scatterlist segments
Date: Wed, 25 Apr 2018 07:58:56 +0200 [thread overview]
Message-ID: <20180425055856.GA10738@lst.de> (raw)
In-Reply-To: <5952922c7980b5c9091692d886bbca220e7371c2.1524586299.git.robin.murphy@arm.com>
This looks interesting. I suspect it is going to blow up in
quite a few places, so maybe at least for now it might make sense
to have a separate config option?
On Tue, Apr 24, 2018 at 05:12:19PM +0100, Robin Murphy wrote:
> Drivers/subsystems creating scatterlists for DMA should be taking care
> to respect the scatter-gather limitations of the appropriate device, as
> described by dma_parms. A DMA API implementation cannot feasibly split
> a scatterlist into *more* entries than originally passed, so it is not
> well defined what they should do when given a segment larger than the
> limit they are also required to respect.
>
> Conversely, devices which are less limited than the rather conservative
> defaults, or indeed have no limitations at all (e.g. GPUs with their own
> internal MMU), should be encouraged to set appropriate dma_parms, as
> they may get more efficient DMA mapping performance out of it.
>
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
> ---
> lib/dma-debug.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/lib/dma-debug.c b/lib/dma-debug.c
> index 7f5cdc1e6b29..9f158941004d 100644
> --- a/lib/dma-debug.c
> +++ b/lib/dma-debug.c
> @@ -1293,6 +1293,30 @@ static void check_sync(struct device *dev,
> put_hash_bucket(bucket, &flags);
> }
>
> +static void check_sg_segment(struct device *dev, struct scatterlist *sg)
> +{
> + unsigned int max_seg = dma_get_max_seg_size(dev);
> + dma_addr_t start, end, boundary = dma_get_seg_boundary(dev);
> +
> + /*
> + * Either the driver forgot to set dma_parms appropriately, or
> + * whoever generated the list forgot to check them.
> + */
> + if (sg->length > max_seg)
> + err_printk(dev, NULL, "DMA-API: mapping sg segment longer than device claims to support [len=%u] [max=%u]\n",
> + sg->length, max_seg);
> + /*
> + * In some cases this could potentially be the DMA API
> + * implementation's fault, but it would usually imply that
> + * the scatterlist was built inappropriately to begin with.
> + */
> + start = sg_dma_address(sg);
> + end = start + sg_dma_len(sg) - 1;
> + if ((start ^ end) & ~boundary)
> + err_printk(dev, NULL, "DMA-API: mapping sg segment across boundary [start=0x%016llx] [end=0x%016llx] [boundary=0x%016llx]\n",
> + start, end, boundary);
> +}
> +
> void debug_dma_map_page(struct device *dev, struct page *page, size_t offset,
> size_t size, int direction, dma_addr_t dma_addr,
> bool map_single)
> @@ -1423,6 +1447,8 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
> check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s));
> }
>
> + check_sg_segment(dev, s);
> +
> add_dma_entry(entry);
> }
> }
> --
> 2.17.0.dirty
---end quoted text---
next prev parent reply other threads:[~2018-04-25 5:58 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-24 16:12 [PATCH] dma-debug: Check scatterlist segments Robin Murphy via iommu
2018-04-24 16:12 ` Robin Murphy
2018-04-25 4:52 ` kbuild test robot
[not found] ` <5952922c7980b5c9091692d886bbca220e7371c2.1524586299.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2018-04-25 5:58 ` Christoph Hellwig [this message]
2018-04-25 5:58 ` Christoph Hellwig
[not found] ` <20180425055856.GA10738-jcswGhMUV9g@public.gmane.org>
2018-05-08 10:14 ` Robin Murphy
2018-05-08 10:14 ` Robin Murphy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180425055856.GA10738@lst.de \
--to=hch-jcswghmuv9g@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=robin.murphy-5wv7dgnIgG8@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.