All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org,
	Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>,
	Herbert Xu <herbert@gondor.apana.org.au>,
	Cong Wang <xiyou.wangcong@gmail.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 4.4 11/28] netlink: Call cb->done from a worker thread
Date: Fri,  9 Dec 2016 17:17:53 +0100	[thread overview]
Message-ID: <20161209161748.375172092@linuxfoundation.org> (raw)
In-Reply-To: <20161209161747.923205441@linuxfoundation.org>

4.4-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Herbert Xu <herbert@gondor.apana.org.au>


[ Upstream commit 707693c8a498697aa8db240b93eb76ec62e30892 ]

The cb->done interface expects to be called in process context.
This was broken by the netlink RCU conversion.  This patch fixes
it by adding a worker struct to make the cb->done call where
necessary.

Fixes: 21e4902aea80 ("netlink: Lockless lookup with RCU grace...")
Reported-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Acked-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 net/netlink/af_netlink.c |   27 +++++++++++++++++++++++----
 net/netlink/af_netlink.h |    2 ++
 2 files changed, 25 insertions(+), 4 deletions(-)

--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -924,14 +924,11 @@ static void netlink_skb_set_owner_r(stru
 	sk_mem_charge(sk, skb->truesize);
 }
 
-static void netlink_sock_destruct(struct sock *sk)
+static void __netlink_sock_destruct(struct sock *sk)
 {
 	struct netlink_sock *nlk = nlk_sk(sk);
 
 	if (nlk->cb_running) {
-		if (nlk->cb.done)
-			nlk->cb.done(&nlk->cb);
-
 		module_put(nlk->cb.module);
 		kfree_skb(nlk->cb.skb);
 	}
@@ -960,6 +957,28 @@ static void netlink_sock_destruct(struct
 	WARN_ON(nlk_sk(sk)->groups);
 }
 
+static void netlink_sock_destruct_work(struct work_struct *work)
+{
+	struct netlink_sock *nlk = container_of(work, struct netlink_sock,
+						work);
+
+	nlk->cb.done(&nlk->cb);
+	__netlink_sock_destruct(&nlk->sk);
+}
+
+static void netlink_sock_destruct(struct sock *sk)
+{
+	struct netlink_sock *nlk = nlk_sk(sk);
+
+	if (nlk->cb_running && nlk->cb.done) {
+		INIT_WORK(&nlk->work, netlink_sock_destruct_work);
+		schedule_work(&nlk->work);
+		return;
+	}
+
+	__netlink_sock_destruct(sk);
+}
+
 /* This lock without WQ_FLAG_EXCLUSIVE is good on UP and it is _very_ bad on
  * SMP. Look, when several writers sleep and reader wakes them up, all but one
  * immediately hit write lock and grab all the cpus. Exclusive sleep solves
--- a/net/netlink/af_netlink.h
+++ b/net/netlink/af_netlink.h
@@ -3,6 +3,7 @@
 
 #include <linux/rhashtable.h>
 #include <linux/atomic.h>
+#include <linux/workqueue.h>
 #include <net/sock.h>
 
 #define NLGRPSZ(x)	(ALIGN(x, sizeof(unsigned long) * 8) / 8)
@@ -53,6 +54,7 @@ struct netlink_sock {
 
 	struct rhash_head	node;
 	struct rcu_head		rcu;
+	struct work_struct	work;
 };
 
 static inline struct netlink_sock *nlk_sk(struct sock *sk)

  parent reply	other threads:[~2016-12-09 16:19 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20161209161807epcas5p2a4f0544b5e462fc831c24de653b6785e@epcas5p2.samsung.com>
2016-12-09 16:17 ` [PATCH 4.4 00/28] 4.4.38-stable review Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 01/28] virtio-net: add a missing synchronize_net() Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 02/28] net: check dead netns for peernet2id_alloc() Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 03/28] ip6_tunnel: disable caching when the traffic class is inherited Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 04/28] net: sky2: Fix shutdown crash Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 05/28] af_unix: conditionally use freezable blocking calls in read Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 06/28] rtnetlink: fix FDB size computation Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 07/28] l2tp: fix racy SOCK_ZAPPED flag check in l2tp_ip{,6}_bind() Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 08/28] net: dsa: bcm_sf2: Ensure we re-negotiate EEE during after link change Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 09/28] net, sched: respect rcu grace period on cls destruction Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 10/28] net/sched: pedit: make sure that offset is valid Greg Kroah-Hartman
2016-12-09 16:17   ` Greg Kroah-Hartman [this message]
2016-12-09 16:17   ` [PATCH 4.4 12/28] netlink: Do not schedule work from sk_destruct Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 13/28] net/dccp: fix use-after-free in dccp_invalid_packet Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 14/28] packet: fix race condition in packet_set_ring Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 15/28] net: bcmgenet: Utilize correct struct device for all DMA operations Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 16/28] sh_eth: remove unchecked interrupts for RZ/A1 Greg Kroah-Hartman
2016-12-09 16:17   ` [PATCH 4.4 17/28] geneve: avoid use-after-free of skb->data Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 18/28] net: avoid signed overflows for SO_{SND|RCV}BUFFORCE Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 19/28] net: ping: check minimum size on ICMP header length Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 20/28] sparc32: Fix inverted invalid_frame_pointer checks on sigreturns Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 21/28] sparc64: Fix find_node warning if numa node cannot be found Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 22/28] sparc64: fix compile warning section mismatch in find_node() Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 23/28] Dont feed anything but regular iovecs to blk_rq_map_user_iov Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 24/28] constify iov_iter_count() and iter_is_iovec() Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 25/28] ipv6: Set skb->protocol properly for local output Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 26/28] ipv4: " Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 27/28] esp4: Fix integrity verification when ESN are used Greg Kroah-Hartman
2016-12-09 16:18   ` [PATCH 4.4 28/28] esp6: " Greg Kroah-Hartman
2016-12-09 18:22   ` [PATCH 4.4 00/28] 4.4.38-stable review Shuah Khan
2016-12-09 22:35   ` Guenter Roeck

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=20161209161748.375172092@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=subashab@codeaurora.org \
    --cc=xiyou.wangcong@gmail.com \
    /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.