Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2fa2fa1a authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Martin K. Petersen
Browse files

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: default avatarSteven Rostedt <rostedt@goodmis.org>
Acked-by: default avatarChad Dupuis <chad.dupuis@cavium.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 2c2b66ae
Loading
Loading
Loading
Loading
+8 −7
Original line number Original line Diff line number Diff line
@@ -516,14 +516,15 @@ static int __init bnx2i_mod_init(void)
	for_each_online_cpu(cpu)
	for_each_online_cpu(cpu)
		bnx2i_percpu_thread_create(cpu);
		bnx2i_percpu_thread_create(cpu);


	err = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
	err = cpuhp_setup_state_nocalls_cpuslocked(CPUHP_AP_ONLINE_DYN,
						   "scsi/bnx2i:online",
						   "scsi/bnx2i:online",
						   bnx2i_cpu_online, NULL);
						   bnx2i_cpu_online, NULL);
	if (err < 0)
	if (err < 0)
		goto remove_threads;
		goto remove_threads;
	bnx2i_online_state = err;
	bnx2i_online_state = err;


	cpuhp_setup_state_nocalls(CPUHP_SCSI_BNX2I_DEAD, "scsi/bnx2i:dead",
	cpuhp_setup_state_nocalls_cpuslocked(CPUHP_SCSI_BNX2I_DEAD,
					     "scsi/bnx2i:dead",
					     NULL, bnx2i_cpu_dead);
					     NULL, bnx2i_cpu_dead);
	put_online_cpus();
	put_online_cpus();
	return 0;
	return 0;
@@ -574,8 +575,8 @@ static void __exit bnx2i_mod_exit(void)
	for_each_online_cpu(cpu)
	for_each_online_cpu(cpu)
		bnx2i_percpu_thread_destroy(cpu);
		bnx2i_percpu_thread_destroy(cpu);


	cpuhp_remove_state_nocalls(bnx2i_online_state);
	cpuhp_remove_state_nocalls_cpuslocked(bnx2i_online_state);
	cpuhp_remove_state_nocalls(CPUHP_SCSI_BNX2I_DEAD);
	cpuhp_remove_state_nocalls_cpuslocked(CPUHP_SCSI_BNX2I_DEAD);
	put_online_cpus();
	put_online_cpus();


	iscsi_unregister_transport(&bnx2i_iscsi_transport);
	iscsi_unregister_transport(&bnx2i_iscsi_transport);