[PATCH] dma-buf, drm, ion: Propagate error code from dma_buf_start_cpu_access()

Sumit Semwal sumit.semwal at linaro.org
Mon Mar 21 06:13:29 UTC 2016


On 19 March 2016 at 15:39, Daniel Vetter <daniel at ffwll.ch> wrote:
> On Fri, Mar 18, 2016 at 08:02:39PM +0000, Chris Wilson wrote:
>> Drivers, especially i915.ko, can fail during the initial migration of a
>> dma-buf for CPU access. However, the error code from the driver was not
>> being propagated back to ioctl and so userspace was blissfully ignorant
>> of the failure. Rendering corruption ensues.
>>
>> Whilst fixing the ioctl to return the error code from
>> dma_buf_start_cpu_access(), also do the same for
>> dma_buf_end_cpu_access().  For most drivers, dma_buf_end_cpu_access()
>> cannot fail. i915.ko however, as most drivers would, wants to avoid being
>> uninterruptible (as would be required to guarrantee no failure when
>> flushing the buffer to the device). As userspace already has to handle
>> errors from the SYNC_IOCTL, take advantage of this to be able to restart
>> the syscall across signals.
>>
>> This fixes a coherency issue for i915.ko as well as reducing the
>> uninterruptible hold upon its BKL, the struct_mutex.
>>
>> Fixes commit c11e391da2a8fe973c3c2398452000bed505851e
>> Author: Daniel Vetter <daniel.vetter at ffwll.ch>
>> Date:   Thu Feb 11 20:04:51 2016 -0200
>>
>>     dma-buf: Add ioctls to allow userspace to flush
>>
>> Testcase: igt/gem_concurrent_blit/*dmabuf*interruptible
>> Testcase: igt/prime_mmap_coherency/ioctl-errors
>> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>> Cc: Tiago Vignatti <tiago.vignatti at intel.com>
>> Cc: Stéphane Marchesin <marcheu at chromium.org>
>> Cc: David Herrmann <dh.herrmann at gmail.com>
>> Cc: Sumit Semwal <sumit.semwal at linaro.org>
>> Cc: Daniel Vetter <daniel.vetter at intel.com>
>> CC: linux-media at vger.kernel.org
>> Cc: dri-devel at lists.freedesktop.org
>> Cc: linaro-mm-sig at lists.linaro.org
>> Cc: intel-gfx at lists.freedesktop.org
>> Cc: devel at driverdev.osuosl.org
>
> Applied to drm-misc, I'll send a pull to Dave the next few days if no one
> screams.
> -Daniel
Thanks for pulling it via drm-misc, Daniel.
Chris, I feel since this is an API change, it also needs an update to
the Documentation file.
With that, and a minor nit below, please feel free to add
Acked-by: Sumit Semwal <sumit.semwal at linaro.org>

>
>> ---
>>  drivers/dma-buf/dma-buf.c                 | 17 +++++++++++------
>>  drivers/gpu/drm/i915/i915_gem_dmabuf.c    | 15 +++++----------
>>  drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c |  5 +++--
>>  drivers/gpu/drm/udl/udl_fb.c              |  4 ++--
>>  drivers/staging/android/ion/ion.c         |  6 ++++--
>>  include/linux/dma-buf.h                   |  6 +++---
>>  6 files changed, 28 insertions(+), 25 deletions(-)
>>
>> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
>> index 9810d1df0691..774a60f4309a 100644
>> --- a/drivers/dma-buf/dma-buf.c
>> +++ b/drivers/dma-buf/dma-buf.c
>> @@ -259,6 +259,7 @@ static long dma_buf_ioctl(struct file *file,
>>       struct dma_buf *dmabuf;
>>       struct dma_buf_sync sync;
>>       enum dma_data_direction direction;
>> +     int ret;
>>
>>       dmabuf = file->private_data;
>>
>> @@ -285,11 +286,11 @@ static long dma_buf_ioctl(struct file *file,
>>               }
>>
>>               if (sync.flags & DMA_BUF_SYNC_END)
>> -                     dma_buf_end_cpu_access(dmabuf, direction);
>> +                     ret = dma_buf_end_cpu_access(dmabuf, direction);
>>               else
>> -                     dma_buf_begin_cpu_access(dmabuf, direction);
>> +                     ret = dma_buf_begin_cpu_access(dmabuf, direction);
>>
>> -             return 0;
>> +             return ret;
>>       default:
>>               return -ENOTTY;
>>       }
>> @@ -613,13 +614,17 @@ EXPORT_SYMBOL_GPL(dma_buf_begin_cpu_access);
>>   *
>>   * This call must always succeed.
>>   */
Perhaps update the above comment to reflect the change as well?

>> -void dma_buf_end_cpu_access(struct dma_buf *dmabuf,
>> -                         enum dma_data_direction direction)
>> +int dma_buf_end_cpu_access(struct dma_buf *dmabuf,
>> +                        enum dma_data_direction direction)
>>  {
>> +     int ret = 0;
>> +
>>       WARN_ON(!dmabuf);
>>
>>       if (dmabuf->ops->end_cpu_access)
>> -             dmabuf->ops->end_cpu_access(dmabuf, direction);
>> +             ret = dmabuf->ops->end_cpu_access(dmabuf, direction);
>> +
>> +     return ret;
>>  }
<< snip>>

Best regards,
Sumit.


More information about the dri-devel mailing list