diff mbox

[RFC,v2,20/23] spapr: Remove vCPU objects after CPU hot unplug

Message ID 1427117764-23008-21-git-send-email-bharata@linux.vnet.ibm.com
State New
Headers show

Commit Message

Bharata B Rao March 23, 2015, 1:36 p.m. UTC
Release the vCPU objects after CPU hot unplug so that vCPU fd
can be parked and reused.

Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
---
 hw/ppc/spapr.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

Comments

David Gibson March 25, 2015, 5:46 a.m. UTC | #1
On Mon, Mar 23, 2015 at 07:06:01PM +0530, Bharata B Rao wrote:
> Release the vCPU objects after CPU hot unplug so that vCPU fd
> can be parked and reused.
> 
> Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>

I think this patch is simple enough it should just be folded in with
the previous one.

> ---
>  hw/ppc/spapr.c | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 7b8784d..3e56d9e 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -1886,6 +1886,23 @@ static void spapr_cpu_hotplug_add(DeviceState *dev, CPUState *cs, Error **errp)
>      }
>  }
>  
> +static void spapr_cpu_release(DeviceState *dev, void *opaque)
> +{
> +    CPUState *cs;
> +    int i;
> +    int id = ppc_get_vcpu_dt_id(POWERPC_CPU(CPU(dev)));
> +
> +    for (i = id; i < id + smp_threads; i++) {
> +        CPU_FOREACH(cs) {
> +            PowerPCCPU *cpu = POWERPC_CPU(cs);
> +
> +            if (i == ppc_get_vcpu_dt_id(cpu)) {
> +                cpu_remove(cs);
> +            }
> +        }
> +    }
> +}
> +
>  static void spapr_cpu_hotplug_remove(DeviceState *dev, CPUState *cs,
>                                       Error **errp)
>  {
> @@ -1895,7 +1912,7 @@ static void spapr_cpu_hotplug_remove(DeviceState *dev, CPUState *cs,
>          spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, id);
>      sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
>  
> -    drck->detach(drc, dev, NULL, NULL, errp);
> +    drck->detach(drc, dev, spapr_cpu_release, NULL, errp);
>  }
>  
>  static void spapr_cpu_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
diff mbox

Patch

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 7b8784d..3e56d9e 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1886,6 +1886,23 @@  static void spapr_cpu_hotplug_add(DeviceState *dev, CPUState *cs, Error **errp)
     }
 }
 
+static void spapr_cpu_release(DeviceState *dev, void *opaque)
+{
+    CPUState *cs;
+    int i;
+    int id = ppc_get_vcpu_dt_id(POWERPC_CPU(CPU(dev)));
+
+    for (i = id; i < id + smp_threads; i++) {
+        CPU_FOREACH(cs) {
+            PowerPCCPU *cpu = POWERPC_CPU(cs);
+
+            if (i == ppc_get_vcpu_dt_id(cpu)) {
+                cpu_remove(cs);
+            }
+        }
+    }
+}
+
 static void spapr_cpu_hotplug_remove(DeviceState *dev, CPUState *cs,
                                      Error **errp)
 {
@@ -1895,7 +1912,7 @@  static void spapr_cpu_hotplug_remove(DeviceState *dev, CPUState *cs,
         spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, id);
     sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
-    drck->detach(drc, dev, NULL, NULL, errp);
+    drck->detach(drc, dev, spapr_cpu_release, NULL, errp);
 }
 
 static void spapr_cpu_plug(HotplugHandler *hotplug_dev, DeviceState *dev,