Messages in this thread | | | Date | Tue, 31 Jan 2023 11:38:36 -0500 | Subject | Re: [PATCH v5 19/25] powerpc/pseries: Make caller pass buffer to plpks_read_var() | From | Stefan Berger <> |
| |
On 1/31/23 01:39, Andrew Donnellan wrote: > Currently, plpks_read_var() allocates a buffer to pass to the > H_PKS_READ_OBJECT hcall, then allocates another buffer, of the caller's
-> buffer of the (no comma)
> preferred size if necessary, into which the data is copied, and returns > that buffer to the caller. > > This is a bit over the top - while we probably still want to allocate a > separate buffer to pass to the hypervisor in the hcall, we can let the > caller allocate the final buffer and specify the size. > > Don't allocate var->data in plpks_read_var(), instead expect the caller to > allocate it. If the caller needs to discover the size, it can set > var->data to NULL and var->datalen will be populated. Update header file > to document this.
It looks like there are no callers yet that would need to be adapted...
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
> > Suggested-by: Michael Ellerman <mpe@ellerman.id.au> > Signed-off-by: Andrew Donnellan <ajd@linux.ibm.com> > Signed-off-by: Russell Currey <ruscur@russell.cc> > > --- > > v3: New patch (mpe) > --- > arch/powerpc/include/asm/plpks.h | 12 ++++++++++++ > arch/powerpc/platforms/pseries/plpks.c | 11 ++++------- > 2 files changed, 16 insertions(+), 7 deletions(-) > > diff --git a/arch/powerpc/include/asm/plpks.h b/arch/powerpc/include/asm/plpks.h > index e7204e6c0ca4..0c49969b0864 100644 > --- a/arch/powerpc/include/asm/plpks.h > +++ b/arch/powerpc/include/asm/plpks.h > @@ -88,16 +88,28 @@ int plpks_remove_var(char *component, u8 varos, > > /** > * Returns the data for the specified os variable. > + * > + * Caller must allocate a buffer in var->data with length in var->datalen. > + * If no buffer is provided, var->datalen will be populated with the object's > + * size. > */ > int plpks_read_os_var(struct plpks_var *var); > > /** > * Returns the data for the specified firmware variable. > + * > + * Caller must allocate a buffer in var->data with length in var->datalen. > + * If no buffer is provided, var->datalen will be populated with the object's > + * size. > */ > int plpks_read_fw_var(struct plpks_var *var); > > /** > * Returns the data for the specified bootloader variable. > + * > + * Caller must allocate a buffer in var->data with length in var->datalen. > + * If no buffer is provided, var->datalen will be populated with the object's > + * size. > */ > int plpks_read_bootloader_var(struct plpks_var *var); > > diff --git a/arch/powerpc/platforms/pseries/plpks.c b/arch/powerpc/platforms/pseries/plpks.c > index e5755443d4a4..926b6a927326 100644 > --- a/arch/powerpc/platforms/pseries/plpks.c > +++ b/arch/powerpc/platforms/pseries/plpks.c > @@ -581,17 +581,14 @@ static int plpks_read_var(u8 consumer, struct plpks_var *var) > goto out_free_output; > } > > - if (var->datalen == 0 || var->datalen > retbuf[0]) > + if (!var->data || var->datalen > retbuf[0]) > var->datalen = retbuf[0]; > > - var->data = kzalloc(var->datalen, GFP_KERNEL); > - if (!var->data) { > - rc = -ENOMEM; > - goto out_free_output; > - } > var->policy = retbuf[1]; > > - memcpy(var->data, output, var->datalen); > + if (var->data) > + memcpy(var->data, output, var->datalen); > + > rc = 0; > > out_free_output:
| |