From: Jesse Gross <jesse@nicira.com>
Date: Fri, 27 May 2011 22:57:28 +0000 (-0700)
Subject: datapath: Don't call genlmsg_reply() under rcu_read_lock().
X-Git-Tag: v1.2.0~273
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=df2fa9b50e1c0e93c6be1d31a5d69eb4f077add3;p=sliver-openvswitch.git

datapath: Don't call genlmsg_reply() under rcu_read_lock().

genlmsg_reply() indirectly makes a call to kmalloc but takes no
GFP flags, instead using GFP_ATOMIC if in a softirq and GFP_KERNEL
otherwise.  However, here we hold rcu_read_lock(), which requires
GFP_ATOMIC but is not a softirq.  Since we've already built the
reply message, it is safe to release rcu_read_lock(), so do that
before calling genlmsg_reply().

Signed-off-by: Jesse Gross <jesse@nicira.com>
CC: Hao Zheng <hzheng@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
---

diff --git a/datapath/datapath.c b/datapath/datapath.c
index 826d8991e..728012249 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -1904,7 +1904,9 @@ static int odp_vport_cmd_get(struct sk_buff *skb, struct genl_info *info)
 	if (IS_ERR(reply))
 		goto exit_unlock;
 
-	err = genlmsg_reply(reply, info);
+	rcu_read_unlock();
+
+	return genlmsg_reply(reply, info);
 
 exit_unlock:
 	rcu_read_unlock();