All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/2] spapr.c: add 'name' property for hotplugged CPUs nodes
@ 2021-01-20 23:23 Daniel Henrique Barboza
  2021-01-20 23:23 ` [PATCH v1 1/2] spapr.c: use g_auto* with 'nodename' in CPU DT functions Daniel Henrique Barboza
  2021-01-20 23:23 ` [PATCH v1 2/2] spapr.c: add 'name' property for hotplugged CPUs nodes Daniel Henrique Barboza
  0 siblings, 2 replies; 5+ messages in thread
From: Daniel Henrique Barboza @ 2021-01-20 23:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: Daniel Henrique Barboza, qemu-ppc, groug, david

Hi,

We're not adding the 'name' property in the hotplugged CPU nodes, and
this is being reflected in the kernel in a CPU hotunplug bug. See
patch 02 for more info. 


Daniel Henrique Barboza (2):
  spapr.c: use g_auto* with 'nodename' in CPU DT functions
  spapr.c: add 'name' property for hotplugged CPUs nodes

 hw/ppc/spapr.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

-- 
2.26.2



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v1 1/2] spapr.c: use g_auto* with 'nodename' in CPU DT functions
  2021-01-20 23:23 [PATCH v1 0/2] spapr.c: add 'name' property for hotplugged CPUs nodes Daniel Henrique Barboza
@ 2021-01-20 23:23 ` Daniel Henrique Barboza
  2021-01-21  0:27   ` David Gibson
  2021-01-20 23:23 ` [PATCH v1 2/2] spapr.c: add 'name' property for hotplugged CPUs nodes Daniel Henrique Barboza
  1 sibling, 1 reply; 5+ messages in thread
From: Daniel Henrique Barboza @ 2021-01-20 23:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: Daniel Henrique Barboza, qemu-ppc, groug, david

Next patch will use the 'nodename' string in spapr_core_dt_populate()
after the point it's being freed today.

Instead of moving 'g_free(nodename)' around, let's do a QoL change in
both CPU DT functions where 'nodename' is being freed, and use
g_autofree to avoid the 'g_free()' call altogether.

Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
---
 hw/ppc/spapr.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 6c47466fc2..cc1b709615 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -790,7 +790,6 @@ static void spapr_dt_cpus(void *fdt, SpaprMachineState *spapr)
     CPUState *cs;
     int n_cpus;
     int cpus_offset;
-    char *nodename;
     int i;
 
     cpus_offset = fdt_add_subnode(fdt, 0, "cpus");
@@ -818,6 +817,7 @@ static void spapr_dt_cpus(void *fdt, SpaprMachineState *spapr)
         PowerPCCPU *cpu = POWERPC_CPU(cs);
         int index = spapr_get_vcpu_id(cpu);
         DeviceClass *dc = DEVICE_GET_CLASS(cs);
+        g_autofree char *nodename = NULL;
         int offset;
 
         if (!spapr_is_thread0_in_vcore(spapr, cpu)) {
@@ -826,7 +826,6 @@ static void spapr_dt_cpus(void *fdt, SpaprMachineState *spapr)
 
         nodename = g_strdup_printf("%s@%x", dc->fw_name, index);
         offset = fdt_add_subnode(fdt, cpus_offset, nodename);
-        g_free(nodename);
         _FDT(offset);
         spapr_dt_cpu(cs, fdt, offset, spapr);
     }
@@ -3743,12 +3742,11 @@ int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
     PowerPCCPU *cpu = POWERPC_CPU(cs);
     DeviceClass *dc = DEVICE_GET_CLASS(cs);
     int id = spapr_get_vcpu_id(cpu);
-    char *nodename;
+    g_autofree char *nodename = NULL;
     int offset;
 
     nodename = g_strdup_printf("%s@%x", dc->fw_name, id);
     offset = fdt_add_subnode(fdt, 0, nodename);
-    g_free(nodename);
 
     spapr_dt_cpu(cs, fdt, offset, spapr);
 
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v1 2/2] spapr.c: add 'name' property for hotplugged CPUs nodes
  2021-01-20 23:23 [PATCH v1 0/2] spapr.c: add 'name' property for hotplugged CPUs nodes Daniel Henrique Barboza
  2021-01-20 23:23 ` [PATCH v1 1/2] spapr.c: use g_auto* with 'nodename' in CPU DT functions Daniel Henrique Barboza
@ 2021-01-20 23:23 ` Daniel Henrique Barboza
  2021-01-21  0:43   ` David Gibson
  1 sibling, 1 reply; 5+ messages in thread
From: Daniel Henrique Barboza @ 2021-01-20 23:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: Daniel Henrique Barboza, qemu-ppc, groug, david

In the CPU hotunplug bug [1] the guest kernel throws a scary
message in dmesg:

pseries-hotplug-cpu: Failed to offline CPU <NULL>, rc: -16

The reason isn't related to the bug though. This happens because the
kernel file arch/powerpc/platform/pseries/hotplug-cpu.c, function
dlpar_cpu_remove(), is not finding the device_node.name of the offending
CPU.

We're not populating the 'name' property for hotplugged CPUs. Since the
kernel relies on device_node.name for identifying CPU nodes, and the
CPUs that are coldplugged has the 'name' property filled by SLOF, this
is creating an unneeded inconsistency between hotplug and coldplug CPUs
in the kernel.

Let's fill the 'name' property for hotplugged CPUs as well. This will
make the guest dmesg throws a less intimidating message when we try to
unplug the last online CPU:

pseries-hotplug-cpu: Failed to offline CPU PowerPC,POWER9@1, rc: -16

[1] https://bugzilla.redhat.com/1911414

Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
---
 hw/ppc/spapr.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index cc1b709615..6ab27ea269 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3750,6 +3750,19 @@ int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
 
     spapr_dt_cpu(cs, fdt, offset, spapr);
 
+    /*
+     * spapr_dt_cpu() does not fill the 'name' property in the
+     * CPU node. The function is called during boot process, before
+     * and after CAS, and overwriting the 'name' property written
+     * by SLOF is not allowed.
+     *
+     * Write it manually after spapr_dt_cpu(). This makes the hotplug
+     * CPUs more compatible with the coldplugged ones, which have
+     * the 'name' property. Linux Kernel also relies on this
+     * property to identify CPU nodes.
+     */
+    _FDT((fdt_setprop_string(fdt, offset, "name", nodename)));
+
     *fdt_start_offset = offset;
     return 0;
 }
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v1 1/2] spapr.c: use g_auto* with 'nodename' in CPU DT functions
  2021-01-20 23:23 ` [PATCH v1 1/2] spapr.c: use g_auto* with 'nodename' in CPU DT functions Daniel Henrique Barboza
@ 2021-01-21  0:27   ` David Gibson
  0 siblings, 0 replies; 5+ messages in thread
From: David Gibson @ 2021-01-21  0:27 UTC (permalink / raw)
  To: Daniel Henrique Barboza; +Cc: qemu-ppc, qemu-devel, groug

[-- Attachment #1: Type: text/plain, Size: 2378 bytes --]

On Wed, Jan 20, 2021 at 08:23:04PM -0300, Daniel Henrique Barboza wrote:
> Next patch will use the 'nodename' string in spapr_core_dt_populate()
> after the point it's being freed today.
> 
> Instead of moving 'g_free(nodename)' around, let's do a QoL change in
> both CPU DT functions where 'nodename' is being freed, and use
> g_autofree to avoid the 'g_free()' call altogether.
> 
> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>

Applied, thanks.

> ---
>  hw/ppc/spapr.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 6c47466fc2..cc1b709615 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -790,7 +790,6 @@ static void spapr_dt_cpus(void *fdt, SpaprMachineState *spapr)
>      CPUState *cs;
>      int n_cpus;
>      int cpus_offset;
> -    char *nodename;
>      int i;
>  
>      cpus_offset = fdt_add_subnode(fdt, 0, "cpus");
> @@ -818,6 +817,7 @@ static void spapr_dt_cpus(void *fdt, SpaprMachineState *spapr)
>          PowerPCCPU *cpu = POWERPC_CPU(cs);
>          int index = spapr_get_vcpu_id(cpu);
>          DeviceClass *dc = DEVICE_GET_CLASS(cs);
> +        g_autofree char *nodename = NULL;
>          int offset;
>  
>          if (!spapr_is_thread0_in_vcore(spapr, cpu)) {
> @@ -826,7 +826,6 @@ static void spapr_dt_cpus(void *fdt, SpaprMachineState *spapr)
>  
>          nodename = g_strdup_printf("%s@%x", dc->fw_name, index);
>          offset = fdt_add_subnode(fdt, cpus_offset, nodename);
> -        g_free(nodename);
>          _FDT(offset);
>          spapr_dt_cpu(cs, fdt, offset, spapr);
>      }
> @@ -3743,12 +3742,11 @@ int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
>      PowerPCCPU *cpu = POWERPC_CPU(cs);
>      DeviceClass *dc = DEVICE_GET_CLASS(cs);
>      int id = spapr_get_vcpu_id(cpu);
> -    char *nodename;
> +    g_autofree char *nodename = NULL;
>      int offset;
>  
>      nodename = g_strdup_printf("%s@%x", dc->fw_name, id);
>      offset = fdt_add_subnode(fdt, 0, nodename);
> -    g_free(nodename);
>  
>      spapr_dt_cpu(cs, fdt, offset, spapr);
>  

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v1 2/2] spapr.c: add 'name' property for hotplugged CPUs nodes
  2021-01-20 23:23 ` [PATCH v1 2/2] spapr.c: add 'name' property for hotplugged CPUs nodes Daniel Henrique Barboza
@ 2021-01-21  0:43   ` David Gibson
  0 siblings, 0 replies; 5+ messages in thread
From: David Gibson @ 2021-01-21  0:43 UTC (permalink / raw)
  To: Daniel Henrique Barboza; +Cc: qemu-ppc, qemu-devel, groug

[-- Attachment #1: Type: text/plain, Size: 2897 bytes --]

On Wed, Jan 20, 2021 at 08:23:05PM -0300, Daniel Henrique Barboza wrote:
> In the CPU hotunplug bug [1] the guest kernel throws a scary
> message in dmesg:
> 
> pseries-hotplug-cpu: Failed to offline CPU <NULL>, rc: -16
> 
> The reason isn't related to the bug though. This happens because the
> kernel file arch/powerpc/platform/pseries/hotplug-cpu.c, function
> dlpar_cpu_remove(), is not finding the device_node.name of the offending
> CPU.
> 
> We're not populating the 'name' property for hotplugged CPUs. Since the
> kernel relies on device_node.name for identifying CPU nodes, and the
> CPUs that are coldplugged has the 'name' property filled by SLOF, this
> is creating an unneeded inconsistency between hotplug and coldplug CPUs
> in the kernel.
> 
> Let's fill the 'name' property for hotplugged CPUs as well. This will
> make the guest dmesg throws a less intimidating message when we try to
> unplug the last online CPU:
> 
> pseries-hotplug-cpu: Failed to offline CPU PowerPC,POWER9@1, rc: -16
> 
> [1] https://bugzilla.redhat.com/1911414
> 
> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>

Nice catch.  Because the PAPR code has an odd mix of flattened-tree
pieces (where 'name' is implicit) and real OF pieces (where we
definitely need it), getting this right is kind of fiddly.  Since this
bit of flat tree gets encoded into PAPR's CAS update format, which
does require the 'name' property, this is correct.

You could argue that it's more technically correct for the flattening
code to add the name property from the FDT node name, but this is
simpler and gets the job done.

Applied, thanks.

> ---
>  hw/ppc/spapr.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index cc1b709615..6ab27ea269 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -3750,6 +3750,19 @@ int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
>  
>      spapr_dt_cpu(cs, fdt, offset, spapr);
>  
> +    /*
> +     * spapr_dt_cpu() does not fill the 'name' property in the
> +     * CPU node. The function is called during boot process, before
> +     * and after CAS, and overwriting the 'name' property written
> +     * by SLOF is not allowed.
> +     *
> +     * Write it manually after spapr_dt_cpu(). This makes the hotplug
> +     * CPUs more compatible with the coldplugged ones, which have
> +     * the 'name' property. Linux Kernel also relies on this
> +     * property to identify CPU nodes.
> +     */
> +    _FDT((fdt_setprop_string(fdt, offset, "name", nodename)));
> +
>      *fdt_start_offset = offset;
>      return 0;
>  }

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-01-21  0:52 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-20 23:23 [PATCH v1 0/2] spapr.c: add 'name' property for hotplugged CPUs nodes Daniel Henrique Barboza
2021-01-20 23:23 ` [PATCH v1 1/2] spapr.c: use g_auto* with 'nodename' in CPU DT functions Daniel Henrique Barboza
2021-01-21  0:27   ` David Gibson
2021-01-20 23:23 ` [PATCH v1 2/2] spapr.c: add 'name' property for hotplugged CPUs nodes Daniel Henrique Barboza
2021-01-21  0:43   ` David Gibson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.