From: Jakub Sitnicki <jakub@cloudflare.com>
To: John Fastabend <john.fastabend@gmail.com>
Cc: daniel@iogearbox.net, xiyou.wangcong@gmail.com,
alexei.starovoitov@gmail.com, bpf@vger.kernel.org,
netdev@vger.kernel.org
Subject: Re: [PATCH bpf 3/3] bpf, sockmap: fix memleak on ingress msg enqueue
Date: Wed, 21 Jul 2021 18:36:23 +0200 [thread overview]
Message-ID: <87sg07r5dk.fsf@cloudflare.com> (raw)
In-Reply-To: <20210719214834.125484-4-john.fastabend@gmail.com>
On Mon, Jul 19, 2021 at 11:48 PM CEST, John Fastabend wrote:
> If backlog handler is running during a tear down operation we may enqueue
> data on the ingress msg queue while tear down is trying to free it.
>
> sk_psock_backlog()
> sk_psock_handle_skb()
> skb_psock_skb_ingress()
> sk_psock_skb_ingress_enqueue()
> sk_psock_queue_msg(psock,msg)
> spin_lock(ingress_lock)
> sk_psock_zap_ingress()
> _sk_psock_purge_ingerss_msg()
> _sk_psock_purge_ingress_msg()
> -- free ingress_msg list --
> spin_unlock(ingress_lock)
> spin_lock(ingress_lock)
> list_add_tail(msg,ingress_msg) <- entry on list with no on
> left to free it.
> spin_unlock(ingress_lock)
>
> To fix we only enqueue from backlog if the ENABLED bit is set. The tear
> down logic clears the bit with ingress_lock set so we wont enqueue the
> msg in the last step.
>
> Fixes: 799aa7f98d53 ("skmsg: Avoid lock_sock() in sk_psock_backlog()")
> Signed-off-by: John Fastabend <john.fastabend@gmail.com>
> ---
> include/linux/skmsg.h | 54 ++++++++++++++++++++++++++++---------------
> net/core/skmsg.c | 6 -----
> 2 files changed, 35 insertions(+), 25 deletions(-)
>
> diff --git a/include/linux/skmsg.h b/include/linux/skmsg.h
> index 96f319099744..883638888f93 100644
> --- a/include/linux/skmsg.h
> +++ b/include/linux/skmsg.h
> @@ -285,11 +285,45 @@ static inline struct sk_psock *sk_psock(const struct sock *sk)
> return rcu_dereference_sk_user_data(sk);
> }
>
> +static inline void sk_psock_set_state(struct sk_psock *psock,
> + enum sk_psock_state_bits bit)
> +{
> + set_bit(bit, &psock->state);
> +}
> +
> +static inline void sk_psock_clear_state(struct sk_psock *psock,
> + enum sk_psock_state_bits bit)
> +{
> + clear_bit(bit, &psock->state);
> +}
> +
> +static inline bool sk_psock_test_state(const struct sk_psock *psock,
> + enum sk_psock_state_bits bit)
> +{
> + return test_bit(bit, &psock->state);
> +}
> +
> +static void sock_drop(struct sock *sk, struct sk_buff *skb)
> +{
> + sk_drops_add(sk, skb);
> + kfree_skb(skb);
> +}
> +
> +static inline void drop_sk_msg(struct sk_psock *psock, struct sk_msg *msg)
> +{
> + if (msg->skb)
> + sock_drop(psock->sk, msg->skb);
> + kfree(msg);
> +}
> +
> static inline void sk_psock_queue_msg(struct sk_psock *psock,
> struct sk_msg *msg)
> {
> spin_lock_bh(&psock->ingress_lock);
> - list_add_tail(&msg->list, &psock->ingress_msg);
> + if (sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED))
Whitespace issue ^. Otherwise LGTM.
> + list_add_tail(&msg->list, &psock->ingress_msg);
> + else
> + drop_sk_msg(psock, msg);
> spin_unlock_bh(&psock->ingress_lock);
> }
>
[...]
next prev parent reply other threads:[~2021-07-21 16:37 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-19 21:48 [PATCH bpf 0/3] sockmap fixes picked up by stress tests John Fastabend
2021-07-19 21:48 ` [PATCH bpf 1/3] bpf, sockmap: zap ingress queues after stopping strparser John Fastabend
2021-07-20 10:27 ` Jakub Sitnicki
2021-07-20 17:41 ` John Fastabend
2021-07-19 21:48 ` [PATCH bpf 2/3] bpf, sockmap: on cleanup we additionally need to remove cached skb John Fastabend
2021-07-21 10:13 ` Jakub Sitnicki
2021-07-19 21:48 ` [PATCH bpf 3/3] bpf, sockmap: fix memleak on ingress msg enqueue John Fastabend
2021-07-21 16:36 ` Jakub Sitnicki [this message]
2021-07-21 18:02 ` Martin KaFai Lau
2021-07-21 16:38 ` [PATCH bpf 0/3] sockmap fixes picked up by stress tests Jakub Sitnicki
-- strict thread matches above, loose matches on Subject: below --
2021-07-20 10:53 [PATCH bpf 2/3] bpf, sockmap: on cleanup we additionally need to remove cached skb kernel test robot
2021-07-21 9:38 ` Dan Carpenter
2021-07-21 9:38 ` Dan Carpenter
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=87sg07r5dk.fsf@cloudflare.com \
--to=jakub@cloudflare.com \
--cc=alexei.starovoitov@gmail.com \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=john.fastabend@gmail.com \
--cc=netdev@vger.kernel.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.