mbox series

[bpf,v8,00/13] bpf sockmap fixes

Message ID 20230517052244.294755-1-john.fastabend@gmail.com (mailing list archive)
Headers show
Series bpf sockmap fixes | expand

Message

John Fastabend May 17, 2023, 5:22 a.m. UTC
This v8 iteration adds another fix suggested by Jakub to always
check the enable bit is set before rescheduling to avoid trying
to reschedule backlog queue handler while trying to tear down
a socket. Also cleaned up one of the tests as suggested by Jakub
to avoid creating unused pair of sockets.

Fixes for sockmap running against NGINX TCP tests and also on an
underprovisioned VM so that we hit error (ENOMEM) cases regularly.

The first 3 patches fix cases related to ENOMEM that were either
causing splats or data hangs.

Then 4-7 resolved cases found when running NGINX with its sockets
assigned to sockmap. These mostly have to do with handling fin/shutdown
incorrectly and ensuring epoll_wait works as expected.

Patches 8 and 9 extract some of the logic used for sockmap_listen tests
so that we can use it in other tests because it didn't make much
sense to me to add tests to the sockmap_listen cases when here we
are testing send/recv *basic* cases.

Finally patches 10, 11 and 12 add the new tests to ensure we handle
ioctl(FIONREAD) and shutdown correctly.

To test the series I ran the NGINX compliance tests and the sockmap
selftests. For now our compliance test just runs with SK_PASS.

There are some more things to be done here, but these 11 patches
stand on their own in my opionion and fix issues we are having in
CI now. For bpf-next we can fixup/improve selftests to use the
ASSERT_* in sockmap_helpers, streamline some of the testing, and
add more tests. We also still are debugging a few additional flakes
patches coming soon.

v2: use skb_queue_empty instead of *_empty_lockless (Eric)
    oops incorrectly updated copied_seq on DROP case (Eric)
    added test for drop case copied_seq update

v3: Fix up comment to use /**/ formatting and update commit
    message to capture discussion about previous fix attempt
    for hanging backlog being imcomplete.

v4: build error sockmap things are behind NET_SKMSG not in
    BPF_SYSCALL otherwise you can build the .c file but not
    have correct headers.

v5: typo with mispelled SOCKMAP_HELPERS

v6: fix to build without INET enabled for the other sockmap
    types e.g. af_unix.

v7: We can not protect backlog queue with a mutex because in
    some cases we call this with sock lock held. Instead do
    as Jakub suggested and peek the queue and only pop the
    skb when its been correctly processed.

v8: Only schedule backlog when still enabled and cleanup test
    to not create unused sockets.


John Fastabend (13):
  bpf: sockmap, pass skb ownership through read_skb
  bpf: sockmap, convert schedule_work into delayed_work
  bpf: sockmap, reschedule is now done through backlog
  bpf: sockmap, improved check for empty queue
  bpf: sockmap, handle fin correctly
  bpf: sockmap, TCP data stall on recv before accept
  bpf: sockmap, wake up polling after data copy
  bpf: sockmap, incorrectly handling copied_seq
  bpf: sockmap, pull socket helpers out of listen test for general use
  bpf: sockmap, build helper to create connected socket pair
  bpf: sockmap, test shutdown() correctly exits epoll and recv()=0
  bpf: sockmap, test FIONREAD returns correct bytes in rx buffer
  bpf: sockmap, test FIONREAD returns correct bytes in rx buffer with
    drops

 include/linux/skmsg.h                         |   3 +-
 include/net/tcp.h                             |  10 +
 net/core/skmsg.c                              |  81 ++--
 net/core/sock_map.c                           |   3 +-
 net/ipv4/tcp.c                                |  11 +-
 net/ipv4/tcp_bpf.c                            |  79 +++-
 net/ipv4/udp.c                                |   7 +-
 net/unix/af_unix.c                            |   7 +-
 .../selftests/bpf/prog_tests/sockmap_basic.c  | 131 +++++++
 .../bpf/prog_tests/sockmap_helpers.h          | 367 ++++++++++++++++++
 .../selftests/bpf/prog_tests/sockmap_listen.c | 352 +----------------
 .../bpf/progs/test_sockmap_drop_prog.c        |  32 ++
 .../bpf/progs/test_sockmap_pass_prog.c        |  32 ++
 13 files changed, 702 insertions(+), 413 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/sockmap_helpers.h
 create mode 100644 tools/testing/selftests/bpf/progs/test_sockmap_drop_prog.c
 create mode 100644 tools/testing/selftests/bpf/progs/test_sockmap_pass_prog.c

Comments

Daniel Borkmann May 17, 2023, 1:54 p.m. UTC | #1
On 5/17/23 7:22 AM, John Fastabend wrote:
> This v8 iteration adds another fix suggested by Jakub to always
> check the enable bit is set before rescheduling to avoid trying
> to reschedule backlog queue handler while trying to tear down
> a socket. Also cleaned up one of the tests as suggested by Jakub
> to avoid creating unused pair of sockets.
[...]
> v8: Only schedule backlog when still enabled and cleanup test
>      to not create unused sockets.

Looks like this needs a v9 :( The series does not apply to bpf tree,
see here:

[...]
Cmd('git') failed due to: exit code(128)
   cmdline: git am --3way
   stdout: 'Applying: bpf: sockmap, pass skb ownership through read_skb
Applying: bpf: sockmap, convert schedule_work into delayed_work
Applying: bpf: sockmap, reschedule is now done through backlog
Applying: bpf: sockmap, improved check for empty queue
Applying: bpf: sockmap, handle fin correctly
Applying: bpf: sockmap, TCP data stall on recv before accept
Applying: bpf: sockmap, wake up polling after data copy
Applying: bpf: sockmap, incorrectly handling copied_seq
Applying: bpf: sockmap, pull socket helpers out of listen test for general use
Using index info to reconstruct a base tree...
M	tools/testing/selftests/bpf/prog_tests/sockmap_listen.c
Falling back to patching base and 3-way merge...
Auto-merging tools/testing/selftests/bpf/prog_tests/sockmap_listen.c
CONFLICT (content): Merge conflict in tools/testing/selftests/bpf/prog_tests/sockmap_listen.c
Patch failed at 0009 bpf: sockmap, pull socket helpers out of listen test for general use
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".'
   stderr: 'error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch'