On Mon, 24 Jul 2017 12:52:58 +0200 Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote: > 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@xxxxxxxxxxx> Tested-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx> (makes the lockdep splat go away) -- Steve > Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > --- > drivers/scsi/bnx2i/bnx2i_init.c | 15 ++++++++------- > 1 file changed, 8 insertions(+), 7 deletions(-) > > --- 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); >