Re: [PATCH] tpm: Fix the timeout & use ktime

From: Orlov, Ivan
Date: Fri Jun 20 2025 - 13:23:34 EST


On 20/06/2025 14:24, Jonathan McDowell wrote:
This looks similar to the issue I fixed in 7146dffa875c ('Fix timeout
handling when waiting for TPM status'), I assume you're actually seeing
it in your systems? I think we're starting to see it (rarely) now the
other issues are fixed in our builds. As a similar approach does the
following work?

diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm- interface.c
index 8d7e4da6ed53..18ae0767fa60 100644
--- a/drivers/char/tpm/tpm-interface.c
+++ b/drivers/char/tpm/tpm-interface.c
@@ -127,7 +127,7 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, void *buf, size_t bufsiz)
         goto out_recv;

     stop = jiffies + tpm_calc_ordinal_duration(chip, ordinal);
-    do {
+    while (true) {
         u8 status = tpm_chip_status(chip);
         if ((status & chip->ops->req_complete_mask) ==
             chip->ops->req_complete_val)
@@ -138,9 +138,12 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, void *buf, size_t bufsiz)
             return -ECANCELED;
         }


<-- This would solve the problem with usleep_range taking arbitrary time, but unfortunately won't solve it for the guest VM scenario: if vCPU gets interrupted here, then it still will account the steal time and time out when it's woken up before checking for completion again

+        if (time_after(jiffies, stop))
+            break;
+
         tpm_msleep(TPM_TIMEOUT_POLL);
         rmb();
-    } while (time_before(jiffies, stop));
+    }

     tpm_chip_cancel(chip);
     dev_err(&chip->dev, "Operation Timed out\n");

--
Kind regards,
Ivan Orlov