All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
To: linux-integrity@vger.kernel.org,
	James Bottomley <James.Bottomley@hansenpartnership.com>,
	Stefan Berger <stefanb@linux.ibm.com>,
	Peter Huewe <peterhuewe@gmx.de>, Jason Gunthorpe <jgg@ziepe.ca>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Sumit Garg <sumit.garg@linaro.org>,
	Alexey Klimov <aklimov@redhat.com>,
	open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2] tpm: tpm2-space: Resize session and context buffers dynamically
Date: Fri, 26 Jun 2020 14:49:20 +0300	[thread overview]
Message-ID: <20200626114920.GB5847@linux.intel.com> (raw)
In-Reply-To: <20200625212817.rxzjsgecrfpcb6ph@cantor>

On Thu, Jun 25, 2020 at 02:28:17PM -0700, Jerry Snitselaar wrote:
> On Thu Jun 25 20, 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,
> > @@ -40,16 +43,21 @@ static void tpm2_flush_sessions(struct tpm_chip *chip, struct tpm_space *space)
> > 
> > int tpm2_init_space(struct tpm_space *space)
> > {
> > -	space->context_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
> > +	space->context_buf = kzalloc(TPM2_SPACE_DEFAULT_BUFFER_SIZE,
> > +				     GFP_KERNEL);
> > 	if (!space->context_buf)
> > 		return -ENOMEM;
> > 
> > -	space->session_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
> > +	space->session_buf = kzalloc(TPM2_SPACE_DEFAULT_BUFFER_SIZE,
> > +				     GFP_KERNEL);
> > 	if (space->session_buf == NULL) {
> > 		kfree(space->context_buf);
> > +		space->context_buf = NULL;
> > 		return -ENOMEM;
> > 	}
> > 
> > +	space->context_size = TPM2_SPACE_DEFAULT_BUFFER_SIZE;
> > +	space->session_size = TPM2_SPACE_DEFAULT_BUFFER_SIZE;
> > 	return 0;
> > }
> > 
> > @@ -116,11 +124,13 @@ static int tpm2_load_context(struct tpm_chip *chip, u8 *buf,
> > 	return 0;
> > }
> > 
> > -static int tpm2_save_context(struct tpm_chip *chip, u32 handle, u8 *buf,
> > -			     unsigned int buf_size, unsigned int *offset)
> > +static int tpm2_save_context(struct tpm_chip *chip, u32 handle, u8 **buf,
> > +			     unsigned int *buf_size, unsigned int *offset)
> > {
> > -	struct tpm_buf tbuf;
> > +	unsigned int new_buf_size;
> > 	unsigned int body_size;
> > +	struct tpm_buf tbuf;
> > +	void *new_buf;
> > 	int rc;
> > 
> > 	rc = tpm_buf_init(&tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_SAVE);
> > @@ -131,31 +141,48 @@ static int tpm2_save_context(struct tpm_chip *chip, u32 handle, u8 *buf,
> > 
> > 	rc = tpm_transmit_cmd(chip, &tbuf, 0, NULL);
> > 	if (rc < 0) {
> > -		dev_warn(&chip->dev, "%s: failed with a system error %d\n",
> > -			 __func__, rc);
> > -		tpm_buf_destroy(&tbuf);
> > -		return -EFAULT;
> > +		rc = -EFAULT;
> > +		goto err;
> > 	} else if (tpm2_rc_value(rc) == TPM2_RC_REFERENCE_H0) {
> > -		tpm_buf_destroy(&tbuf);
> > -		return -ENOENT;
> > +		rc = -ENOENT;
> > +		goto out;
> > 	} else if (rc) {
> > -		dev_warn(&chip->dev, "%s: failed with a TPM error 0x%04X\n",
> > -			 __func__, rc);
> > -		tpm_buf_destroy(&tbuf);
> > -		return -EFAULT;
> > +		rc = -EFAULT;
> > +		goto err;
> > 	}
> > 
> 
> Would it be worthwhile to still output something here since it is changing
> the value of rc returned from tpm_transmit_cmd()? Wondering if it would
> be useful for debugging to know what the returned error was. Other than
> that question looks good to me pending what is decided on using PAGE_SIZE.
> 
> Regards,
> Jerry

I'll submit a new version that will just allocate a static buffer of 16
kB. Dynamic scaling is saved for future.

/Jarkko

  reply	other threads:[~2020-06-26 11:49 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-25  4:38 [PATCH v2] tpm: tpm2-space: Resize session and context buffers dynamically Jarkko Sakkinen
2020-06-25 12:41 ` Stefan Berger
2020-06-25 21:25   ` Jarkko Sakkinen
2020-06-25 21:27     ` Stefan Berger
2020-06-26 11:48       ` Jarkko Sakkinen
2020-06-26 12:16         ` Stefan Berger
2020-07-02 19:54           ` Jarkko Sakkinen
2020-06-25 21:28 ` Jerry Snitselaar
2020-06-26 11:49   ` Jarkko Sakkinen [this message]
2020-06-25 21:38 ` Stefan Berger
2020-06-26 11:50   ` Jarkko Sakkinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200626114920.GB5847@linux.intel.com \
    --to=jarkko.sakkinen@linux.intel.com \
    --cc=James.Bottomley@hansenpartnership.com \
    --cc=aklimov@redhat.com \
    --cc=arnd@arndb.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=jgg@ziepe.ca \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterhuewe@gmx.de \
    --cc=stefanb@linux.ibm.com \
    --cc=sumit.garg@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.