hw/pvrdma: Clean device's resource when system is shutdown
In order to clean some external resources such as GIDs, QPs etc, register to receive notification when VM is shutdown. Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com> Reviewed-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
This commit is contained in:
parent
2dadd75385
commit
ffa65d97fc
|
@ -17,6 +17,7 @@
|
||||||
#define PVRDMA_PVRDMA_H
|
#define PVRDMA_PVRDMA_H
|
||||||
|
|
||||||
#include "qemu/units.h"
|
#include "qemu/units.h"
|
||||||
|
#include "qemu/notify.h"
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
#include "hw/pci/msix.h"
|
#include "hw/pci/msix.h"
|
||||||
#include "chardev/char-fe.h"
|
#include "chardev/char-fe.h"
|
||||||
|
@ -87,6 +88,7 @@ typedef struct PVRDMADev {
|
||||||
RdmaDeviceResources rdma_dev_res;
|
RdmaDeviceResources rdma_dev_res;
|
||||||
CharBackend mad_chr;
|
CharBackend mad_chr;
|
||||||
VMXNET3State *func0;
|
VMXNET3State *func0;
|
||||||
|
Notifier shutdown_notifier;
|
||||||
} PVRDMADev;
|
} PVRDMADev;
|
||||||
#define PVRDMA_DEV(dev) OBJECT_CHECK(PVRDMADev, (dev), PVRDMA_HW_NAME)
|
#define PVRDMA_DEV(dev) OBJECT_CHECK(PVRDMADev, (dev), PVRDMA_HW_NAME)
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
#include "sysemu/sysemu.h"
|
||||||
|
|
||||||
#include "../rdma_rm.h"
|
#include "../rdma_rm.h"
|
||||||
#include "../rdma_backend.h"
|
#include "../rdma_backend.h"
|
||||||
|
@ -334,6 +335,9 @@ static void pvrdma_fini(PCIDevice *pdev)
|
||||||
if (msix_enabled(pdev)) {
|
if (msix_enabled(pdev)) {
|
||||||
uninit_msix(pdev, RDMA_MAX_INTRS);
|
uninit_msix(pdev, RDMA_MAX_INTRS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pr_dbg("Device %s %x.%x is down\n", pdev->name, PCI_SLOT(pdev->devfn),
|
||||||
|
PCI_FUNC(pdev->devfn));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pvrdma_stop(PVRDMADev *dev)
|
static void pvrdma_stop(PVRDMADev *dev)
|
||||||
|
@ -559,6 +563,14 @@ static int pvrdma_check_ram_shared(Object *obj, void *opaque)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pvrdma_shutdown_notifier(Notifier *n, void *opaque)
|
||||||
|
{
|
||||||
|
PVRDMADev *dev = container_of(n, PVRDMADev, shutdown_notifier);
|
||||||
|
PCIDevice *pci_dev = PCI_DEVICE(dev);
|
||||||
|
|
||||||
|
pvrdma_fini(pci_dev);
|
||||||
|
}
|
||||||
|
|
||||||
static void pvrdma_realize(PCIDevice *pdev, Error **errp)
|
static void pvrdma_realize(PCIDevice *pdev, Error **errp)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -632,6 +644,9 @@ static void pvrdma_realize(PCIDevice *pdev, Error **errp)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev->shutdown_notifier.notify = pvrdma_shutdown_notifier;
|
||||||
|
qemu_register_shutdown_notifier(&dev->shutdown_notifier);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error_append_hint(errp, "Device fail to load\n");
|
error_append_hint(errp, "Device fail to load\n");
|
||||||
|
|
Loading…
Reference in a new issue