Messages in this thread | | | Subject | Re: [PATCH v2] tpm: tpm2-space: Resize session and context buffers dynamically | From | Stefan Berger <> | Date | Thu, 25 Jun 2020 17:38:03 -0400 |
| |
On 6/25/20 12:38 AM, Jarkko Sakkinen wrote: > Re-allocate context and session buffers when needed. Scale them in page > increments so that the reallocation is only seldomly required, and thus > causes minimal stress to the system. Add a static maximum limit of four > pages for buffer sizes. > > Cc: James Bottomley <James.Bottomley@HansenPartnership.com> > Suggested-by: Stefan Berger <stefanb@linux.ibm.com> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > --- > Tested only for compilation. > v2: TPM2_SPACE_DEFAULT_BUFFER_SIZE > drivers/char/tpm/tpm2-space.c | 87 ++++++++++++++++++++++++----------- > include/linux/tpm.h | 6 ++- > 2 files changed, 64 insertions(+), 29 deletions(-) > > diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c > index 982d341d8837..b8ece01d6afb 100644 > --- a/drivers/char/tpm/tpm2-space.c > +++ b/drivers/char/tpm/tpm2-space.c > @@ -15,6 +15,9 @@ > #include <asm/unaligned.h> > #include "tpm.h" > > +#define TPM2_SPACE_DEFAULT_BUFFER_SIZE PAGE_SIZE > +#define TPM2_SPACE_MAX_BUFFER_SIZE (4 * PAGE_SIZE) > + > enum tpm2_handle_types { > TPM2_HT_HMAC_SESSION = 0x02000000, > TPM2_HT_POLICY_SESSION = 0x03000000, > @@ -557,8 +588,10 @@ int tpm2_commit_space(struct tpm_chip *chip, struct tpm_space *space, > sizeof(space->context_tbl)); > memcpy(&space->session_tbl, &chip->work_space.session_tbl, > sizeof(space->session_tbl)); > - memcpy(space->context_buf, chip->work_space.context_buf, PAGE_SIZE); > - memcpy(space->session_buf, chip->work_space.session_buf, PAGE_SIZE); > + memcpy(space->context_buf, chip->work_space.context_buf, > + space->context_size);
You have to allocate the max size the in tpm_chip_alloc (tpm-chip.c):
chip->work_space.context_buf = kzalloc(TPM2_SPACE_MAX_BUFFER_SIZE, GFP_KERNEL);
> + memcpy(space->session_buf, chip->work_space.session_buf, > + space->session_size); >
same for this
> return 0; > out: > diff --git a/include/linux/tpm.h b/include/linux/tpm.h > index 03e9b184411b..9ea39e8f7162 100644 > --- a/include/linux/tpm.h > +++ b/include/linux/tpm.h > @@ -92,10 +92,12 @@ enum tpm_duration { > #define TPM_PPI_VERSION_LEN 3 > > struct tpm_space { > + u8 *context_buf; > + u8 *session_buf; > + u32 context_size; > + u32 session_size; > u32 context_tbl[3]; > - u8 *context_buf; > u32 session_tbl[3]; > - u8 *session_buf; > }; > > struct tpm_bios_log {
| |