All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
To: Sumit Semwal <sumit.semwal@linaro.org>,
	linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
	dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
	linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org
Cc: linaro-kernel@lists.linaro.org,
	stanislawski.tomasz@googlemail.com, robin.murphy@arm.com,
	m.szyprowski@samsung.com
Subject: Re: [RFCv3 2/2] dma-buf: add helpers for sharing attacher constraints with dma-parms
Date: Thu, 29 Jan 2015 15:16:49 +0100	[thread overview]
Message-ID: <54CA40D1.4000701@canonical.com> (raw)
In-Reply-To: <1422347154-15258-2-git-send-email-sumit.semwal@linaro.org>

Op 27-01-15 om 09:25 schreef Sumit Semwal:
> Add some helpers to share the constraints of devices while attaching
> to the dmabuf buffer.
>
> At each attach, the constraints are calculated based on the following:
> - max_segment_size, max_segment_count, segment_boundary_mask from
>    device_dma_parameters.
>
> In case the attaching device's constraints don't match up, attach() fails.
>
> At detach, the constraints are recalculated based on the remaining
> attached devices.
>
> Two helpers are added:
> - dma_buf_get_constraints - which gives the current constraints as calculated
>       during each attach on the buffer till the time,
> - dma_buf_recalc_constraints - which recalculates the constraints for all
>       currently attached devices for the 'paranoid' ones amongst us.
>
> The idea of this patch is largely taken from Rob Clark's RFC at
> https://lkml.org/lkml/2012/7/19/285, and the comments received on it.
>
> Cc: Rob Clark <robdclark@gmail.com>
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> ---
> v3: 
> - Thanks to Russell's comment, remove dma_mask and coherent_dma_mask from
>   constraints' calculation; has a nice side effect of letting us use
>   device_dma_parameters directly to list constraints.
> - update the debugfs output to show constraint info as well.
>   
> v2: split constraints-sharing and allocation helpers
>
>  drivers/dma-buf/dma-buf.c | 126 +++++++++++++++++++++++++++++++++++++++++++++-
>  include/linux/dma-buf.h   |   7 +++
>  2 files changed, 132 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 5be225c2ba98..f363f1440803 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -264,6 +264,66 @@ static inline int is_dma_buf_file(struct file *file)
>  	return file->f_op == &dma_buf_fops;
>  }
>  
> +static inline void init_constraints(struct device_dma_parameters *cons)
> +{
> +	cons->max_segment_count = (unsigned int)-1;
> +	cons->max_segment_size = (unsigned int)-1;
> +	cons->segment_boundary_mask = (unsigned long)-1;
> +}
Use DMA_SEGMENTS_MAX_SEG_COUNT or UINT/ULONG_MAX here instead?

Patches look sane,
Reviewed-By: Maarten Lankhorst <maarten.lankhorst@canonical.com>
> +/*
> + * calc_constraints - calculates if the new attaching device's constraints
> + * match, with the constraints of already attached devices; if yes, returns
> + * the constraints; else return ERR_PTR(-EINVAL)
> + */
> +static int calc_constraints(struct device *dev,
> +			    struct device_dma_parameters *calc_cons)
> +{
> +	struct device_dma_parameters cons = *calc_cons;
> +
> +	cons.max_segment_count = min(cons.max_segment_count,
> +					dma_get_max_seg_count(dev));
> +	cons.max_segment_size = min(cons.max_segment_size,
> +					dma_get_max_seg_size(dev));
> +	cons.segment_boundary_mask &= dma_get_seg_boundary(dev);
> +
> +	if (!cons.max_segment_count ||
> +	    !cons.max_segment_size ||
> +	    !cons.segment_boundary_mask) {
> +		pr_err("Dev: %s's constraints don't match\n", dev_name(dev));
> +		return -EINVAL;
> +	}
> +
> +	*calc_cons = cons;
> +
> +	return 0;
> +}
> +
> +/*
> + * recalc_constraints - recalculates constraints for all attached devices;
> + *  useful for detach() recalculation, and for dma_buf_recalc_constraints()
> + *  helper.
> + *  Returns recalculated constraints in recalc_cons, or error in the unlikely
> + *  case when constraints of attached devices might have changed.
> + */
> +static int recalc_constraints(struct dma_buf *dmabuf,
> +			      struct device_dma_parameters *recalc_cons)
> +{
> +	struct device_dma_parameters calc_cons;
> +	struct dma_buf_attachment *attach;
> +	int ret = 0;
> +
> +	init_constraints(&calc_cons);
> +
> +	list_for_each_entry(attach, &dmabuf->attachments, node) {
> +		ret = calc_constraints(attach->dev, &calc_cons);
> +		if (ret)
> +			return ret;
> +	}
> +	*recalc_cons = calc_cons;
> +	return 0;
> +}
> +
>  /**
>   * dma_buf_export_named - Creates a new dma_buf, and associates an anon file
>   * with this buffer, so it can be exported.
> @@ -313,6 +373,9 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
>  	dmabuf->ops = ops;
>  	dmabuf->size = size;
>  	dmabuf->exp_name = exp_name;
> +
> +	init_constraints(&dmabuf->constraints);
> +
>  	init_waitqueue_head(&dmabuf->poll);
>  	dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll;
>  	dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0;
> @@ -422,7 +485,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  					  struct device *dev)
>  {
>  	struct dma_buf_attachment *attach;
> -	int ret;
> +	int ret = 0;
>  
>  	if (WARN_ON(!dmabuf || !dev))
>  		return ERR_PTR(-EINVAL);
> @@ -436,6 +499,9 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  
>  	mutex_lock(&dmabuf->lock);
>  
> +	if (calc_constraints(dev, &dmabuf->constraints))
> +		goto err_constraints;
> +
>  	if (dmabuf->ops->attach) {
>  		ret = dmabuf->ops->attach(dmabuf, dev, attach);
>  		if (ret)
> @@ -448,6 +514,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  
>  err_attach:
>  	kfree(attach);
> +err_constraints:
>  	mutex_unlock(&dmabuf->lock);
>  	return ERR_PTR(ret);
>  }
> @@ -470,6 +537,8 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
>  	if (dmabuf->ops->detach)
>  		dmabuf->ops->detach(dmabuf, attach);
>  
> +	recalc_constraints(dmabuf, &dmabuf->constraints);
> +
>  	mutex_unlock(&dmabuf->lock);
>  	kfree(attach);
>  }
> @@ -770,6 +839,56 @@ void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr)
>  }
>  EXPORT_SYMBOL_GPL(dma_buf_vunmap);
>  
> +/**
> + * dma_buf_get_constraints - get the *current* constraints of the dmabuf,
> + *  as calculated during each attach(); returns error on invalid inputs
> + *
> + * @dmabuf:		[in]	buffer to get constraints of
> + * @constraints:	[out]	current constraints are returned in this
> + */
> +int dma_buf_get_constraints(struct dma_buf *dmabuf,
> +			    struct device_dma_parameters *constraints)
> +{
> +	if (WARN_ON(!dmabuf || !constraints))
> +		return -EINVAL;
> +
> +	mutex_lock(&dmabuf->lock);
> +	*constraints = dmabuf->constraints;
> +	mutex_unlock(&dmabuf->lock);
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_get_constraints);
> +
> +/**
> + * dma_buf_recalc_constraints - *recalculate* the constraints for the buffer
> + *  afresh, from the list of currently attached devices; this could be useful
> + *  cross-check the current constraints, for exporters that might want to be
> + *  'paranoid' about the device constraints.
> + *
> + *  returns error on invalid inputs
> + *
> + * @dmabuf:		[in]	buffer to get constraints of
> + * @constraints:	[out]	recalculated constraints are returned in this
> + */
> +int dma_buf_recalc_constraints(struct dma_buf *dmabuf,
> +			    struct device_dma_parameters *constraints)
> +{
> +	struct device_dma_parameters calc_cons;
> +	int ret = 0;
> +
> +	if (WARN_ON(!dmabuf || !constraints))
> +		return -EINVAL;
> +
> +	mutex_lock(&dmabuf->lock);
> +	ret = recalc_constraints(dmabuf, &calc_cons);
> +	if (!ret)
> +		*constraints = calc_cons;
> +
> +	mutex_unlock(&dmabuf->lock);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_recalc_constraints);
> +
>  #ifdef CONFIG_DEBUG_FS
>  static int dma_buf_describe(struct seq_file *s)
>  {
> @@ -801,6 +920,11 @@ static int dma_buf_describe(struct seq_file *s)
>  				buf_obj->file->f_flags, buf_obj->file->f_mode,
>  				file_count(buf_obj->file),
>  				buf_obj->exp_name);
> +		seq_printf(s, "\tConstraints: Seg Count: %08u, Seg Size: %08u",
> +				buf_obj->constraints.max_segment_count,
> +				buf_obj->constraints.max_segment_size);
> +		seq_printf(s, " seg boundary mask: %08lx\n",
> +				buf_obj->constraints.segment_boundary_mask);
>  
>  		seq_puts(s, "\tAttached Devices:\n");
>  		attach_count = 0;
> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> index 694e1fe1c4b4..489ad9b2e5ae 100644
> --- a/include/linux/dma-buf.h
> +++ b/include/linux/dma-buf.h
> @@ -34,6 +34,7 @@
>  #include <linux/wait.h>
>  
>  struct device;
> +struct device_dma_parameters;
>  struct dma_buf;
>  struct dma_buf_attachment;
>  
> @@ -116,6 +117,7 @@ struct dma_buf_ops {
>   * @ops: dma_buf_ops associated with this buffer object.
>   * @exp_name: name of the exporter; useful for debugging.
>   * @list_node: node for dma_buf accounting and debugging.
> + * @constraints: calculated constraints of attached devices.
>   * @priv: exporter specific private data for this buffer object.
>   * @resv: reservation object linked to this dma-buf
>   */
> @@ -130,6 +132,7 @@ struct dma_buf {
>  	void *vmap_ptr;
>  	const char *exp_name;
>  	struct list_head list_node;
> +	struct device_dma_parameters constraints;
>  	void *priv;
>  	struct reservation_object *resv;
>  
> @@ -211,4 +214,8 @@ void *dma_buf_vmap(struct dma_buf *);
>  void dma_buf_vunmap(struct dma_buf *, void *vaddr);
>  int dma_buf_debugfs_create_file(const char *name,
>  				int (*write)(struct seq_file *));
> +
> +int dma_buf_get_constraints(struct dma_buf *, struct device_dma_parameters *);
> +int dma_buf_recalc_constraints(struct dma_buf *,
> +					struct device_dma_parameters *);
>  #endif /* __DMA_BUF_H__ */


WARNING: multiple messages have this Message-ID (diff)
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
To: Sumit Semwal <sumit.semwal@linaro.org>,
	linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
	dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
	linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org
Cc: linaro-kernel@lists.linaro.org,
	stanislawski.tomasz@googlemail.com, robin.murphy@arm.com,
	m.szyprowski@samsung.com
Subject: Re: [RFCv3 2/2] dma-buf: add helpers for sharing attacher constraints with dma-parms
Date: Thu, 29 Jan 2015 15:16:49 +0100	[thread overview]
Message-ID: <54CA40D1.4000701@canonical.com> (raw)
In-Reply-To: <1422347154-15258-2-git-send-email-sumit.semwal@linaro.org>

Op 27-01-15 om 09:25 schreef Sumit Semwal:
> Add some helpers to share the constraints of devices while attaching
> to the dmabuf buffer.
>
> At each attach, the constraints are calculated based on the following:
> - max_segment_size, max_segment_count, segment_boundary_mask from
>    device_dma_parameters.
>
> In case the attaching device's constraints don't match up, attach() fails.
>
> At detach, the constraints are recalculated based on the remaining
> attached devices.
>
> Two helpers are added:
> - dma_buf_get_constraints - which gives the current constraints as calculated
>       during each attach on the buffer till the time,
> - dma_buf_recalc_constraints - which recalculates the constraints for all
>       currently attached devices for the 'paranoid' ones amongst us.
>
> The idea of this patch is largely taken from Rob Clark's RFC at
> https://lkml.org/lkml/2012/7/19/285, and the comments received on it.
>
> Cc: Rob Clark <robdclark@gmail.com>
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> ---
> v3: 
> - Thanks to Russell's comment, remove dma_mask and coherent_dma_mask from
>   constraints' calculation; has a nice side effect of letting us use
>   device_dma_parameters directly to list constraints.
> - update the debugfs output to show constraint info as well.
>   
> v2: split constraints-sharing and allocation helpers
>
>  drivers/dma-buf/dma-buf.c | 126 +++++++++++++++++++++++++++++++++++++++++++++-
>  include/linux/dma-buf.h   |   7 +++
>  2 files changed, 132 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 5be225c2ba98..f363f1440803 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -264,6 +264,66 @@ static inline int is_dma_buf_file(struct file *file)
>  	return file->f_op == &dma_buf_fops;
>  }
>  
> +static inline void init_constraints(struct device_dma_parameters *cons)
> +{
> +	cons->max_segment_count = (unsigned int)-1;
> +	cons->max_segment_size = (unsigned int)-1;
> +	cons->segment_boundary_mask = (unsigned long)-1;
> +}
Use DMA_SEGMENTS_MAX_SEG_COUNT or UINT/ULONG_MAX here instead?

Patches look sane,
Reviewed-By: Maarten Lankhorst <maarten.lankhorst@canonical.com>
> +/*
> + * calc_constraints - calculates if the new attaching device's constraints
> + * match, with the constraints of already attached devices; if yes, returns
> + * the constraints; else return ERR_PTR(-EINVAL)
> + */
> +static int calc_constraints(struct device *dev,
> +			    struct device_dma_parameters *calc_cons)
> +{
> +	struct device_dma_parameters cons = *calc_cons;
> +
> +	cons.max_segment_count = min(cons.max_segment_count,
> +					dma_get_max_seg_count(dev));
> +	cons.max_segment_size = min(cons.max_segment_size,
> +					dma_get_max_seg_size(dev));
> +	cons.segment_boundary_mask &= dma_get_seg_boundary(dev);
> +
> +	if (!cons.max_segment_count ||
> +	    !cons.max_segment_size ||
> +	    !cons.segment_boundary_mask) {
> +		pr_err("Dev: %s's constraints don't match\n", dev_name(dev));
> +		return -EINVAL;
> +	}
> +
> +	*calc_cons = cons;
> +
> +	return 0;
> +}
> +
> +/*
> + * recalc_constraints - recalculates constraints for all attached devices;
> + *  useful for detach() recalculation, and for dma_buf_recalc_constraints()
> + *  helper.
> + *  Returns recalculated constraints in recalc_cons, or error in the unlikely
> + *  case when constraints of attached devices might have changed.
> + */
> +static int recalc_constraints(struct dma_buf *dmabuf,
> +			      struct device_dma_parameters *recalc_cons)
> +{
> +	struct device_dma_parameters calc_cons;
> +	struct dma_buf_attachment *attach;
> +	int ret = 0;
> +
> +	init_constraints(&calc_cons);
> +
> +	list_for_each_entry(attach, &dmabuf->attachments, node) {
> +		ret = calc_constraints(attach->dev, &calc_cons);
> +		if (ret)
> +			return ret;
> +	}
> +	*recalc_cons = calc_cons;
> +	return 0;
> +}
> +
>  /**
>   * dma_buf_export_named - Creates a new dma_buf, and associates an anon file
>   * with this buffer, so it can be exported.
> @@ -313,6 +373,9 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
>  	dmabuf->ops = ops;
>  	dmabuf->size = size;
>  	dmabuf->exp_name = exp_name;
> +
> +	init_constraints(&dmabuf->constraints);
> +
>  	init_waitqueue_head(&dmabuf->poll);
>  	dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll;
>  	dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0;
> @@ -422,7 +485,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  					  struct device *dev)
>  {
>  	struct dma_buf_attachment *attach;
> -	int ret;
> +	int ret = 0;
>  
>  	if (WARN_ON(!dmabuf || !dev))
>  		return ERR_PTR(-EINVAL);
> @@ -436,6 +499,9 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  
>  	mutex_lock(&dmabuf->lock);
>  
> +	if (calc_constraints(dev, &dmabuf->constraints))
> +		goto err_constraints;
> +
>  	if (dmabuf->ops->attach) {
>  		ret = dmabuf->ops->attach(dmabuf, dev, attach);
>  		if (ret)
> @@ -448,6 +514,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  
>  err_attach:
>  	kfree(attach);
> +err_constraints:
>  	mutex_unlock(&dmabuf->lock);
>  	return ERR_PTR(ret);
>  }
> @@ -470,6 +537,8 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
>  	if (dmabuf->ops->detach)
>  		dmabuf->ops->detach(dmabuf, attach);
>  
> +	recalc_constraints(dmabuf, &dmabuf->constraints);
> +
>  	mutex_unlock(&dmabuf->lock);
>  	kfree(attach);
>  }
> @@ -770,6 +839,56 @@ void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr)
>  }
>  EXPORT_SYMBOL_GPL(dma_buf_vunmap);
>  
> +/**
> + * dma_buf_get_constraints - get the *current* constraints of the dmabuf,
> + *  as calculated during each attach(); returns error on invalid inputs
> + *
> + * @dmabuf:		[in]	buffer to get constraints of
> + * @constraints:	[out]	current constraints are returned in this
> + */
> +int dma_buf_get_constraints(struct dma_buf *dmabuf,
> +			    struct device_dma_parameters *constraints)
> +{
> +	if (WARN_ON(!dmabuf || !constraints))
> +		return -EINVAL;
> +
> +	mutex_lock(&dmabuf->lock);
> +	*constraints = dmabuf->constraints;
> +	mutex_unlock(&dmabuf->lock);
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_get_constraints);
> +
> +/**
> + * dma_buf_recalc_constraints - *recalculate* the constraints for the buffer
> + *  afresh, from the list of currently attached devices; this could be useful
> + *  cross-check the current constraints, for exporters that might want to be
> + *  'paranoid' about the device constraints.
> + *
> + *  returns error on invalid inputs
> + *
> + * @dmabuf:		[in]	buffer to get constraints of
> + * @constraints:	[out]	recalculated constraints are returned in this
> + */
> +int dma_buf_recalc_constraints(struct dma_buf *dmabuf,
> +			    struct device_dma_parameters *constraints)
> +{
> +	struct device_dma_parameters calc_cons;
> +	int ret = 0;
> +
> +	if (WARN_ON(!dmabuf || !constraints))
> +		return -EINVAL;
> +
> +	mutex_lock(&dmabuf->lock);
> +	ret = recalc_constraints(dmabuf, &calc_cons);
> +	if (!ret)
> +		*constraints = calc_cons;
> +
> +	mutex_unlock(&dmabuf->lock);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_recalc_constraints);
> +
>  #ifdef CONFIG_DEBUG_FS
>  static int dma_buf_describe(struct seq_file *s)
>  {
> @@ -801,6 +920,11 @@ static int dma_buf_describe(struct seq_file *s)
>  				buf_obj->file->f_flags, buf_obj->file->f_mode,
>  				file_count(buf_obj->file),
>  				buf_obj->exp_name);
> +		seq_printf(s, "\tConstraints: Seg Count: %08u, Seg Size: %08u",
> +				buf_obj->constraints.max_segment_count,
> +				buf_obj->constraints.max_segment_size);
> +		seq_printf(s, " seg boundary mask: %08lx\n",
> +				buf_obj->constraints.segment_boundary_mask);
>  
>  		seq_puts(s, "\tAttached Devices:\n");
>  		attach_count = 0;
> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> index 694e1fe1c4b4..489ad9b2e5ae 100644
> --- a/include/linux/dma-buf.h
> +++ b/include/linux/dma-buf.h
> @@ -34,6 +34,7 @@
>  #include <linux/wait.h>
>  
>  struct device;
> +struct device_dma_parameters;
>  struct dma_buf;
>  struct dma_buf_attachment;
>  
> @@ -116,6 +117,7 @@ struct dma_buf_ops {
>   * @ops: dma_buf_ops associated with this buffer object.
>   * @exp_name: name of the exporter; useful for debugging.
>   * @list_node: node for dma_buf accounting and debugging.
> + * @constraints: calculated constraints of attached devices.
>   * @priv: exporter specific private data for this buffer object.
>   * @resv: reservation object linked to this dma-buf
>   */
> @@ -130,6 +132,7 @@ struct dma_buf {
>  	void *vmap_ptr;
>  	const char *exp_name;
>  	struct list_head list_node;
> +	struct device_dma_parameters constraints;
>  	void *priv;
>  	struct reservation_object *resv;
>  
> @@ -211,4 +214,8 @@ void *dma_buf_vmap(struct dma_buf *);
>  void dma_buf_vunmap(struct dma_buf *, void *vaddr);
>  int dma_buf_debugfs_create_file(const char *name,
>  				int (*write)(struct seq_file *));
> +
> +int dma_buf_get_constraints(struct dma_buf *, struct device_dma_parameters *);
> +int dma_buf_recalc_constraints(struct dma_buf *,
> +					struct device_dma_parameters *);
>  #endif /* __DMA_BUF_H__ */

--
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: maarten.lankhorst@canonical.com (Maarten Lankhorst)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFCv3 2/2] dma-buf: add helpers for sharing attacher constraints with dma-parms
Date: Thu, 29 Jan 2015 15:16:49 +0100	[thread overview]
Message-ID: <54CA40D1.4000701@canonical.com> (raw)
In-Reply-To: <1422347154-15258-2-git-send-email-sumit.semwal@linaro.org>

Op 27-01-15 om 09:25 schreef Sumit Semwal:
> Add some helpers to share the constraints of devices while attaching
> to the dmabuf buffer.
>
> At each attach, the constraints are calculated based on the following:
> - max_segment_size, max_segment_count, segment_boundary_mask from
>    device_dma_parameters.
>
> In case the attaching device's constraints don't match up, attach() fails.
>
> At detach, the constraints are recalculated based on the remaining
> attached devices.
>
> Two helpers are added:
> - dma_buf_get_constraints - which gives the current constraints as calculated
>       during each attach on the buffer till the time,
> - dma_buf_recalc_constraints - which recalculates the constraints for all
>       currently attached devices for the 'paranoid' ones amongst us.
>
> The idea of this patch is largely taken from Rob Clark's RFC at
> https://lkml.org/lkml/2012/7/19/285, and the comments received on it.
>
> Cc: Rob Clark <robdclark@gmail.com>
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> ---
> v3: 
> - Thanks to Russell's comment, remove dma_mask and coherent_dma_mask from
>   constraints' calculation; has a nice side effect of letting us use
>   device_dma_parameters directly to list constraints.
> - update the debugfs output to show constraint info as well.
>   
> v2: split constraints-sharing and allocation helpers
>
>  drivers/dma-buf/dma-buf.c | 126 +++++++++++++++++++++++++++++++++++++++++++++-
>  include/linux/dma-buf.h   |   7 +++
>  2 files changed, 132 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 5be225c2ba98..f363f1440803 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -264,6 +264,66 @@ static inline int is_dma_buf_file(struct file *file)
>  	return file->f_op == &dma_buf_fops;
>  }
>  
> +static inline void init_constraints(struct device_dma_parameters *cons)
> +{
> +	cons->max_segment_count = (unsigned int)-1;
> +	cons->max_segment_size = (unsigned int)-1;
> +	cons->segment_boundary_mask = (unsigned long)-1;
> +}
Use DMA_SEGMENTS_MAX_SEG_COUNT or UINT/ULONG_MAX here instead?

Patches look sane,
Reviewed-By: Maarten Lankhorst <maarten.lankhorst@canonical.com>
> +/*
> + * calc_constraints - calculates if the new attaching device's constraints
> + * match, with the constraints of already attached devices; if yes, returns
> + * the constraints; else return ERR_PTR(-EINVAL)
> + */
> +static int calc_constraints(struct device *dev,
> +			    struct device_dma_parameters *calc_cons)
> +{
> +	struct device_dma_parameters cons = *calc_cons;
> +
> +	cons.max_segment_count = min(cons.max_segment_count,
> +					dma_get_max_seg_count(dev));
> +	cons.max_segment_size = min(cons.max_segment_size,
> +					dma_get_max_seg_size(dev));
> +	cons.segment_boundary_mask &= dma_get_seg_boundary(dev);
> +
> +	if (!cons.max_segment_count ||
> +	    !cons.max_segment_size ||
> +	    !cons.segment_boundary_mask) {
> +		pr_err("Dev: %s's constraints don't match\n", dev_name(dev));
> +		return -EINVAL;
> +	}
> +
> +	*calc_cons = cons;
> +
> +	return 0;
> +}
> +
> +/*
> + * recalc_constraints - recalculates constraints for all attached devices;
> + *  useful for detach() recalculation, and for dma_buf_recalc_constraints()
> + *  helper.
> + *  Returns recalculated constraints in recalc_cons, or error in the unlikely
> + *  case when constraints of attached devices might have changed.
> + */
> +static int recalc_constraints(struct dma_buf *dmabuf,
> +			      struct device_dma_parameters *recalc_cons)
> +{
> +	struct device_dma_parameters calc_cons;
> +	struct dma_buf_attachment *attach;
> +	int ret = 0;
> +
> +	init_constraints(&calc_cons);
> +
> +	list_for_each_entry(attach, &dmabuf->attachments, node) {
> +		ret = calc_constraints(attach->dev, &calc_cons);
> +		if (ret)
> +			return ret;
> +	}
> +	*recalc_cons = calc_cons;
> +	return 0;
> +}
> +
>  /**
>   * dma_buf_export_named - Creates a new dma_buf, and associates an anon file
>   * with this buffer, so it can be exported.
> @@ -313,6 +373,9 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
>  	dmabuf->ops = ops;
>  	dmabuf->size = size;
>  	dmabuf->exp_name = exp_name;
> +
> +	init_constraints(&dmabuf->constraints);
> +
>  	init_waitqueue_head(&dmabuf->poll);
>  	dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll;
>  	dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0;
> @@ -422,7 +485,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  					  struct device *dev)
>  {
>  	struct dma_buf_attachment *attach;
> -	int ret;
> +	int ret = 0;
>  
>  	if (WARN_ON(!dmabuf || !dev))
>  		return ERR_PTR(-EINVAL);
> @@ -436,6 +499,9 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  
>  	mutex_lock(&dmabuf->lock);
>  
> +	if (calc_constraints(dev, &dmabuf->constraints))
> +		goto err_constraints;
> +
>  	if (dmabuf->ops->attach) {
>  		ret = dmabuf->ops->attach(dmabuf, dev, attach);
>  		if (ret)
> @@ -448,6 +514,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  
>  err_attach:
>  	kfree(attach);
> +err_constraints:
>  	mutex_unlock(&dmabuf->lock);
>  	return ERR_PTR(ret);
>  }
> @@ -470,6 +537,8 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
>  	if (dmabuf->ops->detach)
>  		dmabuf->ops->detach(dmabuf, attach);
>  
> +	recalc_constraints(dmabuf, &dmabuf->constraints);
> +
>  	mutex_unlock(&dmabuf->lock);
>  	kfree(attach);
>  }
> @@ -770,6 +839,56 @@ void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr)
>  }
>  EXPORT_SYMBOL_GPL(dma_buf_vunmap);
>  
> +/**
> + * dma_buf_get_constraints - get the *current* constraints of the dmabuf,
> + *  as calculated during each attach(); returns error on invalid inputs
> + *
> + * @dmabuf:		[in]	buffer to get constraints of
> + * @constraints:	[out]	current constraints are returned in this
> + */
> +int dma_buf_get_constraints(struct dma_buf *dmabuf,
> +			    struct device_dma_parameters *constraints)
> +{
> +	if (WARN_ON(!dmabuf || !constraints))
> +		return -EINVAL;
> +
> +	mutex_lock(&dmabuf->lock);
> +	*constraints = dmabuf->constraints;
> +	mutex_unlock(&dmabuf->lock);
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_get_constraints);
> +
> +/**
> + * dma_buf_recalc_constraints - *recalculate* the constraints for the buffer
> + *  afresh, from the list of currently attached devices; this could be useful
> + *  cross-check the current constraints, for exporters that might want to be
> + *  'paranoid' about the device constraints.
> + *
> + *  returns error on invalid inputs
> + *
> + * @dmabuf:		[in]	buffer to get constraints of
> + * @constraints:	[out]	recalculated constraints are returned in this
> + */
> +int dma_buf_recalc_constraints(struct dma_buf *dmabuf,
> +			    struct device_dma_parameters *constraints)
> +{
> +	struct device_dma_parameters calc_cons;
> +	int ret = 0;
> +
> +	if (WARN_ON(!dmabuf || !constraints))
> +		return -EINVAL;
> +
> +	mutex_lock(&dmabuf->lock);
> +	ret = recalc_constraints(dmabuf, &calc_cons);
> +	if (!ret)
> +		*constraints = calc_cons;
> +
> +	mutex_unlock(&dmabuf->lock);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_recalc_constraints);
> +
>  #ifdef CONFIG_DEBUG_FS
>  static int dma_buf_describe(struct seq_file *s)
>  {
> @@ -801,6 +920,11 @@ static int dma_buf_describe(struct seq_file *s)
>  				buf_obj->file->f_flags, buf_obj->file->f_mode,
>  				file_count(buf_obj->file),
>  				buf_obj->exp_name);
> +		seq_printf(s, "\tConstraints: Seg Count: %08u, Seg Size: %08u",
> +				buf_obj->constraints.max_segment_count,
> +				buf_obj->constraints.max_segment_size);
> +		seq_printf(s, " seg boundary mask: %08lx\n",
> +				buf_obj->constraints.segment_boundary_mask);
>  
>  		seq_puts(s, "\tAttached Devices:\n");
>  		attach_count = 0;
> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> index 694e1fe1c4b4..489ad9b2e5ae 100644
> --- a/include/linux/dma-buf.h
> +++ b/include/linux/dma-buf.h
> @@ -34,6 +34,7 @@
>  #include <linux/wait.h>
>  
>  struct device;
> +struct device_dma_parameters;
>  struct dma_buf;
>  struct dma_buf_attachment;
>  
> @@ -116,6 +117,7 @@ struct dma_buf_ops {
>   * @ops: dma_buf_ops associated with this buffer object.
>   * @exp_name: name of the exporter; useful for debugging.
>   * @list_node: node for dma_buf accounting and debugging.
> + * @constraints: calculated constraints of attached devices.
>   * @priv: exporter specific private data for this buffer object.
>   * @resv: reservation object linked to this dma-buf
>   */
> @@ -130,6 +132,7 @@ struct dma_buf {
>  	void *vmap_ptr;
>  	const char *exp_name;
>  	struct list_head list_node;
> +	struct device_dma_parameters constraints;
>  	void *priv;
>  	struct reservation_object *resv;
>  
> @@ -211,4 +214,8 @@ void *dma_buf_vmap(struct dma_buf *);
>  void dma_buf_vunmap(struct dma_buf *, void *vaddr);
>  int dma_buf_debugfs_create_file(const char *name,
>  				int (*write)(struct seq_file *));
> +
> +int dma_buf_get_constraints(struct dma_buf *, struct device_dma_parameters *);
> +int dma_buf_recalc_constraints(struct dma_buf *,
> +					struct device_dma_parameters *);
>  #endif /* __DMA_BUF_H__ */

WARNING: multiple messages have this Message-ID (diff)
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
To: Sumit Semwal <sumit.semwal@linaro.org>,
	linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
	dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
	linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org
Cc: robin.murphy@arm.com, linaro-kernel@lists.linaro.org,
	stanislawski.tomasz@googlemail.com, m.szyprowski@samsung.com
Subject: Re: [RFCv3 2/2] dma-buf: add helpers for sharing attacher constraints with dma-parms
Date: Thu, 29 Jan 2015 15:16:49 +0100	[thread overview]
Message-ID: <54CA40D1.4000701@canonical.com> (raw)
In-Reply-To: <1422347154-15258-2-git-send-email-sumit.semwal@linaro.org>

Op 27-01-15 om 09:25 schreef Sumit Semwal:
> Add some helpers to share the constraints of devices while attaching
> to the dmabuf buffer.
>
> At each attach, the constraints are calculated based on the following:
> - max_segment_size, max_segment_count, segment_boundary_mask from
>    device_dma_parameters.
>
> In case the attaching device's constraints don't match up, attach() fails.
>
> At detach, the constraints are recalculated based on the remaining
> attached devices.
>
> Two helpers are added:
> - dma_buf_get_constraints - which gives the current constraints as calculated
>       during each attach on the buffer till the time,
> - dma_buf_recalc_constraints - which recalculates the constraints for all
>       currently attached devices for the 'paranoid' ones amongst us.
>
> The idea of this patch is largely taken from Rob Clark's RFC at
> https://lkml.org/lkml/2012/7/19/285, and the comments received on it.
>
> Cc: Rob Clark <robdclark@gmail.com>
> Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
> ---
> v3: 
> - Thanks to Russell's comment, remove dma_mask and coherent_dma_mask from
>   constraints' calculation; has a nice side effect of letting us use
>   device_dma_parameters directly to list constraints.
> - update the debugfs output to show constraint info as well.
>   
> v2: split constraints-sharing and allocation helpers
>
>  drivers/dma-buf/dma-buf.c | 126 +++++++++++++++++++++++++++++++++++++++++++++-
>  include/linux/dma-buf.h   |   7 +++
>  2 files changed, 132 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 5be225c2ba98..f363f1440803 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -264,6 +264,66 @@ static inline int is_dma_buf_file(struct file *file)
>  	return file->f_op == &dma_buf_fops;
>  }
>  
> +static inline void init_constraints(struct device_dma_parameters *cons)
> +{
> +	cons->max_segment_count = (unsigned int)-1;
> +	cons->max_segment_size = (unsigned int)-1;
> +	cons->segment_boundary_mask = (unsigned long)-1;
> +}
Use DMA_SEGMENTS_MAX_SEG_COUNT or UINT/ULONG_MAX here instead?

Patches look sane,
Reviewed-By: Maarten Lankhorst <maarten.lankhorst@canonical.com>
> +/*
> + * calc_constraints - calculates if the new attaching device's constraints
> + * match, with the constraints of already attached devices; if yes, returns
> + * the constraints; else return ERR_PTR(-EINVAL)
> + */
> +static int calc_constraints(struct device *dev,
> +			    struct device_dma_parameters *calc_cons)
> +{
> +	struct device_dma_parameters cons = *calc_cons;
> +
> +	cons.max_segment_count = min(cons.max_segment_count,
> +					dma_get_max_seg_count(dev));
> +	cons.max_segment_size = min(cons.max_segment_size,
> +					dma_get_max_seg_size(dev));
> +	cons.segment_boundary_mask &= dma_get_seg_boundary(dev);
> +
> +	if (!cons.max_segment_count ||
> +	    !cons.max_segment_size ||
> +	    !cons.segment_boundary_mask) {
> +		pr_err("Dev: %s's constraints don't match\n", dev_name(dev));
> +		return -EINVAL;
> +	}
> +
> +	*calc_cons = cons;
> +
> +	return 0;
> +}
> +
> +/*
> + * recalc_constraints - recalculates constraints for all attached devices;
> + *  useful for detach() recalculation, and for dma_buf_recalc_constraints()
> + *  helper.
> + *  Returns recalculated constraints in recalc_cons, or error in the unlikely
> + *  case when constraints of attached devices might have changed.
> + */
> +static int recalc_constraints(struct dma_buf *dmabuf,
> +			      struct device_dma_parameters *recalc_cons)
> +{
> +	struct device_dma_parameters calc_cons;
> +	struct dma_buf_attachment *attach;
> +	int ret = 0;
> +
> +	init_constraints(&calc_cons);
> +
> +	list_for_each_entry(attach, &dmabuf->attachments, node) {
> +		ret = calc_constraints(attach->dev, &calc_cons);
> +		if (ret)
> +			return ret;
> +	}
> +	*recalc_cons = calc_cons;
> +	return 0;
> +}
> +
>  /**
>   * dma_buf_export_named - Creates a new dma_buf, and associates an anon file
>   * with this buffer, so it can be exported.
> @@ -313,6 +373,9 @@ struct dma_buf *dma_buf_export_named(void *priv, const struct dma_buf_ops *ops,
>  	dmabuf->ops = ops;
>  	dmabuf->size = size;
>  	dmabuf->exp_name = exp_name;
> +
> +	init_constraints(&dmabuf->constraints);
> +
>  	init_waitqueue_head(&dmabuf->poll);
>  	dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll;
>  	dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0;
> @@ -422,7 +485,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  					  struct device *dev)
>  {
>  	struct dma_buf_attachment *attach;
> -	int ret;
> +	int ret = 0;
>  
>  	if (WARN_ON(!dmabuf || !dev))
>  		return ERR_PTR(-EINVAL);
> @@ -436,6 +499,9 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  
>  	mutex_lock(&dmabuf->lock);
>  
> +	if (calc_constraints(dev, &dmabuf->constraints))
> +		goto err_constraints;
> +
>  	if (dmabuf->ops->attach) {
>  		ret = dmabuf->ops->attach(dmabuf, dev, attach);
>  		if (ret)
> @@ -448,6 +514,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
>  
>  err_attach:
>  	kfree(attach);
> +err_constraints:
>  	mutex_unlock(&dmabuf->lock);
>  	return ERR_PTR(ret);
>  }
> @@ -470,6 +537,8 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
>  	if (dmabuf->ops->detach)
>  		dmabuf->ops->detach(dmabuf, attach);
>  
> +	recalc_constraints(dmabuf, &dmabuf->constraints);
> +
>  	mutex_unlock(&dmabuf->lock);
>  	kfree(attach);
>  }
> @@ -770,6 +839,56 @@ void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr)
>  }
>  EXPORT_SYMBOL_GPL(dma_buf_vunmap);
>  
> +/**
> + * dma_buf_get_constraints - get the *current* constraints of the dmabuf,
> + *  as calculated during each attach(); returns error on invalid inputs
> + *
> + * @dmabuf:		[in]	buffer to get constraints of
> + * @constraints:	[out]	current constraints are returned in this
> + */
> +int dma_buf_get_constraints(struct dma_buf *dmabuf,
> +			    struct device_dma_parameters *constraints)
> +{
> +	if (WARN_ON(!dmabuf || !constraints))
> +		return -EINVAL;
> +
> +	mutex_lock(&dmabuf->lock);
> +	*constraints = dmabuf->constraints;
> +	mutex_unlock(&dmabuf->lock);
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_get_constraints);
> +
> +/**
> + * dma_buf_recalc_constraints - *recalculate* the constraints for the buffer
> + *  afresh, from the list of currently attached devices; this could be useful
> + *  cross-check the current constraints, for exporters that might want to be
> + *  'paranoid' about the device constraints.
> + *
> + *  returns error on invalid inputs
> + *
> + * @dmabuf:		[in]	buffer to get constraints of
> + * @constraints:	[out]	recalculated constraints are returned in this
> + */
> +int dma_buf_recalc_constraints(struct dma_buf *dmabuf,
> +			    struct device_dma_parameters *constraints)
> +{
> +	struct device_dma_parameters calc_cons;
> +	int ret = 0;
> +
> +	if (WARN_ON(!dmabuf || !constraints))
> +		return -EINVAL;
> +
> +	mutex_lock(&dmabuf->lock);
> +	ret = recalc_constraints(dmabuf, &calc_cons);
> +	if (!ret)
> +		*constraints = calc_cons;
> +
> +	mutex_unlock(&dmabuf->lock);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(dma_buf_recalc_constraints);
> +
>  #ifdef CONFIG_DEBUG_FS
>  static int dma_buf_describe(struct seq_file *s)
>  {
> @@ -801,6 +920,11 @@ static int dma_buf_describe(struct seq_file *s)
>  				buf_obj->file->f_flags, buf_obj->file->f_mode,
>  				file_count(buf_obj->file),
>  				buf_obj->exp_name);
> +		seq_printf(s, "\tConstraints: Seg Count: %08u, Seg Size: %08u",
> +				buf_obj->constraints.max_segment_count,
> +				buf_obj->constraints.max_segment_size);
> +		seq_printf(s, " seg boundary mask: %08lx\n",
> +				buf_obj->constraints.segment_boundary_mask);
>  
>  		seq_puts(s, "\tAttached Devices:\n");
>  		attach_count = 0;
> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> index 694e1fe1c4b4..489ad9b2e5ae 100644
> --- a/include/linux/dma-buf.h
> +++ b/include/linux/dma-buf.h
> @@ -34,6 +34,7 @@
>  #include <linux/wait.h>
>  
>  struct device;
> +struct device_dma_parameters;
>  struct dma_buf;
>  struct dma_buf_attachment;
>  
> @@ -116,6 +117,7 @@ struct dma_buf_ops {
>   * @ops: dma_buf_ops associated with this buffer object.
>   * @exp_name: name of the exporter; useful for debugging.
>   * @list_node: node for dma_buf accounting and debugging.
> + * @constraints: calculated constraints of attached devices.
>   * @priv: exporter specific private data for this buffer object.
>   * @resv: reservation object linked to this dma-buf
>   */
> @@ -130,6 +132,7 @@ struct dma_buf {
>  	void *vmap_ptr;
>  	const char *exp_name;
>  	struct list_head list_node;
> +	struct device_dma_parameters constraints;
>  	void *priv;
>  	struct reservation_object *resv;
>  
> @@ -211,4 +214,8 @@ void *dma_buf_vmap(struct dma_buf *);
>  void dma_buf_vunmap(struct dma_buf *, void *vaddr);
>  int dma_buf_debugfs_create_file(const char *name,
>  				int (*write)(struct seq_file *));
> +
> +int dma_buf_get_constraints(struct dma_buf *, struct device_dma_parameters *);
> +int dma_buf_recalc_constraints(struct dma_buf *,
> +					struct device_dma_parameters *);
>  #endif /* __DMA_BUF_H__ */

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2015-01-29 14:17 UTC|newest]

Thread overview: 262+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-27  8:25 [RFCv3 1/2] device: add dma_params->max_segment_count Sumit Semwal
2015-01-27  8:25 ` Sumit Semwal
2015-01-27  8:25 ` Sumit Semwal
2015-01-27  8:25 ` [RFCv3 2/2] dma-buf: add helpers for sharing attacher constraints with dma-parms Sumit Semwal
2015-01-27  8:25   ` Sumit Semwal
2015-01-27  8:25   ` Sumit Semwal
2015-01-27  8:25   ` Sumit Semwal
2015-01-29 14:16   ` Maarten Lankhorst [this message]
2015-01-29 14:16     ` Maarten Lankhorst
2015-01-29 14:16     ` Maarten Lankhorst
2015-01-29 14:16     ` Maarten Lankhorst
2015-01-29 14:39   ` Russell King - ARM Linux
2015-01-29 14:39     ` Russell King - ARM Linux
2015-01-29 14:39     ` Russell King - ARM Linux
2015-01-29 14:39     ` Russell King - ARM Linux
2015-01-29 15:30     ` Sumit Semwal
2015-01-29 15:30       ` Sumit Semwal
2015-01-29 15:30       ` Sumit Semwal
2015-01-29 15:30       ` Sumit Semwal
2015-01-29 15:47       ` Russell King - ARM Linux
2015-01-29 15:47         ` Russell King - ARM Linux
2015-01-29 15:47         ` Russell King - ARM Linux
2015-01-29 15:47         ` Russell King - ARM Linux
2015-01-29 15:47         ` Russell King - ARM Linux
2015-01-29 16:55         ` Sumit Semwal
2015-01-29 16:55           ` Sumit Semwal
2015-01-29 16:55           ` Sumit Semwal
2015-01-29 16:55           ` Sumit Semwal
2015-01-29 18:52         ` Rob Clark
2015-01-29 18:52           ` Rob Clark
2015-01-29 18:52           ` Rob Clark
2015-01-29 18:52           ` Rob Clark
2015-01-29 18:52           ` Rob Clark
2015-01-29 19:26           ` Russell King - ARM Linux
2015-01-29 19:26             ` Russell King - ARM Linux
2015-01-29 19:26             ` Russell King - ARM Linux
2015-01-29 19:26             ` Russell King - ARM Linux
2015-01-29 19:26             ` Russell King - ARM Linux
2015-01-29 22:18             ` Rob Clark
2015-01-29 22:18               ` Rob Clark
2015-01-29 22:18               ` Rob Clark
2015-01-29 22:18               ` Rob Clark
2015-01-29 22:31               ` Russell King - ARM Linux
2015-01-29 22:31                 ` Russell King - ARM Linux
2015-01-29 22:31                 ` Russell King - ARM Linux
2015-01-29 22:31                 ` Russell King - ARM Linux
2015-01-29 23:19                 ` Rob Clark
2015-01-29 23:19                   ` Rob Clark
2015-01-29 23:19                   ` Rob Clark
2015-01-29 23:19                   ` Rob Clark
2015-02-02 16:54               ` Daniel Vetter
2015-02-02 16:54                 ` Daniel Vetter
2015-02-02 16:54                 ` Daniel Vetter
2015-02-02 16:54                 ` Daniel Vetter
2015-02-02 20:30                 ` Rob Clark
2015-02-02 20:30                   ` Rob Clark
2015-02-02 20:30                   ` Rob Clark
2015-02-02 20:30                   ` Rob Clark
2015-02-02 21:46                   ` Russell King - ARM Linux
2015-02-02 21:46                     ` Russell King - ARM Linux
2015-02-02 21:46                     ` Russell King - ARM Linux
2015-02-02 21:46                     ` Russell King - ARM Linux
2015-02-02 22:36                     ` Rob Clark
2015-02-02 22:36                       ` Rob Clark
2015-02-02 22:36                       ` Rob Clark
2015-02-02 22:36                       ` Rob Clark
2015-02-02 22:36                       ` Rob Clark
2015-02-03  7:50                       ` Daniel Vetter
2015-02-03  7:50                         ` Daniel Vetter
2015-02-03  7:50                         ` Daniel Vetter
2015-02-03  7:50                         ` Daniel Vetter
2015-02-03  7:46                     ` Daniel Vetter
2015-02-03  7:46                       ` Daniel Vetter
2015-02-03  7:46                       ` Daniel Vetter
2015-02-03  7:46                       ` Daniel Vetter
2015-02-03  7:48                   ` Daniel Vetter
2015-02-03  7:48                     ` Daniel Vetter
2015-02-03  7:48                     ` Daniel Vetter
2015-02-03  7:48                     ` Daniel Vetter
2015-02-03 12:28                     ` Russell King - ARM Linux
2015-02-03 12:28                       ` Russell King - ARM Linux
2015-02-03 12:28                       ` Russell King - ARM Linux
2015-02-03 12:28                       ` Russell King - ARM Linux
2015-02-03 13:00                       ` Daniel Vetter
2015-02-03 13:00                         ` Daniel Vetter
2015-02-03 13:00                         ` Daniel Vetter
2015-02-03 13:00                         ` Daniel Vetter
2015-02-03 13:28                       ` Christian Gmeiner
2015-02-03 13:28                         ` Christian Gmeiner
2015-02-03 13:28                         ` Christian Gmeiner
2015-02-03 13:28                         ` Christian Gmeiner
2015-02-03 13:28                         ` Christian Gmeiner
2015-02-03 14:32                         ` Russell King - ARM Linux
2015-02-03 14:32                           ` Russell King - ARM Linux
2015-02-03 14:32                           ` Russell King - ARM Linux
2015-02-03 14:32                           ` Russell King - ARM Linux
2015-02-03 14:32                           ` Russell King - ARM Linux
2015-02-03 14:25                       ` Rob Clark
2015-02-03 14:25                         ` Rob Clark
2015-02-03 14:25                         ` Rob Clark
2015-02-03 14:25                         ` Rob Clark
2015-02-03 14:04                     ` Rob Clark
2015-02-03 14:04                       ` Rob Clark
2015-02-03 14:04                       ` Rob Clark
2015-02-03 14:04                       ` Rob Clark
2015-02-03 14:17                       ` Arnd Bergmann
2015-02-03 14:17                         ` Arnd Bergmann
2015-02-03 14:17                         ` Arnd Bergmann
2015-02-03 14:17                         ` Arnd Bergmann
2015-02-03 14:41                         ` Russell King - ARM Linux
2015-02-03 14:41                           ` Russell King - ARM Linux
2015-02-03 14:41                           ` Russell King - ARM Linux
2015-02-03 14:41                           ` Russell King - ARM Linux
2015-02-03 14:52                           ` Arnd Bergmann
2015-02-03 14:52                             ` Arnd Bergmann
2015-02-03 14:52                             ` Arnd Bergmann
2015-02-03 15:22                             ` Russell King - ARM Linux
2015-02-03 15:22                               ` Russell King - ARM Linux
2015-02-03 15:22                               ` Russell King - ARM Linux
2015-02-03 15:22                               ` Russell King - ARM Linux
2015-02-03 15:31                               ` [Linaro-mm-sig] " Arnd Bergmann
2015-02-03 15:31                                 ` Arnd Bergmann
2015-02-03 15:31                                 ` Arnd Bergmann
2015-02-03 15:54                                 ` Russell King - ARM Linux
2015-02-03 15:54                                   ` Russell King - ARM Linux
2015-02-03 15:54                                   ` Russell King - ARM Linux
2015-02-03 15:54                                   ` Russell King - ARM Linux
2015-02-03 16:12                                   ` Arnd Bergmann
2015-02-03 16:12                                     ` Arnd Bergmann
2015-02-03 16:12                                     ` Arnd Bergmann
2015-02-03 16:12                                     ` Arnd Bergmann
2015-02-03 16:22                                     ` Rob Clark
2015-02-03 16:22                                       ` Rob Clark
2015-02-03 16:22                                       ` Rob Clark
2015-02-03 16:22                                       ` Rob Clark
2015-02-03 16:36                                       ` Arnd Bergmann
2015-02-03 16:36                                         ` Arnd Bergmann
2015-02-03 16:36                                         ` Arnd Bergmann
2015-02-03 16:36                                         ` Arnd Bergmann
2015-02-03 16:36                                         ` Arnd Bergmann
2015-02-03 20:04                                         ` Daniel Vetter
2015-02-03 20:04                                           ` Daniel Vetter
2015-02-03 20:04                                           ` Daniel Vetter
2015-02-03 20:04                                           ` Daniel Vetter
2015-02-03 21:42                                           ` Arnd Bergmann
2015-02-03 21:42                                             ` Arnd Bergmann
2015-02-03 21:42                                             ` Arnd Bergmann
2015-02-03 21:42                                             ` Arnd Bergmann
2015-02-03 21:42                                             ` Arnd Bergmann
2015-02-03 22:07                                             ` Daniel Vetter
2015-02-03 22:07                                               ` Daniel Vetter
2015-02-03 22:07                                               ` Daniel Vetter
2015-02-03 22:07                                               ` Daniel Vetter
2015-02-04  0:14                                             ` Russell King - ARM Linux
2015-02-04  0:14                                               ` Russell King - ARM Linux
2015-02-04  0:14                                               ` Russell King - ARM Linux
2015-02-04  0:14                                               ` Russell King - ARM Linux
2015-02-03 17:01                                       ` Russell King - ARM Linux
2015-02-03 17:01                                         ` Russell King - ARM Linux
2015-02-03 17:01                                         ` Russell King - ARM Linux
2015-02-03 17:01                                         ` Russell King - ARM Linux
2015-02-03 17:01                                         ` Russell King - ARM Linux
2015-02-03 16:58                                     ` Russell King - ARM Linux
2015-02-03 16:58                                       ` Russell King - ARM Linux
2015-02-03 16:58                                       ` Russell King - ARM Linux
2015-02-03 16:58                                       ` Russell King - ARM Linux
2015-02-03 17:35                                       ` Rob Clark
2015-02-03 17:35                                         ` Rob Clark
2015-02-03 17:35                                         ` Rob Clark
2015-02-03 17:35                                         ` Rob Clark
2015-02-03 20:08                                         ` Daniel Vetter
2015-02-03 20:08                                           ` Daniel Vetter
2015-02-03 20:08                                           ` Daniel Vetter
2015-02-03 20:08                                           ` Daniel Vetter
2015-02-03 20:08                                           ` Daniel Vetter
2015-02-03 21:44                                         ` Arnd Bergmann
2015-02-03 21:44                                           ` Arnd Bergmann
2015-02-03 21:44                                           ` Arnd Bergmann
2015-02-03 21:44                                           ` Arnd Bergmann
2015-02-03 21:44                                           ` Arnd Bergmann
2015-02-03 15:25                             ` Rob Clark
2015-02-03 15:25                               ` Rob Clark
2015-02-03 15:25                               ` Rob Clark
2015-02-03 15:25                               ` Rob Clark
2015-02-03 15:19                           ` Rob Clark
2015-02-03 15:19                             ` Rob Clark
2015-02-03 15:19                             ` Rob Clark
2015-02-03 15:19                             ` Rob Clark
2015-02-03 14:37                       ` Russell King - ARM Linux
2015-02-03 14:37                         ` Russell King - ARM Linux
2015-02-03 14:37                         ` Russell King - ARM Linux
2015-02-03 14:37                         ` Russell King - ARM Linux
2015-02-03 14:37                         ` Russell King - ARM Linux
2015-02-03 14:44                         ` Rob Clark
2015-02-03 14:44                           ` Rob Clark
2015-02-03 14:44                           ` Rob Clark
2015-02-03 14:44                           ` Rob Clark
2015-02-03 14:58                           ` Russell King - ARM Linux
2015-02-03 14:58                             ` Russell King - ARM Linux
2015-02-03 14:58                             ` Russell King - ARM Linux
2015-02-03 14:58                             ` Russell King - ARM Linux
2015-02-03 14:58                             ` Russell King - ARM Linux
2015-02-02  5:53             ` Sumit Semwal
2015-02-02  5:53               ` Sumit Semwal
2015-02-02  5:53               ` Sumit Semwal
2015-02-02  5:53               ` Sumit Semwal
2015-02-11  8:28   ` Marek Szyprowski
2015-02-11  8:28     ` Marek Szyprowski
2015-02-11  8:28     ` Marek Szyprowski
2015-02-11 11:12     ` Russell King - ARM Linux
2015-02-11 11:12       ` Russell King - ARM Linux
2015-02-11 11:12       ` Russell King - ARM Linux
2015-02-11 11:12       ` Russell King - ARM Linux
2015-02-11 11:23       ` Rob Clark
2015-02-11 11:23         ` Rob Clark
2015-02-11 11:23         ` Rob Clark
2015-02-11 11:23         ` Rob Clark
2015-02-11 11:23         ` Rob Clark
2015-02-11 12:56         ` Daniel Vetter
2015-02-11 12:56           ` Daniel Vetter
2015-02-11 12:56           ` Daniel Vetter
2015-02-11 12:56           ` Daniel Vetter
2015-02-11 12:56           ` Daniel Vetter
2015-02-11 13:30           ` Rob Clark
2015-02-11 13:30             ` Rob Clark
2015-02-11 13:30             ` Rob Clark
2015-02-11 13:30             ` Rob Clark
2015-02-11 13:30             ` Rob Clark
2015-02-11 12:20       ` Marek Szyprowski
2015-02-11 12:20         ` Marek Szyprowski
2015-02-11 12:20         ` Marek Szyprowski
2015-02-11 16:23         ` Russell King - ARM Linux
2015-02-11 16:23           ` Russell King - ARM Linux
2015-02-11 16:23           ` Russell King - ARM Linux
2015-02-11 16:23           ` Russell King - ARM Linux
2015-05-05 14:41           ` Sumit Semwal
2015-05-05 14:41             ` Sumit Semwal
2015-05-05 14:41             ` Sumit Semwal
2015-05-05 14:41             ` Sumit Semwal
2015-06-03  6:39             ` [Linaro-mm-sig] " Hans Verkuil
2015-06-03  6:39               ` Hans Verkuil
2015-06-03  6:39               ` Hans Verkuil
2015-06-03  6:39               ` Hans Verkuil
2015-06-03  8:41               ` Russell King - ARM Linux
2015-06-03  8:41                 ` Russell King - ARM Linux
2015-06-03  8:41                 ` Russell King - ARM Linux
2015-06-03  8:41                 ` Russell King - ARM Linux
2015-06-03  8:41                 ` Russell King - ARM Linux
2015-06-03  9:37                 ` Hans Verkuil
2015-06-03  9:37                   ` Hans Verkuil
2015-06-03  9:37                   ` Hans Verkuil
2015-06-03  9:37                   ` Hans Verkuil
2015-06-04  5:24                   ` Sumit Semwal
2015-06-04  5:24                     ` Sumit Semwal
2015-06-04  5:24                     ` Sumit Semwal
2015-06-04  5:24                     ` Sumit Semwal
2015-01-28 14:09 ` [RFCv3 1/2] device: add dma_params->max_segment_count Marek Szyprowski
2015-01-28 14:09   ` Marek Szyprowski
2015-01-28 14:09   ` Marek Szyprowski
2015-06-03  6:13 ` [Linaro-mm-sig] " Hans Verkuil
2015-06-03  6:13   ` Hans Verkuil
2015-06-03  6:13   ` Hans Verkuil

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=54CA40D1.4000701@canonical.com \
    --to=maarten.lankhorst@canonical.com \
    --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=robin.murphy@arm.com \
    --cc=stanislawski.tomasz@googlemail.com \
    --cc=sumit.semwal@linaro.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.