[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [patch v6 02/12] vfio: squeeze out vfio_pci_do_hot_reset fo
From: |
Cao jin |
Subject: |
[Qemu-devel] [patch v6 02/12] vfio: squeeze out vfio_pci_do_hot_reset for support bus reset |
Date: |
Tue, 5 Apr 2016 19:41:53 +0800 |
From: Chen Fan <address@hidden>
squeeze out vfio_pci_do_hot_reset to do host bus reset when AER recovery.
Signed-off-by: Chen Fan <address@hidden>
---
hw/vfio/pci.c | 75 +++++++++++++++++++++++++++++++++++------------------------
1 file changed, 44 insertions(+), 31 deletions(-)
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index cf40f9e..1ad47ef 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -1746,6 +1746,48 @@ error:
return ret;
}
+static int vfio_pci_do_hot_reset(VFIOPCIDevice *vdev,
+ struct vfio_pci_hot_reset_info *info)
+{
+ VFIOGroup *group;
+ struct vfio_pci_hot_reset *reset;
+ int32_t *fds;
+ int ret, i, count;
+ struct vfio_pci_dependent_device *devices;
+
+ /* Determine how many group fds need to be passed */
+ count = 0;
+ devices = &info->devices[0];
+ QLIST_FOREACH(group, &vfio_group_list, next) {
+ for (i = 0; i < info->count; i++) {
+ if (group->groupid == devices[i].group_id) {
+ count++;
+ break;
+ }
+ }
+ }
+
+ reset = g_malloc0(sizeof(*reset) + (count * sizeof(*fds)));
+ reset->argsz = sizeof(*reset) + (count * sizeof(*fds));
+ fds = &reset->group_fds[0];
+
+ /* Fill in group fds */
+ QLIST_FOREACH(group, &vfio_group_list, next) {
+ for (i = 0; i < info->count; i++) {
+ if (group->groupid == devices[i].group_id) {
+ fds[reset->count++] = group->fd;
+ break;
+ }
+ }
+ }
+
+ /* Bus reset! */
+ ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_PCI_HOT_RESET, reset);
+ g_free(reset);
+
+ return ret;
+}
+
static int vfio_add_std_cap(VFIOPCIDevice *vdev, uint8_t pos)
{
PCIDevice *pdev = &vdev->pdev;
@@ -1889,9 +1931,7 @@ static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool
single)
VFIOGroup *group;
struct vfio_pci_hot_reset_info *info = NULL;
struct vfio_pci_dependent_device *devices;
- struct vfio_pci_hot_reset *reset;
- int32_t *fds;
- int ret, i, count;
+ int ret, i;
bool multi = false;
trace_vfio_pci_hot_reset(vdev->vbasedev.name, single ? "one" : "multi");
@@ -1969,34 +2009,7 @@ static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool
single)
goto out_single;
}
- /* Determine how many group fds need to be passed */
- count = 0;
- QLIST_FOREACH(group, &vfio_group_list, next) {
- for (i = 0; i < info->count; i++) {
- if (group->groupid == devices[i].group_id) {
- count++;
- break;
- }
- }
- }
-
- reset = g_malloc0(sizeof(*reset) + (count * sizeof(*fds)));
- reset->argsz = sizeof(*reset) + (count * sizeof(*fds));
- fds = &reset->group_fds[0];
-
- /* Fill in group fds */
- QLIST_FOREACH(group, &vfio_group_list, next) {
- for (i = 0; i < info->count; i++) {
- if (group->groupid == devices[i].group_id) {
- fds[reset->count++] = group->fd;
- break;
- }
- }
- }
-
- /* Bus reset! */
- ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_PCI_HOT_RESET, reset);
- g_free(reset);
+ ret = vfio_pci_do_hot_reset(vdev, info);
trace_vfio_pci_hot_reset_result(vdev->vbasedev.name,
ret ? "%m" : "Success");
--
1.9.3
- [Qemu-devel] [patch v6 00/12] vfio-pci: pass the aer error to guest, part2, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 01/12] vfio: extract vfio_get_hot_reset_info as a single function, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 02/12] vfio: squeeze out vfio_pci_do_hot_reset for support bus reset,
Cao jin <=
- [Qemu-devel] [patch v6 03/12] vfio: add pcie extended capability support, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 05/12] vfio: refine function vfio_pci_host_match, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 04/12] vfio: add aer support for vfio device, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 09/12] vfio: vote the function 0 to do host bus reset when aer occurred, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 08/12] vfio: add check aer functionality for hotplug device, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 07/12] pci: add a pci_function_is_valid callback to check function if valid, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 06/12] vfio: add check host bus reset is support or not, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 12/12] vfio: add 'aer' property to expose aercap, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 10/12] vfio-pci: pass the aer error to guest, Cao jin, 2016/04/05
- [Qemu-devel] [patch v6 11/12] vfio: register aer resume notification handler for aer resume, Cao jin, 2016/04/05