diff options
| -rw-r--r-- | kernel/bpf/sockmap.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/kernel/bpf/sockmap.c b/kernel/bpf/sockmap.c index 9192fdbcbccc..d2bda5aa25d7 100644 --- a/kernel/bpf/sockmap.c +++ b/kernel/bpf/sockmap.c | |||
| @@ -341,7 +341,7 @@ retry: | |||
| 341 | md->sg_start++; | 341 | md->sg_start++; |
| 342 | if (md->sg_start == MAX_SKB_FRAGS) | 342 | if (md->sg_start == MAX_SKB_FRAGS) |
| 343 | md->sg_start = 0; | 343 | md->sg_start = 0; |
| 344 | memset(sg, 0, sizeof(*sg)); | 344 | sg_init_table(sg, 1); |
| 345 | 345 | ||
| 346 | if (md->sg_start == md->sg_end) | 346 | if (md->sg_start == md->sg_end) |
| 347 | break; | 347 | break; |
| @@ -843,7 +843,7 @@ static int bpf_tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) | |||
| 843 | } | 843 | } |
| 844 | 844 | ||
| 845 | sg = md.sg_data; | 845 | sg = md.sg_data; |
| 846 | sg_init_table(sg, MAX_SKB_FRAGS); | 846 | sg_init_marker(sg, MAX_SKB_FRAGS); |
| 847 | rcu_read_unlock(); | 847 | rcu_read_unlock(); |
| 848 | 848 | ||
| 849 | lock_sock(sk); | 849 | lock_sock(sk); |
| @@ -950,10 +950,14 @@ static int bpf_tcp_sendpage(struct sock *sk, struct page *page, | |||
| 950 | 950 | ||
| 951 | lock_sock(sk); | 951 | lock_sock(sk); |
| 952 | 952 | ||
| 953 | if (psock->cork_bytes) | 953 | if (psock->cork_bytes) { |
| 954 | m = psock->cork; | 954 | m = psock->cork; |
| 955 | else | 955 | sg = &m->sg_data[m->sg_end]; |
| 956 | } else { | ||
| 956 | m = &md; | 957 | m = &md; |
| 958 | sg = m->sg_data; | ||
| 959 | sg_init_marker(sg, MAX_SKB_FRAGS); | ||
| 960 | } | ||
| 957 | 961 | ||
| 958 | /* Catch case where ring is full and sendpage is stalled. */ | 962 | /* Catch case where ring is full and sendpage is stalled. */ |
| 959 | if (unlikely(m->sg_end == m->sg_start && | 963 | if (unlikely(m->sg_end == m->sg_start && |
| @@ -961,7 +965,6 @@ static int bpf_tcp_sendpage(struct sock *sk, struct page *page, | |||
| 961 | goto out_err; | 965 | goto out_err; |
| 962 | 966 | ||
| 963 | psock->sg_size += size; | 967 | psock->sg_size += size; |
| 964 | sg = &m->sg_data[m->sg_end]; | ||
| 965 | sg_set_page(sg, page, size, offset); | 968 | sg_set_page(sg, page, size, offset); |
| 966 | get_page(page); | 969 | get_page(page); |
| 967 | m->sg_copy[m->sg_end] = true; | 970 | m->sg_copy[m->sg_end] = true; |
