All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@linuxfoundation.org>
To: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Mathias Nyman <mathias.nyman@linux.intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	airlied@linux.ie,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	Oliver Neukum <oneukum@suse.com>, Christoph Hellwig <hch@lst.de>,
	hdegoede@redhat.com, Alan Stern <stern@rowland.harvard.edu>,
	dri-devel@lists.freedesktop.org, stable@vger.kernel.org,
	Johan Hovold <johan@kernel.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	sean@poorly.run, christian.koenig@amd.com
Subject: Re: [PATCH v3] drm: Use USB controller's DMA mask when importing dmabufs
Date: Tue, 23 Feb 2021 12:27:38 +0100	[thread overview]
Message-ID: <YDTmqpXssyTPWJQa@kroah.com> (raw)
In-Reply-To: <YDTk3L3gNxDE3YrC@kroah.com>

On Tue, Feb 23, 2021 at 12:19:56PM +0100, Greg KH wrote:
> On Tue, Feb 23, 2021 at 11:58:42AM +0100, Thomas Zimmermann wrote:
> > USB devices cannot perform DMA and hence have no dma_mask set in their
> > device structure. Importing dmabuf into a USB-based driver fails, which
> > break joining and mirroring of display in X11.
> > 
> > For USB devices, pick the associated USB controller as attachment device,
> > so that it can perform DMA. If the DMa controller does not support DMA
> > transfers, we're aout of luck and cannot import.
> > 
> > Drivers should use DRM_GEM_SHMEM_DROVER_OPS_USB to initialize their
> > instance of struct drm_driver.
> > 
> > Tested by joining/mirroring displays of udl and radeon un der Gnome/X11.
> > 
> > v3:
> > 	* drop gem_create_object
> > 	* use DMA mask of USB controller, if any (Daniel, Christian, Noralf)
> > v2:
> > 	* move fix to importer side (Christian, Daniel)
> > 	* update SHMEM and CMA helpers for new PRIME callbacks
> > 
> > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> > Fixes: 6eb0233ec2d0 ("usb: don't inherity DMA properties for USB devices")
> > Cc: Christoph Hellwig <hch@lst.de>
> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Cc: Johan Hovold <johan@kernel.org>
> > Cc: Alan Stern <stern@rowland.harvard.edu>
> > Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > Cc: Mathias Nyman <mathias.nyman@linux.intel.com>
> > Cc: Oliver Neukum <oneukum@suse.com>
> > Cc: Thomas Gleixner <tglx@linutronix.de>
> > Cc: <stable@vger.kernel.org> # v5.10+
> > ---
> >  drivers/gpu/drm/drm_prime.c        | 36 ++++++++++++++++++++++++++++++
> >  drivers/gpu/drm/tiny/gm12u320.c    |  2 +-
> >  drivers/gpu/drm/udl/udl_drv.c      |  2 +-
> >  include/drm/drm_gem_shmem_helper.h | 13 +++++++++++
> >  include/drm/drm_prime.h            |  5 +++++
> >  5 files changed, 56 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> > index 2a54f86856af..9015850f2160 100644
> > --- a/drivers/gpu/drm/drm_prime.c
> > +++ b/drivers/gpu/drm/drm_prime.c
> > @@ -29,6 +29,7 @@
> >  #include <linux/export.h>
> >  #include <linux/dma-buf.h>
> >  #include <linux/rbtree.h>
> > +#include <linux/usb.h>
> > 
> >  #include <drm/drm.h>
> >  #include <drm/drm_drv.h>
> > @@ -1055,3 +1056,38 @@ void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg)
> >  	dma_buf_put(dma_buf);
> >  }
> >  EXPORT_SYMBOL(drm_prime_gem_destroy);
> > +
> > +/**
> > + * drm_gem_prime_import_usb - helper library implementation of the import callback for USB devices
> > + * @dev: drm_device to import into
> > + * @dma_buf: dma-buf object to import
> > + *
> > + * This is an implementation of drm_gem_prime_import() for USB-based devices.
> > + * USB devices cannot perform DMA directly. This function selects the USB host
> > + * controller as DMA device instead. Drivers can use this as their
> > + * &drm_driver.gem_prime_import implementation.
> > + *
> > + * See also drm_gem_prime_import().
> > + */
> > +#ifdef CONFIG_USB
> > +struct drm_gem_object *drm_gem_prime_import_usb(struct drm_device *dev,
> > +						struct dma_buf *dma_buf)
> > +{
> > +	struct usb_device *udev;
> > +	struct device *usbhost;
> > +
> > +	if (dev->dev->bus != &usb_bus_type)
> > +		return ERR_PTR(-ENODEV);
> > +
> > +	udev = interface_to_usbdev(to_usb_interface(dev->dev));
> > +	if (!udev->bus)
> > +		return ERR_PTR(-ENODEV);
> > +
> > +	usbhost = udev->bus->controller;
> > +	if (!usbhost || !usbhost->dma_mask)
> > +		return ERR_PTR(-ENODEV);
> 
> If individual USB drivers need access to this type of thing, shouldn't
> that be done in the USB core itself?
> 
> {hint, yes}
> 
> There shouldn't be anything "special" about a DRM driver that needs this
> vs. any other driver that might want to know about DMA things related to
> a specific USB device.  Why isn't this an issue with the existing
> storage or v4l USB devices?

Also, where is the locking for any of the above?  What guarantees that
the device will not go away during those pointer walks?

thanks,

greg k-h
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

WARNING: multiple messages have this Message-ID (diff)
From: Greg KH <gregkh@linuxfoundation.org>
To: Thomas Zimmermann <tzimmermann@suse.de>
Cc: daniel@ffwll.ch, airlied@linux.ie,
	maarten.lankhorst@linux.intel.com, mripard@kernel.org,
	sumit.semwal@linaro.org, christian.koenig@amd.com,
	hdegoede@redhat.com, sean@poorly.run, noralf@tronnes.org,
	dri-devel@lists.freedesktop.org, Christoph Hellwig <hch@lst.de>,
	Johan Hovold <johan@kernel.org>,
	Alan Stern <stern@rowland.harvard.edu>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	Mathias Nyman <mathias.nyman@linux.intel.com>,
	Oliver Neukum <oneukum@suse.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	stable@vger.kernel.org
Subject: Re: [PATCH v3] drm: Use USB controller's DMA mask when importing dmabufs
Date: Tue, 23 Feb 2021 12:27:38 +0100	[thread overview]
Message-ID: <YDTmqpXssyTPWJQa@kroah.com> (raw)
In-Reply-To: <YDTk3L3gNxDE3YrC@kroah.com>

On Tue, Feb 23, 2021 at 12:19:56PM +0100, Greg KH wrote:
> On Tue, Feb 23, 2021 at 11:58:42AM +0100, Thomas Zimmermann wrote:
> > USB devices cannot perform DMA and hence have no dma_mask set in their
> > device structure. Importing dmabuf into a USB-based driver fails, which
> > break joining and mirroring of display in X11.
> > 
> > For USB devices, pick the associated USB controller as attachment device,
> > so that it can perform DMA. If the DMa controller does not support DMA
> > transfers, we're aout of luck and cannot import.
> > 
> > Drivers should use DRM_GEM_SHMEM_DROVER_OPS_USB to initialize their
> > instance of struct drm_driver.
> > 
> > Tested by joining/mirroring displays of udl and radeon un der Gnome/X11.
> > 
> > v3:
> > 	* drop gem_create_object
> > 	* use DMA mask of USB controller, if any (Daniel, Christian, Noralf)
> > v2:
> > 	* move fix to importer side (Christian, Daniel)
> > 	* update SHMEM and CMA helpers for new PRIME callbacks
> > 
> > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> > Fixes: 6eb0233ec2d0 ("usb: don't inherity DMA properties for USB devices")
> > Cc: Christoph Hellwig <hch@lst.de>
> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Cc: Johan Hovold <johan@kernel.org>
> > Cc: Alan Stern <stern@rowland.harvard.edu>
> > Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > Cc: Mathias Nyman <mathias.nyman@linux.intel.com>
> > Cc: Oliver Neukum <oneukum@suse.com>
> > Cc: Thomas Gleixner <tglx@linutronix.de>
> > Cc: <stable@vger.kernel.org> # v5.10+
> > ---
> >  drivers/gpu/drm/drm_prime.c        | 36 ++++++++++++++++++++++++++++++
> >  drivers/gpu/drm/tiny/gm12u320.c    |  2 +-
> >  drivers/gpu/drm/udl/udl_drv.c      |  2 +-
> >  include/drm/drm_gem_shmem_helper.h | 13 +++++++++++
> >  include/drm/drm_prime.h            |  5 +++++
> >  5 files changed, 56 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> > index 2a54f86856af..9015850f2160 100644
> > --- a/drivers/gpu/drm/drm_prime.c
> > +++ b/drivers/gpu/drm/drm_prime.c
> > @@ -29,6 +29,7 @@
> >  #include <linux/export.h>
> >  #include <linux/dma-buf.h>
> >  #include <linux/rbtree.h>
> > +#include <linux/usb.h>
> > 
> >  #include <drm/drm.h>
> >  #include <drm/drm_drv.h>
> > @@ -1055,3 +1056,38 @@ void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg)
> >  	dma_buf_put(dma_buf);
> >  }
> >  EXPORT_SYMBOL(drm_prime_gem_destroy);
> > +
> > +/**
> > + * drm_gem_prime_import_usb - helper library implementation of the import callback for USB devices
> > + * @dev: drm_device to import into
> > + * @dma_buf: dma-buf object to import
> > + *
> > + * This is an implementation of drm_gem_prime_import() for USB-based devices.
> > + * USB devices cannot perform DMA directly. This function selects the USB host
> > + * controller as DMA device instead. Drivers can use this as their
> > + * &drm_driver.gem_prime_import implementation.
> > + *
> > + * See also drm_gem_prime_import().
> > + */
> > +#ifdef CONFIG_USB
> > +struct drm_gem_object *drm_gem_prime_import_usb(struct drm_device *dev,
> > +						struct dma_buf *dma_buf)
> > +{
> > +	struct usb_device *udev;
> > +	struct device *usbhost;
> > +
> > +	if (dev->dev->bus != &usb_bus_type)
> > +		return ERR_PTR(-ENODEV);
> > +
> > +	udev = interface_to_usbdev(to_usb_interface(dev->dev));
> > +	if (!udev->bus)
> > +		return ERR_PTR(-ENODEV);
> > +
> > +	usbhost = udev->bus->controller;
> > +	if (!usbhost || !usbhost->dma_mask)
> > +		return ERR_PTR(-ENODEV);
> 
> If individual USB drivers need access to this type of thing, shouldn't
> that be done in the USB core itself?
> 
> {hint, yes}
> 
> There shouldn't be anything "special" about a DRM driver that needs this
> vs. any other driver that might want to know about DMA things related to
> a specific USB device.  Why isn't this an issue with the existing
> storage or v4l USB devices?

Also, where is the locking for any of the above?  What guarantees that
the device will not go away during those pointer walks?

thanks,

greg k-h

  reply	other threads:[~2021-02-23 11:27 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-23 10:58 [PATCH v3] drm: Use USB controller's DMA mask when importing dmabufs Thomas Zimmermann
2021-02-23 10:58 ` Thomas Zimmermann
2021-02-23 11:19 ` Greg KH
2021-02-23 11:19   ` Greg KH
2021-02-23 11:27   ` Greg KH [this message]
2021-02-23 11:27     ` Greg KH
2021-02-23 11:46   ` Daniel Vetter
2021-02-23 11:46     ` Daniel Vetter
2021-02-23 12:02     ` Greg KH
2021-02-23 12:02       ` Greg KH
2021-02-23 12:14       ` Daniel Vetter
2021-02-23 12:14         ` Daniel Vetter
2021-02-23 12:24         ` Greg KH
2021-02-23 12:24           ` Greg KH
2021-02-23 12:40           ` Daniel Vetter
2021-02-23 12:40             ` Daniel Vetter
2021-02-23 12:50             ` Greg KH
2021-02-23 12:50               ` Greg KH
2021-02-23 12:59               ` Daniel Vetter
2021-02-23 12:59                 ` Daniel Vetter
2021-02-23 12:51           ` Thomas Zimmermann
2021-02-23 12:51             ` Thomas Zimmermann
2021-02-23 13:09             ` Greg KH
2021-02-23 13:09               ` Greg KH
2021-02-25 19:01               ` Sudip Mukherjee
2021-02-25 19:01                 ` Sudip Mukherjee
2021-02-25 21:39                 ` Salvatore Bonaccorso
2021-02-25 21:39                   ` Salvatore Bonaccorso
2021-02-23 12:37   ` Thomas Zimmermann
2021-02-23 12:37     ` Thomas Zimmermann
2021-02-23 12:44     ` Greg KH
2021-02-23 12:44       ` Greg KH
2021-02-23 12:49       ` Daniel Vetter
2021-02-23 12:49         ` Daniel Vetter
2021-02-23 12:52         ` Greg KH
2021-02-23 12:52           ` Greg KH
2021-02-23 13:43           ` Thomas Zimmermann
2021-02-23 13:43             ` Thomas Zimmermann
2021-02-23 12:47     ` Daniel Vetter
2021-02-23 12:47       ` Daniel Vetter
2021-02-23 15:45   ` Alan Stern
2021-02-23 15:45     ` Alan Stern
2021-02-24  6:02     ` Thomas Zimmermann
2021-02-24  6:02       ` Thomas Zimmermann
2021-02-23 13:44 ` Takashi Iwai
2021-02-23 13:44   ` Takashi Iwai
2021-02-23 14:06   ` Thomas Zimmermann
2021-02-23 14:06     ` Thomas Zimmermann
2021-02-23 16:00     ` Alan Stern
2021-02-23 16:00       ` Alan Stern
2021-02-23 16:12       ` Takashi Iwai
2021-02-23 16:12         ` Takashi Iwai
2021-02-23 17:30       ` Greg KH
2021-02-23 17:30         ` Greg KH
2021-02-24  5:59         ` Thomas Zimmermann
2021-02-24  5:59           ` Thomas Zimmermann
2021-02-24  7:27       ` Christoph Hellwig
2021-02-23 16:09 ` kernel test robot

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=YDTmqpXssyTPWJQa@kroah.com \
    --to=gregkh@linuxfoundation.org \
    --cc=airlied@linux.ie \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=bigeasy@linutronix.de \
    --cc=christian.koenig@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hch@lst.de \
    --cc=hdegoede@redhat.com \
    --cc=johan@kernel.org \
    --cc=mathias.nyman@linux.intel.com \
    --cc=oneukum@suse.com \
    --cc=sean@poorly.run \
    --cc=stable@vger.kernel.org \
    --cc=stern@rowland.harvard.edu \
    --cc=tglx@linutronix.de \
    --cc=tzimmermann@suse.de \
    /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.