RE: mechanism to allow a driver to bind to any device

2014-03-31 Thread Stuart Yoder


 -Original Message-
 From: Alex Williamson [mailto:alex.william...@redhat.com]
 Sent: Wednesday, March 26, 2014 11:21 AM
 To: Alexander Graf
 Cc: Konrad Rzeszutek Wilk; k...@vger.kernel.org; jan.kis...@siemens.com;
 will.dea...@arm.com; Yoder Stuart-B08248; linux-ker...@vger.kernel.org;
 Michal Hocko; Bjorn Helgaas; Sethi Varun-B16395;
 kvm...@lists.cs.columbia.edu; Rafael J. Wysocki; Guenter Roeck; Dmitry
 Kasatkin; Joe Perches; Wood Scott-B07421; Antonios Motakis;
 t...@virtualopensystems.com; Toshi Kani; Greg KH;
 a.r...@virtualopensystems.com; iommu@lists.linux-foundation.org; Tejun
 Heo; christoffer.d...@linaro.org
 Subject: Re: mechanism to allow a driver to bind to any device
 
 On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
 
   Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk
 konrad.w...@oracle.com:
  
   On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
   Hi Greg,
  
   We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
   closed that has been perculating for a while around creating a
 mechanism
   that will allow kernel drivers like vfio can bind to devices of any
 type.
  
   This thread with you:
   http://www.spinics.net/lists/kvm-arm/msg08370.html
   ...seems to have died out, so am trying to get your response
   and will summarize again.  Vfio drivers in the kernel (regardless of
   bus type) need to bind to devices of any type.  The driver's
 function
   is to simply export hardware resources of any type to user space.
  
   There are several approaches that have been proposed:
  
   You seem to have missed the one I proposed.
  
 1.  new_id -- (current approach) the user explicitly registers
 each new device type with the vfio driver using the new_id
 mechanism.
  
 Problem: multiple drivers will be resident that handle the
 same device type...and there is nothing user space hotplug
 infrastructure can do to help.
  
 2.  any id -- the vfio driver could specify a wildcard match
 of some kind in its ID match table which would allow it to
 match and bind to any possible device id.  However,
 we don't want the vfio driver grabbing _all_ devices...just
 the ones we
 explicitly want to pass to user space.
  
 The proposed patch to support this was to create a new flag
 sysfs_bind_only in struct device_driver.  When this flag
 is set, the driver can only bind to devices via the sysfs
 bind file.  This would allow the wildcard match to work.
  
 Patch is here:
 https://lkml.org/lkml/2013/12/3/253
  
 3.  Driver initiated explicit bind -- with this approach the
 vfio driver would create a private 'bind' sysfs object
 and the user would echo the requested device into it:
  
 echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
  
 In order to make that work, the driver would need to call
 driver_probe_device() and thus we need this patch:
 https://lkml.org/lkml/2014/2/8/175
  
   4). Use the 'unbind' (from the original device) and 'bind' to vfio
 driver.
 
  This is approach 2, no?
 
  
   Which I think is what is currently being done. Why is that not
 sufficient?
 
  How would 'bind to vfio driver' look like?
 
   The only thing I see in the URL is  That works, but it is ugly.
   There is some mention of race but I don't see how - if you do the
 'unbind'
   on the original driver and then bind the BDF to the VFIO how would
 you get
   a race?
 
  Typically on PCI, you do a
 
- add wildcard (pci id) match to vfio driver
- unbind driver
- reprobe
- device attaches to vfio driver because it is the least recent
 match
- remove wildcard match from vfio driver
 
  If in between you hotplug add a card of the same type, it gets attached
 to vfio - even though the logical default driver would be the device
 specific driver.
 
 I've mentioned drivers_autoprobe in the past, but I'm not sure we're
 really factoring it into the discussion.  drivers_autoprobe allows us to
 toggle two points:
 
 a) When a new device is added whether we automatically give drivers a
 try at binding to it
 
 b) When a new driver is added whether it gets to try to bind to anything
 in the system
 
 So we do have a mechanism to avoid the race, but the problem is that it
 becomes the responsibility of userspace to:
 
 1) turn off drivers_autoprobe
 2) unbind/new_id/bind/remove_id
 3) turn on drivers_autoprobe
 4) call drivers_probe for anything added between 1)  3)
 
 Is the question about the ugliness of the current solution whether it's
 unreasonable to ask userspace to do this?

It's probably not unreasonable... I did not understand the
drivers_autoprobe mechanism until now...didn't realize we had that.

 What we seem to be asking for above is more like an autoprobe flag per
 driver where there's some way for this special driver to opt out of auto
 probing.

Yes, that is 

Re: mechanism to allow a driver to bind to any device

2014-03-31 Thread Greg KH
On Mon, Mar 31, 2014 at 06:47:51PM +, Stuart Yoder wrote:
 I also, was at the point where I thought we should perhaps just
 go with current mechanisms and implement new_id for the platform
 bus...but Greg's recent response is 'platform devices suck' and it sounds
 like he would reject a new_id patch for the platform bus.  So it kind
 of feels like we are stuck.

ids mean nothing in the platform device model, so having a new_id file
for them makes no sense.

greg k-h
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


RE: mechanism to allow a driver to bind to any device

2014-03-31 Thread Stuart Yoder


 -Original Message-
 From: Greg KH [mailto:gre...@linuxfoundation.org]
 Sent: Monday, March 31, 2014 2:47 PM
 To: Yoder Stuart-B08248
 Cc: Alex Williamson; Alexander Graf; k...@vger.kernel.org;
 jan.kis...@siemens.com; will.dea...@arm.com;
 a.r...@virtualopensystems.com; Michal Hocko; Wood Scott-B07421; Sethi
 Varun-B16395; kvm...@lists.cs.columbia.edu; Rafael J. Wysocki; Guenter
 Roeck; Dmitry Kasatkin; Tejun Heo; Bjorn Helgaas; Antonios Motakis;
 t...@virtualopensystems.com; Toshi Kani; linux-ker...@vger.kernel.org;
 iommu@lists.linux-foundation.org; Joe Perches;
 christoffer.d...@linaro.org
 Subject: Re: mechanism to allow a driver to bind to any device
 
 On Mon, Mar 31, 2014 at 06:47:51PM +, Stuart Yoder wrote:
  I also, was at the point where I thought we should perhaps just
  go with current mechanisms and implement new_id for the platform
  bus...but Greg's recent response is 'platform devices suck' and it
 sounds
  like he would reject a new_id patch for the platform bus.  So it kind
  of feels like we are stuck.
 
 ids mean nothing in the platform device model, so having a new_id file
 for them makes no sense.

They don't have IDs like PCI, but platform drivers have to match on
something.  Platform device match tables are based on compatible strings.

Example from Freescale DMA driver:
  static const struct of_device_id fsldma_of_ids[] = {
{ .compatible = fsl,elo3-dma, },
{ .compatible = fsl,eloplus-dma, },
{ .compatible = fsl,elo-dma, },
{}
  };

The process of unbinding, setting a new_id, and binding to vfio would work
just like PCI:

   echo ffe101300.dma  /sys/bus/platform/devices/ffe101300.dma/driver/unbind
   echo fsl,eloplus-dma  /sys/bus/platform/drivers/vfio-platform/new_id

Thanks,
Stuart


___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: mechanism to allow a driver to bind to any device

2014-03-31 Thread Kim Phillips
On Mon, 31 Mar 2014 20:23:36 +
Stuart Yoder stuart.yo...@freescale.com wrote:

  From: Greg KH [mailto:gre...@linuxfoundation.org]
  Sent: Monday, March 31, 2014 2:47 PM
  
  On Mon, Mar 31, 2014 at 06:47:51PM +, Stuart Yoder wrote:
   I also, was at the point where I thought we should perhaps just
   go with current mechanisms and implement new_id for the platform
   bus...but Greg's recent response is 'platform devices suck' and it
  sounds
   like he would reject a new_id patch for the platform bus.  So it kind
   of feels like we are stuck.
  
  ids mean nothing in the platform device model, so having a new_id file
  for them makes no sense.
 
 They don't have IDs like PCI, but platform drivers have to match on
 something.  Platform device match tables are based on compatible strings.
 
 Example from Freescale DMA driver:
   static const struct of_device_id fsldma_of_ids[] = {
 { .compatible = fsl,elo3-dma, },
 { .compatible = fsl,eloplus-dma, },
 { .compatible = fsl,elo-dma, },
 {}
   };
 
 The process of unbinding, setting a new_id, and binding to vfio would work
 just like PCI:
 
echo ffe101300.dma  /sys/bus/platform/devices/ffe101300.dma/driver/unbind
echo fsl,eloplus-dma  /sys/bus/platform/drivers/vfio-platform/new_id

In platform device land, we don't want to pursue the
new_id/match-by-compatible methodology: we know exactly which specific
device (not device types) we want bound to which driver, so we just
want to be able to simply:

echo fff51000.ethernet | sudo tee -a 
/sys/bus/platform/devices/fff51000.ethernet/driver/unbind
echo fff51000.ethernet | sudo tee -a 
/sys/bus/platform/drivers/vfio-platform/bind

and not get involved with how PCI doesn't simply do that, independent
of autoprobe/hotplug.

Kim
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: mechanism to allow a driver to bind to any device

2014-03-31 Thread Kim Phillips
On Fri, 28 Mar 2014 11:10:23 -0600
Alex Williamson alex.william...@redhat.com wrote:

 On Fri, 2014-03-28 at 12:58 -0400, Konrad Rzeszutek Wilk wrote:
  On Wed, Mar 26, 2014 at 04:09:21PM -0600, Alex Williamson wrote:
   On Wed, 2014-03-26 at 10:21 -0600, Alex Williamson wrote:
On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
 
  Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
  konrad.w...@oracle.com:
  
  On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
  Hi Greg,
  
  We (Linaro, Freescale, Virtual Open Systems) are trying get an 
  issue
  closed that has been perculating for a while around creating a 
  mechanism
  that will allow kernel drivers like vfio can bind to devices of 
  any type.
  
  This thread with you:
  http://www.spinics.net/lists/kvm-arm/msg08370.html
  ...seems to have died out, so am trying to get your response
  and will summarize again.  Vfio drivers in the kernel (regardless 
  of
  bus type) need to bind to devices of any type.  The driver's 
  function
  is to simply export hardware resources of any type to user space.
  
  There are several approaches that have been proposed:
  
  You seem to have missed the one I proposed.
  
1.  new_id -- (current approach) the user explicitly registers
each new device type with the vfio driver using the new_id
mechanism.
  
Problem: multiple drivers will be resident that handle the
same device type...and there is nothing user space hotplug
infrastructure can do to help.
  
2.  any id -- the vfio driver could specify a wildcard match
of some kind in its ID match table which would allow it to
match and bind to any possible device id.  However,
we don't want the vfio driver grabbing _all_ devices...just 
  the ones we
explicitly want to pass to user space.
  
The proposed patch to support this was to create a new flag
sysfs_bind_only in struct device_driver.  When this flag
is set, the driver can only bind to devices via the sysfs
bind file.  This would allow the wildcard match to work.
  
Patch is here:
https://lkml.org/lkml/2013/12/3/253
  
3.  Driver initiated explicit bind -- with this approach the
vfio driver would create a private 'bind' sysfs object
and the user would echo the requested device into it:
  
echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
  
In order to make that work, the driver would need to call
driver_probe_device() and thus we need this patch:
https://lkml.org/lkml/2014/2/8/175
  
  4). Use the 'unbind' (from the original device) and 'bind' to vfio 
  driver.
 
 This is approach 2, no?
 
  
  Which I think is what is currently being done. Why is that not 
  sufficient?
 
 How would 'bind to vfio driver' look like?
 
  The only thing I see in the URL is  That works, but it is ugly.
  There is some mention of race but I don't see how - if you do the 
  'unbind'
  on the original driver and then bind the BDF to the VFIO how would 
  you get
  a race?
 
 Typically on PCI, you do a
 
   - add wildcard (pci id) match to vfio driver
   - unbind driver
   - reprobe
   - device attaches to vfio driver because it is the least recent 
 match
   - remove wildcard match from vfio driver
 
 If in between you hotplug add a card of the same type, it gets 
 attached to vfio - even though the logical default driver would be 
 the device specific driver.

I've mentioned drivers_autoprobe in the past, but I'm not sure we're
really factoring it into the discussion.  drivers_autoprobe allows us to
toggle two points:

a) When a new device is added whether we automatically give drivers a
try at binding to it

b) When a new driver is added whether it gets to try to bind to anything
in the system

So we do have a mechanism to avoid the race, but the problem is that it
becomes the responsibility of userspace to:

1) turn off drivers_autoprobe
2) unbind/new_id/bind/remove_id
3) turn on drivers_autoprobe
4) call drivers_probe for anything added between 1)  3)

Is the question about the ugliness of the current solution whether it's
unreasonable to ask userspace to do this?
What we seem to be asking for above is more like an autoprobe flag per
driver where there's some way for this special driver to opt out of auto
probing.  Option 2. in Stuart's list does this by short-cutting ID
matching so that a match is only found when using the sysfs bind path,
option 3. enables a way 

Re: mechanism to allow a driver to bind to any device

2014-03-31 Thread Alex Williamson
On Mon, 2014-03-31 at 17:36 -0500, Kim Phillips wrote:
 On Fri, 28 Mar 2014 11:10:23 -0600
 Alex Williamson alex.william...@redhat.com wrote:
 
  On Fri, 2014-03-28 at 12:58 -0400, Konrad Rzeszutek Wilk wrote:
   On Wed, Mar 26, 2014 at 04:09:21PM -0600, Alex Williamson wrote:
On Wed, 2014-03-26 at 10:21 -0600, Alex Williamson wrote:
 On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
  
   Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
   konrad.w...@oracle.com:
   
   On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
   Hi Greg,
   
   We (Linaro, Freescale, Virtual Open Systems) are trying get an 
   issue
   closed that has been perculating for a while around creating a 
   mechanism
   that will allow kernel drivers like vfio can bind to devices of 
   any type.
   
   This thread with you:
   http://www.spinics.net/lists/kvm-arm/msg08370.html
   ...seems to have died out, so am trying to get your response
   and will summarize again.  Vfio drivers in the kernel 
   (regardless of
   bus type) need to bind to devices of any type.  The driver's 
   function
   is to simply export hardware resources of any type to user space.
   
   There are several approaches that have been proposed:
   
   You seem to have missed the one I proposed.
   
 1.  new_id -- (current approach) the user explicitly registers
 each new device type with the vfio driver using the new_id
 mechanism.
   
 Problem: multiple drivers will be resident that handle the
 same device type...and there is nothing user space hotplug
 infrastructure can do to help.
   
 2.  any id -- the vfio driver could specify a wildcard match
 of some kind in its ID match table which would allow it to
 match and bind to any possible device id.  However,
 we don't want the vfio driver grabbing _all_ 
   devices...just the ones we
 explicitly want to pass to user space.
   
 The proposed patch to support this was to create a new flag
 sysfs_bind_only in struct device_driver.  When this flag
 is set, the driver can only bind to devices via the sysfs
 bind file.  This would allow the wildcard match to work.
   
 Patch is here:
 https://lkml.org/lkml/2013/12/3/253
   
 3.  Driver initiated explicit bind -- with this approach the
 vfio driver would create a private 'bind' sysfs object
 and the user would echo the requested device into it:
   
 echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
   
 In order to make that work, the driver would need to call
 driver_probe_device() and thus we need this patch:
 https://lkml.org/lkml/2014/2/8/175
   
   4). Use the 'unbind' (from the original device) and 'bind' to 
   vfio driver.
  
  This is approach 2, no?
  
   
   Which I think is what is currently being done. Why is that not 
   sufficient?
  
  How would 'bind to vfio driver' look like?
  
   The only thing I see in the URL is  That works, but it is ugly.
   There is some mention of race but I don't see how - if you do the 
   'unbind'
   on the original driver and then bind the BDF to the VFIO how 
   would you get
   a race?
  
  Typically on PCI, you do a
  
- add wildcard (pci id) match to vfio driver
- unbind driver
- reprobe
- device attaches to vfio driver because it is the least recent 
  match
- remove wildcard match from vfio driver
  
  If in between you hotplug add a card of the same type, it gets 
  attached to vfio - even though the logical default driver would 
  be the device specific driver.
 
 I've mentioned drivers_autoprobe in the past, but I'm not sure we're
 really factoring it into the discussion.  drivers_autoprobe allows us 
 to
 toggle two points:
 
 a) When a new device is added whether we automatically give drivers a
 try at binding to it
 
 b) When a new driver is added whether it gets to try to bind to 
 anything
 in the system
 
 So we do have a mechanism to avoid the race, but the problem is that 
 it
 becomes the responsibility of userspace to:
 
 1) turn off drivers_autoprobe
 2) unbind/new_id/bind/remove_id
 3) turn on drivers_autoprobe
 4) call drivers_probe for anything added between 1)  3)
 
 Is the question about the ugliness of the current solution whether 
 it's
 unreasonable to ask userspace to do this?
 What we seem to be asking for above is more like an autoprobe flag per
 driver where there's some way for this special 

Re: mechanism to allow a driver to bind to any device

2014-03-28 Thread Greg KH
On Wed, Mar 26, 2014 at 10:39:57PM +0100, Antonios Motakis wrote:
 
 Of note is that new_id doesn't work particularly well for platform devices.

Nor should it.  Platform devices suck horribly, and ids mean nothing
to them, so you shouldn't even try this.  Use a real bus and it should
be fine.

greg k-h
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: mechanism to allow a driver to bind to any device

2014-03-28 Thread Konrad Rzeszutek Wilk
On Wed, Mar 26, 2014 at 04:09:21PM -0600, Alex Williamson wrote:
 On Wed, 2014-03-26 at 10:21 -0600, Alex Williamson wrote:
  On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
   
Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
konrad.w...@oracle.com:

On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
Hi Greg,

We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
closed that has been perculating for a while around creating a 
mechanism
that will allow kernel drivers like vfio can bind to devices of any 
type.

This thread with you:
http://www.spinics.net/lists/kvm-arm/msg08370.html
...seems to have died out, so am trying to get your response
and will summarize again.  Vfio drivers in the kernel (regardless of
bus type) need to bind to devices of any type.  The driver's function
is to simply export hardware resources of any type to user space.

There are several approaches that have been proposed:

You seem to have missed the one I proposed.

  1.  new_id -- (current approach) the user explicitly registers
  each new device type with the vfio driver using the new_id
  mechanism.

  Problem: multiple drivers will be resident that handle the
  same device type...and there is nothing user space hotplug
  infrastructure can do to help.

  2.  any id -- the vfio driver could specify a wildcard match
  of some kind in its ID match table which would allow it to
  match and bind to any possible device id.  However,
  we don't want the vfio driver grabbing _all_ devices...just the 
ones we
  explicitly want to pass to user space.

  The proposed patch to support this was to create a new flag
  sysfs_bind_only in struct device_driver.  When this flag
  is set, the driver can only bind to devices via the sysfs
  bind file.  This would allow the wildcard match to work.

  Patch is here:
  https://lkml.org/lkml/2013/12/3/253

  3.  Driver initiated explicit bind -- with this approach the
  vfio driver would create a private 'bind' sysfs object
  and the user would echo the requested device into it:

  echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind

  In order to make that work, the driver would need to call
  driver_probe_device() and thus we need this patch:
  https://lkml.org/lkml/2014/2/8/175

4). Use the 'unbind' (from the original device) and 'bind' to vfio 
driver.
   
   This is approach 2, no?
   

Which I think is what is currently being done. Why is that not 
sufficient?
   
   How would 'bind to vfio driver' look like?
   
The only thing I see in the URL is  That works, but it is ugly.
There is some mention of race but I don't see how - if you do the 
'unbind'
on the original driver and then bind the BDF to the VFIO how would you 
get
a race?
   
   Typically on PCI, you do a
   
 - add wildcard (pci id) match to vfio driver
 - unbind driver
 - reprobe
 - device attaches to vfio driver because it is the least recent match
 - remove wildcard match from vfio driver
   
   If in between you hotplug add a card of the same type, it gets attached 
   to vfio - even though the logical default driver would be the device 
   specific driver.
  
  I've mentioned drivers_autoprobe in the past, but I'm not sure we're
  really factoring it into the discussion.  drivers_autoprobe allows us to
  toggle two points:
  
  a) When a new device is added whether we automatically give drivers a
  try at binding to it
  
  b) When a new driver is added whether it gets to try to bind to anything
  in the system
  
  So we do have a mechanism to avoid the race, but the problem is that it
  becomes the responsibility of userspace to:
  
  1) turn off drivers_autoprobe
  2) unbind/new_id/bind/remove_id
  3) turn on drivers_autoprobe
  4) call drivers_probe for anything added between 1)  3)
  
  Is the question about the ugliness of the current solution whether it's
  unreasonable to ask userspace to do this?
  
  What we seem to be asking for above is more like an autoprobe flag per
  driver where there's some way for this special driver to opt out of auto
  probing.  Option 2. in Stuart's list does this by short-cutting ID
  matching so that a match is only found when using the sysfs bind path,
  option 3. enables a way for a driver to expose their own sysfs entry
  point for binding.  The latter feels particularly chaotic since drivers
  get to make-up their own bind mechanism.
  
  Another twist I'll throw in is that devices can be hot added to IOMMU
  groups that are in-use by userspace.  When that happens we'd like to be
  able to disable driver autoprobe of the device to avoid a host driver
  automatically 

Re: mechanism to allow a driver to bind to any device

2014-03-28 Thread Alex Williamson
On Fri, 2014-03-28 at 12:58 -0400, Konrad Rzeszutek Wilk wrote:
 On Wed, Mar 26, 2014 at 04:09:21PM -0600, Alex Williamson wrote:
  On Wed, 2014-03-26 at 10:21 -0600, Alex Williamson wrote:
   On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:

 Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
 konrad.w...@oracle.com:
 
 On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
 Hi Greg,
 
 We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
 closed that has been perculating for a while around creating a 
 mechanism
 that will allow kernel drivers like vfio can bind to devices of any 
 type.
 
 This thread with you:
 http://www.spinics.net/lists/kvm-arm/msg08370.html
 ...seems to have died out, so am trying to get your response
 and will summarize again.  Vfio drivers in the kernel (regardless of
 bus type) need to bind to devices of any type.  The driver's function
 is to simply export hardware resources of any type to user space.
 
 There are several approaches that have been proposed:
 
 You seem to have missed the one I proposed.
 
   1.  new_id -- (current approach) the user explicitly registers
   each new device type with the vfio driver using the new_id
   mechanism.
 
   Problem: multiple drivers will be resident that handle the
   same device type...and there is nothing user space hotplug
   infrastructure can do to help.
 
   2.  any id -- the vfio driver could specify a wildcard match
   of some kind in its ID match table which would allow it to
   match and bind to any possible device id.  However,
   we don't want the vfio driver grabbing _all_ devices...just 
 the ones we
   explicitly want to pass to user space.
 
   The proposed patch to support this was to create a new flag
   sysfs_bind_only in struct device_driver.  When this flag
   is set, the driver can only bind to devices via the sysfs
   bind file.  This would allow the wildcard match to work.
 
   Patch is here:
   https://lkml.org/lkml/2013/12/3/253
 
   3.  Driver initiated explicit bind -- with this approach the
   vfio driver would create a private 'bind' sysfs object
   and the user would echo the requested device into it:
 
   echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
 
   In order to make that work, the driver would need to call
   driver_probe_device() and thus we need this patch:
   https://lkml.org/lkml/2014/2/8/175
 
 4). Use the 'unbind' (from the original device) and 'bind' to vfio 
 driver.

This is approach 2, no?

 
 Which I think is what is currently being done. Why is that not 
 sufficient?

How would 'bind to vfio driver' look like?

 The only thing I see in the URL is  That works, but it is ugly.
 There is some mention of race but I don't see how - if you do the 
 'unbind'
 on the original driver and then bind the BDF to the VFIO how would 
 you get
 a race?

Typically on PCI, you do a

  - add wildcard (pci id) match to vfio driver
  - unbind driver
  - reprobe
  - device attaches to vfio driver because it is the least recent match
  - remove wildcard match from vfio driver

If in between you hotplug add a card of the same type, it gets attached 
to vfio - even though the logical default driver would be the device 
specific driver.
   
   I've mentioned drivers_autoprobe in the past, but I'm not sure we're
   really factoring it into the discussion.  drivers_autoprobe allows us to
   toggle two points:
   
   a) When a new device is added whether we automatically give drivers a
   try at binding to it
   
   b) When a new driver is added whether it gets to try to bind to anything
   in the system
   
   So we do have a mechanism to avoid the race, but the problem is that it
   becomes the responsibility of userspace to:
   
   1) turn off drivers_autoprobe
   2) unbind/new_id/bind/remove_id
   3) turn on drivers_autoprobe
   4) call drivers_probe for anything added between 1)  3)
   
   Is the question about the ugliness of the current solution whether it's
   unreasonable to ask userspace to do this?
   
   What we seem to be asking for above is more like an autoprobe flag per
   driver where there's some way for this special driver to opt out of auto
   probing.  Option 2. in Stuart's list does this by short-cutting ID
   matching so that a match is only found when using the sysfs bind path,
   option 3. enables a way for a driver to expose their own sysfs entry
   point for binding.  The latter feels particularly chaotic since drivers
   get to make-up their own bind mechanism.
   
   Another twist I'll throw in is that devices can be 

Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Konrad Rzeszutek Wilk
On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
 Hi Greg,
 
 We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
 closed that has been perculating for a while around creating a mechanism
 that will allow kernel drivers like vfio can bind to devices of any type.
 
 This thread with you:
 http://www.spinics.net/lists/kvm-arm/msg08370.html
 ...seems to have died out, so am trying to get your response
 and will summarize again.  Vfio drivers in the kernel (regardless of
 bus type) need to bind to devices of any type.  The driver's function
 is to simply export hardware resources of any type to user space.
 
 There are several approaches that have been proposed:

You seem to have missed the one I proposed.
 
1.  new_id -- (current approach) the user explicitly registers
each new device type with the vfio driver using the new_id
mechanism.
 
Problem: multiple drivers will be resident that handle the
same device type...and there is nothing user space hotplug
infrastructure can do to help.
 
2.  any id -- the vfio driver could specify a wildcard match
of some kind in its ID match table which would allow it to
match and bind to any possible device id.  However,
we don't want the vfio driver grabbing _all_ devices...just the ones we
explicitly want to pass to user space.
 
The proposed patch to support this was to create a new flag
sysfs_bind_only in struct device_driver.  When this flag
is set, the driver can only bind to devices via the sysfs
bind file.  This would allow the wildcard match to work.
 
Patch is here:
https://lkml.org/lkml/2013/12/3/253
 
3.  Driver initiated explicit bind -- with this approach the
vfio driver would create a private 'bind' sysfs object
and the user would echo the requested device into it:
  
echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
 
In order to make that work, the driver would need to call
driver_probe_device() and thus we need this patch:
https://lkml.org/lkml/2014/2/8/175
 

4). Use the 'unbind' (from the original device) and 'bind' to vfio driver.

Which I think is what is currently being done. Why is that not sufficient?
The only thing I see in the URL is  That works, but it is ugly.
There is some mention of race but I don't see how - if you do the 'unbind'
on the original driver and then bind the BDF to the VFIO how would you get
a race?

 
 Would like your comment on these options-- option #3 is preferred
 and is literally a 2 line patch.
 
 Thanks,
 Stuart
 ___
 iommu mailing list
 iommu@lists.linux-foundation.org
 https://lists.linuxfoundation.org/mailman/listinfo/iommu
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Alexander Graf


 Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk konrad.w...@oracle.com:
 
 On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
 Hi Greg,
 
 We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
 closed that has been perculating for a while around creating a mechanism
 that will allow kernel drivers like vfio can bind to devices of any type.
 
 This thread with you:
 http://www.spinics.net/lists/kvm-arm/msg08370.html
 ...seems to have died out, so am trying to get your response
 and will summarize again.  Vfio drivers in the kernel (regardless of
 bus type) need to bind to devices of any type.  The driver's function
 is to simply export hardware resources of any type to user space.
 
 There are several approaches that have been proposed:
 
 You seem to have missed the one I proposed.
 
   1.  new_id -- (current approach) the user explicitly registers
   each new device type with the vfio driver using the new_id
   mechanism.
 
   Problem: multiple drivers will be resident that handle the
   same device type...and there is nothing user space hotplug
   infrastructure can do to help.
 
   2.  any id -- the vfio driver could specify a wildcard match
   of some kind in its ID match table which would allow it to
   match and bind to any possible device id.  However,
   we don't want the vfio driver grabbing _all_ devices...just the ones we
   explicitly want to pass to user space.
 
   The proposed patch to support this was to create a new flag
   sysfs_bind_only in struct device_driver.  When this flag
   is set, the driver can only bind to devices via the sysfs
   bind file.  This would allow the wildcard match to work.
 
   Patch is here:
   https://lkml.org/lkml/2013/12/3/253
 
   3.  Driver initiated explicit bind -- with this approach the
   vfio driver would create a private 'bind' sysfs object
   and the user would echo the requested device into it:
 
   echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
 
   In order to make that work, the driver would need to call
   driver_probe_device() and thus we need this patch:
   https://lkml.org/lkml/2014/2/8/175
 
 4). Use the 'unbind' (from the original device) and 'bind' to vfio driver.

This is approach 2, no?

 
 Which I think is what is currently being done. Why is that not sufficient?

How would 'bind to vfio driver' look like?

 The only thing I see in the URL is  That works, but it is ugly.
 There is some mention of race but I don't see how - if you do the 'unbind'
 on the original driver and then bind the BDF to the VFIO how would you get
 a race?

Typically on PCI, you do a

  - add wildcard (pci id) match to vfio driver
  - unbind driver
  - reprobe
  - device attaches to vfio driver because it is the least recent match
  - remove wildcard match from vfio driver

If in between you hotplug add a card of the same type, it gets attached to vfio 
- even though the logical default driver would be the device specific driver.


Alex

 
 
 Would like your comment on these options-- option #3 is preferred
 and is literally a 2 line patch.
 
 Thanks,
 Stuart
 ___
 iommu mailing list
 iommu@lists.linux-foundation.org
 https://lists.linuxfoundation.org/mailman/listinfo/iommu
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


RE: mechanism to allow a driver to bind to any device

2014-03-26 Thread Stuart Yoder


 -Original Message-
 From: Konrad Rzeszutek Wilk [mailto:konrad.w...@oracle.com]
 Sent: Wednesday, March 26, 2014 9:40 AM
 To: Yoder Stuart-B08248
 Cc: Greg KH; k...@vger.kernel.org; jan.kis...@siemens.com;
 will.dea...@arm.com; linux-ker...@vger.kernel.org; Bjorn Helgaas; Sethi
 Varun-B16395; kvm...@lists.cs.columbia.edu; Rafael J. Wysocki;
 ag...@suse.de; Guenter Roeck; Dmitry Kasatkin; Tejun Heo; Wood Scott-
 B07421; Antonios Motakis; t...@virtualopensystems.com; Michal Hocko;
 Toshi Kani; a.r...@virtualopensystems.com; iommu@lists.linux-
 foundation.org; Joe Perches; christoffer.d...@linaro.org
 Subject: Re: mechanism to allow a driver to bind to any device
 
 On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
  Hi Greg,
 
  We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
  closed that has been perculating for a while around creating a
 mechanism
  that will allow kernel drivers like vfio can bind to devices of any
 type.
 
  This thread with you:
  http://www.spinics.net/lists/kvm-arm/msg08370.html
  ...seems to have died out, so am trying to get your response
  and will summarize again.  Vfio drivers in the kernel (regardless of
  bus type) need to bind to devices of any type.  The driver's function
  is to simply export hardware resources of any type to user space.
 
  There are several approaches that have been proposed:
 
 You seem to have missed the one I proposed.

Sorry, I frankly had no idea of what you were talking about.  Please
explain with an example what steps a user would take to unbind
a device from the host and bind it to say vfio-pci.

 1.  new_id -- (current approach) the user explicitly registers
 each new device type with the vfio driver using the new_id
 mechanism.
 
 Problem: multiple drivers will be resident that handle the
 same device type...and there is nothing user space hotplug
 infrastructure can do to help.
 
 2.  any id -- the vfio driver could specify a wildcard match
 of some kind in its ID match table which would allow it to
 match and bind to any possible device id.  However,
 we don't want the vfio driver grabbing _all_ devices...just the
 ones we
 explicitly want to pass to user space.
 
 The proposed patch to support this was to create a new flag
 sysfs_bind_only in struct device_driver.  When this flag
 is set, the driver can only bind to devices via the sysfs
 bind file.  This would allow the wildcard match to work.
 
 Patch is here:
 https://lkml.org/lkml/2013/12/3/253
 
 3.  Driver initiated explicit bind -- with this approach the
 vfio driver would create a private 'bind' sysfs object
 and the user would echo the requested device into it:
 
 echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
 
 In order to make that work, the driver would need to call
 driver_probe_device() and thus we need this patch:
 https://lkml.org/lkml/2014/2/8/175
 
 
 4). Use the 'unbind' (from the original device) and 'bind' to vfio
 driver.

How can you bind a device to vfio, when vfio is not aware of the
device type?   Does not work.

There is no way the vfio driver can know ahead of time what device may
be bound to it.

Stuart
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Alex Williamson
On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
 
  Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
  konrad.w...@oracle.com:
  
  On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
  Hi Greg,
  
  We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
  closed that has been perculating for a while around creating a mechanism
  that will allow kernel drivers like vfio can bind to devices of any type.
  
  This thread with you:
  http://www.spinics.net/lists/kvm-arm/msg08370.html
  ...seems to have died out, so am trying to get your response
  and will summarize again.  Vfio drivers in the kernel (regardless of
  bus type) need to bind to devices of any type.  The driver's function
  is to simply export hardware resources of any type to user space.
  
  There are several approaches that have been proposed:
  
  You seem to have missed the one I proposed.
  
1.  new_id -- (current approach) the user explicitly registers
each new device type with the vfio driver using the new_id
mechanism.
  
Problem: multiple drivers will be resident that handle the
same device type...and there is nothing user space hotplug
infrastructure can do to help.
  
2.  any id -- the vfio driver could specify a wildcard match
of some kind in its ID match table which would allow it to
match and bind to any possible device id.  However,
we don't want the vfio driver grabbing _all_ devices...just the ones 
  we
explicitly want to pass to user space.
  
The proposed patch to support this was to create a new flag
sysfs_bind_only in struct device_driver.  When this flag
is set, the driver can only bind to devices via the sysfs
bind file.  This would allow the wildcard match to work.
  
Patch is here:
https://lkml.org/lkml/2013/12/3/253
  
3.  Driver initiated explicit bind -- with this approach the
vfio driver would create a private 'bind' sysfs object
and the user would echo the requested device into it:
  
echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
  
In order to make that work, the driver would need to call
driver_probe_device() and thus we need this patch:
https://lkml.org/lkml/2014/2/8/175
  
  4). Use the 'unbind' (from the original device) and 'bind' to vfio driver.
 
 This is approach 2, no?
 
  
  Which I think is what is currently being done. Why is that not sufficient?
 
 How would 'bind to vfio driver' look like?
 
  The only thing I see in the URL is  That works, but it is ugly.
  There is some mention of race but I don't see how - if you do the 'unbind'
  on the original driver and then bind the BDF to the VFIO how would you get
  a race?
 
 Typically on PCI, you do a
 
   - add wildcard (pci id) match to vfio driver
   - unbind driver
   - reprobe
   - device attaches to vfio driver because it is the least recent match
   - remove wildcard match from vfio driver
 
 If in between you hotplug add a card of the same type, it gets attached to 
 vfio - even though the logical default driver would be the device specific 
 driver.

I've mentioned drivers_autoprobe in the past, but I'm not sure we're
really factoring it into the discussion.  drivers_autoprobe allows us to
toggle two points:

a) When a new device is added whether we automatically give drivers a
try at binding to it

b) When a new driver is added whether it gets to try to bind to anything
in the system

So we do have a mechanism to avoid the race, but the problem is that it
becomes the responsibility of userspace to:

1) turn off drivers_autoprobe
2) unbind/new_id/bind/remove_id
3) turn on drivers_autoprobe
4) call drivers_probe for anything added between 1)  3)

Is the question about the ugliness of the current solution whether it's
unreasonable to ask userspace to do this?

What we seem to be asking for above is more like an autoprobe flag per
driver where there's some way for this special driver to opt out of auto
probing.  Option 2. in Stuart's list does this by short-cutting ID
matching so that a match is only found when using the sysfs bind path,
option 3. enables a way for a driver to expose their own sysfs entry
point for binding.  The latter feels particularly chaotic since drivers
get to make-up their own bind mechanism.

Another twist I'll throw in is that devices can be hot added to IOMMU
groups that are in-use by userspace.  When that happens we'd like to be
able to disable driver autoprobe of the device to avoid a host driver
automatically binding to the device.  I wonder if instead of looking at
the problem from the driver perspective, if we were to instead look at
it from the device perspective if we might find a solution that would
address both.  For instance, if devices had a driver_probe_id property
that was by default set to their bus specific ID match ($VENDOR
$DEVICE on PCI) could we use that to write new match 

Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Konrad Rzeszutek Wilk
On Wed, Mar 26, 2014 at 11:06:02PM +0800, Alexander Graf wrote:
 
 
  Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
  konrad.w...@oracle.com:
  
  On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
  Hi Greg,
  
  We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
  closed that has been perculating for a while around creating a mechanism
  that will allow kernel drivers like vfio can bind to devices of any type.
  
  This thread with you:
  http://www.spinics.net/lists/kvm-arm/msg08370.html
  ...seems to have died out, so am trying to get your response
  and will summarize again.  Vfio drivers in the kernel (regardless of
  bus type) need to bind to devices of any type.  The driver's function
  is to simply export hardware resources of any type to user space.
  
  There are several approaches that have been proposed:
  
  You seem to have missed the one I proposed.
  
1.  new_id -- (current approach) the user explicitly registers
each new device type with the vfio driver using the new_id
mechanism.
  
Problem: multiple drivers will be resident that handle the
same device type...and there is nothing user space hotplug
infrastructure can do to help.
  
2.  any id -- the vfio driver could specify a wildcard match
of some kind in its ID match table which would allow it to
match and bind to any possible device id.  However,
we don't want the vfio driver grabbing _all_ devices...just the ones 
  we
explicitly want to pass to user space.
  
The proposed patch to support this was to create a new flag
sysfs_bind_only in struct device_driver.  When this flag
is set, the driver can only bind to devices via the sysfs
bind file.  This would allow the wildcard match to work.
  
Patch is here:
https://lkml.org/lkml/2013/12/3/253
  
3.  Driver initiated explicit bind -- with this approach the
vfio driver would create a private 'bind' sysfs object
and the user would echo the requested device into it:
  
echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
  
In order to make that work, the driver would need to call
driver_probe_device() and thus we need this patch:
https://lkml.org/lkml/2014/2/8/175
  
  4). Use the 'unbind' (from the original device) and 'bind' to vfio driver.
 
 This is approach 2, no?
 
  
  Which I think is what is currently being done. Why is that not sufficient?
 
 How would 'bind to vfio driver' look like?

you echo the BDF to a 'new_slot' to setup an pci match entry (so that it
can lookup from the BDF the device/vendor id). Then you echo the
BDF to the 'bind'.

 
  The only thing I see in the URL is  That works, but it is ugly.
  There is some mention of race but I don't see how - if you do the 'unbind'
  on the original driver and then bind the BDF to the VFIO how would you get
  a race?
 
 Typically on PCI, you do a
 
   - add wildcard (pci id) match to vfio driver
   - unbind driver
   - reprobe
   - device attaches to vfio driver because it is the least recent match
   - remove wildcard match from vfio driver
 
 If in between you hotplug add a card of the same type, it gets attached to 
 vfio - even though the logical default driver would be the device specific 
 driver.

But that would not happen if you use BDF. So if you switch from using
device/vendor id then you don't have this problem.
 
 
 Alex
 
  
  
  Would like your comment on these options-- option #3 is preferred
  and is literally a 2 line patch.
  
  Thanks,
  Stuart
  ___
  iommu mailing list
  iommu@lists.linux-foundation.org
  https://lists.linuxfoundation.org/mailman/listinfo/iommu
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Konrad Rzeszutek Wilk
On Wed, Mar 26, 2014 at 10:21:02AM -0600, Alex Williamson wrote:
 On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
  
   Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
   konrad.w...@oracle.com:
   
   On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
   Hi Greg,
   
   We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
   closed that has been perculating for a while around creating a mechanism
   that will allow kernel drivers like vfio can bind to devices of any type.
   
   This thread with you:
   http://www.spinics.net/lists/kvm-arm/msg08370.html
   ...seems to have died out, so am trying to get your response
   and will summarize again.  Vfio drivers in the kernel (regardless of
   bus type) need to bind to devices of any type.  The driver's function
   is to simply export hardware resources of any type to user space.
   
   There are several approaches that have been proposed:
   
   You seem to have missed the one I proposed.
   
 1.  new_id -- (current approach) the user explicitly registers
 each new device type with the vfio driver using the new_id
 mechanism.
   
 Problem: multiple drivers will be resident that handle the
 same device type...and there is nothing user space hotplug
 infrastructure can do to help.
   
 2.  any id -- the vfio driver could specify a wildcard match
 of some kind in its ID match table which would allow it to
 match and bind to any possible device id.  However,
 we don't want the vfio driver grabbing _all_ devices...just the 
   ones we
 explicitly want to pass to user space.
   
 The proposed patch to support this was to create a new flag
 sysfs_bind_only in struct device_driver.  When this flag
 is set, the driver can only bind to devices via the sysfs
 bind file.  This would allow the wildcard match to work.
   
 Patch is here:
 https://lkml.org/lkml/2013/12/3/253
   
 3.  Driver initiated explicit bind -- with this approach the
 vfio driver would create a private 'bind' sysfs object
 and the user would echo the requested device into it:
   
 echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
   
 In order to make that work, the driver would need to call
 driver_probe_device() and thus we need this patch:
 https://lkml.org/lkml/2014/2/8/175
   
   4). Use the 'unbind' (from the original device) and 'bind' to vfio driver.
  
  This is approach 2, no?
  
   
   Which I think is what is currently being done. Why is that not sufficient?
  
  How would 'bind to vfio driver' look like?
  
   The only thing I see in the URL is  That works, but it is ugly.
   There is some mention of race but I don't see how - if you do the 'unbind'
   on the original driver and then bind the BDF to the VFIO how would you get
   a race?
  
  Typically on PCI, you do a
  
- add wildcard (pci id) match to vfio driver
- unbind driver
- reprobe
- device attaches to vfio driver because it is the least recent match
- remove wildcard match from vfio driver
  
  If in between you hotplug add a card of the same type, it gets attached to 
  vfio - even though the logical default driver would be the device 
  specific driver.
 
 I've mentioned drivers_autoprobe in the past, but I'm not sure we're
 really factoring it into the discussion.  drivers_autoprobe allows us to
 toggle two points:
 
 a) When a new device is added whether we automatically give drivers a
 try at binding to it
 
 b) When a new driver is added whether it gets to try to bind to anything
 in the system
 
 So we do have a mechanism to avoid the race, but the problem is that it
 becomes the responsibility of userspace to:
 
 1) turn off drivers_autoprobe
 2) unbind/new_id/bind/remove_id
 3) turn on drivers_autoprobe
 4) call drivers_probe for anything added between 1)  3)
 
 Is the question about the ugliness of the current solution whether it's
 unreasonable to ask userspace to do this?
 
 What we seem to be asking for above is more like an autoprobe flag per
 driver where there's some way for this special driver to opt out of auto
 probing.  Option 2. in Stuart's list does this by short-cutting ID
 matching so that a match is only found when using the sysfs bind path,
 option 3. enables a way for a driver to expose their own sysfs entry
 point for binding.  The latter feels particularly chaotic since drivers
 get to make-up their own bind mechanism.
 
 Another twist I'll throw in is that devices can be hot added to IOMMU
 groups that are in-use by userspace.  When that happens we'd like to be
 able to disable driver autoprobe of the device to avoid a host driver
 automatically binding to the device.  I wonder if instead of looking at
 the problem from the driver perspective, if we were to instead look at
 it from the device perspective if we might find a solution that would
 address 

Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Alex Williamson
On Wed, 2014-03-26 at 12:32 -0400, Konrad Rzeszutek Wilk wrote:
 On Wed, Mar 26, 2014 at 10:21:02AM -0600, Alex Williamson wrote:
  On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
   
Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
konrad.w...@oracle.com:

On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
Hi Greg,

We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
closed that has been perculating for a while around creating a 
mechanism
that will allow kernel drivers like vfio can bind to devices of any 
type.

This thread with you:
http://www.spinics.net/lists/kvm-arm/msg08370.html
...seems to have died out, so am trying to get your response
and will summarize again.  Vfio drivers in the kernel (regardless of
bus type) need to bind to devices of any type.  The driver's function
is to simply export hardware resources of any type to user space.

There are several approaches that have been proposed:

You seem to have missed the one I proposed.

  1.  new_id -- (current approach) the user explicitly registers
  each new device type with the vfio driver using the new_id
  mechanism.

  Problem: multiple drivers will be resident that handle the
  same device type...and there is nothing user space hotplug
  infrastructure can do to help.

  2.  any id -- the vfio driver could specify a wildcard match
  of some kind in its ID match table which would allow it to
  match and bind to any possible device id.  However,
  we don't want the vfio driver grabbing _all_ devices...just the 
ones we
  explicitly want to pass to user space.

  The proposed patch to support this was to create a new flag
  sysfs_bind_only in struct device_driver.  When this flag
  is set, the driver can only bind to devices via the sysfs
  bind file.  This would allow the wildcard match to work.

  Patch is here:
  https://lkml.org/lkml/2013/12/3/253

  3.  Driver initiated explicit bind -- with this approach the
  vfio driver would create a private 'bind' sysfs object
  and the user would echo the requested device into it:

  echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind

  In order to make that work, the driver would need to call
  driver_probe_device() and thus we need this patch:
  https://lkml.org/lkml/2014/2/8/175

4). Use the 'unbind' (from the original device) and 'bind' to vfio 
driver.
   
   This is approach 2, no?
   

Which I think is what is currently being done. Why is that not 
sufficient?
   
   How would 'bind to vfio driver' look like?
   
The only thing I see in the URL is  That works, but it is ugly.
There is some mention of race but I don't see how - if you do the 
'unbind'
on the original driver and then bind the BDF to the VFIO how would you 
get
a race?
   
   Typically on PCI, you do a
   
 - add wildcard (pci id) match to vfio driver
 - unbind driver
 - reprobe
 - device attaches to vfio driver because it is the least recent match
 - remove wildcard match from vfio driver
   
   If in between you hotplug add a card of the same type, it gets attached 
   to vfio - even though the logical default driver would be the device 
   specific driver.
  
  I've mentioned drivers_autoprobe in the past, but I'm not sure we're
  really factoring it into the discussion.  drivers_autoprobe allows us to
  toggle two points:
  
  a) When a new device is added whether we automatically give drivers a
  try at binding to it
  
  b) When a new driver is added whether it gets to try to bind to anything
  in the system
  
  So we do have a mechanism to avoid the race, but the problem is that it
  becomes the responsibility of userspace to:
  
  1) turn off drivers_autoprobe
  2) unbind/new_id/bind/remove_id
  3) turn on drivers_autoprobe
  4) call drivers_probe for anything added between 1)  3)
  
  Is the question about the ugliness of the current solution whether it's
  unreasonable to ask userspace to do this?
  
  What we seem to be asking for above is more like an autoprobe flag per
  driver where there's some way for this special driver to opt out of auto
  probing.  Option 2. in Stuart's list does this by short-cutting ID
  matching so that a match is only found when using the sysfs bind path,
  option 3. enables a way for a driver to expose their own sysfs entry
  point for binding.  The latter feels particularly chaotic since drivers
  get to make-up their own bind mechanism.
  
  Another twist I'll throw in is that devices can be hot added to IOMMU
  groups that are in-use by userspace.  When that happens we'd like to be
  able to disable driver autoprobe of the device to avoid a host driver
  automatically 

Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Konrad Rzeszutek Wilk
On Wed, Mar 26, 2014 at 10:49:52AM -0600, Alex Williamson wrote:
 On Wed, 2014-03-26 at 12:32 -0400, Konrad Rzeszutek Wilk wrote:
  On Wed, Mar 26, 2014 at 10:21:02AM -0600, Alex Williamson wrote:
   On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:

 Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
 konrad.w...@oracle.com:
 
 On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
 Hi Greg,
 
 We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
 closed that has been perculating for a while around creating a 
 mechanism
 that will allow kernel drivers like vfio can bind to devices of any 
 type.
 
 This thread with you:
 http://www.spinics.net/lists/kvm-arm/msg08370.html
 ...seems to have died out, so am trying to get your response
 and will summarize again.  Vfio drivers in the kernel (regardless of
 bus type) need to bind to devices of any type.  The driver's function
 is to simply export hardware resources of any type to user space.
 
 There are several approaches that have been proposed:
 
 You seem to have missed the one I proposed.
 
   1.  new_id -- (current approach) the user explicitly registers
   each new device type with the vfio driver using the new_id
   mechanism.
 
   Problem: multiple drivers will be resident that handle the
   same device type...and there is nothing user space hotplug
   infrastructure can do to help.
 
   2.  any id -- the vfio driver could specify a wildcard match
   of some kind in its ID match table which would allow it to
   match and bind to any possible device id.  However,
   we don't want the vfio driver grabbing _all_ devices...just 
 the ones we
   explicitly want to pass to user space.
 
   The proposed patch to support this was to create a new flag
   sysfs_bind_only in struct device_driver.  When this flag
   is set, the driver can only bind to devices via the sysfs
   bind file.  This would allow the wildcard match to work.
 
   Patch is here:
   https://lkml.org/lkml/2013/12/3/253
 
   3.  Driver initiated explicit bind -- with this approach the
   vfio driver would create a private 'bind' sysfs object
   and the user would echo the requested device into it:
 
   echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
 
   In order to make that work, the driver would need to call
   driver_probe_device() and thus we need this patch:
   https://lkml.org/lkml/2014/2/8/175
 
 4). Use the 'unbind' (from the original device) and 'bind' to vfio 
 driver.

This is approach 2, no?

 
 Which I think is what is currently being done. Why is that not 
 sufficient?

How would 'bind to vfio driver' look like?

 The only thing I see in the URL is  That works, but it is ugly.
 There is some mention of race but I don't see how - if you do the 
 'unbind'
 on the original driver and then bind the BDF to the VFIO how would 
 you get
 a race?

Typically on PCI, you do a

  - add wildcard (pci id) match to vfio driver
  - unbind driver
  - reprobe
  - device attaches to vfio driver because it is the least recent match
  - remove wildcard match from vfio driver

If in between you hotplug add a card of the same type, it gets attached 
to vfio - even though the logical default driver would be the device 
specific driver.
   
   I've mentioned drivers_autoprobe in the past, but I'm not sure we're
   really factoring it into the discussion.  drivers_autoprobe allows us to
   toggle two points:
   
   a) When a new device is added whether we automatically give drivers a
   try at binding to it
   
   b) When a new driver is added whether it gets to try to bind to anything
   in the system
   
   So we do have a mechanism to avoid the race, but the problem is that it
   becomes the responsibility of userspace to:
   
   1) turn off drivers_autoprobe
   2) unbind/new_id/bind/remove_id
   3) turn on drivers_autoprobe
   4) call drivers_probe for anything added between 1)  3)
   
   Is the question about the ugliness of the current solution whether it's
   unreasonable to ask userspace to do this?
   
   What we seem to be asking for above is more like an autoprobe flag per
   driver where there's some way for this special driver to opt out of auto
   probing.  Option 2. in Stuart's list does this by short-cutting ID
   matching so that a match is only found when using the sysfs bind path,
   option 3. enables a way for a driver to expose their own sysfs entry
   point for binding.  The latter feels particularly chaotic since drivers
   get to make-up their own bind mechanism.
   
   Another twist I'll throw in is that devices 

Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Alex Williamson
On Wed, 2014-03-26 at 13:04 -0400, Konrad Rzeszutek Wilk wrote:
 On Wed, Mar 26, 2014 at 10:49:52AM -0600, Alex Williamson wrote:
  On Wed, 2014-03-26 at 12:32 -0400, Konrad Rzeszutek Wilk wrote:
   On Wed, Mar 26, 2014 at 10:21:02AM -0600, Alex Williamson wrote:
On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
 
  Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
  konrad.w...@oracle.com:
  
  On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
  Hi Greg,
  
  We (Linaro, Freescale, Virtual Open Systems) are trying get an 
  issue
  closed that has been perculating for a while around creating a 
  mechanism
  that will allow kernel drivers like vfio can bind to devices of 
  any type.
  
  This thread with you:
  http://www.spinics.net/lists/kvm-arm/msg08370.html
  ...seems to have died out, so am trying to get your response
  and will summarize again.  Vfio drivers in the kernel (regardless 
  of
  bus type) need to bind to devices of any type.  The driver's 
  function
  is to simply export hardware resources of any type to user space.
  
  There are several approaches that have been proposed:
  
  You seem to have missed the one I proposed.
  
1.  new_id -- (current approach) the user explicitly registers
each new device type with the vfio driver using the new_id
mechanism.
  
Problem: multiple drivers will be resident that handle the
same device type...and there is nothing user space hotplug
infrastructure can do to help.
  
2.  any id -- the vfio driver could specify a wildcard match
of some kind in its ID match table which would allow it to
match and bind to any possible device id.  However,
we don't want the vfio driver grabbing _all_ devices...just 
  the ones we
explicitly want to pass to user space.
  
The proposed patch to support this was to create a new flag
sysfs_bind_only in struct device_driver.  When this flag
is set, the driver can only bind to devices via the sysfs
bind file.  This would allow the wildcard match to work.
  
Patch is here:
https://lkml.org/lkml/2013/12/3/253
  
3.  Driver initiated explicit bind -- with this approach the
vfio driver would create a private 'bind' sysfs object
and the user would echo the requested device into it:
  
echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
  
In order to make that work, the driver would need to call
driver_probe_device() and thus we need this patch:
https://lkml.org/lkml/2014/2/8/175
  
  4). Use the 'unbind' (from the original device) and 'bind' to vfio 
  driver.
 
 This is approach 2, no?
 
  
  Which I think is what is currently being done. Why is that not 
  sufficient?
 
 How would 'bind to vfio driver' look like?
 
  The only thing I see in the URL is  That works, but it is ugly.
  There is some mention of race but I don't see how - if you do the 
  'unbind'
  on the original driver and then bind the BDF to the VFIO how would 
  you get
  a race?
 
 Typically on PCI, you do a
 
   - add wildcard (pci id) match to vfio driver
   - unbind driver
   - reprobe
   - device attaches to vfio driver because it is the least recent 
 match
   - remove wildcard match from vfio driver
 
 If in between you hotplug add a card of the same type, it gets 
 attached to vfio - even though the logical default driver would be 
 the device specific driver.

I've mentioned drivers_autoprobe in the past, but I'm not sure we're
really factoring it into the discussion.  drivers_autoprobe allows us to
toggle two points:

a) When a new device is added whether we automatically give drivers a
try at binding to it

b) When a new driver is added whether it gets to try to bind to anything
in the system

So we do have a mechanism to avoid the race, but the problem is that it
becomes the responsibility of userspace to:

1) turn off drivers_autoprobe
2) unbind/new_id/bind/remove_id
3) turn on drivers_autoprobe
4) call drivers_probe for anything added between 1)  3)

Is the question about the ugliness of the current solution whether it's
unreasonable to ask userspace to do this?

What we seem to be asking for above is more like an autoprobe flag per
driver where there's some way for this special driver to opt out of auto
probing.  Option 2. in Stuart's list does this by short-cutting ID
matching so that a match is only found when using the sysfs bind path,
option 3. enables a way for a 

RE: mechanism to allow a driver to bind to any device

2014-03-26 Thread Stuart Yoder
 The other option for this is to having some sort of priority on the
 device probing with hotplugging.
 
 That is you can could do the following:
 
  1) add the device vendor/model in vfio
  2) unbind the BDF from the original driver.
  3) hotplug happens - any new device that has the device vendor/model
 gets
owned by vfio instead of the original device.
  4). bind the BDF to the vfio.
 
 Granted that is a bit silly too - as the admin might want to have the new
 hotplugged device be owned by the native driver.
 
 In which case, why not just switch out from using device vendor/model
 to just using BDF values?

Did you read option #3 in my proposal-- using bus/dev/func # is
one option proposed:

3.  Driver initiated explicit bind -- with this approach the
vfio driver would create a private 'bind' sysfs object
and the user would echo the requested device into it:
  
echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
  
  bus/dev/func
 
In order to make that work, the driver would need to call
driver_probe_device() and thus we need this patch:
https://lkml.org/lkml/2014/2/8/175

But in order to do that the vfio driver needs to call 
driver_probe_device() which it can't right now without
the proposed 2 line patch...which Greg rejects.

Stuart
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Antonios Motakis
Hello,


On Wed, Mar 26, 2014 at 2:40 AM, Stuart Yoder stuart.yo...@freescale.comwrote:

 Hi Greg,

 We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
 closed that has been perculating for a while around creating a mechanism
 that will allow kernel drivers like vfio can bind to devices of any type.

 This thread with you:
 http://www.spinics.net/lists/kvm-arm/msg08370.html
 ...seems to have died out, so am trying to get your response
 and will summarize again.  Vfio drivers in the kernel (regardless of
 bus type) need to bind to devices of any type.  The driver's function
 is to simply export hardware resources of any type to user space.

 There are several approaches that have been proposed:

1.  new_id -- (current approach) the user explicitly registers
each new device type with the vfio driver using the new_id
mechanism.

Problem: multiple drivers will be resident that handle the
same device type...and there is nothing user space hotplug
infrastructure can do to help.


Of note is that new_id doesn't work particularly well for platform devices.
Before trying any of the other two solutions, a nasty hack was applied on
the device tree used with the system in order to let vfio-platform match
with a specific device, which is certainly not an acceptable solution.

Implementing wildcard matching quickly reveals the problems mentioned,
which motivates the other two approaches.


2.  any id -- the vfio driver could specify a wildcard match
of some kind in its ID match table which would allow it to
match and bind to any possible device id.  However,
we don't want the vfio driver grabbing _all_ devices...just the
 ones we
explicitly want to pass to user space.

The proposed patch to support this was to create a new flag
sysfs_bind_only in struct device_driver.  When this flag
is set, the driver can only bind to devices via the sysfs
bind file.  This would allow the wildcard match to work.

Patch is here:
https://lkml.org/lkml/2013/12/3/253

3.  Driver initiated explicit bind -- with this approach the
vfio driver would create a private 'bind' sysfs object
and the user would echo the requested device into it:

echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind

In order to make that work, the driver would need to call
driver_probe_device() and thus we need this patch:
https://lkml.org/lkml/2014/2/8/175


 Would like your comment on these options-- option #3 is preferred
 and is literally a 2 line patch.


I would definitely agree with approach #3, for which Kim has already
provided a patch. Not having this would make using VFIO with platform
devices really inelegant and strange.



 Thanks,
 Stuart




-- 
Antonios Motakis
Virtual Open Systems
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Antonios Motakis
(Resend because of html)

On Wed, Mar 26, 2014 at 2:40 AM, Stuart Yoder
stuart.yo...@freescale.com wrote:
 Hi Greg,

 We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
 closed that has been perculating for a while around creating a mechanism
 that will allow kernel drivers like vfio can bind to devices of any type.

 This thread with you:
 http://www.spinics.net/lists/kvm-arm/msg08370.html
 ...seems to have died out, so am trying to get your response
 and will summarize again.  Vfio drivers in the kernel (regardless of
 bus type) need to bind to devices of any type.  The driver's function
 is to simply export hardware resources of any type to user space.

 There are several approaches that have been proposed:

1.  new_id -- (current approach) the user explicitly registers
each new device type with the vfio driver using the new_id
mechanism.

Problem: multiple drivers will be resident that handle the
same device type...and there is nothing user space hotplug
infrastructure can do to help.


Of note is that new_id doesn't work particularly well for platform
devices. Before trying any of the other two solutions, a nasty hack
was applied on the device tree used with the system in order to let
vfio-platform match with a specific device, which is certainly not an
acceptable solution.

Implementing wildcard matching quickly reveals the problems mentioned,
which motivates the other two approaches.

2.  any id -- the vfio driver could specify a wildcard match
of some kind in its ID match table which would allow it to
match and bind to any possible device id.  However,
we don't want the vfio driver grabbing _all_ devices...just the ones we
explicitly want to pass to user space.

The proposed patch to support this was to create a new flag
sysfs_bind_only in struct device_driver.  When this flag
is set, the driver can only bind to devices via the sysfs
bind file.  This would allow the wildcard match to work.

Patch is here:
https://lkml.org/lkml/2013/12/3/253

3.  Driver initiated explicit bind -- with this approach the
vfio driver would create a private 'bind' sysfs object
and the user would echo the requested device into it:

echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind

In order to make that work, the driver would need to call
driver_probe_device() and thus we need this patch:
https://lkml.org/lkml/2014/2/8/175


 Would like your comment on these options-- option #3 is preferred
 and is literally a 2 line patch.

I would definitely agree with approach #3, for which Kim has already
provided a patch. Not having this would make using VFIO with platform
devices really inelegant and strange.


 Thanks,
 Stuart



-- 
Antonios Motakis
Virtual Open Systems
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: mechanism to allow a driver to bind to any device

2014-03-26 Thread Alex Williamson
On Wed, 2014-03-26 at 10:21 -0600, Alex Williamson wrote:
 On Wed, 2014-03-26 at 23:06 +0800, Alexander Graf wrote:
  
   Am 26.03.2014 um 22:40 schrieb Konrad Rzeszutek Wilk 
   konrad.w...@oracle.com:
   
   On Wed, Mar 26, 2014 at 01:40:32AM +, Stuart Yoder wrote:
   Hi Greg,
   
   We (Linaro, Freescale, Virtual Open Systems) are trying get an issue
   closed that has been perculating for a while around creating a mechanism
   that will allow kernel drivers like vfio can bind to devices of any type.
   
   This thread with you:
   http://www.spinics.net/lists/kvm-arm/msg08370.html
   ...seems to have died out, so am trying to get your response
   and will summarize again.  Vfio drivers in the kernel (regardless of
   bus type) need to bind to devices of any type.  The driver's function
   is to simply export hardware resources of any type to user space.
   
   There are several approaches that have been proposed:
   
   You seem to have missed the one I proposed.
   
 1.  new_id -- (current approach) the user explicitly registers
 each new device type with the vfio driver using the new_id
 mechanism.
   
 Problem: multiple drivers will be resident that handle the
 same device type...and there is nothing user space hotplug
 infrastructure can do to help.
   
 2.  any id -- the vfio driver could specify a wildcard match
 of some kind in its ID match table which would allow it to
 match and bind to any possible device id.  However,
 we don't want the vfio driver grabbing _all_ devices...just the 
   ones we
 explicitly want to pass to user space.
   
 The proposed patch to support this was to create a new flag
 sysfs_bind_only in struct device_driver.  When this flag
 is set, the driver can only bind to devices via the sysfs
 bind file.  This would allow the wildcard match to work.
   
 Patch is here:
 https://lkml.org/lkml/2013/12/3/253
   
 3.  Driver initiated explicit bind -- with this approach the
 vfio driver would create a private 'bind' sysfs object
 and the user would echo the requested device into it:
   
 echo 0001:03:00.0  /sys/bus/pci/drivers/vfio-pci/vfio_bind
   
 In order to make that work, the driver would need to call
 driver_probe_device() and thus we need this patch:
 https://lkml.org/lkml/2014/2/8/175
   
   4). Use the 'unbind' (from the original device) and 'bind' to vfio driver.
  
  This is approach 2, no?
  
   
   Which I think is what is currently being done. Why is that not sufficient?
  
  How would 'bind to vfio driver' look like?
  
   The only thing I see in the URL is  That works, but it is ugly.
   There is some mention of race but I don't see how - if you do the 'unbind'
   on the original driver and then bind the BDF to the VFIO how would you get
   a race?
  
  Typically on PCI, you do a
  
- add wildcard (pci id) match to vfio driver
- unbind driver
- reprobe
- device attaches to vfio driver because it is the least recent match
- remove wildcard match from vfio driver
  
  If in between you hotplug add a card of the same type, it gets attached to 
  vfio - even though the logical default driver would be the device 
  specific driver.
 
 I've mentioned drivers_autoprobe in the past, but I'm not sure we're
 really factoring it into the discussion.  drivers_autoprobe allows us to
 toggle two points:
 
 a) When a new device is added whether we automatically give drivers a
 try at binding to it
 
 b) When a new driver is added whether it gets to try to bind to anything
 in the system
 
 So we do have a mechanism to avoid the race, but the problem is that it
 becomes the responsibility of userspace to:
 
 1) turn off drivers_autoprobe
 2) unbind/new_id/bind/remove_id
 3) turn on drivers_autoprobe
 4) call drivers_probe for anything added between 1)  3)
 
 Is the question about the ugliness of the current solution whether it's
 unreasonable to ask userspace to do this?
 
 What we seem to be asking for above is more like an autoprobe flag per
 driver where there's some way for this special driver to opt out of auto
 probing.  Option 2. in Stuart's list does this by short-cutting ID
 matching so that a match is only found when using the sysfs bind path,
 option 3. enables a way for a driver to expose their own sysfs entry
 point for binding.  The latter feels particularly chaotic since drivers
 get to make-up their own bind mechanism.
 
 Another twist I'll throw in is that devices can be hot added to IOMMU
 groups that are in-use by userspace.  When that happens we'd like to be
 able to disable driver autoprobe of the device to avoid a host driver
 automatically binding to the device.  I wonder if instead of looking at
 the problem from the driver perspective, if we were to instead look at
 it from the device perspective if we might find a solution that would
 address both.