Skip to content

Commit

Permalink
tpm_tis: fix tis_lock with respect to RCU
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
Jiri Kosina committed Mar 5, 2012
1 parent c3363c9 commit 4e70daa
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions drivers/char/tpm/tpm_tis.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ enum tis_defaults {
#define TPM_RID(l) (0x0F04 | ((l) << 12))

static LIST_HEAD(tis_chips);
static DEFINE_SPINLOCK(tis_lock);
static DEFINE_MUTEX(tis_lock);

#if defined(CONFIG_PNP) && defined(CONFIG_ACPI)
static int is_itpm(struct pnp_dev *dev)
Expand Down Expand Up @@ -689,9 +689,9 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
}

INIT_LIST_HEAD(&chip->vendor.list);
spin_lock(&tis_lock);
mutex_lock(&tis_lock);
list_add(&chip->vendor.list, &tis_chips);
spin_unlock(&tis_lock);
mutex_unlock(&tis_lock);


return 0;
Expand Down Expand Up @@ -855,7 +855,7 @@ static void __exit cleanup_tis(void)
{
struct tpm_vendor_specific *i, *j;
struct tpm_chip *chip;
spin_lock(&tis_lock);
mutex_lock(&tis_lock);
list_for_each_entry_safe(i, j, &tis_chips, list) {
chip = to_tpm_chip(i);
tpm_remove_hardware(chip->dev);
Expand All @@ -871,7 +871,7 @@ static void __exit cleanup_tis(void)
iounmap(i->iobase);
list_del(&i->list);
}
spin_unlock(&tis_lock);
mutex_unlock(&tis_lock);
#ifdef CONFIG_PNP
if (!force) {
pnp_unregister_driver(&tis_pnp_driver);
Expand Down

0 comments on commit 4e70daa

Please sign in to comment.