scsi: bnx2fc: Prevent recursive cpuhotplug locking
authorThomas Gleixner <tglx@linutronix.de>
Mon, 24 Jul 2017 10:52:57 +0000 (12:52 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 27 Jul 2017 01:51:24 +0000 (21:51 -0400)
The BNX2FC 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: kernel test robot <fengguang.wu@intel.com>
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/bnx2fc/bnx2fc_fcoe.c

index 7dfe709a713837b075cd2021c00ee6a5fb44d978..c4ebf8c5d88436de77c2817bf2bc6ddf6d1a75f5 100644 (file)
@@ -2766,15 +2766,16 @@ static int __init bnx2fc_mod_init(void)
        for_each_online_cpu(cpu)
                bnx2fc_percpu_thread_create(cpu);
 
-       rc = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
-                                      "scsi/bnx2fc:online",
-                                      bnx2fc_cpu_online, NULL);
+       rc = cpuhp_setup_state_nocalls_cpuslocked(CPUHP_AP_ONLINE_DYN,
+                                                 "scsi/bnx2fc:online",
+                                                 bnx2fc_cpu_online, NULL);
        if (rc < 0)
                goto stop_threads;
        bnx2fc_online_state = rc;
 
-       cpuhp_setup_state_nocalls(CPUHP_SCSI_BNX2FC_DEAD, "scsi/bnx2fc:dead",
-                                 NULL, bnx2fc_cpu_dead);
+       cpuhp_setup_state_nocalls_cpuslocked(CPUHP_SCSI_BNX2FC_DEAD,
+                                            "scsi/bnx2fc:dead",
+                                            NULL, bnx2fc_cpu_dead);
        put_online_cpus();
 
        cnic_register_driver(CNIC_ULP_FCOE, &bnx2fc_cnic_cb);
@@ -2850,8 +2851,8 @@ static void __exit bnx2fc_mod_exit(void)
                bnx2fc_percpu_thread_destroy(cpu);
        }
 
-       cpuhp_remove_state_nocalls(bnx2fc_online_state);
-       cpuhp_remove_state_nocalls(CPUHP_SCSI_BNX2FC_DEAD);
+       cpuhp_remove_state_nocalls_cpuslocked(bnx2fc_online_state);
+       cpuhp_remove_state_nocalls_cpuslocked(CPUHP_SCSI_BNX2FC_DEAD);
 
        put_online_cpus();