From: Oleksij Rempel <o.rempel@pengutronix.de> To: mkl@pengutronix.de, "David S. Miller" <davem@davemloft.net>, Jakub Kicinski <kuba@kernel.org>, Oliver Hartkopp <socketcan@hartkopp.net>, Robin van der Gracht <robin@protonic.nl>, Johannes Berg <johannes@sipsolutions.net> Cc: Oleksij Rempel <o.rempel@pengutronix.de>, kernel@pengutronix.de, linux-can@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Eric Dumazet <edumazet@google.com>, linux-wireless@vger.kernel.org Subject: [PATCH net v2 1/2] skbuff: skb_clone_sk_optional(): add function to always clone a skb and increase refcount on sk if valid Date: Tue, 23 Feb 2021 06:53:19 +0100 Message-ID: <20210223055321.3891-2-o.rempel@pengutronix.de> (raw) In-Reply-To: <20210223055321.3891-1-o.rempel@pengutronix.de> There already the function skb_clone_sk(), which clones the skb, but only if the sk is valid. There are several users in the networking stack, which always need a clone of a skb with the sk refcount incremented (but only if the sk is valid). This patch adds such a function. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- include/linux/skbuff.h | 1 + net/core/skbuff.c | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 6d0a33d1c0db..99d552017508 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -3874,6 +3874,7 @@ static inline void skb_metadata_clear(struct sk_buff *skb) skb_metadata_set(skb, 0); } +struct sk_buff *skb_clone_sk_optional(struct sk_buff *skb); struct sk_buff *skb_clone_sk(struct sk_buff *skb); #ifdef CONFIG_NETWORK_PHY_TIMESTAMPING diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 545a472273a5..97341f173fb0 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -4671,6 +4671,33 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk) } EXPORT_SYMBOL(sock_dequeue_err_skb); +/** + * skb_clone_sk_optional - create clone of skb, and take reference to socket if + * socket is referenced in original skb + * @skb: the skb to clone + * + * This function always creates a clone of a buffer. If it that holds a valid + * reference on sk_refcnt this is increased. + */ +struct sk_buff *skb_clone_sk_optional(struct sk_buff *skb) +{ + struct sock *sk = skb->sk; + struct sk_buff *clone; + + clone = skb_clone(skb, GFP_ATOMIC); + if (!clone) + return NULL; + + if (!sk || !refcount_inc_not_zero(&sk->sk_refcnt)) + return clone; + + clone->sk = sk; + clone->destructor = sock_efree; + + return clone; +} +EXPORT_SYMBOL(skb_clone_sk_optional); + /** * skb_clone_sk - create clone of skb, and take reference to socket * @skb: the skb to clone -- 2.29.2
next prev parent reply index Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-02-23 5:53 [PATCH net v2 0/2] add support for skb with sk ref cloning Oleksij Rempel 2021-02-23 5:53 ` Oleksij Rempel [this message] 2021-02-23 5:53 ` [PATCH net v2 2/2] can: fix ref count warning if socket was closed before skb was cloned Oleksij Rempel 2021-02-23 8:55 ` Eric Dumazet
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=20210223055321.3891-2-o.rempel@pengutronix.de \ --to=o.rempel@pengutronix.de \ --cc=davem@davemloft.net \ --cc=edumazet@google.com \ --cc=johannes@sipsolutions.net \ --cc=kernel@pengutronix.de \ --cc=kuba@kernel.org \ --cc=linux-can@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-wireless@vger.kernel.org \ --cc=mkl@pengutronix.de \ --cc=netdev@vger.kernel.org \ --cc=robin@protonic.nl \ --cc=socketcan@hartkopp.net \ /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
Netdev Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/netdev/0 netdev/git/0.git git clone --mirror https://lore.kernel.org/netdev/1 netdev/git/1.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 netdev netdev/ https://lore.kernel.org/netdev \ netdev@vger.kernel.org public-inbox-index netdev Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.netdev AGPL code for this site: git clone https://public-inbox.org/public-inbox.git