All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robin Murphy <robin.murphy@arm.com>
To: Sumit Semwal <sumit.semwal@linaro.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-media@vger.kernel.org" <linux-media@vger.kernel.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"linaro-mm-sig@lists.linaro.org" <linaro-mm-sig@lists.linaro.org>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>
Cc: "t.stanislaws@samsung.com" <t.stanislaws@samsung.com>,
	"linaro-kernel@lists.linaro.org" <linaro-kernel@lists.linaro.org>,
	"robdclark@gmail.com" <robdclark@gmail.com>,
	"daniel@ffwll.ch" <daniel@ffwll.ch>,
	"m.szyprowski@samsung.com" <m.szyprowski@samsung.com>
Subject: Re: [RFCv2 1/2] device: add dma_params->max_segment_count
Date: Wed, 21 Jan 2015 18:56:57 +0000	[thread overview]
Message-ID: <54BFF679.6010705@arm.com> (raw)
In-Reply-To: <1421813807-9178-2-git-send-email-sumit.semwal@linaro.org>

Hi Sumit,

On 21/01/15 04:16, Sumit Semwal wrote:
> From: Rob Clark <robdclark@gmail.com>
>
> For devices which have constraints about maximum number of segments in
> an sglist.  For example, a device which could only deal with contiguous
> buffers would set max_segment_count to 1.
>
> The initial motivation is for devices sharing buffers via dma-buf,
> to allow the buffer exporter to know the constraints of other
> devices which have attached to the buffer.  The dma_mask and fields
> in 'struct device_dma_parameters' tell the exporter everything else
> that is needed, except whether the importer has constraints about
> maximum number of segments.
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
>   [sumits: Minor updates wrt comments on the first version]
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> ---
>   include/linux/device.h      |  1 +
>   include/linux/dma-mapping.h | 19 +++++++++++++++++++
>   2 files changed, 20 insertions(+)
>
> diff --git a/include/linux/device.h b/include/linux/device.h
> index fb50673..a32f9b6 100644
> --- a/include/linux/device.h
> +++ b/include/linux/device.h
> @@ -647,6 +647,7 @@ struct device_dma_parameters {
>   	 * sg limitations.
>   	 */
>   	unsigned int max_segment_size;
> +	unsigned int max_segment_count;    /* INT_MAX for unlimited */
>   	unsigned long segment_boundary_mask;
>   };
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index c3007cb..38e2835 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -154,6 +154,25 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
>   		return -EIO;
>   }
>
> +#define DMA_SEGMENTS_MAX_SEG_COUNT ((unsigned int) INT_MAX)
> +
> +static inline unsigned int dma_get_max_seg_count(struct device *dev)
> +{
> +	return dev->dma_parms ?
> +			dev->dma_parms->max_segment_count :
> +			DMA_SEGMENTS_MAX_SEG_COUNT;
> +}

I know this copies the style of the existing code, but unfortunately it 
also copies the subtle brokenness. Plenty of drivers seem to set up a 
dma_parms struct just for max_segment_size, thus chances are you'll come 
across a max_segment_count of 0 sooner or later. How badly is that going 
to break things? I posted a fix recently[1] having hit this problem with 
segment_boundary_mask in IOMMU code.

> +
> +static inline int dma_set_max_seg_count(struct device *dev,
> +						unsigned int count)
> +{
> +	if (dev->dma_parms) {
> +		dev->dma_parms->max_segment_count = count;
> +		return 0;
> +	} else

This "else" is just as unnecessary as the other two I've taken out ;)


Robin.

[1]:http://article.gmane.org/gmane.linux.kernel.iommu/8175/

> +		return -EIO;
> +}
> +
>   static inline unsigned long dma_get_seg_boundary(struct device *dev)
>   {
>   	return dev->dma_parms ?
>



WARNING: multiple messages have this Message-ID (diff)
From: Robin Murphy <robin.murphy@arm.com>
To: Sumit Semwal <sumit.semwal@linaro.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-media@vger.kernel.org" <linux-media@vger.kernel.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"linaro-mm-sig@lists.linaro.org" <linaro-mm-sig@lists.linaro.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>
Cc: "t.stanislaws@samsung.com" <t.stanislaws@samsung.com>,
	"linaro-kernel@lists.linaro.org" <linaro-kernel@lists.linaro.org>,
	"robdclark@gmail.com" <robdclark@gmail.com>,
	"daniel@ffwll.ch" <daniel@ffwll.ch>,
	"m.szyprowski@samsung.com" <m.szyprowski@samsung.com>
Subject: Re: [RFCv2 1/2] device: add dma_params->max_segment_count
Date: Wed, 21 Jan 2015 18:56:57 +0000	[thread overview]
Message-ID: <54BFF679.6010705@arm.com> (raw)
In-Reply-To: <1421813807-9178-2-git-send-email-sumit.semwal@linaro.org>

Hi Sumit,

On 21/01/15 04:16, Sumit Semwal wrote:
> From: Rob Clark <robdclark@gmail.com>
>
> For devices which have constraints about maximum number of segments in
> an sglist.  For example, a device which could only deal with contiguous
> buffers would set max_segment_count to 1.
>
> The initial motivation is for devices sharing buffers via dma-buf,
> to allow the buffer exporter to know the constraints of other
> devices which have attached to the buffer.  The dma_mask and fields
> in 'struct device_dma_parameters' tell the exporter everything else
> that is needed, except whether the importer has constraints about
> maximum number of segments.
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
>   [sumits: Minor updates wrt comments on the first version]
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> ---
>   include/linux/device.h      |  1 +
>   include/linux/dma-mapping.h | 19 +++++++++++++++++++
>   2 files changed, 20 insertions(+)
>
> diff --git a/include/linux/device.h b/include/linux/device.h
> index fb50673..a32f9b6 100644
> --- a/include/linux/device.h
> +++ b/include/linux/device.h
> @@ -647,6 +647,7 @@ struct device_dma_parameters {
>   	 * sg limitations.
>   	 */
>   	unsigned int max_segment_size;
> +	unsigned int max_segment_count;    /* INT_MAX for unlimited */
>   	unsigned long segment_boundary_mask;
>   };
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index c3007cb..38e2835 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -154,6 +154,25 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
>   		return -EIO;
>   }
>
> +#define DMA_SEGMENTS_MAX_SEG_COUNT ((unsigned int) INT_MAX)
> +
> +static inline unsigned int dma_get_max_seg_count(struct device *dev)
> +{
> +	return dev->dma_parms ?
> +			dev->dma_parms->max_segment_count :
> +			DMA_SEGMENTS_MAX_SEG_COUNT;
> +}

I know this copies the style of the existing code, but unfortunately it 
also copies the subtle brokenness. Plenty of drivers seem to set up a 
dma_parms struct just for max_segment_size, thus chances are you'll come 
across a max_segment_count of 0 sooner or later. How badly is that going 
to break things? I posted a fix recently[1] having hit this problem with 
segment_boundary_mask in IOMMU code.

> +
> +static inline int dma_set_max_seg_count(struct device *dev,
> +						unsigned int count)
> +{
> +	if (dev->dma_parms) {
> +		dev->dma_parms->max_segment_count = count;
> +		return 0;
> +	} else

This "else" is just as unnecessary as the other two I've taken out ;)


Robin.

[1]:http://article.gmane.org/gmane.linux.kernel.iommu/8175/

> +		return -EIO;
> +}
> +
>   static inline unsigned long dma_get_seg_boundary(struct device *dev)
>   {
>   	return dev->dma_parms ?
>


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: robin.murphy@arm.com (Robin Murphy)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFCv2 1/2] device: add dma_params->max_segment_count
Date: Wed, 21 Jan 2015 18:56:57 +0000	[thread overview]
Message-ID: <54BFF679.6010705@arm.com> (raw)
In-Reply-To: <1421813807-9178-2-git-send-email-sumit.semwal@linaro.org>

Hi Sumit,

On 21/01/15 04:16, Sumit Semwal wrote:
> From: Rob Clark <robdclark@gmail.com>
>
> For devices which have constraints about maximum number of segments in
> an sglist.  For example, a device which could only deal with contiguous
> buffers would set max_segment_count to 1.
>
> The initial motivation is for devices sharing buffers via dma-buf,
> to allow the buffer exporter to know the constraints of other
> devices which have attached to the buffer.  The dma_mask and fields
> in 'struct device_dma_parameters' tell the exporter everything else
> that is needed, except whether the importer has constraints about
> maximum number of segments.
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
>   [sumits: Minor updates wrt comments on the first version]
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> ---
>   include/linux/device.h      |  1 +
>   include/linux/dma-mapping.h | 19 +++++++++++++++++++
>   2 files changed, 20 insertions(+)
>
> diff --git a/include/linux/device.h b/include/linux/device.h
> index fb50673..a32f9b6 100644
> --- a/include/linux/device.h
> +++ b/include/linux/device.h
> @@ -647,6 +647,7 @@ struct device_dma_parameters {
>   	 * sg limitations.
>   	 */
>   	unsigned int max_segment_size;
> +	unsigned int max_segment_count;    /* INT_MAX for unlimited */
>   	unsigned long segment_boundary_mask;
>   };
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index c3007cb..38e2835 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -154,6 +154,25 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
>   		return -EIO;
>   }
>
> +#define DMA_SEGMENTS_MAX_SEG_COUNT ((unsigned int) INT_MAX)
> +
> +static inline unsigned int dma_get_max_seg_count(struct device *dev)
> +{
> +	return dev->dma_parms ?
> +			dev->dma_parms->max_segment_count :
> +			DMA_SEGMENTS_MAX_SEG_COUNT;
> +}

I know this copies the style of the existing code, but unfortunately it 
also copies the subtle brokenness. Plenty of drivers seem to set up a 
dma_parms struct just for max_segment_size, thus chances are you'll come 
across a max_segment_count of 0 sooner or later. How badly is that going 
to break things? I posted a fix recently[1] having hit this problem with 
segment_boundary_mask in IOMMU code.

> +
> +static inline int dma_set_max_seg_count(struct device *dev,
> +						unsigned int count)
> +{
> +	if (dev->dma_parms) {
> +		dev->dma_parms->max_segment_count = count;
> +		return 0;
> +	} else

This "else" is just as unnecessary as the other two I've taken out ;)


Robin.

[1]:http://article.gmane.org/gmane.linux.kernel.iommu/8175/

> +		return -EIO;
> +}
> +
>   static inline unsigned long dma_get_seg_boundary(struct device *dev)
>   {
>   	return dev->dma_parms ?
>

  reply	other threads:[~2015-01-21 18:57 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-21  4:16 [RFCv2 0/2] dma-parms, constraints and helpers for dma-buf Sumit Semwal
2015-01-21  4:16 ` Sumit Semwal
2015-01-21  4:16 ` Sumit Semwal
2015-01-21  4:16 ` Sumit Semwal
2015-01-21  4:16 ` [RFCv2 1/2] device: add dma_params->max_segment_count Sumit Semwal
2015-01-21  4:16   ` Sumit Semwal
2015-01-21  4:16   ` Sumit Semwal
2015-01-21 18:56   ` Robin Murphy [this message]
2015-01-21 18:56     ` Robin Murphy
2015-01-21 18:56     ` Robin Murphy
2015-01-21 18:56     ` Robin Murphy
2015-01-22  3:46     ` Sumit Semwal
2015-01-22  3:46       ` Sumit Semwal
2015-01-22  3:46       ` Sumit Semwal
2015-01-22  3:46       ` Sumit Semwal
2015-01-21  4:16 ` [RFCv2 2/2] dma-buf: add helpers for sharing attacher constraints with dma-parms Sumit Semwal
2015-01-21  4:16   ` Sumit Semwal
2015-01-21  4:16   ` Sumit Semwal
2015-01-21  4:16   ` Sumit Semwal
2015-01-21 17:31   ` Russell King - ARM Linux
2015-01-21 17:31     ` Russell King - ARM Linux
2015-01-21 17:31     ` Russell King - ARM Linux
2015-01-21 17:31     ` Russell King - ARM Linux
2015-01-27  7:04     ` Sumit Semwal
2015-01-27  7:04       ` Sumit Semwal
2015-01-27  7:04       ` Sumit Semwal
2015-01-27  7:04       ` Sumit Semwal

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=54BFF679.6010705@arm.com \
    --to=robin.murphy@arm.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linaro-mm-sig@lists.linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=m.szyprowski@samsung.com \
    --cc=robdclark@gmail.com \
    --cc=sumit.semwal@linaro.org \
    --cc=t.stanislaws@samsung.com \
    /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.