aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/netfilter/nfnetlink.c25
-rw-r--r--net/netlink/genetlink.c15
2 files changed, 8 insertions, 32 deletions
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index cb41990f92e..99775af19ff 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -44,26 +44,14 @@ static struct sock *nfnl = NULL;
44static const struct nfnetlink_subsystem *subsys_table[NFNL_SUBSYS_COUNT]; 44static const struct nfnetlink_subsystem *subsys_table[NFNL_SUBSYS_COUNT];
45static DEFINE_MUTEX(nfnl_mutex); 45static DEFINE_MUTEX(nfnl_mutex);
46 46
47static void nfnl_lock(void) 47static inline void nfnl_lock(void)
48{ 48{
49 mutex_lock(&nfnl_mutex); 49 mutex_lock(&nfnl_mutex);
50} 50}
51 51
52static int nfnl_trylock(void) 52static inline void nfnl_unlock(void)
53{
54 return !mutex_trylock(&nfnl_mutex);
55}
56
57static void __nfnl_unlock(void)
58{
59 mutex_unlock(&nfnl_mutex);
60}
61
62static void nfnl_unlock(void)
63{ 53{
64 mutex_unlock(&nfnl_mutex); 54 mutex_unlock(&nfnl_mutex);
65 if (nfnl->sk_receive_queue.qlen)
66 nfnl->sk_data_ready(nfnl, 0);
67} 55}
68 56
69int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n) 57int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n)
@@ -147,9 +135,7 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
147 ss = nfnetlink_get_subsys(type); 135 ss = nfnetlink_get_subsys(type);
148 if (!ss) { 136 if (!ss) {
149#ifdef CONFIG_KMOD 137#ifdef CONFIG_KMOD
150 /* don't call nfnl_unlock, since it would reenter 138 nfnl_unlock();
151 * with further packet processing */
152 __nfnl_unlock();
153 request_module("nfnetlink-subsys-%d", NFNL_SUBSYS_ID(type)); 139 request_module("nfnetlink-subsys-%d", NFNL_SUBSYS_ID(type));
154 nfnl_lock(); 140 nfnl_lock();
155 ss = nfnetlink_get_subsys(type); 141 ss = nfnetlink_get_subsys(type);
@@ -188,10 +174,9 @@ static void nfnetlink_rcv(struct sock *sk, int len)
188 unsigned int qlen = 0; 174 unsigned int qlen = 0;
189 175
190 do { 176 do {
191 if (nfnl_trylock()) 177 nfnl_lock();
192 return;
193 qlen = netlink_run_queue(sk, qlen, nfnetlink_rcv_msg); 178 qlen = netlink_run_queue(sk, qlen, nfnetlink_rcv_msg);
194 __nfnl_unlock(); 179 nfnl_unlock();
195 } while (qlen); 180 } while (qlen);
196} 181}
197 182
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 07ef5d204a0..3f1104dc128 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -22,22 +22,14 @@ struct sock *genl_sock = NULL;
22 22
23static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */ 23static DEFINE_MUTEX(genl_mutex); /* serialization of message processing */
24 24
25static void genl_lock(void) 25static inline void genl_lock(void)
26{ 26{
27 mutex_lock(&genl_mutex); 27 mutex_lock(&genl_mutex);
28} 28}
29 29
30static int genl_trylock(void) 30static inline void genl_unlock(void)
31{
32 return !mutex_trylock(&genl_mutex);
33}
34
35static void genl_unlock(void)
36{ 31{
37 mutex_unlock(&genl_mutex); 32 mutex_unlock(&genl_mutex);
38
39 if (genl_sock && genl_sock->sk_receive_queue.qlen)
40 genl_sock->sk_data_ready(genl_sock, 0);
41} 33}
42 34
43#define GENL_FAM_TAB_SIZE 16 35#define GENL_FAM_TAB_SIZE 16
@@ -483,8 +475,7 @@ static void genl_rcv(struct sock *sk, int len)
483 unsigned int qlen = 0; 475 unsigned int qlen = 0;
484 476
485 do { 477 do {
486 if (genl_trylock()) 478 genl_lock();
487 return;
488 qlen = netlink_run_queue(sk, qlen, genl_rcv_msg); 479 qlen = netlink_run_queue(sk, qlen, genl_rcv_msg);
489 genl_unlock(); 480 genl_unlock();
490 } while (qlen && genl_sock && genl_sock->sk_receive_queue.qlen); 481 } while (qlen && genl_sock && genl_sock->sk_receive_queue.qlen);