On 12/20/21 5:31 PM, Stefan Berger wrote: > > On 12/20/21 20:13, Jason Gunthorpe wrote: >> On Mon, Dec 20, 2021 at 08:05:58PM -0500, Stefan Berger wrote: >> >>> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c >>> index ddaeceb7e109..4cb908349b31 100644 >>> +++ b/drivers/char/tpm/tpm-chip.c >>> @@ -473,15 +473,8 @@ static void tpm_del_char_device(struct tpm_chip *chip) >>> mutex_unlock(&idr_lock); >>> >>> /* Make the driver uncallable. */ >>> - down_write(&chip->ops_sem); >>> - if (chip->flags & TPM_CHIP_FLAG_TPM2) { >>> - if (!tpm_chip_start(chip)) { >>> - tpm2_shutdown(chip, TPM2_SU_CLEAR); >>> - tpm_chip_stop(chip); >>> - } >>> - } >>> - chip->ops = NULL; >>> - up_write(&chip->ops_sem); >>> + if (chip->ops) >> ops cannot be read without locking > > This here could be an alternative: I still think code de-duplication is a good thing. Maybe combine the two approaches. Call tpm_class_shutdown from tpm_del_char_device and add a chip->ops check in tpm_class_shutdown to ensure we only do the shutdown when chip->ops is valid. -Tyrel > > diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c > index ddaeceb7e109..7772b475ebc0 100644 > --- a/drivers/char/tpm/tpm-chip.c > +++ b/drivers/char/tpm/tpm-chip.c > @@ -474,7 +474,7 @@ static void tpm_del_char_device(struct tpm_chip *chip) > > /* Make the driver uncallable. */ > down_write(&chip->ops_sem); > - if (chip->flags & TPM_CHIP_FLAG_TPM2) { > + if (chip->ops && chip->flags & TPM_CHIP_FLAG_TPM2) { > if (!tpm_chip_start(chip)) { > tpm2_shutdown(chip, TPM2_SU_CLEAR); > tpm_chip_stop(chip); > > Stefan > > >> >> Jason