20 Jan, 2021

2 commits

  • This is the 5.10.8 stable release

    * tag 'v5.10.8': (104 commits)
    Linux 5.10.8
    tools headers UAPI: Sync linux/fscrypt.h with the kernel sources
    drm/panfrost: Remove unused variables in panfrost_job_close()
    ...

    Signed-off-by: Jason Liu

    Jason Liu
     
  • This is the 5.10.7 stable release

    * tag 'v5.10.7': (144 commits)
    Linux 5.10.7
    scsi: target: Fix XCOPY NAA identifier lookup
    rtlwifi: rise completion at the last step of firmware callback
    ...

    Signed-off-by: Jason Liu

    Jason Liu
     

17 Jan, 2021

1 commit

  • commit 54970a2fbb673f090b7f02d7f57b10b2e0707155 upstream.

    syzbot reproduces BUG_ON in skb_checksum_help():
    tun creates (bogus) skb with huge partial-checksummed area and
    small ip packet inside. Then ip_rcv trims the skb based on size
    of internal ip packet, after that csum offset points beyond of
    trimmed skb. Then checksum_tg() called via netfilter hook
    triggers BUG_ON:

    offset = skb_checksum_start_offset(skb);
    BUG_ON(offset >= skb_headlen(skb));

    To work around the problem this patch forces pskb_trim_rcsum_slow()
    to return -EINVAL in described scenario. It allows its callers to
    drop such kind of packets.

    Link: https://syzkaller.appspot.com/bug?id=b419a5ca95062664fe1a60b764621eb4526e2cd0
    Reported-by: syzbot+7010af67ced6105e5ab6@syzkaller.appspotmail.com
    Signed-off-by: Vasily Averin
    Acked-by: Willem de Bruijn
    Link: https://lore.kernel.org/r/1b2494af-2c56-8ee2-7bc0-923fcad1cdf8@virtuozzo.com
    Signed-off-by: Jakub Kicinski
    Signed-off-by: Greg Kroah-Hartman

    Vasily Averin
     

13 Jan, 2021

4 commits

  • [ Upstream commit 4ae2bb81649dc03dfc95875f02126b14b773f7ab ]

    Accesses to dev->xps_rxqs_map (when using dev->num_tc) should be
    protected by the rtnl lock, like we do for netif_set_xps_queue. I didn't
    see an actual bug being triggered, but let's be safe here and take the
    rtnl lock while accessing the map in sysfs.

    Fixes: 8af2c06ff4b1 ("net-sysfs: Add interface for Rx queue(s) map per Tx queue")
    Signed-off-by: Antoine Tenart
    Reviewed-by: Alexander Duyck
    Signed-off-by: Jakub Kicinski
    Signed-off-by: Greg Kroah-Hartman

    Antoine Tenart
     
  • [ Upstream commit 2d57b4f142e0b03e854612b8e28978935414bced ]

    Two race conditions can be triggered when storing xps rxqs, resulting in
    various oops and invalid memory accesses:

    1. Calling netdev_set_num_tc while netif_set_xps_queue:

    - netif_set_xps_queue uses dev->tc_num as one of the parameters to
    compute the size of new_dev_maps when allocating it. dev->tc_num is
    also used to access the map, and the compiler may generate code to
    retrieve this field multiple times in the function.

    - netdev_set_num_tc sets dev->tc_num.

    If new_dev_maps is allocated using dev->tc_num and then dev->tc_num
    is set to a higher value through netdev_set_num_tc, later accesses to
    new_dev_maps in netif_set_xps_queue could lead to accessing memory
    outside of new_dev_maps; triggering an oops.

    2. Calling netif_set_xps_queue while netdev_set_num_tc is running:

    2.1. netdev_set_num_tc starts by resetting the xps queues,
    dev->tc_num isn't updated yet.

    2.2. netif_set_xps_queue is called, setting up the map with the
    *old* dev->num_tc.

    2.3. netdev_set_num_tc updates dev->tc_num.

    2.4. Later accesses to the map lead to out of bound accesses and
    oops.

    A similar issue can be found with netdev_reset_tc.

    One way of triggering this is to set an iface up (for which the driver
    uses netdev_set_num_tc in the open path, such as bnx2x) and writing to
    xps_rxqs in a concurrent thread. With the right timing an oops is
    triggered.

    Both issues have the same fix: netif_set_xps_queue, netdev_set_num_tc
    and netdev_reset_tc should be mutually exclusive. We do that by taking
    the rtnl lock in xps_rxqs_store.

    Fixes: 8af2c06ff4b1 ("net-sysfs: Add interface for Rx queue(s) map per Tx queue")
    Signed-off-by: Antoine Tenart
    Reviewed-by: Alexander Duyck
    Signed-off-by: Jakub Kicinski
    Signed-off-by: Greg Kroah-Hartman

    Antoine Tenart
     
  • [ Upstream commit fb25038586d0064123e393cadf1fadd70a9df97a ]

    Accesses to dev->xps_cpus_map (when using dev->num_tc) should be
    protected by the rtnl lock, like we do for netif_set_xps_queue. I didn't
    see an actual bug being triggered, but let's be safe here and take the
    rtnl lock while accessing the map in sysfs.

    Fixes: 184c449f91fe ("net: Add support for XPS with QoS via traffic classes")
    Signed-off-by: Antoine Tenart
    Reviewed-by: Alexander Duyck
    Signed-off-by: Jakub Kicinski
    Signed-off-by: Greg Kroah-Hartman

    Antoine Tenart
     
  • [ Upstream commit 1ad58225dba3f2f598d2c6daed4323f24547168f ]

    Two race conditions can be triggered when storing xps cpus, resulting in
    various oops and invalid memory accesses:

    1. Calling netdev_set_num_tc while netif_set_xps_queue:

    - netif_set_xps_queue uses dev->tc_num as one of the parameters to
    compute the size of new_dev_maps when allocating it. dev->tc_num is
    also used to access the map, and the compiler may generate code to
    retrieve this field multiple times in the function.

    - netdev_set_num_tc sets dev->tc_num.

    If new_dev_maps is allocated using dev->tc_num and then dev->tc_num
    is set to a higher value through netdev_set_num_tc, later accesses to
    new_dev_maps in netif_set_xps_queue could lead to accessing memory
    outside of new_dev_maps; triggering an oops.

    2. Calling netif_set_xps_queue while netdev_set_num_tc is running:

    2.1. netdev_set_num_tc starts by resetting the xps queues,
    dev->tc_num isn't updated yet.

    2.2. netif_set_xps_queue is called, setting up the map with the
    *old* dev->num_tc.

    2.3. netdev_set_num_tc updates dev->tc_num.

    2.4. Later accesses to the map lead to out of bound accesses and
    oops.

    A similar issue can be found with netdev_reset_tc.

    One way of triggering this is to set an iface up (for which the driver
    uses netdev_set_num_tc in the open path, such as bnx2x) and writing to
    xps_cpus in a concurrent thread. With the right timing an oops is
    triggered.

    Both issues have the same fix: netif_set_xps_queue, netdev_set_num_tc
    and netdev_reset_tc should be mutually exclusive. We do that by taking
    the rtnl lock in xps_cpus_store.

    Fixes: 184c449f91fe ("net: Add support for XPS with QoS via traffic classes")
    Signed-off-by: Antoine Tenart
    Reviewed-by: Alexander Duyck
    Signed-off-by: Jakub Kicinski
    Signed-off-by: Greg Kroah-Hartman

    Antoine Tenart
     

14 Dec, 2020

1 commit


11 Dec, 2020

1 commit

  • Alexei Starovoitov says:

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

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

    We've added 21 non-merge commits during the last 12 day(s) which contain
    a total of 21 files changed, 163 insertions(+), 88 deletions(-).

    The main changes are:

    1) Fix propagation of 32-bit signed bounds from 64-bit bounds, from Alexei.

    2) Fix ring_buffer__poll() return value, from Andrii.

    3) Fix race in lwt_bpf, from Cong.

    4) Fix test_offload, from Toke.

    5) Various xsk fixes.

    Please consider pulling these changes from:

    git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git

    Thanks a lot!

    Also thanks to reporters, reviewers and testers of commits in this pull-request:

    Cong Wang, Hulk Robot, Jakub Kicinski, Jean-Philippe Brucker, John
    Fastabend, Magnus Karlsson, Maxim Mikityanskiy, Yonghong Song
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     

10 Dec, 2020

1 commit

  • The offending commit introduces a cleanup callback that is invoked
    when the driver module is removed to clean up the tunnel device
    flow block. But it returns on the first iteration of the for loop.
    The remaining indirect flow blocks will never be freed.

    Fixes: 1fac52da5942 ("net: flow_offload: consolidate indirect flow_block infrastructure")
    CC: Pablo Neira Ayuso
    Signed-off-by: Chris Mi
    Reviewed-by: Roi Dayan

    Chris Mi
     

09 Dec, 2020

1 commit

  • Since commit 7f0a838254bd ("bpf, xdp: Maintain info on attached XDP BPF
    programs in net_device"), the XDP program attachment info is now maintained
    in the core code. This interacts badly with the xdp_attachment_flags_ok()
    check that prevents unloading an XDP program with different load flags than
    it was loaded with. In practice, two kinds of failures are seen:

    - An XDP program loaded without specifying a mode (and which then ends up
    in driver mode) cannot be unloaded if the program mode is specified on
    unload.

    - The dev_xdp_uninstall() hook always calls the driver callback with the
    mode set to the type of the program but an empty flags argument, which
    means the flags_ok() check prevents the program from being removed,
    leading to bpf prog reference leaks.

    The original reason this check was added was to avoid ambiguity when
    multiple programs were loaded. With the way the checks are done in the core
    now, this is quite simple to enforce in the core code, so let's add a check
    there and get rid of the xdp_attachment_flags_ok() callback entirely.

    Fixes: 7f0a838254bd ("bpf, xdp: Maintain info on attached XDP BPF programs in net_device")
    Signed-off-by: Toke Høiland-Jørgensen
    Signed-off-by: Daniel Borkmann
    Acked-by: Jakub Kicinski
    Link: https://lore.kernel.org/bpf/160752225751.110217.10267659521308669050.stgit@toke.dk

    Toke Høiland-Jørgensen
     

08 Dec, 2020

2 commits

  • migrate_disable() is just a wrapper for preempt_disable() in
    non-RT kernel. It is safe to replace it, and RT kernel will
    benefit.

    Note that it is introduced since Feb 2020.

    Suggested-by: Alexei Starovoitov
    Signed-off-by: Cong Wang
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/20201205075946.497763-2-xiyou.wangcong@gmail.com

    Cong Wang
     
  • The per-cpu bpf_redirect_info is shared among all skb_do_redirect()
    and BPF redirect helpers. Callers on RX path are all in BH context,
    disabling preemption is not sufficient to prevent BH interruption.

    In production, we observed strange packet drops because of the race
    condition between LWT xmit and TC ingress, and we verified this issue
    is fixed after we disable BH.

    Although this bug was technically introduced from the beginning, that
    is commit 3a0af8fd61f9 ("bpf: BPF for lightweight tunnel infrastructure"),
    at that time call_rcu() had to be call_rcu_bh() to match the RCU context.
    So this patch may not work well before RCU flavor consolidation has been
    completed around v5.0.

    Update the comments above the code too, as call_rcu() is now BH friendly.

    Signed-off-by: Dongdong Wang
    Signed-off-by: Alexei Starovoitov
    Reviewed-by: Cong Wang
    Link: https://lore.kernel.org/bpf/20201205075946.497763-1-xiyou.wangcong@gmail.com

    Dongdong Wang
     

04 Dec, 2020

1 commit

  • skb_mpls_dec_ttl() reads the LSE without ensuring that it is contained in
    the skb "linear" area. Fix this calling pskb_may_pull() before reading the
    current ttl.

    Found by code inspection.

    Fixes: 2a2ea50870ba ("net: sched: add mpls manipulation actions to TC")
    Reported-by: Marcelo Ricardo Leitner
    Signed-off-by: Davide Caratti
    Link: https://lore.kernel.org/r/53659f28be8bc336c113b5254dc637cc76bbae91.1606987074.git.dcaratti@redhat.com
    Signed-off-by: Jakub Kicinski

    Davide Caratti
     

01 Dec, 2020

1 commit

  • It turns out that it does exist a path where xdp_return_buff() is
    being passed an XDP buffer of type MEM_TYPE_XSK_BUFF_POOL. This path
    is when AF_XDP zero-copy mode is enabled, and a buffer is redirected
    to a DEVMAP with an attached XDP program that drops the buffer.

    This change simply puts the handling of MEM_TYPE_XSK_BUFF_POOL back
    into xdp_return_buff().

    Fixes: 82c41671ca4f ("xdp: Simplify xdp_return_{frame, frame_rx_napi, buff}")
    Reported-by: Maxim Mikityanskiy
    Signed-off-by: Björn Töpel
    Signed-off-by: Daniel Borkmann
    Acked-by: Maxim Mikityanskiy
    Link: https://lore.kernel.org/bpf/20201127171726.123627-1-bjorn.topel@gmail.com

    Björn Töpel
     

29 Nov, 2020

1 commit

  • Daniel Borkmann says:

    ====================
    pull-request: bpf 2020-11-28

    1) Do not reference the skb for xsk's generic TX side since when looped
    back into RX it might crash in generic XDP, from Björn Töpel.

    2) Fix umem cleanup on a partially set up xsk socket when being destroyed,
    from Magnus Karlsson.

    3) Fix an incorrect netdev reference count when failing xsk_bind() operation,
    from Marek Majtyka.

    4) Fix bpftool to set an error code on failed calloc() in build_btf_type_table(),
    from Zhen Lei.

    * https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf:
    bpf: Add MAINTAINERS entry for BPF LSM
    bpftool: Fix error return value in build_btf_type_table
    net, xsk: Avoid taking multiple skbuff references
    xsk: Fix incorrect netdev reference count
    xsk: Fix umem cleanup bug at socket destruct
    MAINTAINERS: Update XDP and AF_XDP entries
    ====================

    Link: https://lore.kernel.org/r/20201128005104.1205-1-daniel@iogearbox.net
    Signed-off-by: Jakub Kicinski

    Jakub Kicinski
     

28 Nov, 2020

1 commit

  • When setting sk_err, set it to ee_errno, not ee_origin.

    Commit f5f99309fa74 ("sock: do not set sk_err in
    sock_dequeue_err_skb") disabled updating sk_err on errq dequeue,
    which is correct for most error types (origins):

    - sk->sk_err = err;

    Commit 38b257938ac6 ("sock: reset sk_err when the error queue is
    empty") reenabled the behavior for IMCP origins, which do require it:

    + if (icmp_next)
    + sk->sk_err = SKB_EXT_ERR(skb_next)->ee.ee_origin;

    But read from ee_errno.

    Fixes: 38b257938ac6 ("sock: reset sk_err when the error queue is empty")
    Reported-by: Ayush Ranjan
    Signed-off-by: Willem de Bruijn
    Acked-by: Soheil Hassas Yeganeh
    Link: https://lore.kernel.org/r/20201126151220.2819322-1-willemdebruijn.kernel@gmail.com
    Signed-off-by: Jakub Kicinski

    Willem de Bruijn
     

26 Nov, 2020

3 commits

  • When devlink reload operation is not used, netdev of an Ethernet port may
    be present in different net namespace than the net namespace of the
    devlink instance.

    Ensure that both the devlink instance and devlink port netdev are located
    in same net namespace.

    Fixes: 070c63f20f6c ("net: devlink: allow to change namespaces during reload")
    Signed-off-by: Parav Pandit
    Signed-off-by: Jakub Kicinski

    Parav Pandit
     
  • A netdevice of a devlink port can be moved to different net namespace
    than its parent devlink instance.
    This scenario occurs when devlink reload is not used.

    When netdevice is undergoing migration to net namespace, its ifindex
    and name may change.

    In such use case, devlink port query may read stale netdev attributes.

    Fix it by reading them under rtnl lock.

    Fixes: bfcd3a466172 ("Introduce devlink infrastructure")
    Signed-off-by: Parav Pandit
    Signed-off-by: Jakub Kicinski

    Parav Pandit
     
  • After cited commit, gro_cells_destroy() became damn slow
    on hosts with a lot of cores.

    This is because we have one additional synchronize_net() per cpu as
    stated in the changelog.

    gro_cells_init() is setting NAPI_STATE_NO_BUSY_POLL, and this was enough
    to not have one synchronize_net() call per netif_napi_del()

    We can factorize all the synchronize_net() to a single one,
    right before freeing per-cpu memory.

    Fixes: 5198d545dba8 ("net: remove napi_hash_del() from driver-facing API")
    Signed-off-by: Eric Dumazet
    Link: https://lore.kernel.org/r/20201124203822.1360107-1-eric.dumazet@gmail.com
    Signed-off-by: Jakub Kicinski

    Eric Dumazet
     

25 Nov, 2020

2 commits

  • Commit 642e450b6b59 ("xsk: Do not discard packet when NETDEV_TX_BUSY")
    addressed the problem that packets were discarded from the Tx AF_XDP
    ring, when the driver returned NETDEV_TX_BUSY. Part of the fix was
    bumping the skbuff reference count, so that the buffer would not be
    freed by dev_direct_xmit(). A reference count larger than one means
    that the skbuff is "shared", which is not the case.

    If the "shared" skbuff is sent to the generic XDP receive path,
    netif_receive_generic_xdp(), and pskb_expand_head() is entered the
    BUG_ON(skb_shared(skb)) will trigger.

    This patch adds a variant to dev_direct_xmit(), __dev_direct_xmit(),
    where a user can select the skbuff free policy. This allows AF_XDP to
    avoid bumping the reference count, but still keep the NETDEV_TX_BUSY
    behavior.

    Fixes: 642e450b6b59 ("xsk: Do not discard packet when NETDEV_TX_BUSY")
    Reported-by: Yonghong Song
    Signed-off-by: Björn Töpel
    Signed-off-by: Daniel Borkmann
    Link: https://lore.kernel.org/bpf/20201123175600.146255-1-bjorn.topel@gmail.com

    Björn Töpel
     
  • Fix reload stats structure exposed to the user. Change stats structure
    hierarchy to have the reload action as a parent of the stat entry and
    then stat entry includes value per limit. This will also help to avoid
    string concatenation on iproute2 output.

    Reload stats structure before this fix:
    "stats": {
    "reload": {
    "driver_reinit": 2,
    "fw_activate": 1,
    "fw_activate_no_reset": 0
    }
    }

    After this fix:
    "stats": {
    "reload": {
    "driver_reinit": {
    "unspecified": 2
    },
    "fw_activate": {
    "unspecified": 1,
    "no_reset": 0
    }
    }

    Fixes: a254c264267e ("devlink: Add reload stats")
    Signed-off-by: Moshe Shemesh
    Reviewed-by: Jiri Pirko
    Link: https://lore.kernel.org/r/1606109785-25197-1-git-send-email-moshe@mellanox.com
    Signed-off-by: Jakub Kicinski

    Moshe Shemesh
     

20 Nov, 2020

1 commit

  • Alexei Starovoitov says:

    ====================
    1) libbpf should not attempt to load unused subprogs, from Andrii.

    2) Make strncpy_from_user() mask out bytes after NUL terminator, from Daniel.

    3) Relax return code check for subprograms in the BPF verifier, from Dmitrii.

    4) Fix several sockmap issues, from John.

    * https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf:
    fail_function: Remove a redundant mutex unlock
    selftest/bpf: Test bpf_probe_read_user_str() strips trailing bytes after NUL
    lib/strncpy_from_user.c: Mask out bytes after NUL terminator.
    libbpf: Fix VERSIONED_SYM_COUNT number parsing
    bpf, sockmap: Avoid failures from skb_to_sgvec when skb has frag_list
    bpf, sockmap: Handle memory acct if skb_verdict prog redirects to self
    bpf, sockmap: Avoid returning unneeded EAGAIN when redirecting to self
    bpf, sockmap: Use truesize with sk_rmem_schedule()
    bpf, sockmap: Ensure SO_RCVBUF memory is observed on ingress redirect
    bpf, sockmap: Fix partial copy_page_to_iter so progress can still be made
    selftests/bpf: Fix error return code in run_getsockopt_test()
    bpf: Relax return code check for subprograms
    tools, bpftool: Add missing close before bpftool net attach exit
    MAINTAINERS/bpf: Update Andrii's entry.
    selftests/bpf: Fix unused attribute usage in subprogs_unused test
    bpf: Fix unsigned 'datasec_id' compared with zero in check_pseudo_btf_id
    bpf: Fix passing zero to PTR_ERR() in bpf_btf_printf_prepare
    libbpf: Don't attempt to load unused subprog as an entry-point BPF program
    ====================

    Link: https://lore.kernel.org/r/20201119200721.288-1-alexei.starovoitov@gmail.com
    Signed-off-by: Jakub Kicinski

    Jakub Kicinski
     

19 Nov, 2020

1 commit

  • DSA network devices rely on having their DSA management interface up and
    running otherwise their ndo_open() will return -ENETDOWN. Without doing
    this it would not be possible to use DSA devices as netconsole when
    configured on the command line. These devices also do not utilize the
    upper/lower linking so the check about the netpoll device having upper
    is not going to be a problem.

    The solution adopted here is identical to the one done for
    net/ipv4/ipconfig.c with 728c02089a0e ("net: ipv4: handle DSA enabled
    master network devices"), with the network namespace scope being
    restricted to that of the process configuring netpoll.

    Fixes: 04ff53f96a93 ("net: dsa: Add netconsole support")
    Tested-by: Vladimir Oltean
    Signed-off-by: Florian Fainelli
    Link: https://lore.kernel.org/r/20201117035236.22658-1-f.fainelli@gmail.com
    Signed-off-by: Jakub Kicinski

    Florian Fainelli
     

18 Nov, 2020

5 commits

  • When skb has a frag_list its possible for skb_to_sgvec() to fail. This
    happens when the scatterlist has fewer elements to store pages than would
    be needed for the initial skb plus any of its frags.

    This case appears rare, but is possible when running an RX parser/verdict
    programs exposed to the internet. Currently, when this happens we throw
    an error, break the pipe, and kfree the msg. This effectively breaks the
    application or forces it to do a retry.

    Lets catch this case and handle it by doing an skb_linearize() on any
    skb we receive with frags. At this point skb_to_sgvec should not fail
    because the failing conditions would require frags to be in place.

    Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface")
    Signed-off-by: John Fastabend
    Signed-off-by: Daniel Borkmann
    Reviewed-by: Jakub Sitnicki
    Link: https://lore.kernel.org/bpf/160556576837.73229.14800682790808797635.stgit@john-XPS-13-9370

    John Fastabend
     
  • If the skb_verdict_prog redirects an skb knowingly to itself, fix your
    BPF program this is not optimal and an abuse of the API please use
    SK_PASS. That said there may be cases, such as socket load balancing,
    where picking the socket is hashed based or otherwise picks the same
    socket it was received on in some rare cases. If this happens we don't
    want to confuse userspace giving them an EAGAIN error if we can avoid
    it.

    To avoid double accounting in these cases. At the moment even if the
    skb has already been charged against the sockets rcvbuf and forward
    alloc we check it again and do set_owner_r() causing it to be orphaned
    and recharged. For one this is useless work, but more importantly we
    can have a case where the skb could be put on the ingress queue, but
    because we are under memory pressure we return EAGAIN. The trouble
    here is the skb has already been accounted for so any rcvbuf checks
    include the memory associated with the packet already. This rolls
    up and can result in unnecessary EAGAIN errors in userspace read()
    calls.

    Fix by doing an unlikely check and skipping checks if skb->sk == sk.

    Fixes: 51199405f9672 ("bpf: skb_verdict, support SK_PASS on RX BPF path")
    Signed-off-by: John Fastabend
    Signed-off-by: Daniel Borkmann
    Reviewed-by: Jakub Sitnicki
    Link: https://lore.kernel.org/bpf/160556574804.73229.11328201020039674147.stgit@john-XPS-13-9370

    John Fastabend
     
  • If a socket redirects to itself and it is under memory pressure it is
    possible to get a socket stuck so that recv() returns EAGAIN and the
    socket can not advance for some time. This happens because when
    redirecting a skb to the same socket we received the skb on we first
    check if it is OK to enqueue the skb on the receiving socket by checking
    memory limits. But, if the skb is itself the object holding the memory
    needed to enqueue the skb we will keep retrying from kernel side
    and always fail with EAGAIN. Then userspace will get a recv() EAGAIN
    error if there are no skbs in the psock ingress queue. This will continue
    until either some skbs get kfree'd causing the memory pressure to
    reduce far enough that we can enqueue the pending packet or the
    socket is destroyed. In some cases its possible to get a socket
    stuck for a noticeable amount of time if the socket is only receiving
    skbs from sk_skb verdict programs. To reproduce I make the socket
    memory limits ridiculously low so sockets are always under memory
    pressure. More often though if under memory pressure it looks like
    a spurious EAGAIN error on user space side causing userspace to retry
    and typically enough has moved on the memory side that it works.

    To fix skip memory checks and skb_orphan if receiving on the same
    sock as already assigned.

    For SK_PASS cases this is easy, its always the same socket so we
    can just omit the orphan/set_owner pair.

    For backlog cases we need to check skb->sk and decide if the orphan
    and set_owner pair are needed.

    Fixes: 51199405f9672 ("bpf: skb_verdict, support SK_PASS on RX BPF path")
    Signed-off-by: John Fastabend
    Signed-off-by: Daniel Borkmann
    Reviewed-by: Jakub Sitnicki
    Link: https://lore.kernel.org/bpf/160556572660.73229.12566203819812939627.stgit@john-XPS-13-9370

    John Fastabend
     
  • We use skb->size with sk_rmem_scheduled() which is not correct. Instead
    use truesize to align with socket and tcp stack usage of sk_rmem_schedule.

    Suggested-by: Daniel Borkman
    Signed-off-by: John Fastabend
    Signed-off-by: Daniel Borkmann
    Reviewed-by: Jakub Sitnicki
    Link: https://lore.kernel.org/bpf/160556570616.73229.17003722112077507863.stgit@john-XPS-13-9370

    John Fastabend
     
  • Fix sockmap sk_skb programs so that they observe sk_rcvbuf limits. This
    allows users to tune SO_RCVBUF and sockmap will honor them.

    We can refactor the if(charge) case out in later patches. But, keep this
    fix to the point.

    Fixes: 51199405f9672 ("bpf: skb_verdict, support SK_PASS on RX BPF path")
    Suggested-by: Jakub Sitnicki
    Signed-off-by: John Fastabend
    Signed-off-by: Daniel Borkmann
    Reviewed-by: Jakub Sitnicki
    Link: https://lore.kernel.org/bpf/160556568657.73229.8404601585878439060.stgit@john-XPS-13-9370

    John Fastabend
     

15 Nov, 2020

1 commit

  • If sb_occ_port_pool_get() failed in devlink_nl_sb_port_pool_fill(),
    msg should be canceled by genlmsg_cancel().

    Fixes: df38dafd2559 ("devlink: implement shared buffer occupancy monitoring interface")
    Reported-by: Hulk Robot
    Signed-off-by: Wang Hai
    Link: https://lore.kernel.org/r/20201113111622.11040-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski

    Wang Hai
     

14 Nov, 2020

1 commit

  • Commit 58956317c8de ("neighbor: Improve garbage collection")
    guarantees neighbour table entries a five-second lifetime. Processes
    which make heavy use of multicast can fill the neighour table with
    multicast addresses in five seconds. At that point, neighbour entries
    can't be GC-ed because they aren't five seconds old yet, the kernel
    log starts to fill up with "neighbor table overflow!" messages, and
    sends start to fail.

    This patch allows multicast addresses to be thrown out before they've
    lived out their five seconds. This makes room for non-multicast
    addresses and makes messages to all addresses more reliable in these
    circumstances.

    Fixes: 58956317c8de ("neighbor: Improve garbage collection")
    Signed-off-by: Jeff Dike
    Reviewed-by: David Ahern
    Link: https://lore.kernel.org/r/20201113015815.31397-1-jdike@akamai.com
    Signed-off-by: Jakub Kicinski

    Jeff Dike
     

13 Nov, 2020

1 commit

  • Cited commit in fixes tag overwrites the port attributes for the
    registered port.

    Avoid such error by checking registered flag before setting attributes.

    Fixes: 71ad8d55f8e5 ("devlink: Replace devlink_port_attrs_set parameters with a struct")
    Signed-off-by: Parav Pandit
    Reviewed-by: Jiri Pirko
    Link: https://lore.kernel.org/r/20201111034744.35554-1-parav@nvidia.com
    Signed-off-by: Jakub Kicinski

    Parav Pandit
     

30 Oct, 2020

1 commit

  • Pull networking fixes from Jakub Kicinski:
    "Current release regressions:

    - r8169: fix forced threading conflicting with other shared
    interrupts; we tried to fix the use of raise_softirq_irqoff from an
    IRQ handler on RT by forcing hard irqs, but this driver shares
    legacy PCI IRQs so drop the _irqoff() instead

    - tipc: fix memory leak caused by a recent syzbot report fix to
    tipc_buf_append()

    Current release - bugs in new features:

    - devlink: Unlock on error in dumpit() and fix some error codes

    - net/smc: fix null pointer dereference in smc_listen_decline()

    Previous release - regressions:

    - tcp: Prevent low rmem stalls with SO_RCVLOWAT.

    - net: protect tcf_block_unbind with block lock

    - ibmveth: Fix use of ibmveth in a bridge; the self-imposed filtering
    to only send legal frames to the hypervisor was too strict

    - net: hns3: Clear the CMDQ registers before unmapping BAR region;
    incorrect cleanup order was leading to a crash

    - bnxt_en - handful of fixes to fixes:
    - Send HWRM_FUNC_RESET fw command unconditionally, even if there
    are PCIe errors being reported
    - Check abort error state in bnxt_open_nic().
    - Invoke cancel_delayed_work_sync() for PFs also.
    - Fix regression in workqueue cleanup logic in bnxt_remove_one().

    - mlxsw: Only advertise link modes supported by both driver and
    device, after removal of 56G support from the driver 56G was not
    cleared from advertised modes

    - net/smc: fix suppressed return code

    Previous release - always broken:

    - netem: fix zero division in tabledist, caused by integer overflow

    - bnxt_en: Re-write PCI BARs after PCI fatal error.

    - cxgb4: set up filter action after rewrites

    - net: ipa: command payloads already mapped

    Misc:

    - s390/ism: fix incorrect system EID, it's okay to change since it
    was added in current release

    - vsock: use ns_capable_noaudit() on socket create to suppress false
    positive audit messages"

    * tag 'net-5.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (36 commits)
    r8169: fix issue with forced threading in combination with shared interrupts
    netem: fix zero division in tabledist
    ibmvnic: fix ibmvnic_set_mac
    mptcp: add missing memory scheduling in the rx path
    tipc: fix memory leak caused by tipc_buf_append()
    gtp: fix an use-before-init in gtp_newlink()
    net: protect tcf_block_unbind with block lock
    ibmveth: Fix use of ibmveth in a bridge.
    net/sched: act_mpls: Add softdep on mpls_gso.ko
    ravb: Fix bit fields checking in ravb_hwtstamp_get()
    devlink: Unlock on error in dumpit()
    devlink: Fix some error codes
    chelsio/chtls: fix memory leaks in CPL handlers
    chelsio/chtls: fix deadlock issue
    net: hns3: Clear the CMDQ registers before unmapping BAR region
    bnxt_en: Send HWRM_FUNC_RESET fw command unconditionally.
    bnxt_en: Check abort error state in bnxt_open_nic().
    bnxt_en: Re-write PCI BARs after PCI fatal error.
    bnxt_en: Invoke cancel_delayed_work_sync() for PFs also.
    bnxt_en: Fix regression in workqueue cleanup logic in bnxt_remove_one().
    ...

    Linus Torvalds
     

28 Oct, 2020

2 commits

  • This needs to unlock before returning.

    Fixes: 544e7c33ec2f ("net: devlink: Add support for port regions")
    Signed-off-by: Dan Carpenter
    Link: https://lore.kernel.org/r/20201026080127.GB1628785@mwanda
    Signed-off-by: Jakub Kicinski

    Dan Carpenter
     
  • These paths don't set the error codes. It's especially important in
    devlink_nl_region_notify_build() where it leads to a NULL dereference in
    the caller.

    Fixes: 544e7c33ec2f ("net: devlink: Add support for port regions")
    Signed-off-by: Dan Carpenter
    Link: https://lore.kernel.org/r/20201026080059.GA1628785@mwanda
    Signed-off-by: Jakub Kicinski

    Dan Carpenter
     

25 Oct, 2020

1 commit

  • With the removal of the interrupt perturbations in previous random32
    change (random32: make prandom_u32() output unpredictable), the PRNG
    has become 100% deterministic again. While SipHash is expected to be
    way more robust against brute force than the previous Tausworthe LFSR,
    there's still the risk that whoever has even one temporary access to
    the PRNG's internal state is able to predict all subsequent draws till
    the next reseed (roughly every minute). This may happen through a side
    channel attack or any data leak.

    This patch restores the spirit of commit f227e3ec3b5c ("random32: update
    the net random state on interrupt and activity") in that it will perturb
    the internal PRNG's statee using externally collected noise, except that
    it will not pick that noise from the random pool's bits nor upon
    interrupt, but will rather combine a few elements along the Tx path
    that are collectively hard to predict, such as dev, skb and txq
    pointers, packet length and jiffies values. These ones are combined
    using a single round of SipHash into a single long variable that is
    mixed with the net_rand_state upon each invocation.

    The operation was inlined because it produces very small and efficient
    code, typically 3 xor, 2 add and 2 rol. The performance was measured
    to be the same (even very slightly better) than before the switch to
    SipHash; on a 6-core 12-thread Core i7-8700k equipped with a 40G NIC
    (i40e), the connection rate dropped from 556k/s to 555k/s while the
    SYN cookie rate grew from 5.38 Mpps to 5.45 Mpps.

    Link: https://lore.kernel.org/netdev/20200808152628.GA27941@SDF.ORG/
    Cc: George Spelvin
    Cc: Amit Klein
    Cc: Eric Dumazet
    Cc: "Jason A. Donenfeld"
    Cc: Andy Lutomirski
    Cc: Kees Cook
    Cc: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: Linus Torvalds
    Cc: tytso@mit.edu
    Cc: Florian Westphal
    Cc: Marc Plumb
    Tested-by: Sedat Dilek
    Signed-off-by: Willy Tarreau

    Willy Tarreau
     

23 Oct, 2020

2 commits

  • In setsockopt(SO_MAX_PACING_RATE) on 64bit systems, sk_max_pacing_rate,
    after extended from 'u32' to 'unsigned long', takes unintentionally
    hiked value whenever assigned from an 'int' value with MSB=1, due to
    binary sign extension in promoting s32 to u64, e.g. 0x80000000 becomes
    0xFFFFFFFF80000000.

    Thus inflated sk_max_pacing_rate causes subsequent getsockopt to return
    ~0U unexpectedly. It may also result in increased pacing rate.

    Fix by explicitly casting the 'int' value to 'unsigned int' before
    assigning it to sk_max_pacing_rate, for zero extension to happen.

    Fixes: 76a9ebe811fb ("net: extend sk_pacing_rate to unsigned long")
    Signed-off-by: Ji Li
    Signed-off-by: Ke Li
    Reviewed-by: Eric Dumazet
    Link: https://lore.kernel.org/r/20201022064146.79873-1-keli@akamai.com
    Signed-off-by: Jakub Kicinski

    Ke Li
     
  • Daniel Borkmann says:

    ====================
    pull-request: bpf 2020-10-22

    1) Fix enforcing NULL check in verifier for new helper return types of
    RET_PTR_TO_{BTF_ID,MEM_OR_BTF_ID}_OR_NULL, from Martin KaFai Lau.

    2) Fix bpf_redirect_neigh() helper API before it becomes frozen by adding
    nexthop information as argument, from Toke Høiland-Jørgensen.

    3) Guard & fix compilation of bpf_tail_call_static() when __bpf__ arch is
    not defined by compiler or clang too old, from Daniel Borkmann.

    4) Remove misplaced break after return in attach_type_to_prog_type(), from
    Tom Rix.
    ====================

    Signed-off-by: Jakub Kicinski

    Jakub Kicinski
     

22 Oct, 2020

2 commits

  • "ip addr show" command execute error when we have a physical
    network card with a large number of VFs

    The return value of if_nlmsg_size() in rtnl_calcit() will exceed
    range of u16 data type when any network cards has a larger number of
    VFs. rtnl_vfinfo_size() will significant increase needed dump size when
    the value of num_vfs is larger.

    Eventually we get a wrong value of min_ifinfo_dump_size because of overflow
    which decides the memory size needed by netlink dump and netlink_dump()
    will return -EMSGSIZE because of not enough memory was allocated.

    So fix it by promoting min_dump_alloc data type to u32 to
    avoid whole netlink message size overflow and it's also align
    with the data type of struct netlink_callback{}.min_dump_alloc
    which is assigned by return value of rtnl_calcit()

    Signed-off-by: Di Zhu
    Link: https://lore.kernel.org/r/20201021020053.1401-1-zhudi21@huawei.com
    Signed-off-by: Jakub Kicinski

    Di Zhu
     
  • Based on the discussion in [0], update the bpf_redirect_neigh() helper to
    accept an optional parameter specifying the nexthop information. This makes
    it possible to combine bpf_fib_lookup() and bpf_redirect_neigh() without
    incurring a duplicate FIB lookup - since the FIB lookup helper will return
    the nexthop information even if no neighbour is present, this can simply
    be passed on to bpf_redirect_neigh() if bpf_fib_lookup() returns
    BPF_FIB_LKUP_RET_NO_NEIGH. Thus fix & extend it before helper API is frozen.

    [0] https://lore.kernel.org/bpf/393e17fc-d187-3a8d-2f0d-a627c7c63fca@iogearbox.net/

    Signed-off-by: Toke Høiland-Jørgensen
    Signed-off-by: Daniel Borkmann
    Reviewed-by: David Ahern
    Link: https://lore.kernel.org/bpf/160322915615.32199.1187570224032024535.stgit@toke.dk

    Toke Høiland-Jørgensen