14 Jun, 2020

2 commits

  • Pull networking fixes from David Miller:

    1) Fix cfg80211 deadlock, from Johannes Berg.

    2) RXRPC fails to send norigications, from David Howells.

    3) MPTCP RM_ADDR parsing has an off by one pointer error, fix from
    Geliang Tang.

    4) Fix crash when using MSG_PEEK with sockmap, from Anny Hu.

    5) The ucc_geth driver needs __netdev_watchdog_up exported, from
    Valentin Longchamp.

    6) Fix hashtable memory leak in dccp, from Wang Hai.

    7) Fix how nexthops are marked as FDB nexthops, from David Ahern.

    8) Fix mptcp races between shutdown and recvmsg, from Paolo Abeni.

    9) Fix crashes in tipc_disc_rcv(), from Tuong Lien.

    10) Fix link speed reporting in iavf driver, from Brett Creeley.

    11) When a channel is used for XSK and then reused again later for XSK,
    we forget to clear out the relevant data structures in mlx5 which
    causes all kinds of problems. Fix from Maxim Mikityanskiy.

    12) Fix memory leak in genetlink, from Cong Wang.

    13) Disallow sockmap attachments to UDP sockets, it simply won't work.
    From Lorenz Bauer.

    * git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (83 commits)
    net: ethernet: ti: ale: fix allmulti for nu type ale
    net: ethernet: ti: am65-cpsw-nuss: fix ale parameters init
    net: atm: Remove the error message according to the atomic context
    bpf: Undo internal BPF_PROBE_MEM in BPF insns dump
    libbpf: Support pre-initializing .bss global variables
    tools/bpftool: Fix skeleton codegen
    bpf: Fix memlock accounting for sock_hash
    bpf: sockmap: Don't attach programs to UDP sockets
    bpf: tcp: Recv() should return 0 when the peer socket is closed
    ibmvnic: Flush existing work items before device removal
    genetlink: clean up family attributes allocations
    net: ipa: header pad field only valid for AP->modem endpoint
    net: ipa: program upper nibbles of sequencer type
    net: ipa: fix modem LAN RX endpoint id
    net: ipa: program metadata mask differently
    ionic: add pcie_print_link_status
    rxrpc: Fix race between incoming ACK parser and retransmitter
    net/mlx5: E-Switch, Fix some error pointer dereferences
    net/mlx5: Don't fail driver on failure to create debugfs
    net/mlx5e: CT: Fix ipv6 nat header rewrite actions
    ...

    Linus Torvalds
     
  • Alexei Starovoitov says:

    ====================
    pull-request: bpf 2020-06-12

    The following pull-request contains BPF updates for your *net* tree.

    We've added 26 non-merge commits during the last 10 day(s) which contain
    a total of 27 files changed, 348 insertions(+), 93 deletions(-).

    The main changes are:

    1) sock_hash accounting fix, from Andrey.

    2) libbpf fix and probe_mem sanitizing, from Andrii.

    3) sock_hash fixes, from Jakub.

    4) devmap_val fix, from Jesper.

    5) load_bytes_relative fix, from YiFei.
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     

12 Jun, 2020

1 commit

  • Propagate sock_alloc_send_skb error code, not set it to
    EAGAIN unconditionally, when fail to allocate skb, which
    might cause that user space unnecessary loops.

    Fixes: 35fcde7f8deb ("xsk: support for Tx")
    Signed-off-by: Li RongQing
    Signed-off-by: Daniel Borkmann
    Acked-by: Björn Töpel
    Link: https://lore.kernel.org/bpf/1591852266-24017-1-git-send-email-lirongqing@baidu.com

    Li RongQing
     

10 Jun, 2020

1 commit

  • This change converts the existing mmap_sem rwsem calls to use the new mmap
    locking API instead.

    The change is generated using coccinelle with the following rule:

    // spatch --sp-file mmap_lock_api.cocci --in-place --include-headers --dir .

    @@
    expression mm;
    @@
    (
    -init_rwsem
    +mmap_init_lock
    |
    -down_write
    +mmap_write_lock
    |
    -down_write_killable
    +mmap_write_lock_killable
    |
    -down_write_trylock
    +mmap_write_trylock
    |
    -up_write
    +mmap_write_unlock
    |
    -downgrade_write
    +mmap_write_downgrade
    |
    -down_read
    +mmap_read_lock
    |
    -down_read_killable
    +mmap_read_lock_killable
    |
    -down_read_trylock
    +mmap_read_trylock
    |
    -up_read
    +mmap_read_unlock
    )
    -(&mm->mmap_sem)
    +(mm)

    Signed-off-by: Michel Lespinasse
    Signed-off-by: Andrew Morton
    Reviewed-by: Daniel Jordan
    Reviewed-by: Laurent Dufour
    Reviewed-by: Vlastimil Babka
    Cc: Davidlohr Bueso
    Cc: David Rientjes
    Cc: Hugh Dickins
    Cc: Jason Gunthorpe
    Cc: Jerome Glisse
    Cc: John Hubbard
    Cc: Liam Howlett
    Cc: Matthew Wilcox
    Cc: Peter Zijlstra
    Cc: Ying Han
    Link: http://lkml.kernel.org/r/20200520052908.204642-5-walken@google.com
    Signed-off-by: Linus Torvalds

    Michel Lespinasse
     

05 Jun, 2020

1 commit


01 Jun, 2020

1 commit

  • xdp_umem.c had overlapping changes between the 64-bit math fix
    for the calculation of npgs and the removal of the zerocopy
    memory type which got rid of the chunk_size_nohdr member.

    The mlx5 Kconfig conflict is a case where we just take the
    net-next copy of the Kconfig entry dependency as it takes on
    the ESWITCH dependency by one level of indirection which is
    what the 'net' conflicting change is trying to ensure.

    Signed-off-by: David S. Miller

    David S. Miller
     

26 May, 2020

1 commit

  • The npgs member of struct xdp_umem is an u32 entity, and stores the
    number of pages the UMEM consumes. The calculation of npgs

    npgs = size / PAGE_SIZE

    can overflow.

    To avoid overflow scenarios, the division is now first stored in a
    u64, and the result is verified to fit into 32b.

    An alternative would be storing the npgs as a u64, however, this
    wastes memory and is an unrealisticly large packet area.

    Fixes: c0c77d8fb787 ("xsk: add user memory registration support sockopt")
    Reported-by: "Minh Bùi Quang"
    Signed-off-by: Björn Töpel
    Signed-off-by: Daniel Borkmann
    Acked-by: Jonathan Lemon
    Link: https://lore.kernel.org/bpf/CACtPs=GGvV-_Yj6rbpzTVnopgi5nhMoCcTkSkYrJHGQHJWFZMQ@mail.gmail.com/
    Link: https://lore.kernel.org/bpf/20200525080400.13195-1-bjorn.topel@gmail.com

    Björn Töpel
     

22 May, 2020

6 commits

  • In order to reduce the number of function calls, the struct
    xsk_buff_pool definition is moved to xsk_buff_pool.h. The functions
    xp_get_dma(), xp_dma_sync_for_cpu(), xp_dma_sync_for_device(),
    xp_validate_desc() and various helper functions are explicitly
    inlined.

    Further, move xp_get_handle() and xp_release() to xsk.c, to allow for
    the compiler to perform inlining.

    rfc->v1: Make sure xp_validate_desc() is inlined for Tx perf. (Maxim)

    Signed-off-by: Björn Töpel
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/20200520192103.355233-15-bjorn.topel@gmail.com

    Björn Töpel
     
  • There are no users of MEM_TYPE_ZERO_COPY. Remove all corresponding
    code, including the "handle" member of struct xdp_buff.

    rfc->v1: Fixed spelling in commit message. (Björn)

    Signed-off-by: Björn Töpel
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/20200520192103.355233-13-bjorn.topel@gmail.com

    Björn Töpel
     
  • In order to simplify AF_XDP zero-copy enablement for NIC driver
    developers, a new AF_XDP buffer allocation API is added. The
    implementation is based on a single core (single producer/consumer)
    buffer pool for the AF_XDP UMEM.

    A buffer is allocated using the xsk_buff_alloc() function, and
    returned using xsk_buff_free(). If a buffer is disassociated with the
    pool, e.g. when a buffer is passed to an AF_XDP socket, a buffer is
    said to be released. Currently, the release function is only used by
    the AF_XDP internals and not visible to the driver.

    Drivers using this API should register the XDP memory model with the
    new MEM_TYPE_XSK_BUFF_POOL type.

    The API is defined in net/xdp_sock_drv.h.

    The buffer type is struct xdp_buff, and follows the lifetime of
    regular xdp_buffs, i.e. the lifetime of an xdp_buff is restricted to
    a NAPI context. In other words, the API is not replacing xdp_frames.

    In addition to introducing the API and implementations, the AF_XDP
    core is migrated to use the new APIs.

    rfc->v1: Fixed build errors/warnings for m68k and riscv. (kbuild test
    robot)
    Added headroom/chunk size getter. (Maxim/Björn)

    v1->v2: Swapped SoBs. (Maxim)

    v2->v3: Initialize struct xdp_buff member frame_sz. (Björn)
    Add API to query the DMA address of a frame. (Maxim)
    Do DMA sync for CPU till the end of the frame to handle
    possible growth (frame_sz). (Maxim)

    Signed-off-by: Björn Töpel
    Signed-off-by: Maxim Mikityanskiy
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/20200520192103.355233-6-bjorn.topel@gmail.com

    Björn Töpel
     
  • Move the XSK_NEXT_PG_CONTIG_{MASK,SHIFT}, and
    XDP_UMEM_USES_NEED_WAKEUP defines from xdp_sock.h to the AF_XDP
    internal xsk.h file. Also, start using the BIT{,_ULL} macro instead of
    explicit shifts.

    Signed-off-by: Björn Töpel
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/20200520192103.355233-5-bjorn.topel@gmail.com

    Björn Töpel
     
  • Move the AF_XDP zero-copy driver interface to its own include file
    called xdp_sock_drv.h. This, hopefully, will make it more clear for
    NIC driver implementors to know what functions to use for zero-copy
    support.

    v4->v5: Fix -Wmissing-prototypes by include header file. (Jakub)

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/20200520192103.355233-4-bjorn.topel@gmail.com

    Magnus Karlsson
     
  • The XSKMAP is partly implemented by net/xdp/xsk.c. Move xskmap.c from
    kernel/bpf/ to net/xdp/, which is the logical place for AF_XDP related
    code. Also, move AF_XDP struct definitions, and function declarations
    only used by AF_XDP internals into net/xdp/xsk.h.

    Signed-off-by: Björn Töpel
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/20200520192103.355233-3-bjorn.topel@gmail.com

    Björn Töpel
     

05 May, 2020

2 commits

  • Remove the unnecessary member of address in struct xdp_umem as it is
    only used during the umem registration. No need to carry this around
    as it is not used during run-time nor when unregistering the umem.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Daniel Borkmann
    Acked-by: Jonathan Lemon
    Link: https://lore.kernel.org/bpf/1588599232-24897-3-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • Change two variables names so that it is clearer what they
    represent. The first one is xsk_list that in fact only contains the
    list of AF_XDP sockets with a Tx component. Change this to xsk_tx_list
    for improved clarity. The second variable is size in the ring
    structure. One might think that this is the size of the ring, but it
    is in fact the size of the umem, copied into the ring structure to
    improve performance. Rename this variable umem_size to avoid any
    confusion.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Daniel Borkmann
    Acked-by: Jonathan Lemon
    Link: https://lore.kernel.org/bpf/1588599232-24897-2-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     

27 Apr, 2020

1 commit


15 Apr, 2020

1 commit

  • Add a check that the headroom cannot be larger than the available
    space in the chunk. In the current code, a malicious user can set the
    headroom to a value larger than the chunk size minus the fixed XDP
    headroom. That way packets with a length larger than the supported
    size in the umem could get accepted and result in an out-of-bounds
    write.

    Fixes: c0c77d8fb787 ("xsk: add user memory registration support sockopt")
    Reported-by: Bui Quang Minh
    Signed-off-by: Magnus Karlsson
    Signed-off-by: Daniel Borkmann
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=207225
    Link: https://lore.kernel.org/bpf/1586849715-23490-1-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     

07 Apr, 2020

1 commit

  • first_len is the remainder of the first page we're copying.
    If this size is larger, then out of page boundary write will
    otherwise happen.

    Fixes: c05cd3645814 ("xsk: add support to allow unaligned chunk placement")
    Signed-off-by: Li RongQing
    Signed-off-by: Daniel Borkmann
    Acked-by: Jonathan Lemon
    Acked-by: Björn Töpel
    Link: https://lore.kernel.org/bpf/1585813930-19712-1-git-send-email-lirongqing@baidu.com

    Li RongQing
     

29 Feb, 2020

1 commit

  • The current codebase makes use of the zero-length array language
    extension to the C90 standard, but the preferred mechanism to declare
    variable-length types such as these ones is a flexible array member[1][2],
    introduced in C99:

    struct foo {
    int stuff;
    struct boo array[];
    };

    By making use of the mechanism above, we will get a compiler warning
    in case the flexible array does not occur last in the structure, which
    will help us prevent some kind of undefined behavior bugs from being
    inadvertently introduced[3] to the codebase from now on.

    Also, notice that, dynamic memory allocations won't be affected by
    this change:

    "Flexible array members have incomplete type, and so the sizeof operator
    may not be applied. As a quirk of the original implementation of
    zero-length arrays, sizeof evaluates to zero."[1]

    This issue was found with the help of Coccinelle.

    [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    [2] https://github.com/KSPP/linux/issues/21
    [3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

    Signed-off-by: Gustavo A. R. Silva
    Acked-by: Jonathan Lemon
    Acked-by: Björn Töpel
    Signed-off-by: David S. Miller

    Gustavo A. R. Silva
     

11 Feb, 2020

1 commit

  • The commit 4b638f13bab4 ("xsk: Eliminate the RX batch size")
    introduced a much more lazy way of updating the global consumer
    pointers from the kernel side, by only doing so when running out of
    entries in the fill or Tx rings (the rings consumed by the
    kernel). This can result in a deadlock with the user application if
    the kernel requires more than one entry to proceed and the application
    cannot put these entries in the fill ring because the kernel has not
    updated the global consumer pointer since the ring is not empty.

    Fix this by publishing the local kernel side consumer pointer whenever
    we have completed Rx or Tx processing in the kernel. This way, user
    space will have an up-to-date view of the consumer pointers whenever it
    gets to execute in the one core case (application and driver on the
    same core), or after a certain number of packets have been processed
    in the two core case (application and driver on different cores).

    A side effect of this patch is that the one core case gets better
    performance, but the two core case gets worse. The reason that the one
    core case improves is that updating the global consumer pointer is
    relatively cheap since the application by definition is not running
    when the kernel is (they are on the same core) and it is beneficial
    for the application, once it gets to run, to have pointers that are
    as up to date as possible since it then can operate on more packets
    and buffers. In the two core case, the most important performance
    aspect is to minimize the number of accesses to the global pointers
    since they are shared between two cores and bounces between the caches
    of those cores. This patch results in more updates to global state,
    which means lower performance in the two core case.

    Fixes: 4b638f13bab4 ("xsk: Eliminate the RX batch size")
    Reported-by: Ryan Goodfellow
    Reported-by: Maxim Mikityanskiy
    Signed-off-by: Magnus Karlsson
    Signed-off-by: Daniel Borkmann
    Acked-by: Jonathan Lemon
    Acked-by: Maxim Mikityanskiy
    Link: https://lore.kernel.org/bpf/1581348432-6747-1-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     

01 Feb, 2020

2 commits

  • In order to provide a clearer, more symmetric API for pinning and
    unpinning DMA pages. This way, pin_user_pages*() calls match up with
    unpin_user_pages*() calls, and the API is a lot closer to being
    self-explanatory.

    Link: http://lkml.kernel.org/r/20200107224558.2362728-23-jhubbard@nvidia.com
    Signed-off-by: John Hubbard
    Reviewed-by: Jan Kara
    Cc: Alex Williamson
    Cc: Aneesh Kumar K.V
    Cc: Björn Töpel
    Cc: Christoph Hellwig
    Cc: Daniel Vetter
    Cc: Dan Williams
    Cc: Hans Verkuil
    Cc: Ira Weiny
    Cc: Jason Gunthorpe
    Cc: Jason Gunthorpe
    Cc: Jens Axboe
    Cc: Jerome Glisse
    Cc: Jonathan Corbet
    Cc: Kirill A. Shutemov
    Cc: Leon Romanovsky
    Cc: Mauro Carvalho Chehab
    Cc: Mike Rapoport
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    John Hubbard
     
  • Convert net/xdp to use the new pin_longterm_pages() call, which sets
    FOLL_PIN. Setting FOLL_PIN is now required for code that requires
    tracking of pinned pages.

    In partial anticipation of this work, the net/xdp code was already calling
    put_user_page() instead of put_page(). Therefore, in order to convert
    from the get_user_pages()/put_page() model, to the
    pin_user_pages()/put_user_page() model, the only change required here is
    to change get_user_pages() to pin_user_pages().

    Link: http://lkml.kernel.org/r/20200107224558.2362728-18-jhubbard@nvidia.com
    Signed-off-by: John Hubbard
    Acked-by: Björn Töpel
    Cc: Alex Williamson
    Cc: Aneesh Kumar K.V
    Cc: Christoph Hellwig
    Cc: Daniel Vetter
    Cc: Dan Williams
    Cc: Hans Verkuil
    Cc: Ira Weiny
    Cc: Jan Kara
    Cc: Jason Gunthorpe
    Cc: Jason Gunthorpe
    Cc: Jens Axboe
    Cc: Jerome Glisse
    Cc: Jonathan Corbet
    Cc: Kirill A. Shutemov
    Cc: Leon Romanovsky
    Cc: Mauro Carvalho Chehab
    Cc: Mike Rapoport
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    John Hubbard
     

22 Jan, 2020

1 commit

  • XDP sockets use the default implementation of struct sock's
    sk_data_ready callback, which is sock_def_readable(). This function
    is called in the XDP socket fast-path, and involves a retpoline. By
    letting sock_def_readable() have external linkage, and being called
    directly, the retpoline can be avoided.

    Signed-off-by: Björn Töpel
    Signed-off-by: Daniel Borkmann
    Link: https://lore.kernel.org/bpf/20200120092917.13949-1-bjorn.topel@gmail.com

    Björn Töpel
     

16 Jan, 2020

1 commit

  • When registering a umem area that is sufficiently large (>1G on an
    x86), kmalloc cannot be used to allocate one of the internal data
    structures, as the size requested gets too large. Use kvmalloc instead
    that falls back on vmalloc if the allocation is too large for kmalloc.

    Also add accounting for this structure as it is triggered by a user
    space action (the XDP_UMEM_REG setsockopt) and it is by far the
    largest structure of kernel allocated memory in xsk.

    Reported-by: Ryan Goodfellow
    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Acked-by: Jonathan Lemon
    Link: https://lore.kernel.org/bpf/1578995365-7050-1-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     

28 Dec, 2019

1 commit

  • Daniel Borkmann says:

    ====================
    pull-request: bpf-next 2019-12-27

    The following pull-request contains BPF updates for your *net-next* tree.

    We've added 127 non-merge commits during the last 17 day(s) which contain
    a total of 110 files changed, 6901 insertions(+), 2721 deletions(-).

    There are three merge conflicts. Conflicts and resolution looks as follows:

    1) Merge conflict in net/bpf/test_run.c:

    There was a tree-wide cleanup c593642c8be0 ("treewide: Use sizeof_field() macro")
    which gets in the way with b590cb5f802d ("bpf: Switch to offsetofend in
    BPF_PROG_TEST_RUN"):

    <<<<<<< HEAD
    if (!range_is_zero(__skb, offsetof(struct __sk_buff, priority) +
    sizeof_field(struct __sk_buff, priority),
    =======
    if (!range_is_zero(__skb, offsetofend(struct __sk_buff, priority),
    >>>>>>> 7c8dce4b166113743adad131b5a24c4acc12f92c

    There are a few occasions that look similar to this. Always take the chunk with
    offsetofend(). Note that there is one where the fields differ in here:

    <<<<<<< HEAD
    if (!range_is_zero(__skb, offsetof(struct __sk_buff, tstamp) +
    sizeof_field(struct __sk_buff, tstamp),
    =======
    if (!range_is_zero(__skb, offsetofend(struct __sk_buff, gso_segs),
    >>>>>>> 7c8dce4b166113743adad131b5a24c4acc12f92c

    Just take the one with offsetofend() /and/ gso_segs. Latter is correct due to
    850a88cc4096 ("bpf: Expose __sk_buff wire_len/gso_segs to BPF_PROG_TEST_RUN").

    2) Merge conflict in arch/riscv/net/bpf_jit_comp.c:

    (I'm keeping Bjorn in Cc here for a double-check in case I got it wrong.)

    <<<<<<< HEAD
    if (is_13b_check(off, insn))
    return -1;
    emit(rv_blt(tcc, RV_REG_ZERO, off >> 1), ctx);
    =======
    emit_branch(BPF_JSLT, RV_REG_T1, RV_REG_ZERO, off, ctx);
    >>>>>>> 7c8dce4b166113743adad131b5a24c4acc12f92c

    Result should look like:

    emit_branch(BPF_JSLT, tcc, RV_REG_ZERO, off, ctx);

    3) Merge conflict in arch/riscv/include/asm/pgtable.h:

    <<<<<<< HEAD
    =======
    #define VMALLOC_SIZE (KERN_VIRT_SIZE >> 1)
    #define VMALLOC_END (PAGE_OFFSET - 1)
    #define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)

    #define BPF_JIT_REGION_SIZE (SZ_128M)
    #define BPF_JIT_REGION_START (PAGE_OFFSET - BPF_JIT_REGION_SIZE)
    #define BPF_JIT_REGION_END (VMALLOC_END)

    /*
    * Roughly size the vmemmap space to be large enough to fit enough
    * struct pages to map half the virtual address space. Then
    * position vmemmap directly below the VMALLOC region.
    */
    #define VMEMMAP_SHIFT \
    (CONFIG_VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT)
    #define VMEMMAP_SIZE BIT(VMEMMAP_SHIFT)
    #define VMEMMAP_END (VMALLOC_START - 1)
    #define VMEMMAP_START (VMALLOC_START - VMEMMAP_SIZE)

    #define vmemmap ((struct page *)VMEMMAP_START)

    >>>>>>> 7c8dce4b166113743adad131b5a24c4acc12f92c

    Only take the BPF_* defines from there and move them higher up in the
    same file. Remove the rest from the chunk. The VMALLOC_* etc defines
    got moved via 01f52e16b868 ("riscv: define vmemmap before pfn_to_page
    calls"). Result:

    [...]
    #define __S101 PAGE_READ_EXEC
    #define __S110 PAGE_SHARED_EXEC
    #define __S111 PAGE_SHARED_EXEC

    #define VMALLOC_SIZE (KERN_VIRT_SIZE >> 1)
    #define VMALLOC_END (PAGE_OFFSET - 1)
    #define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)

    #define BPF_JIT_REGION_SIZE (SZ_128M)
    #define BPF_JIT_REGION_START (PAGE_OFFSET - BPF_JIT_REGION_SIZE)
    #define BPF_JIT_REGION_END (VMALLOC_END)

    /*
    * Roughly size the vmemmap space to be large enough to fit enough
    * struct pages to map half the virtual address space. Then
    * position vmemmap directly below the VMALLOC region.
    */
    #define VMEMMAP_SHIFT \
    (CONFIG_VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT)
    #define VMEMMAP_SIZE BIT(VMEMMAP_SHIFT)
    #define VMEMMAP_END (VMALLOC_START - 1)
    #define VMEMMAP_START (VMALLOC_START - VMEMMAP_SIZE)

    [...]

    Let me know if there are any other issues.

    Anyway, the main changes are:

    1) Extend bpftool to produce a struct (aka "skeleton") tailored and specific
    to a provided BPF object file. This provides an alternative, simplified API
    compared to standard libbpf interaction. Also, add libbpf extern variable
    resolution for .kconfig section to import Kconfig data, from Andrii Nakryiko.

    2) Add BPF dispatcher for XDP which is a mechanism to avoid indirect calls by
    generating a branch funnel as discussed back in bpfconf'19 at LSF/MM. Also,
    add various BPF riscv JIT improvements, from Björn Töpel.

    3) Extend bpftool to allow matching BPF programs and maps by name,
    from Paul Chaignon.

    4) Support for replacing cgroup BPF programs attached with BPF_F_ALLOW_MULTI
    flag for allowing updates without service interruption, from Andrey Ignatov.

    5) Cleanup and simplification of ring access functions for AF_XDP with a
    bonus of 0-5% performance improvement, from Magnus Karlsson.

    6) Enable BPF JITs for x86-64 and arm64 by default. Also, final version of
    audit support for BPF, from Daniel Borkmann and latter with Jiri Olsa.

    7) Move and extend test_select_reuseport into BPF program tests under
    BPF selftests, from Jakub Sitnicki.

    8) Various BPF sample improvements for xdpsock for customizing parameters
    to set up and benchmark AF_XDP, from Jay Jayatheerthan.

    9) Improve libbpf to provide a ulimit hint on permission denied errors.
    Also change XDP sample programs to attach in driver mode by default,
    from Toke Høiland-Jørgensen.

    10) Extend BPF test infrastructure to allow changing skb mark from tc BPF
    programs, from Nikita V. Shirokov.

    11) Optimize prologue code sequence in BPF arm32 JIT, from Russell King.

    12) Fix xdp_redirect_cpu BPF sample to manually attach to tracepoints after
    libbpf conversion, from Jesper Dangaard Brouer.

    13) Minor misc improvements from various others.
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     

21 Dec, 2019

12 commits

  • Improve readability and maintainability by using the struct_size()
    helper when allocating the AF_XDP rings.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-13-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • Add comments on how the ring access functions are named and how they
    are supposed to be used for producers and consumers. The functions are
    also reordered so that the consumer functions are in the beginning and
    the producer functions in the end, for easier reference. Put this in a
    separate patch as the diff might look a little odd, but no
    functionality has changed in this patch.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-12-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • There are two unnecessary READ_ONCE of descriptor data. These are not
    needed since the data is written by the producer before it signals
    that the data is available by incrementing the producer pointer. As the
    access to this producer pointer is serialized and the consumer always
    reads the descriptor after it has read and synchronized with the
    producer counter, the write of the descriptor will have fully
    completed and it does not matter if the consumer has any read tearing.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-11-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • Change the name of xsk_umem_discard_addr to xsk_umem_release_addr to
    better reflect the new naming of the AF_XDP queue manipulation
    functions. As this functions is used by drivers implementing support
    for AF_XDP zero-copy, it requires a name change to these drivers. The
    function xsk_umem_release_addr_rq has also changed name in the same
    fashion.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-10-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • Change the names of the validation functions to better reflect what
    they are doing. The uppermost ones are reading entries from the rings
    and only the bottom ones validate entries. So xskq_cons_read_ is a
    better prefix name.

    Also change the xskq_cons_read_ functions to return a bool
    as the the descriptor or address is already returned by reference
    in the parameters. Everyone is using the return value as a bool
    anyway.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-9-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • Simplify and refactor consumer ring functions. The consumer first
    "peeks" to find descriptors or addresses that are available to
    read from the ring, then reads them and finally "releases" these
    descriptors once it is done. The two local variables cons_tail
    and cons_head are turned into one single variable called
    cached_cons. cached_tail referred to the cached value of the
    global consumer pointer and will be stored in cached_cons. For
    cached_head, we just use cached_prod instead as it was not used
    for a consumer queue before. It also better reflects what it
    really is now: a cached copy of the producer pointer.

    The names of the functions are also renamed in the same manner as
    the producer functions. The new functions are called xskq_cons_
    followed by what it does.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-8-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • At this point, there are no users of the functions xskq_nb_avail and
    xskq_nb_free that take any other number of entries argument than 1, so
    let us get rid of the second argument that takes the number of
    entries.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-7-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • In the xsk consumer ring code there is a variable called RX_BATCH_SIZE
    that dictates the minimum number of entries that we try to grab from
    the fill and Tx rings. In fact, the code always try to grab the
    maximum amount of entries from these rings. The only thing this
    variable does is to throw an error if there is less than 16 (as it is
    defined) entries on the ring. There is no reason to do this and it
    will just lead to weird behavior from user space's point of view. So
    eliminate this variable.

    With this change, we will be able to simplify the xskq_nb_free and
    xskq_nb_avail code in the next commit.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-6-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • Adopt the naming of the producer ring access functions to have a
    similar naming convention as the functions in libbpf, but adapted to
    the kernel. You first reserve a number of entries that you later
    submit to the global state of the ring. This is much clearer, IMO,
    than the one that was in the kernel part. Once renamed, we also
    discover that two functions are actually the same, so remove one of
    them. Some of the primitive ring submission operations are also the
    same so break these out into __xskq_prod_submit that the upper level
    ring access functions can use.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-5-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • Currently, the xsk ring code has two cached producer pointers:
    prod_head and prod_tail. This patch consolidates these two into a
    single one called cached_prod to make the code simpler and easier to
    maintain. This will be in line with the user space part of the the
    code found in libbpf, that only uses a single cached pointer.

    The Rx path only uses the two top level functions
    xskq_produce_batch_desc and xskq_produce_flush_desc and they both use
    prod_head and never prod_tail. So just move them over to
    cached_prod.

    The Tx XDP_DRV path uses xskq_produce_addr_lazy and
    xskq_produce_flush_addr_n and unnecessarily operates on both prod_tail
    and prod_head, so move them over to just use cached_prod by skipping
    the intermediate step of updating prod_tail.

    The Tx path in XDP_SKB mode uses xskq_reserve_addr and
    xskq_produce_addr. They currently use both cached pointers, but we can
    operate on the global producer pointer in xskq_produce_addr since it
    has to be updated anyway, thus eliminating the use of both cached
    pointers. We can also remove the xskq_nb_free in xskq_produce_addr
    since it is already called in xskq_reserve_addr. No need to do it
    twice.

    When there is only one cached producer pointer, we can also simplify
    xskq_nb_free by removing one argument.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-4-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • In order to set the correct return flags for poll, the xsk code has to
    check if the Rx queue is empty and if the Tx queue is full. This code
    was unnecessarily large and complex as it used the functions that are
    used to update the local state from the global state (xskq_nb_free and
    xskq_nb_avail). Since we are not doing this nor updating any data
    dependent on this state, we can simplify the functions. Another
    benefit from this is that we can also simplify the xskq_nb_free and
    xskq_nb_avail functions in a later commit.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-3-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     
  • The lazy update threshold was introduced to keep the producer and
    consumer some distance apart in the completion ring. This was
    important in the beginning of the development of AF_XDP as the ring
    format as that point in time was very sensitive to the producer and
    consumer being on the same cache line. This is not the case
    anymore as the current ring format does not degrade in any noticeable
    way when this happens. Moreover, this threshold makes it impossible
    to run the system with rings that have less than 128 entries.

    So let us remove this threshold and just get one entry from the ring
    as in all other functions. This will enable us to remove this function
    in a later commit. Note that xskq_produce_addr_lazy followed by
    xskq_produce_flush_addr_n are still not the same function as
    xskq_produce_addr() as it operates on another cached pointer.

    Signed-off-by: Magnus Karlsson
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/1576759171-28550-2-git-send-email-magnus.karlsson@intel.com

    Magnus Karlsson
     

20 Dec, 2019

1 commit

  • The xskmap flush list is used to track entries that need to flushed
    from via the xdp_do_flush_map() function. This list used to be
    per-map, but there is really no reason for that. Instead make the
    flush list global for all xskmaps, which simplifies __xsk_map_flush()
    and xsk_map_alloc().

    Signed-off-by: Björn Töpel
    Signed-off-by: Alexei Starovoitov
    Acked-by: Toke Høiland-Jørgensen
    Link: https://lore.kernel.org/bpf/20191219061006.21980-5-bjorn.topel@gmail.com

    Björn Töpel
     

19 Dec, 2019

1 commit

  • The XSK wakeup callback in drivers makes some sanity checks before
    triggering NAPI. However, some configuration changes may occur during
    this function that affect the result of those checks. For example, the
    interface can go down, and all the resources will be destroyed after the
    checks in the wakeup function, but before it attempts to use these
    resources. Wrap this callback in rcu_read_lock to allow driver to
    synchronize_rcu before actually destroying the resources.

    xsk_wakeup is a new function that encapsulates calling ndo_xsk_wakeup
    wrapped into the RCU lock. After this commit, xsk_poll starts using
    xsk_wakeup and checks xs->zc instead of ndo_xsk_wakeup != NULL to decide
    ndo_xsk_wakeup should be called. It also fixes a bug introduced with the
    need_wakeup feature: a non-zero-copy socket may be used with a driver
    supporting zero-copy, and in this case ndo_xsk_wakeup should not be
    called, so the xs->zc check is the correct one.

    Fixes: 77cd0d7b3f25 ("xsk: add support for need_wakeup flag in AF_XDP rings")
    Signed-off-by: Maxim Mikityanskiy
    Signed-off-by: Björn Töpel
    Signed-off-by: Daniel Borkmann
    Link: https://lore.kernel.org/bpf/20191217162023.16011-2-maximmi@mellanox.com

    Maxim Mikityanskiy
     

25 Nov, 2019

1 commit

  • xsk_poll() is defined as returning 'unsigned int' but the
    .poll method is declared as returning '__poll_t', a bitwise type.

    Fix this by using the proper return type and using the EPOLL
    constants instead of the POLL ones, as required for __poll_t.

    Signed-off-by: Luc Van Oostenryck
    Signed-off-by: Daniel Borkmann
    Acked-by: Björn Töpel
    Link: https://lore.kernel.org/bpf/20191120001042.30830-1-luc.vanoostenryck@gmail.com

    Luc Van Oostenryck