diff options
author | Liu Jian <liujian56@huawei.com> | 2022-04-27 19:51:50 +0800 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2022-04-28 23:40:01 +0200 |
commit | 3527bfe6a92d940abfca87929207e734039f496b (patch) | |
tree | e476bb3fbfef579a4a060fc3d34a51db9f52d447 /net/core | |
parent | 9a9a90ca1327024f669b670b02f61021306033dc (diff) | |
download | linux-stable-3527bfe6a92d940abfca87929207e734039f496b.tar.gz linux-stable-3527bfe6a92d940abfca87929207e734039f496b.tar.bz2 linux-stable-3527bfe6a92d940abfca87929207e734039f496b.zip |
bpf, sockmap: Call skb_linearize only when required in sk_psock_skb_ingress_enqueue
The skb_to_sgvec fails only when the number of frag_list and frags
exceeds MAX_MSG_FRAGS. Therefore, we can call skb_linearize only
when the conversion fails.
Signed-off-by: Liu Jian <liujian56@huawei.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20220427115150.210213-1-liujian56@huawei.com
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/skmsg.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/net/core/skmsg.c b/net/core/skmsg.c index cc381165ea08..22b983ade0e7 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -524,16 +524,20 @@ static int sk_psock_skb_ingress_enqueue(struct sk_buff *skb, { int num_sge, copied; - /* skb linearize may fail with ENOMEM, but lets simply try again - * later if this happens. Under memory pressure we don't want to - * drop the skb. We need to linearize the skb so that the mapping - * in skb_to_sgvec can not error. - */ - if (skb_linearize(skb)) - return -EAGAIN; num_sge = skb_to_sgvec(skb, msg->sg.data, off, len); - if (unlikely(num_sge < 0)) - return num_sge; + if (num_sge < 0) { + /* skb linearize may fail with ENOMEM, but lets simply try again + * later if this happens. Under memory pressure we don't want to + * drop the skb. We need to linearize the skb so that the mapping + * in skb_to_sgvec can not error. + */ + if (skb_linearize(skb)) + return -EAGAIN; + + num_sge = skb_to_sgvec(skb, msg->sg.data, off, len); + if (unlikely(num_sge < 0)) + return num_sge; + } copied = len; msg->sg.start = 0; |