summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bnx2i
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2017-07-24 12:52:58 +0200
committerMartin K. Petersen <martin.petersen@oracle.com>2017-07-26 21:51:24 -0400
commit2fa2fa1ae6b42fc4c4995fdbf8fd7df96bb25ba4 (patch)
tree678556aaaea61778230319612d4377ee4fda3acc /drivers/scsi/bnx2i
parent2c2b66ae9d11d99f5f6d7010f0d46401ed9031ce (diff)
downloadlinux-2fa2fa1ae6b42fc4c4995fdbf8fd7df96bb25ba4.tar.gz
linux-2fa2fa1ae6b42fc4c4995fdbf8fd7df96bb25ba4.tar.bz2
linux-2fa2fa1ae6b42fc4c4995fdbf8fd7df96bb25ba4.zip
scsi: bnx2i: Prevent recursive cpuhotplug locking
The BNX2I module init/exit code installs/removes the hotplug callbacks with the cpu hotplug lock held. This worked with the old CPU locking implementation which allowed recursive locking, but with the new percpu rwsem based mechanism this is not longer allowed. Use the _cpuslocked() variants to fix this. Reported-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Chad Dupuis <chad.dupuis@cavium.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/bnx2i')
-rw-r--r--drivers/scsi/bnx2i/bnx2i_init.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/scsi/bnx2i/bnx2i_init.c b/drivers/scsi/bnx2i/bnx2i_init.c
index 86afc002814c..7487b653e799 100644
--- a/drivers/scsi/bnx2i/bnx2i_init.c
+++ b/drivers/scsi/bnx2i/bnx2i_init.c
@@ -516,15 +516,16 @@ static int __init bnx2i_mod_init(void)
for_each_online_cpu(cpu)
bnx2i_percpu_thread_create(cpu);
- err = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
- "scsi/bnx2i:online",
- bnx2i_cpu_online, NULL);
+ err = cpuhp_setup_state_nocalls_cpuslocked(CPUHP_AP_ONLINE_DYN,
+ "scsi/bnx2i:online",
+ bnx2i_cpu_online, NULL);
if (err < 0)
goto remove_threads;
bnx2i_online_state = err;
- cpuhp_setup_state_nocalls(CPUHP_SCSI_BNX2I_DEAD, "scsi/bnx2i:dead",
- NULL, bnx2i_cpu_dead);
+ cpuhp_setup_state_nocalls_cpuslocked(CPUHP_SCSI_BNX2I_DEAD,
+ "scsi/bnx2i:dead",
+ NULL, bnx2i_cpu_dead);
put_online_cpus();
return 0;
@@ -574,8 +575,8 @@ static void __exit bnx2i_mod_exit(void)
for_each_online_cpu(cpu)
bnx2i_percpu_thread_destroy(cpu);
- cpuhp_remove_state_nocalls(bnx2i_online_state);
- cpuhp_remove_state_nocalls(CPUHP_SCSI_BNX2I_DEAD);
+ cpuhp_remove_state_nocalls_cpuslocked(bnx2i_online_state);
+ cpuhp_remove_state_nocalls_cpuslocked(CPUHP_SCSI_BNX2I_DEAD);
put_online_cpus();
iscsi_unregister_transport(&bnx2i_iscsi_transport);