[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 09/11] vfio: vote a device to do host bus reset
From: |
Cao jin |
Subject: |
[Qemu-devel] [PATCH v2 09/11] vfio: vote a device to do host bus reset |
Date: |
Fri, 19 Feb 2016 18:42:38 +0800 |
From: Chen Fan <address@hidden>
Signed-off-by: Chen Fan <address@hidden>
---
hw/vfio/pci.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hw/vfio/pci.h | 1 +
2 files changed, 58 insertions(+)
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 24848c9..8e902d2 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -1937,6 +1937,8 @@ static void vfio_check_host_bus_reset(VFIOPCIDevice
*vdev, Error **errp)
/* List all affected devices by bus reset */
devices = &info->devices[0];
+ vdev->single_depend_dev = (info->count == 1);
+
/* Verify that we have all the groups required */
for (i = 0; i < info->count; i++) {
PCIHostDeviceAddress host;
@@ -2998,6 +3000,49 @@ static void vfio_exitfn(PCIDevice *pdev)
vfio_unregister_bars(vdev);
}
+static VFIOPCIDevice *vfio_pci_get_do_reset_device(VFIOPCIDevice *vdev)
+{
+ struct vfio_pci_hot_reset_info *info = NULL;
+ struct vfio_pci_dependent_device *devices;
+ VFIOGroup *group;
+ VFIODevice *vbasedev_iter;
+ int ret;
+
+ ret = vfio_get_hot_reset_info(vdev, &info);
+ if (ret) {
+ error_report("vfio: Cannot enable AER for device %s,"
+ " device does not support hot reset.",
+ vdev->vbasedev.name);
+ return NULL;
+ }
+
+ devices = &info->devices[0];
+
+ QLIST_FOREACH(group, &vfio_group_list, next) {
+ if (group->groupid == devices[0].group_id) {
+ break;
+ }
+ }
+
+ if (!group) {
+ error_report("vfio: Cannot enable AER for device %s, "
+ "depends on group %d which is not owned.",
+ vdev->vbasedev.name, devices[0].group_id);
+ return NULL;
+ }
+
+ QLIST_FOREACH(vbasedev_iter, &group->device_list, next) {
+ if (vbasedev_iter->type != VFIO_DEVICE_TYPE_PCI ||
+ !(vdev->features & VFIO_FEATURE_ENABLE_AER)) {
+ continue;
+ }
+
+ return container_of(vbasedev_iter, VFIOPCIDevice, vbasedev);
+ }
+
+ return NULL;
+}
+
static void vfio_pci_reset(DeviceState *dev)
{
PCIDevice *pdev = DO_UPCAST(PCIDevice, qdev, dev);
@@ -3005,6 +3050,18 @@ static void vfio_pci_reset(DeviceState *dev)
trace_vfio_pci_reset(vdev->vbasedev.name);
+ if (pdev->bus->in_hot_reset) {
+ VFIOPCIDevice *tmp;
+
+ tmp = vfio_pci_get_do_reset_device(vdev);
+ if (tmp) {
+ if (tmp == vdev) {
+ vfio_pci_hot_reset(vdev, vdev->single_depend_dev);
+ }
+ return;
+ }
+ }
+
vfio_pci_pre_reset(vdev);
if (vdev->resetfn && !vdev->resetfn(vdev)) {
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
index aff46c2..32bd31f 100644
--- a/hw/vfio/pci.h
+++ b/hw/vfio/pci.h
@@ -143,6 +143,7 @@ typedef struct VFIOPCIDevice {
bool no_kvm_intx;
bool no_kvm_msi;
bool no_kvm_msix;
+ bool single_depend_dev;
} VFIOPCIDevice;
uint32_t vfio_pci_read_config(PCIDevice *pdev, uint32_t addr, int len);
--
1.9.3
- [Qemu-devel] [PATCH v2 00/11] vfio-pci: pass the aer error to guest, part2, Cao jin, 2016/02/19
- [Qemu-devel] [PATCH v2 02/11] vfio: squeeze out vfio_pci_do_hot_reset for support bus reset, Cao jin, 2016/02/19
- [Qemu-devel] [PATCH v2 03/11] vfio: add pcie extended capability support, Cao jin, 2016/02/19
- [Qemu-devel] [PATCH v2 04/11] vfio: add aer support for vfio device, Cao jin, 2016/02/19
- [Qemu-devel] [PATCH v2 01/11] vfio: extract vfio_get_hot_reset_info as a single function, Cao jin, 2016/02/19
- [Qemu-devel] [PATCH v2 05/11] vfio: add check host bus reset is support or not, Cao jin, 2016/02/19
- [Qemu-devel] [PATCH v2 06/11] pci: add a is_valid_func callback to check device if complete, Cao jin, 2016/02/19
- [Qemu-devel] [PATCH v2 07/11] vfio: add check aer functionality for hotplug device, Cao jin, 2016/02/19
- [Qemu-devel] [PATCH v2 09/11] vfio: vote a device to do host bus reset,
Cao jin <=
- [Qemu-devel] [PATCH v2 08/11] pci: introduce pci bus pre reset, Cao jin, 2016/02/19