Skip to content

Commit 4e70daa

Browse files
author
Jiri Kosina
committed
tpm_tis: fix tis_lock with respect to RCU
cleanup_tis() -> tpm_remove_hardware() -> syncrhonize_rcu() is being called in an atomic context (tis_lock spinlock held), which is not allowed. Convert tis_lock to mutex. Signed-off-by: Jiri Kosina <[email protected]> Tested-by: Stefan Berger <[email protected]> Acked-by: Rajiv Andrade <[email protected]>
1 parent c3363c9 commit 4e70daa

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

drivers/char/tpm/tpm_tis.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ enum tis_defaults {
7676
#define TPM_RID(l) (0x0F04 | ((l) << 12))
7777

7878
static LIST_HEAD(tis_chips);
79-
static DEFINE_SPINLOCK(tis_lock);
79+
static DEFINE_MUTEX(tis_lock);
8080

8181
#if defined(CONFIG_PNP) && defined(CONFIG_ACPI)
8282
static int is_itpm(struct pnp_dev *dev)
@@ -689,9 +689,9 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
689689
}
690690

691691
INIT_LIST_HEAD(&chip->vendor.list);
692-
spin_lock(&tis_lock);
692+
mutex_lock(&tis_lock);
693693
list_add(&chip->vendor.list, &tis_chips);
694-
spin_unlock(&tis_lock);
694+
mutex_unlock(&tis_lock);
695695

696696

697697
return 0;
@@ -855,7 +855,7 @@ static void __exit cleanup_tis(void)
855855
{
856856
struct tpm_vendor_specific *i, *j;
857857
struct tpm_chip *chip;
858-
spin_lock(&tis_lock);
858+
mutex_lock(&tis_lock);
859859
list_for_each_entry_safe(i, j, &tis_chips, list) {
860860
chip = to_tpm_chip(i);
861861
tpm_remove_hardware(chip->dev);
@@ -871,7 +871,7 @@ static void __exit cleanup_tis(void)
871871
iounmap(i->iobase);
872872
list_del(&i->list);
873873
}
874-
spin_unlock(&tis_lock);
874+
mutex_unlock(&tis_lock);
875875
#ifdef CONFIG_PNP
876876
if (!force) {
877877
pnp_unregister_driver(&tis_pnp_driver);

0 commit comments

Comments
 (0)