The LPAR name may be changed after the LPAR has been started in the HMC.
In that case lparstat command is not reporting the updated value because it
reads it from the device tree which is read at boot time.
However this value could be read from RTAS.
Adding this value in the /proc/powerpc/lparcfg output allows to read the
updated value.
However the hypervisor, like Qemu/KVM, may not support this RTAS
parameter. In that case the value reported in lparcfg is read from the
device tree and so is not updated accordingly.
Cc: Nathan Lynch <redacted>
Signed-off-by: Laurent Dufour <redacted>
---
v5:
fallback to the device tree value if RTAS is not providing the value.
v4:
address Nathan's new comments limiting size of the buffer.
v3:
address Michael's comments.
v2:
address Nathan's comments.
change title to partition_name aligning with existing partition_id
---
arch/powerpc/platforms/pseries/lparcfg.c | 93 ++++++++++++++++++++++++
1 file changed, 93 insertions(+)
@@ -311,6 +311,98 @@ static void parse_mpp_x_data(struct seq_file *m)seq_printf(m,"coalesce_pool_spurr=%ld\n",mpp_x_data.pool_spurr_cycles);}+/*+*PAPRdefines,insection"7.3.16 System Parameters Option",thetoken55to+*readtheLPARname,andthelargestoutputdatato4000+2byteslength.+*/+#define SPLPAR_LPAR_NAME_TOKEN 55+#define GET_SYS_PARM_BUF_SIZE 4002+#if GET_SYS_PARM_BUF_SIZE > RTAS_DATA_BUF_SIZE+#error "GET_SYS_PARM_BUF_SIZE is larger than RTAS_DATA_BUF_SIZE"+#endif++/**+*ReadthelparnameusingtheRTASibm,get-system-parametercall.+*+*Thenamereadthroughthiscallisupdatedifchangesaremadebytheend+*useronthehypervisorside.+*+*Somehypervisor(likeQemu)maynotprovidethisvalue.Inthatcase,anon+*nullvalueisreturned.+*/+staticintread_RTAS_lpar_name(structseq_file*m)+{+intrc,len,token;+union{+charraw_buffer[GET_SYS_PARM_BUF_SIZE];+struct{+__be16len;+charname[GET_SYS_PARM_BUF_SIZE-2];+};+}*local_buffer;++token=rtas_token("ibm,get-system-parameter");+if(token==RTAS_UNKNOWN_SERVICE)+return-EINVAL;++local_buffer=kmalloc(sizeof(*local_buffer),GFP_KERNEL);+if(!local_buffer)+return-ENOMEM;++do{+spin_lock(&rtas_data_buf_lock);+memset(rtas_data_buf,0,sizeof(*local_buffer));+rc=rtas_call(token,3,1,NULL,SPLPAR_LPAR_NAME_TOKEN,+__pa(rtas_data_buf),sizeof(*local_buffer));+if(!rc)+memcpy(local_buffer->raw_buffer,rtas_data_buf,+sizeof(local_buffer->raw_buffer));+spin_unlock(&rtas_data_buf_lock);+}while(rtas_busy_delay(rc));++if(!rc){+/* Force end of string */+len=min((int)be16_to_cpu(local_buffer->len),+(int)sizeof(local_buffer->name)-1);+local_buffer->name[len]='\0';++seq_printf(m,"partition_name=%s\n",local_buffer->name);+}else+rc=-ENODATA;++kfree(local_buffer);+returnrc;+}++/**+*ReadtheLPARnamefromtheDeviceTree.+*+*ThevaluereadintheDTisnotupdatediftheend-useristouchingtheLPAR+*nameonthehypervisorside.+*/+staticintread_DT_lpar_name(structseq_file*m)+{+structdevice_node*rootdn;+constchar*name;++rootdn=of_find_node_by_path("/");+if(!rootdn)+return-ENOENT;++name=of_get_property(rootdn,"ibm,partition-name",NULL);+if(!name)+return-ENOENT;++seq_printf(m,"partition_name=%s\n",name);+return0;+}++staticvoidread_lpar_name(structseq_file*m)+{+if(read_RTAS_lpar_name(m)&&read_DT_lpar_name(m))+pr_err_once("Error can't get the LPAR name");+}+#define SPLPAR_CHARACTERISTICS_TOKEN 20#define SPLPAR_MAXLENGTH 1026*(sizeof(char))
@@ -496,6 +588,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)if(firmware_has_feature(FW_FEATURE_SPLPAR)){/* this call handles the ibm,get-system-parameter contents */+read_lpar_name(m);parse_system_parameter_string(m);parse_ppp_data(m);parse_mpp_data(m);
The LPAR name may be changed after the LPAR has been started in the HMC.
In that case lparstat command is not reporting the updated value because it
reads it from the device tree which is read at boot time.
However this value could be read from RTAS.
Adding this value in the /proc/powerpc/lparcfg output allows to read the
updated value.
However the hypervisor, like Qemu/KVM, may not support this RTAS
parameter. In that case the value reported in lparcfg is read from the
device tree and so is not updated accordingly.
Cc: Nathan Lynch <redacted>
Signed-off-by: Laurent Dufour <redacted>
---
v5:
fallback to the device tree value if RTAS is not providing the value.
v4:
address Nathan's new comments limiting size of the buffer.
v3:
address Michael's comments.
v2:
address Nathan's comments.
change title to partition_name aligning with existing partition_id
The LPAR name may be changed after the LPAR has been started in the HMC.
In that case lparstat command is not reporting the updated value because it
reads it from the device tree which is read at boot time.
However this value could be read from RTAS.
Adding this value in the /proc/powerpc/lparcfg output allows to read the
updated value.
However the hypervisor, like Qemu/KVM, may not support this RTAS
parameter. In that case the value reported in lparcfg is read from the
device tree and so is not updated accordingly.
Cc: Nathan Lynch <redacted>
Signed-off-by: Laurent Dufour <redacted>
My only nit would be that in general for consistency with other function names
_RTAS_ and _DT_ should be lowercase. Seeing as they are statically scoped within
lparcfg.c maybe its ok. Otherwise,
Reviewed-by: Tyrel Datwyler <tyreld@linux.ibm.com>
quoted hunk
---
v5:
fallback to the device tree value if RTAS is not providing the value.
v4:
address Nathan's new comments limiting size of the buffer.
v3:
address Michael's comments.
v2:
address Nathan's comments.
change title to partition_name aligning with existing partition_id
---
arch/powerpc/platforms/pseries/lparcfg.c | 93 ++++++++++++++++++++++++
1 file changed, 93 insertions(+)
@@ -311,6 +311,98 @@ static void parse_mpp_x_data(struct seq_file *m)seq_printf(m,"coalesce_pool_spurr=%ld\n",mpp_x_data.pool_spurr_cycles);}+/*+*PAPRdefines,insection"7.3.16 System Parameters Option",thetoken55to+*readtheLPARname,andthelargestoutputdatato4000+2byteslength.+*/+#define SPLPAR_LPAR_NAME_TOKEN 55+#define GET_SYS_PARM_BUF_SIZE 4002+#if GET_SYS_PARM_BUF_SIZE > RTAS_DATA_BUF_SIZE+#error "GET_SYS_PARM_BUF_SIZE is larger than RTAS_DATA_BUF_SIZE"+#endif++/**+*ReadthelparnameusingtheRTASibm,get-system-parametercall.+*+*Thenamereadthroughthiscallisupdatedifchangesaremadebytheend+*useronthehypervisorside.+*+*Somehypervisor(likeQemu)maynotprovidethisvalue.Inthatcase,anon+*nullvalueisreturned.+*/+staticintread_RTAS_lpar_name(structseq_file*m)+{+intrc,len,token;+union{+charraw_buffer[GET_SYS_PARM_BUF_SIZE];+struct{+__be16len;+charname[GET_SYS_PARM_BUF_SIZE-2];+};+}*local_buffer;++token=rtas_token("ibm,get-system-parameter");+if(token==RTAS_UNKNOWN_SERVICE)+return-EINVAL;++local_buffer=kmalloc(sizeof(*local_buffer),GFP_KERNEL);+if(!local_buffer)+return-ENOMEM;++do{+spin_lock(&rtas_data_buf_lock);+memset(rtas_data_buf,0,sizeof(*local_buffer));+rc=rtas_call(token,3,1,NULL,SPLPAR_LPAR_NAME_TOKEN,+__pa(rtas_data_buf),sizeof(*local_buffer));+if(!rc)+memcpy(local_buffer->raw_buffer,rtas_data_buf,+sizeof(local_buffer->raw_buffer));+spin_unlock(&rtas_data_buf_lock);+}while(rtas_busy_delay(rc));++if(!rc){+/* Force end of string */+len=min((int)be16_to_cpu(local_buffer->len),+(int)sizeof(local_buffer->name)-1);+local_buffer->name[len]='\0';++seq_printf(m,"partition_name=%s\n",local_buffer->name);+}else+rc=-ENODATA;++kfree(local_buffer);+returnrc;+}++/**+*ReadtheLPARnamefromtheDeviceTree.+*+*ThevaluereadintheDTisnotupdatediftheend-useristouchingtheLPAR+*nameonthehypervisorside.+*/+staticintread_DT_lpar_name(structseq_file*m)+{+structdevice_node*rootdn;+constchar*name;++rootdn=of_find_node_by_path("/");+if(!rootdn)+return-ENOENT;++name=of_get_property(rootdn,"ibm,partition-name",NULL);+if(!name)+return-ENOENT;++seq_printf(m,"partition_name=%s\n",name);+return0;+}++staticvoidread_lpar_name(structseq_file*m)+{+if(read_RTAS_lpar_name(m)&&read_DT_lpar_name(m))+pr_err_once("Error can't get the LPAR name");+}+#define SPLPAR_CHARACTERISTICS_TOKEN 20#define SPLPAR_MAXLENGTH 1026*(sizeof(char))
@@ -496,6 +588,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)if(firmware_has_feature(FW_FEATURE_SPLPAR)){/* this call handles the ibm,get-system-parameter contents */+read_lpar_name(m);parse_system_parameter_string(m);parse_ppp_data(m);parse_mpp_data(m);
arch/powerpc/platforms/pseries/lparcfg.c:334: warning: expecting prototype for Read the lpar name using the RTAS ibm,get-system(). Prototype was for read_RTAS_lpar_name() instead
arch/powerpc/platforms/pseries/lparcfg.c:378: warning: This comment starts with '/**', but isn't a kernel-doc comment. Refer Documentation/doc-guide/kernel-doc.rst
* Read the LPAR name from the Device Tree.
arch/powerpc/platforms/pseries/lparcfg.c:678: warning: Function parameter or member 'entitlement' not described in 'update_mpp'
arch/powerpc/platforms/pseries/lparcfg.c:678: warning: Function parameter or member 'weight' not described in 'update_mpp'
vim +334 arch/powerpc/platforms/pseries/lparcfg.c
323
324 /**
325 * Read the lpar name using the RTAS ibm,get-system-parameter call.
326 *
327 * The name read through this call is updated if changes are made by the end
328 * user on the hypervisor side.
329 *
330 * Some hypervisor (like Qemu) may not provide this value. In that case, a non
331 * null value is returned.
332 */
333 static int read_RTAS_lpar_name(struct seq_file *m)
> 334 {
335 int rc, len, token;
336 union {
337 char raw_buffer[GET_SYS_PARM_BUF_SIZE];
338 struct {
339 __be16 len;
340 char name[GET_SYS_PARM_BUF_SIZE-2];
341 };
342 } *local_buffer;
343
344 token = rtas_token("ibm,get-system-parameter");
345 if (token == RTAS_UNKNOWN_SERVICE)
346 return -EINVAL;
347
348 local_buffer = kmalloc(sizeof(*local_buffer), GFP_KERNEL);
349 if (!local_buffer)
350 return -ENOMEM;
351
352 do {
353 spin_lock(&rtas_data_buf_lock);
354 memset(rtas_data_buf, 0, sizeof(*local_buffer));
355 rc = rtas_call(token, 3, 1, NULL, SPLPAR_LPAR_NAME_TOKEN,
356 __pa(rtas_data_buf), sizeof(*local_buffer));
357 if (!rc)
358 memcpy(local_buffer->raw_buffer, rtas_data_buf,
359 sizeof(local_buffer->raw_buffer));
360 spin_unlock(&rtas_data_buf_lock);
361 } while (rtas_busy_delay(rc));
362
363 if (!rc) {
364 /* Force end of string */
365 len = min((int) be16_to_cpu(local_buffer->len),
366 (int) sizeof(local_buffer->name)-1);
367 local_buffer->name[len] = '\0';
368
369 seq_printf(m, "partition_name=%s\n", local_buffer->name);
370 } else
371 rc = -ENODATA;
372
373 kfree(local_buffer);
374 return rc;
375 }
376
377 /**
> 378 * Read the LPAR name from the Device Tree.
379 *
380 * The value read in the DT is not updated if the end-user is touching the LPAR
381 * name on the hypervisor side.
382 */
383 static int read_DT_lpar_name(struct seq_file *m)
384 {
385 struct device_node *rootdn;
386 const char *name;
387
388 rootdn = of_find_node_by_path("/");
389 if (!rootdn)
390 return -ENOENT;
391
392 name = of_get_property(rootdn, "ibm,partition-name", NULL);
393 if (!name)
394 return -ENOENT;
395
396 seq_printf(m, "partition_name=%s\n", name);
397 return 0;
398 }
399
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
From: Michael Ellerman <hidden> Date: 2022-01-11 22:40:46
Tyrel Datwyler [off-list ref] writes:
On 1/6/22 8:13 AM, Laurent Dufour wrote:
quoted
The LPAR name may be changed after the LPAR has been started in the HMC.
In that case lparstat command is not reporting the updated value because it
reads it from the device tree which is read at boot time.
However this value could be read from RTAS.
Adding this value in the /proc/powerpc/lparcfg output allows to read the
updated value.
However the hypervisor, like Qemu/KVM, may not support this RTAS
parameter. In that case the value reported in lparcfg is read from the
device tree and so is not updated accordingly.
Cc: Nathan Lynch <redacted>
Signed-off-by: Laurent Dufour <redacted>
My only nit would be that in general for consistency with other function names
_RTAS_ and _DT_ should be lowercase. Seeing as they are statically scoped within
lparcfg.c maybe its ok. Otherwise,
Yeah I agree, I changed them to lower case when applying.
cheers
The LPAR name may be changed after the LPAR has been started in the HMC.
In that case lparstat command is not reporting the updated value because it
reads it from the device tree which is read at boot time.
However this value could be read from RTAS.
Adding this value in the /proc/powerpc/lparcfg output allows to read the
updated value.
However the hypervisor, like Qemu/KVM, may not support this RTAS
parameter. In that case the value reported in lparcfg is read from the
device tree and so is not updated accordingly.
Cc: Nathan Lynch <redacted>
Signed-off-by: Laurent Dufour <redacted>
My only nit would be that in general for consistency with other function names
_RTAS_ and _DT_ should be lowercase. Seeing as they are statically scoped within
lparcfg.c maybe its ok. Otherwise,
Yeah I agree, I changed them to lower case when applying.
From: Michael Ellerman <hidden> Date: 2022-02-15 05:31:14
On Thu, 6 Jan 2022 17:13:39 +0100, Laurent Dufour wrote:
The LPAR name may be changed after the LPAR has been started in the HMC.
In that case lparstat command is not reporting the updated value because it
reads it from the device tree which is read at boot time.
However this value could be read from RTAS.
Adding this value in the /proc/powerpc/lparcfg output allows to read the
updated value.
[...]