Re: [PATCH] tpm2-cmd: allow more attempts for selftest execution

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Dec 11, 2017 at 05:05:25PM +0100, Alexander Steffen wrote:
> Previously, if the last attempt to execute the selftest command failed with
> RC_TESTING, there was still a call to tpm_msleep, even though no further
> attempt would be made. This causes an unnecessary delay, therefore ensure
> that if the last attempt fails the function is left immediately.
> 
> Also, instead of ensuring that the cumulated runtime of all attempts is
> larger than the command duration for TPM2_SelfTest, ensure that there is at
> least one attempt for which the delay is larger than the expected command
> duration. This allows slow TPMs to execute all their tests in the
> background, without slowing down faster TPMs that have finished their tests
> earlier. If tests are still not finished even with this long delay, then
> something is broken and the TPM is not used.
> 
> Fixes: 125a22105410 ("tpm: React correctly to RC_TESTING from TPM 2.0 self
> tests")
> 
> Signed-off-by: Alexander Steffen <Alexander.Steffen@xxxxxxxxxxxx>
> ---
>  drivers/char/tpm/tpm2-cmd.c | 12 +++++-------
>  1 file changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
> index f40d206..c17e753 100644
> --- a/drivers/char/tpm/tpm2-cmd.c
> +++ b/drivers/char/tpm/tpm2-cmd.c
> @@ -849,28 +849,26 @@ static const struct tpm_input_header tpm2_selftest_header = {
>  static int tpm2_do_selftest(struct tpm_chip *chip)
>  {
>  	int rc;
> -	unsigned int delay_msec = 20;
> +	unsigned int delay_msec = 10;
>  	long duration;
>  	struct tpm2_cmd cmd;
>  
>  	duration = jiffies_to_msecs(
>  		tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST));
>  
> -	while (duration > 0) {
> +	while (1) {
>  		cmd.header.in = tpm2_selftest_header;
>  		cmd.params.selftest_in.full_test = 0;
>  
>  		rc = tpm_transmit_cmd(chip, NULL, &cmd, TPM2_SELF_TEST_IN_SIZE,
>  				      0, 0, "continue selftest");
>  
> -		if (rc != TPM2_RC_TESTING)
> +		if (rc != TPM2_RC_TESTING || delay_msec >= duration)
>  			break;
>  
> -		tpm_msleep(delay_msec);
> -		duration -= delay_msec;
> -
> -		/* wait longer the next round */
> +		/* wait longer than before */
>  		delay_msec *= 2;
> +		tpm_msleep(delay_msec);
>  	}
>  
>  	return rc;
> -- 
> 2.7.4
> 

Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@xxxxxxxxxxxxxxx>

/Jarkko



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux Kernel]     [Linux Kernel Hardening]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux