提交 4e70daaf 编写于 作者: J Jiri Kosina

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: NJiri Kosina <jkosina@suse.cz>
Tested-by: NStefan Berger <stefanb@linux.vnet.ibm.com>
Acked-by: NRajiv Andrade <srajiv@linux.vnet.ibm.com>
上级 c3363c91
...@@ -76,7 +76,7 @@ enum tis_defaults { ...@@ -76,7 +76,7 @@ enum tis_defaults {
#define TPM_RID(l) (0x0F04 | ((l) << 12)) #define TPM_RID(l) (0x0F04 | ((l) << 12))
static LIST_HEAD(tis_chips); static LIST_HEAD(tis_chips);
static DEFINE_SPINLOCK(tis_lock); static DEFINE_MUTEX(tis_lock);
#if defined(CONFIG_PNP) && defined(CONFIG_ACPI) #if defined(CONFIG_PNP) && defined(CONFIG_ACPI)
static int is_itpm(struct pnp_dev *dev) static int is_itpm(struct pnp_dev *dev)
...@@ -689,9 +689,9 @@ static int tpm_tis_init(struct device *dev, resource_size_t start, ...@@ -689,9 +689,9 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
} }
INIT_LIST_HEAD(&chip->vendor.list); INIT_LIST_HEAD(&chip->vendor.list);
spin_lock(&tis_lock); mutex_lock(&tis_lock);
list_add(&chip->vendor.list, &tis_chips); list_add(&chip->vendor.list, &tis_chips);
spin_unlock(&tis_lock); mutex_unlock(&tis_lock);
return 0; return 0;
...@@ -855,7 +855,7 @@ static void __exit cleanup_tis(void) ...@@ -855,7 +855,7 @@ static void __exit cleanup_tis(void)
{ {
struct tpm_vendor_specific *i, *j; struct tpm_vendor_specific *i, *j;
struct tpm_chip *chip; struct tpm_chip *chip;
spin_lock(&tis_lock); mutex_lock(&tis_lock);
list_for_each_entry_safe(i, j, &tis_chips, list) { list_for_each_entry_safe(i, j, &tis_chips, list) {
chip = to_tpm_chip(i); chip = to_tpm_chip(i);
tpm_remove_hardware(chip->dev); tpm_remove_hardware(chip->dev);
...@@ -871,7 +871,7 @@ static void __exit cleanup_tis(void) ...@@ -871,7 +871,7 @@ static void __exit cleanup_tis(void)
iounmap(i->iobase); iounmap(i->iobase);
list_del(&i->list); list_del(&i->list);
} }
spin_unlock(&tis_lock); mutex_unlock(&tis_lock);
#ifdef CONFIG_PNP #ifdef CONFIG_PNP
if (!force) { if (!force) {
pnp_unregister_driver(&tis_pnp_driver); pnp_unregister_driver(&tis_pnp_driver);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册