From: Corey Minyard <minyard@acm.org>
To: Amol Grover <frextrite@gmail.com>
Cc: "Paul E . McKenney" <paulmck@kernel.org>,
Arnd Bergmann <arnd@arndb.de>,
linux-kernel@vger.kernel.org,
Joel Fernandes <joel@joelfernandes.org>,
openipmi-developer@lists.sourceforge.net,
linux-kernel-mentees@lists.linuxfoundation.org
Subject: Re: [Linux-kernel-mentees] [PATCH v3] drivers: char: ipmi: ipmi_msghandler: Pass lockdep expression to RCU lists
Date: Wed, 12 Feb 2020 07:45:52 -0600 [thread overview]
Message-ID: <20200212134552.GN7842@minyard.net> (raw)
In-Reply-To: <20200117132521.31020-1-frextrite@gmail.com>
On Fri, Jan 17, 2020 at 06:55:22PM +0530, Amol Grover wrote:
> intf->cmd_rcvrs is traversed with list_for_each_entry_rcu
> outside an RCU read-side critical section but under the
> protection of intf->cmd_rcvrs_mutex.
>
> ipmi_interfaces is traversed using list_for_each_entry_rcu
> outside an RCU read-side critical section but under the protection
> of ipmi_interfaces_mutex.
>
> Hence, add the corresponding lockdep expression to the list traversal
> primitive to silence false-positive lockdep warnings, and
> harden RCU lists.
>
> Add macro for the corresponding lockdep expression to make the code
> clean and concise.
>
> Signed-off-by: Amol Grover <frextrite@gmail.com>
After reading everything, I think this is correct, but I would like
Paul's stamp of approval on this.
Thanks,
-corey
> ---
> v3:
> - Remove rcu_read_lock_held() from lockdep expression since it is
> implicitly checked.
> - Remove unintended macro usage.
>
> v2:
> - Fix sparse error
> CHECK: Alignment should match open parenthesis
>
> drivers/char/ipmi/ipmi_msghandler.c | 14 ++++++++++----
> 1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
> index cad9563f8f48..64ba16dcb681 100644
> --- a/drivers/char/ipmi/ipmi_msghandler.c
> +++ b/drivers/char/ipmi/ipmi_msghandler.c
> @@ -618,6 +618,8 @@ static DEFINE_MUTEX(ipmidriver_mutex);
>
> static LIST_HEAD(ipmi_interfaces);
> static DEFINE_MUTEX(ipmi_interfaces_mutex);
> +#define ipmi_interfaces_mutex_held() \
> + lockdep_is_held(&ipmi_interfaces_mutex)
> static struct srcu_struct ipmi_interfaces_srcu;
>
> /*
> @@ -1321,7 +1323,8 @@ static void _ipmi_destroy_user(struct ipmi_user *user)
> * synchronize_srcu()) then free everything in that list.
> */
> mutex_lock(&intf->cmd_rcvrs_mutex);
> - list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
> + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,
> + lockdep_is_held(&intf->cmd_rcvrs_mutex)) {
> if (rcvr->user == user) {
> list_del_rcu(&rcvr->link);
> rcvr->next = rcvrs;
> @@ -1599,7 +1602,8 @@ static struct cmd_rcvr *find_cmd_rcvr(struct ipmi_smi *intf,
> {
> struct cmd_rcvr *rcvr;
>
> - list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
> + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,
> + lockdep_is_held(&intf->cmd_rcvrs_mutex)) {
> if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)
> && (rcvr->chans & (1 << chan)))
> return rcvr;
> @@ -1614,7 +1618,8 @@ static int is_cmd_rcvr_exclusive(struct ipmi_smi *intf,
> {
> struct cmd_rcvr *rcvr;
>
> - list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
> + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,
> + lockdep_is_held(&intf->cmd_rcvrs_mutex)) {
> if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)
> && (rcvr->chans & chans))
> return 0;
> @@ -3450,7 +3455,8 @@ int ipmi_add_smi(struct module *owner,
> /* Look for a hole in the numbers. */
> i = 0;
> link = &ipmi_interfaces;
> - list_for_each_entry_rcu(tintf, &ipmi_interfaces, link) {
> + list_for_each_entry_rcu(tintf, &ipmi_interfaces, link,
> + ipmi_interfaces_mutex_held()) {
> if (tintf->intf_num != i) {
> link = &tintf->link;
> break;
> --
> 2.24.1
>
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees
WARNING: multiple messages have this Message-ID (diff)
From: Corey Minyard <minyard@acm.org>
To: Amol Grover <frextrite@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
openipmi-developer@lists.sourceforge.net,
linux-kernel@vger.kernel.org,
linux-kernel-mentees@lists.linuxfoundation.org,
Joel Fernandes <joel@joelfernandes.org>,
Madhuparna Bhowmik <madhuparnabhowmik04@gmail.com>,
"Paul E . McKenney" <paulmck@kernel.org>
Subject: Re: [PATCH v3] drivers: char: ipmi: ipmi_msghandler: Pass lockdep expression to RCU lists
Date: Wed, 12 Feb 2020 07:45:52 -0600 [thread overview]
Message-ID: <20200212134552.GN7842@minyard.net> (raw)
In-Reply-To: <20200117132521.31020-1-frextrite@gmail.com>
On Fri, Jan 17, 2020 at 06:55:22PM +0530, Amol Grover wrote:
> intf->cmd_rcvrs is traversed with list_for_each_entry_rcu
> outside an RCU read-side critical section but under the
> protection of intf->cmd_rcvrs_mutex.
>
> ipmi_interfaces is traversed using list_for_each_entry_rcu
> outside an RCU read-side critical section but under the protection
> of ipmi_interfaces_mutex.
>
> Hence, add the corresponding lockdep expression to the list traversal
> primitive to silence false-positive lockdep warnings, and
> harden RCU lists.
>
> Add macro for the corresponding lockdep expression to make the code
> clean and concise.
>
> Signed-off-by: Amol Grover <frextrite@gmail.com>
After reading everything, I think this is correct, but I would like
Paul's stamp of approval on this.
Thanks,
-corey
> ---
> v3:
> - Remove rcu_read_lock_held() from lockdep expression since it is
> implicitly checked.
> - Remove unintended macro usage.
>
> v2:
> - Fix sparse error
> CHECK: Alignment should match open parenthesis
>
> drivers/char/ipmi/ipmi_msghandler.c | 14 ++++++++++----
> 1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
> index cad9563f8f48..64ba16dcb681 100644
> --- a/drivers/char/ipmi/ipmi_msghandler.c
> +++ b/drivers/char/ipmi/ipmi_msghandler.c
> @@ -618,6 +618,8 @@ static DEFINE_MUTEX(ipmidriver_mutex);
>
> static LIST_HEAD(ipmi_interfaces);
> static DEFINE_MUTEX(ipmi_interfaces_mutex);
> +#define ipmi_interfaces_mutex_held() \
> + lockdep_is_held(&ipmi_interfaces_mutex)
> static struct srcu_struct ipmi_interfaces_srcu;
>
> /*
> @@ -1321,7 +1323,8 @@ static void _ipmi_destroy_user(struct ipmi_user *user)
> * synchronize_srcu()) then free everything in that list.
> */
> mutex_lock(&intf->cmd_rcvrs_mutex);
> - list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
> + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,
> + lockdep_is_held(&intf->cmd_rcvrs_mutex)) {
> if (rcvr->user == user) {
> list_del_rcu(&rcvr->link);
> rcvr->next = rcvrs;
> @@ -1599,7 +1602,8 @@ static struct cmd_rcvr *find_cmd_rcvr(struct ipmi_smi *intf,
> {
> struct cmd_rcvr *rcvr;
>
> - list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
> + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,
> + lockdep_is_held(&intf->cmd_rcvrs_mutex)) {
> if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)
> && (rcvr->chans & (1 << chan)))
> return rcvr;
> @@ -1614,7 +1618,8 @@ static int is_cmd_rcvr_exclusive(struct ipmi_smi *intf,
> {
> struct cmd_rcvr *rcvr;
>
> - list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
> + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link,
> + lockdep_is_held(&intf->cmd_rcvrs_mutex)) {
> if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)
> && (rcvr->chans & chans))
> return 0;
> @@ -3450,7 +3455,8 @@ int ipmi_add_smi(struct module *owner,
> /* Look for a hole in the numbers. */
> i = 0;
> link = &ipmi_interfaces;
> - list_for_each_entry_rcu(tintf, &ipmi_interfaces, link) {
> + list_for_each_entry_rcu(tintf, &ipmi_interfaces, link,
> + ipmi_interfaces_mutex_held()) {
> if (tintf->intf_num != i) {
> link = &tintf->link;
> break;
> --
> 2.24.1
>
next prev parent reply other threads:[~2020-02-12 13:46 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-17 13:25 [Linux-kernel-mentees] [PATCH v3] drivers: char: ipmi: ipmi_msghandler: Pass lockdep expression to RCU lists Amol Grover
2020-01-17 13:25 ` Amol Grover
2020-02-12 13:45 ` Corey Minyard [this message]
2020-02-12 13:45 ` Corey Minyard
2020-02-12 21:49 ` [Linux-kernel-mentees] " Paul E. McKenney
2020-02-12 21:49 ` Paul E. McKenney
2020-02-13 13:04 ` [Linux-kernel-mentees] " Corey Minyard
2020-02-13 13:04 ` Corey Minyard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200212134552.GN7842@minyard.net \
--to=minyard@acm.org \
--cc=arnd@arndb.de \
--cc=frextrite@gmail.com \
--cc=joel@joelfernandes.org \
--cc=linux-kernel-mentees@lists.linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=openipmi-developer@lists.sourceforge.net \
--cc=paulmck@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.