2005-11-01 15:29:16

by Paul E. McKenney

[permalink] [raw]
Subject: [PATCH] fix remaining list_for_each_safe_rcu in -mm

Hello!

I missed a use of list_for_each_rcu_safe() in -mm tree. Here is a patch
to fix it.

Signed-off-by: <[email protected]>

---

ipmi_msghandler.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)

diff -urpNa -X dontdiff linux-2.6.14-rc5-mm1/drivers/char/ipmi/ipmi_msghandler.c linux-2.6.14-rc5-mm1-safe_rcu/drivers/char/ipmi/ipmi_msghandler.c
--- linux-2.6.14-rc5-mm1/drivers/char/ipmi/ipmi_msghandler.c 2005-11-01 06:44:09.000000000 -0800
+++ linux-2.6.14-rc5-mm1-safe_rcu/drivers/char/ipmi/ipmi_msghandler.c 2005-11-01 07:00:50.000000000 -0800
@@ -788,7 +788,7 @@ int ipmi_destroy_user(ipmi_user_t user)
int i;
unsigned long flags;
struct cmd_rcvr *rcvr;
- struct list_head *entry1, *entry2;
+ struct list_head *entry1;
struct cmd_rcvr *rcvrs = NULL;

user->valid = 1;
@@ -813,8 +813,7 @@ int ipmi_destroy_user(ipmi_user_t user)
* synchronize_rcu()) then free everything in that list.
*/
spin_lock_irqsave(&intf->cmd_rcvrs_lock, flags);
- list_for_each_safe_rcu(entry1, entry2, &intf->cmd_rcvrs) {
- rcvr = list_entry(entry1, struct cmd_rcvr, link);
+ list_for_each_entry_rcu(entry1, &intf->cmd_rcvrs, link) {
if (rcvr->user == user) {
list_del_rcu(&rcvr->link);
rcvr->next = rcvrs;


2005-11-01 16:17:03

by Paul E. McKenney

[permalink] [raw]
Subject: [PATCH] fix remaining list_for_each_safe_rcu in -mm (take 2)

Hello!

I missed a use of list_for_each_rcu_safe() in -mm tree. Here is an updated
patch to fix it. This time tested on a machine that actually uses IPMI...
(Thanks to Serge Hallyn for spotting this.)

Signed-off-by: <[email protected]>

---

diff -urpNa -X dontdiff linux-2.6.14-rc5-mm1/drivers/char/ipmi/ipmi_msghandler.c linux-2.6.14-rc5-mm1-safe_rcu/drivers/char/ipmi/ipmi_msghandler.c
--- linux-2.6.14-rc5-mm1/drivers/char/ipmi/ipmi_msghandler.c 2005-11-01 06:44:09.000000000 -0800
+++ linux-2.6.14-rc5-mm1-safe_rcu/drivers/char/ipmi/ipmi_msghandler.c 2005-11-01 08:03:45.000000000 -0800
@@ -788,7 +788,6 @@ int ipmi_destroy_user(ipmi_user_t user)
int i;
unsigned long flags;
struct cmd_rcvr *rcvr;
- struct list_head *entry1, *entry2;
struct cmd_rcvr *rcvrs = NULL;

user->valid = 1;
@@ -813,8 +812,7 @@ int ipmi_destroy_user(ipmi_user_t user)
* synchronize_rcu()) then free everything in that list.
*/
spin_lock_irqsave(&intf->cmd_rcvrs_lock, flags);
- list_for_each_safe_rcu(entry1, entry2, &intf->cmd_rcvrs) {
- rcvr = list_entry(entry1, struct cmd_rcvr, link);
+ list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) {
if (rcvr->user == user) {
list_del_rcu(&rcvr->link);
rcvr->next = rcvrs;

2005-11-05 04:01:22

by Corey Minyard

[permalink] [raw]
Subject: Re: [PATCH] fix remaining list_for_each_safe_rcu in -mm

Sorry for the long delay, I've been travelling and giving presentations :(.

IIRC, the RCU operations are "safe" by nature, so this is fine.

-Corey

Paul E. McKenney wrote:

>Hello!
>
>I missed a use of list_for_each_rcu_safe() in -mm tree. Here is a patch
>to fix it.
>
>Signed-off-by: <[email protected]>
>
>---
>
> ipmi_msghandler.c | 5 ++---
> 1 files changed, 2 insertions(+), 3 deletions(-)
>
>diff -urpNa -X dontdiff linux-2.6.14-rc5-mm1/drivers/char/ipmi/ipmi_msghandler.c linux-2.6.14-rc5-mm1-safe_rcu/drivers/char/ipmi/ipmi_msghandler.c
>--- linux-2.6.14-rc5-mm1/drivers/char/ipmi/ipmi_msghandler.c 2005-11-01 06:44:09.000000000 -0800
>+++ linux-2.6.14-rc5-mm1-safe_rcu/drivers/char/ipmi/ipmi_msghandler.c 2005-11-01 07:00:50.000000000 -0800
>@@ -788,7 +788,7 @@ int ipmi_destroy_user(ipmi_user_t user)
> int i;
> unsigned long flags;
> struct cmd_rcvr *rcvr;
>- struct list_head *entry1, *entry2;
>+ struct list_head *entry1;
> struct cmd_rcvr *rcvrs = NULL;
>
> user->valid = 1;
>@@ -813,8 +813,7 @@ int ipmi_destroy_user(ipmi_user_t user)
> * synchronize_rcu()) then free everything in that list.
> */
> spin_lock_irqsave(&intf->cmd_rcvrs_lock, flags);
>- list_for_each_safe_rcu(entry1, entry2, &intf->cmd_rcvrs) {
>- rcvr = list_entry(entry1, struct cmd_rcvr, link);
>+ list_for_each_entry_rcu(entry1, &intf->cmd_rcvrs, link) {
> if (rcvr->user == user) {
> list_del_rcu(&rcvr->link);
> rcvr->next = rcvrs;
>
>