[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20170731180908.290381d7@gandalf.local.home>
Date: Mon, 31 Jul 2017 18:09:08 -0400
From: Steven Rostedt <rostedt@...dmis.org>
To: Thomas Gleixner <tglx@...utronix.de>
Cc: LKML <linux-kernel@...r.kernel.org>,
QLogic-Storage-Upstream@...gic.com, martin.petersen@...cle.com,
James Bottomley <James.Bottomley@...senPartnership.com>,
linux-scsi <linux-scsi@...r.kernel.org>,
Christoph Hellwig <hch@....de>,
Sebastian Andrzej Siewior <bigeasy@...utronix.de>
Subject: Re: [patch 3/5] scsi/bnx2i: Prevent recursive cpuhotplug locking
On Mon, 24 Jul 2017 12:52:58 +0200
Thomas Gleixner <tglx@...utronix.de> 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@...dmis.org>
Tested-by: Steven Rostedt (VMware) <rostedt@...dmis.org>
(makes the lockdep splat go away)
-- Steve
> Signed-off-by: Thomas Gleixner <tglx@...utronix.de>
> ---
> 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);
>
Powered by blists - more mailing lists