Messages in this thread | | | From | Michael Ellerman <> | Subject | Re: [PATCH v4] powerpc/pseries: read the lpar name from the firmware | Date | Fri, 07 Jan 2022 10:09:32 +1100 |
| |
Laurent Dufour <ldufour@linux.ibm.com> writes: > Happy New Year, Michael! > > Do you consider taking that patch soon?
I did but I was hoping you and Nathan could come to an agreement.
Looks like you did while I was sleeping, perfect :)
I'll pick up v5.
cheers
> On 07/12/2021, 18:11:09, 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. >> >> Cc: Nathan Lynch <nathanl@linux.ibm.com> >> Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com> >> --- >> 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 | 54 ++++++++++++++++++++++++ >> 1 file changed, 54 insertions(+) >> >> diff --git a/arch/powerpc/platforms/pseries/lparcfg.c b/arch/powerpc/platforms/pseries/lparcfg.c >> index f71eac74ea92..058d9a5fe545 100644 >> --- a/arch/powerpc/platforms/pseries/lparcfg.c >> +++ b/arch/powerpc/platforms/pseries/lparcfg.c >> @@ -311,6 +311,59 @@ static void parse_mpp_x_data(struct seq_file *m) >> seq_printf(m, "coalesce_pool_spurr=%ld\n", mpp_x_data.pool_spurr_cycles); >> } >> >> +/* >> + * PAPR defines, in section "7.3.16 System Parameters Option", the token 55 to >> + * read the LPAR name, and the largest output data to 4000 + 2 bytes length. >> + */ >> +#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 >> +static void read_lpar_name(struct seq_file *m) >> +{ >> + int rc, len, token; >> + union { >> + char raw_buffer[GET_SYS_PARM_BUF_SIZE]; >> + struct { >> + __be16 len; >> + char name[GET_SYS_PARM_BUF_SIZE-2]; >> + }; >> + } *local_buffer; >> + >> + token = rtas_token("ibm,get-system-parameter"); >> + if (token == RTAS_UNKNOWN_SERVICE) >> + return; >> + >> + local_buffer = kmalloc(sizeof(*local_buffer), GFP_KERNEL); >> + if (!local_buffer) >> + return; >> + >> + 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 >> + pr_err_once("Error calling get-system-parameter (0x%x)\n", rc); >> + >> + kfree(local_buffer); >> +} >> + >> + >> #define SPLPAR_CHARACTERISTICS_TOKEN 20 >> #define SPLPAR_MAXLENGTH 1026*(sizeof(char)) >> >> @@ -496,6 +549,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);
| |