From: Mimi Zohar <zohar@linux.vnet.ibm.com>
To: James Bottomley <James.Bottomley@HansenPartnership.com>,
Nayna Jain <nayna@linux.vnet.ibm.com>,
Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Cc: "linux-integrity@vger.kernel.org" <linux-integrity@vger.kernel.org>
Subject: Re: [PATCH v2 1/2] tpm: add retry logic
Date: Mon, 26 Mar 2018 12:14:17 -0400 [thread overview]
Message-ID: <1522080857.3541.92.camel@linux.vnet.ibm.com> (raw)
In-Reply-To: <1522074507.4417.15.camel@HansenPartnership.com>
On Mon, 2018-03-26 at 07:28 -0700, James Bottomley wrote:
> On Mon, 2018-03-26 at 19:41 +0530, Nayna Jain wrote:
> >
> > On 03/22/2018 10:01 PM, James Bottomley wrote:
> > >
> > > On Thu, 2018-03-22 at 21:43 +0530, Nayna Jain wrote:
> [...]
> > > > > +ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space
> > > > > *space,
> > > > > + u8 *buf, size_t bufsiz, unsigned int
> > > > > flags)
> > > > > +{
> > > > > + struct tpm_output_header *header = (struct
> > > > > tpm_output_header *)buf;
> > > > > + /* space for header and handles */
> > > > > + u8 save[TPM_HEADER_SIZE + 3*sizeof(u32)];
> > > > > + unsigned int delay_msec = TPM2_DURATION_SHORT;
> > > > > + u32 rc = 0;
> > > > > + ssize_t ret;
> > > > > + const size_t save_size = min(space ? sizeof(save) :
> > > > > TPM_HEADER_SIZE,
> > > > > + bufsiz);
> > > > > +
> > > > > + /*
> > > > > + * Subtlety here: if we have a space, the handles will
> > > > > be
> > > > > + * transformed, so when we restore the header we also
> > > > > have
> > > > > to
> > > > > + * restore the handles.
> > > > > + */
> > > > > + memcpy(save, buf, save_size);
> > > > > +
> > > > > + for (;;) {
> > > > > + ret = tpm_try_transmit(chip, space, buf,
> > > > > bufsiz,
> > > > > flags);
> > > > > + if (ret < 0)
> > > > > + break;
> > > > > + rc = be32_to_cpu(header->return_code);
> > > > > + if (rc != TPM2_RC_RETRY)
> > > > > + break;
> > > > > + delay_msec *= 2;
> > > > Was wondering if this increment could be moved after
> > > > tpm_msleep(delay_msec) ?
> > > I thought about that when I saw the logic in the original but what
> > > it would do is double the maximum delay (which is already nearly
> > > double TPM2_DURATION_LONG). I figured doubling the initial timeout
> > > was fine rather than trying to do complex logic to get the delay
> > > exact (and then having to litter the file with comments explaining
> > > why).
> >
> > Sorry James, I didn't understand exactly about what complex logic is
> > involved. Can you please explain it more ?
> > My point was to just move "delay_msec *= 2" after tpm_msleep() as
> > shown below:
> >
> > if (delay_msec > TPM2_DURATION_LONG) {
> > dev_err(&chip->dev, "TPM is in retry loop\n");
> > break;
> > }
> > tpm_msleep(delay_msec)
> > delay_msec *= 2;
>
> Yes, I understand the suggestion; however, if you simply do that,
> you'll end up with a useless sleep at the end of the wait period before
> you check to see if you've waited too long, which is even more
> suboptimal than the current situation. The cardinal rule is we should
> only sleep if we know we're going to retry.
By the time delay_msec is incremented here, you've already finished
sleeping and will resend the command. This is the reason I assume you
didn't use a normal for loop:
for (delay_msec = TPM2_DURATION_SHORT; delay_msec <TPM2_DURATION_LONG;
delay_msec *= 2)
Incrementing the sleep here will only affect the next sleep.
Mimi
next prev parent reply other threads:[~2018-03-26 16:14 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-21 18:42 [PATCH v2 0/2] retry handling and intermittent self test failure fix James Bottomley
2018-03-21 18:43 ` [PATCH v2 1/2] tpm: add retry logic James Bottomley
2018-03-22 15:14 ` Jarkko Sakkinen
2018-03-22 16:13 ` Nayna Jain
2018-03-22 16:31 ` James Bottomley
2018-03-26 14:11 ` Nayna Jain
2018-03-26 14:28 ` James Bottomley
2018-03-26 16:14 ` Mimi Zohar [this message]
2018-03-27 15:39 ` James Bottomley
2018-03-27 17:47 ` Mimi Zohar
2018-03-21 18:45 ` [PATCH v2 2/2] tpm: fix intermittent failure with self tests James Bottomley
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=1522080857.3541.92.camel@linux.vnet.ibm.com \
--to=zohar@linux.vnet.ibm.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=jarkko.sakkinen@linux.intel.com \
--cc=linux-integrity@vger.kernel.org \
--cc=nayna@linux.vnet.ibm.com \
/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.