aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vfio
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2015-02-06 17:05:07 -0500
committerAlex Williamson <alex.williamson@redhat.com>2015-02-10 14:37:47 -0500
commit13060b64b819c194909121b90b5f8dd9abb5ea4e (patch)
tree3fc90f7744d110341d191dd44fe228c70422bd69 /drivers/vfio
parent4a68810dbbb4664fe4a9ac1be4d1c0e34a9b58f5 (diff)
vfio: Add and use device request op for vfio bus drivers
When a request is made to unbind a device from a vfio bus driver, we need to wait for the device to become unused, ie. for userspace to release the device. However, we have a long standing TODO in the code to do something proactive to make that happen. To enable this, we add a request callback on the vfio bus driver struct, which is intended to signal the user through the vfio device interface to release the device. Instead of passively waiting for the device to become unused, we can now pester the user to give it up. Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Diffstat (limited to 'drivers/vfio')
-rw-r--r--drivers/vfio/vfio.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index 13e0f39d91e0..4cde85501444 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -710,6 +710,7 @@ void *vfio_del_group_dev(struct device *dev)
710 struct vfio_group *group = device->group; 710 struct vfio_group *group = device->group;
711 void *device_data = device->device_data; 711 void *device_data = device->device_data;
712 struct vfio_unbound_dev *unbound; 712 struct vfio_unbound_dev *unbound;
713 unsigned int i = 0;
713 714
714 /* 715 /*
715 * The group exists so long as we have a device reference. Get 716 * The group exists so long as we have a device reference. Get
@@ -737,8 +738,27 @@ void *vfio_del_group_dev(struct device *dev)
737 738
738 vfio_device_put(device); 739 vfio_device_put(device);
739 740
740 /* TODO send a signal to encourage this to be released */ 741 /*
741 wait_event(vfio.release_q, !vfio_dev_present(group, dev)); 742 * If the device is still present in the group after the above
743 * 'put', then it is in use and we need to request it from the
744 * bus driver. The driver may in turn need to request the
745 * device from the user. We send the request on an arbitrary
746 * interval with counter to allow the driver to take escalating
747 * measures to release the device if it has the ability to do so.
748 */
749 do {
750 device = vfio_group_get_device(group, dev);
751 if (!device)
752 break;
753
754 if (device->ops->request)
755 device->ops->request(device_data, i++);
756
757 vfio_device_put(device);
758
759 } while (wait_event_interruptible_timeout(vfio.release_q,
760 !vfio_dev_present(group, dev),
761 HZ * 10) <= 0);
742 762
743 vfio_group_put(group); 763 vfio_group_put(group);
744 764