scsi: bnx2i: Prevent recursive cpuhotplug locking
authorThomas Gleixner <tglx@linutronix.de>
Mon, 24 Jul 2017 10:52:58 +0000 (12:52 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 27 Jul 2017 01:51:24 +0000 (21:51 -0400)
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>
drivers/scsi/bnx2i/bnx2i_init.c

index 86afc002814cd07bbc3b55b64ca31201208a514b..7487b653e7996457b4830b181bf6301db85ad002 100644 (file)
@@ -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);