summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Eckelmann <sven.eckelmann@gmx.de>2010-09-18 21:01:18 +0200
committerGreg Kroah-Hartman <gregkh@suse.de>2010-09-20 16:29:49 -0700
commit16f9530e99f5eb35dd1adafbae854dd94f8d3751 (patch)
treeff66e8898d8475721357ea7287418b4220c2cb08
parent952c699c06f562b07dba4b1f91dfc02de928545d (diff)
downloadlinux-16f9530e99f5eb35dd1adafbae854dd94f8d3751.tar.bz2
Staging: batman-adv: Use synchronize_rcu instead of call_rcu
It is recommended [1] to use synchronize_rcu to simplify the code - especially when otherwise extra locking is needed to protect other code from picking stale elements. It also protects us for emitting to many callbacks which may results in OOM conditions. The only reason not to use it, would be in performance critical sections or when we are not allowed to block. [1] Documentation/RCU/checklist.txt Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/batman-adv/TODO1
-rw-r--r--drivers/staging/batman-adv/hard-interface.c10
-rw-r--r--drivers/staging/batman-adv/types.h1
3 files changed, 2 insertions, 10 deletions
diff --git a/drivers/staging/batman-adv/TODO b/drivers/staging/batman-adv/TODO
index 76b2acd2da73..cb6b026333cb 100644
--- a/drivers/staging/batman-adv/TODO
+++ b/drivers/staging/batman-adv/TODO
@@ -1,7 +1,6 @@
* Rework usage of RCU
- don't leak pointers from rcu out of rcu critical area which may
get freed
- - check were synchronize_rcu must be used
- go through Documentation/RCU/checklist.txt
* Request a new review
* Process the comments from the review
diff --git a/drivers/staging/batman-adv/hard-interface.c b/drivers/staging/batman-adv/hard-interface.c
index 35b198c6bad5..376ac488bf51 100644
--- a/drivers/staging/batman-adv/hard-interface.c
+++ b/drivers/staging/batman-adv/hard-interface.c
@@ -418,13 +418,6 @@ out:
return NULL;
}
-static void hardif_free_interface(struct rcu_head *rcu)
-{
- struct batman_if *batman_if = container_of(rcu, struct batman_if, rcu);
-
- kfree(batman_if);
-}
-
static void hardif_remove_interface(struct batman_if *batman_if)
{
/* first deactivate interface */
@@ -438,9 +431,10 @@ static void hardif_remove_interface(struct batman_if *batman_if)
/* caller must take if_list_lock */
list_del_rcu(&batman_if->list);
+ synchronize_rcu();
sysfs_del_hardif(&batman_if->hardif_obj);
dev_put(batman_if->net_dev);
- call_rcu(&batman_if->rcu, hardif_free_interface);
+ kfree(batman_if);
}
void hardif_remove_interfaces(void)
diff --git a/drivers/staging/batman-adv/types.h b/drivers/staging/batman-adv/types.h
index 478277f6ad08..b16264441ea2 100644
--- a/drivers/staging/batman-adv/types.h
+++ b/drivers/staging/batman-adv/types.h
@@ -44,7 +44,6 @@ struct batman_if {
unsigned char *packet_buff;
int packet_len;
struct kobject *hardif_obj;
- struct rcu_head rcu;
struct packet_type batman_adv_ptype;
struct net_device *soft_iface;
};