Messages in this thread | | | Subject | Re: [PATCH] tpm: ibmvtpm: Avoid error message when process gets signal while waiting | From | Nageswara Sastry <> | Date | Tue, 13 Jul 2021 10:33:02 +0530 |
| |
On 12/07/21 9:55 pm, Stefan Berger wrote: > From: Stefan Berger <stefanb@linux.ibm.com> > > When rngd is run as root then lots of these types of message will appear > in the kernel log if the TPM has been configure to provide random bytes: > > [ 7406.275163] tpm tpm0: tpm_transmit: tpm_recv: error -4 > > The issue is caused by the following call that is interrupted while > waiting for the TPM's response. > > sig = wait_event_interruptible(ibmvtpm->wq, > !ibmvtpm->tpm_processing_cmd); > > The solution is to use wait_event() instead. > > To recreat the issue start rngd like this: > > sudo rngd -r /dev/hwrng -t > > Link: https://bugzilla.redhat.com/show_bug.cgi?id=1981473 > Fixes: 6674ff145eef ("tpm_ibmvtpm: properly handle interrupted packet receptions") > Cc: Nayna Jain <nayna@linux.ibm.com> > Cc: George Wilson <gcwilson@linux.ibm.com> > Reported-by: Nageswara R Sastry <rnsastry@linux.ibm.com> > Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
> --- > drivers/char/tpm/tpm_ibmvtpm.c | 13 ++++--------- > 1 file changed, 4 insertions(+), 9 deletions(-) > > diff --git a/drivers/char/tpm/tpm_ibmvtpm.c b/drivers/char/tpm/tpm_ibmvtpm.c > index 903604769de9..99b0442a5fdf 100644 > --- a/drivers/char/tpm/tpm_ibmvtpm.c > +++ b/drivers/char/tpm/tpm_ibmvtpm.c > @@ -106,16 +106,13 @@ static int tpm_ibmvtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count) > { > struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev); > u16 len; > - int sig; > > if (!ibmvtpm->rtce_buf) { > dev_err(ibmvtpm->dev, "ibmvtpm device is not ready\n"); > return 0; > } > > - sig = wait_event_interruptible(ibmvtpm->wq, !ibmvtpm->tpm_processing_cmd); > - if (sig) > - return -EINTR; > + wait_event(ibmvtpm->wq, !ibmvtpm->tpm_processing_cmd); > > len = ibmvtpm->res_len; > > @@ -206,7 +203,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) > { > struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev); > bool retry = true; > - int rc, sig; > + int rc; > > if (!ibmvtpm->rtce_buf) { > dev_err(ibmvtpm->dev, "ibmvtpm device is not ready\n"); > @@ -224,9 +221,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) > dev_info(ibmvtpm->dev, > "Need to wait for TPM to finish\n"); > /* wait for previous command to finish */ > - sig = wait_event_interruptible(ibmvtpm->wq, !ibmvtpm->tpm_processing_cmd); > - if (sig) > - return -EINTR; > + wait_event(ibmvtpm->wq, !ibmvtpm->tpm_processing_cmd); > } > > spin_lock(&ibmvtpm->rtce_lock); > @@ -551,7 +546,7 @@ static void ibmvtpm_crq_process(struct ibmvtpm_crq *crq, > /* len of the data in rtce buffer */ > ibmvtpm->res_len = be16_to_cpu(crq->len); > ibmvtpm->tpm_processing_cmd = false; > - wake_up_interruptible(&ibmvtpm->wq); > + wake_up(&ibmvtpm->wq); > return; > default: > return; >
-- Thanks and Regards R.Nageswara Sastry
| |