diff mbox series

[v3,20/23] hw/pvrdma: Clean device's resource when system is shutdown

Message ID 20181113071336.6242-21-yuval.shaia@oracle.com (mailing list archive)
State New, archived
Headers show
Series Add support for RDMA MAD | expand

Commit Message

Yuval Shaia Nov. 13, 2018, 7:13 a.m. UTC
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>
---
 hw/rdma/vmw/pvrdma.h      |  2 ++
 hw/rdma/vmw/pvrdma_main.c | 12 ++++++++++++
 2 files changed, 14 insertions(+)

Comments

Marcel Apfelbaum Nov. 17, 2018, 12:24 p.m. UTC | #1
On 11/13/18 9:13 AM, Yuval Shaia wrote:
> 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>
> ---
>   hw/rdma/vmw/pvrdma.h      |  2 ++
>   hw/rdma/vmw/pvrdma_main.c | 12 ++++++++++++
>   2 files changed, 14 insertions(+)
>
> diff --git a/hw/rdma/vmw/pvrdma.h b/hw/rdma/vmw/pvrdma.h
> index 10a3c4fb7c..ffae36986e 100644
> --- a/hw/rdma/vmw/pvrdma.h
> +++ b/hw/rdma/vmw/pvrdma.h
> @@ -17,6 +17,7 @@
>   #define PVRDMA_PVRDMA_H
>   
>   #include "qemu/units.h"
> +#include "qemu/notify.h"
>   #include "hw/pci/pci.h"
>   #include "hw/pci/msix.h"
>   #include "chardev/char-fe.h"
> @@ -87,6 +88,7 @@ typedef struct PVRDMADev {
>       RdmaDeviceResources rdma_dev_res;
>       CharBackend mad_chr;
>       VMXNET3State *func0;
> +    Notifier shutdown_notifier;
>   } PVRDMADev;
>   #define PVRDMA_DEV(dev) OBJECT_CHECK(PVRDMADev, (dev), PVRDMA_HW_NAME)
>   
> diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c
> index 95e9322b7c..45a59cddf9 100644
> --- a/hw/rdma/vmw/pvrdma_main.c
> +++ b/hw/rdma/vmw/pvrdma_main.c
> @@ -24,6 +24,7 @@
>   #include "hw/qdev-properties.h"
>   #include "cpu.h"
>   #include "trace.h"
> +#include "sysemu/sysemu.h"
>   
>   #include "../rdma_rm.h"
>   #include "../rdma_backend.h"
> @@ -559,6 +560,14 @@ static int pvrdma_check_ram_shared(Object *obj, void *opaque)
>       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)
>   {
>       int rc;
> @@ -623,6 +632,9 @@ static void pvrdma_realize(PCIDevice *pdev, Error **errp)
>           goto out;
>       }
>   
> +    dev->shutdown_notifier.notify = pvrdma_shutdown_notifier;
> +    qemu_register_shutdown_notifier(&dev->shutdown_notifier);
> +
>   out:
>       if (rc) {
>           error_append_hint(errp, "Device fail to load\n");

Reviewed-by: Marcel Apfelbaum<marcel.apfelbaum@gmail.com>

Thanks,
Marcel
diff mbox series

Patch

diff --git a/hw/rdma/vmw/pvrdma.h b/hw/rdma/vmw/pvrdma.h
index 10a3c4fb7c..ffae36986e 100644
--- a/hw/rdma/vmw/pvrdma.h
+++ b/hw/rdma/vmw/pvrdma.h
@@ -17,6 +17,7 @@ 
 #define PVRDMA_PVRDMA_H
 
 #include "qemu/units.h"
+#include "qemu/notify.h"
 #include "hw/pci/pci.h"
 #include "hw/pci/msix.h"
 #include "chardev/char-fe.h"
@@ -87,6 +88,7 @@  typedef struct PVRDMADev {
     RdmaDeviceResources rdma_dev_res;
     CharBackend mad_chr;
     VMXNET3State *func0;
+    Notifier shutdown_notifier;
 } PVRDMADev;
 #define PVRDMA_DEV(dev) OBJECT_CHECK(PVRDMADev, (dev), PVRDMA_HW_NAME)
 
diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c
index 95e9322b7c..45a59cddf9 100644
--- a/hw/rdma/vmw/pvrdma_main.c
+++ b/hw/rdma/vmw/pvrdma_main.c
@@ -24,6 +24,7 @@ 
 #include "hw/qdev-properties.h"
 #include "cpu.h"
 #include "trace.h"
+#include "sysemu/sysemu.h"
 
 #include "../rdma_rm.h"
 #include "../rdma_backend.h"
@@ -559,6 +560,14 @@  static int pvrdma_check_ram_shared(Object *obj, void *opaque)
     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)
 {
     int rc;
@@ -623,6 +632,9 @@  static void pvrdma_realize(PCIDevice *pdev, Error **errp)
         goto out;
     }
 
+    dev->shutdown_notifier.notify = pvrdma_shutdown_notifier;
+    qemu_register_shutdown_notifier(&dev->shutdown_notifier);
+
 out:
     if (rc) {
         error_append_hint(errp, "Device fail to load\n");