1. 25 Apr, 2023 3 commits
    • Kuniyuki Iwashima's avatar
      tcp/udp: Fix memleaks of sk and zerocopy skbs with TX timestamp. · 50749f2d
      Kuniyuki Iwashima authored
      syzkaller reported [0] memory leaks of an UDP socket and ZEROCOPY
      skbs.  We can reproduce the problem with these sequences:
      
        sk = socket(AF_INET, SOCK_DGRAM, 0)
        sk.setsockopt(SOL_SOCKET, SO_TIMESTAMPING, SOF_TIMESTAMPING_TX_SOFTWARE)
        sk.setsockopt(SOL_SOCKET, SO_ZEROCOPY, 1)
        sk.sendto(b'', MSG_ZEROCOPY, ('127.0.0.1', 53))
        sk.close()
      
      sendmsg() calls msg_zerocopy_alloc(), which allocates a skb, sets
      skb->cb->ubuf.refcnt to 1, and calls sock_hold().  Here, struct
      ubuf_info_msgzc indirectly holds a refcnt of the socket.  When the
      skb is sent, __skb_tstamp_tx() clones it and puts the clone into
      the socket's error queue with the TX timestamp.
      
      When the original skb is received locally, skb_copy_ubufs() calls
      skb_unclone(), and pskb_expand_head() increments skb->cb->ubuf.refcnt.
      This additional count is decremented while freeing the skb, but struct
      ubuf_info_msgzc still has a refcnt, so __msg_zerocopy_callback() is
      not called.
      
      The last refcnt is not released unless we retrieve the TX timestamped
      skb by recvmsg().  Since we clear the error queue in inet_sock_destruct()
      after the socket's refcnt reaches 0, there is a circular dependency.
      If we close() the socket holding such skbs, we never call sock_put()
      and leak the count, sk, and skb.
      
      TCP has the same problem, and commit e0c8bccd ("net: stream:
      purge sk_error_queue in sk_stream_kill_queues()") tried to fix it
      by calling skb_queue_purge() during close().  However, there is a
      small chance that skb queued in a qdisc or device could be put
      into the error queue after the skb_queue_purge() call.
      
      In __skb_tstamp_tx(), the cloned skb should not have a reference
      to the ubuf to remove the circular dependency, but skb_clone() does
      not call skb_copy_ubufs() for zerocopy skb.  So, we need to call
      skb_orphan_frags_rx() for the cloned skb to call skb_copy_ubufs().
      
      [0]:
      BUG: memory leak
      unreferenced object 0xffff88800c6d2d00 (size 1152):
        comm "syz-executor392", pid 264, jiffies 4294785440 (age 13.044s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 cd af e8 81 00 00 00 00  ................
          02 00 07 40 00 00 00 00 00 00 00 00 00 00 00 00  ...@............
        backtrace:
          [<0000000055636812>] sk_prot_alloc+0x64/0x2a0 net/core/sock.c:2024
          [<0000000054d77b7a>] sk_alloc+0x3b/0x800 net/core/sock.c:2083
          [<0000000066f3c7e0>] inet_create net/ipv4/af_inet.c:319 [inline]
          [<0000000066f3c7e0>] inet_create+0x31e/0xe40 net/ipv4/af_inet.c:245
          [<000000009b83af97>] __sock_create+0x2ab/0x550 net/socket.c:1515
          [<00000000b9b11231>] sock_create net/socket.c:1566 [inline]
          [<00000000b9b11231>] __sys_socket_create net/socket.c:1603 [inline]
          [<00000000b9b11231>] __sys_socket_create net/socket.c:1588 [inline]
          [<00000000b9b11231>] __sys_socket+0x138/0x250 net/socket.c:1636
          [<000000004fb45142>] __do_sys_socket net/socket.c:1649 [inline]
          [<000000004fb45142>] __se_sys_socket net/socket.c:1647 [inline]
          [<000000004fb45142>] __x64_sys_socket+0x73/0xb0 net/socket.c:1647
          [<0000000066999e0e>] do_syscall_x64 arch/x86/entry/common.c:50 [inline]
          [<0000000066999e0e>] do_syscall_64+0x38/0x90 arch/x86/entry/common.c:80
          [<0000000017f238c1>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
      
      BUG: memory leak
      unreferenced object 0xffff888017633a00 (size 240):
        comm "syz-executor392", pid 264, jiffies 4294785440 (age 13.044s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
          00 00 00 00 00 00 00 00 00 2d 6d 0c 80 88 ff ff  .........-m.....
        backtrace:
          [<000000002b1c4368>] __alloc_skb+0x229/0x320 net/core/skbuff.c:497
          [<00000000143579a6>] alloc_skb include/linux/skbuff.h:1265 [inline]
          [<00000000143579a6>] sock_omalloc+0xaa/0x190 net/core/sock.c:2596
          [<00000000be626478>] msg_zerocopy_alloc net/core/skbuff.c:1294 [inline]
          [<00000000be626478>] msg_zerocopy_realloc+0x1ce/0x7f0 net/core/skbuff.c:1370
          [<00000000cbfc9870>] __ip_append_data+0x2adf/0x3b30 net/ipv4/ip_output.c:1037
          [<0000000089869146>] ip_make_skb+0x26c/0x2e0 net/ipv4/ip_output.c:1652
          [<00000000098015c2>] udp_sendmsg+0x1bac/0x2390 net/ipv4/udp.c:1253
          [<0000000045e0e95e>] inet_sendmsg+0x10a/0x150 net/ipv4/af_inet.c:819
          [<000000008d31bfde>] sock_sendmsg_nosec net/socket.c:714 [inline]
          [<000000008d31bfde>] sock_sendmsg+0x141/0x190 net/socket.c:734
          [<0000000021e21aa4>] __sys_sendto+0x243/0x360 net/socket.c:2117
          [<00000000ac0af00c>] __do_sys_sendto net/socket.c:2129 [inline]
          [<00000000ac0af00c>] __se_sys_sendto net/socket.c:2125 [inline]
          [<00000000ac0af00c>] __x64_sys_sendto+0xe1/0x1c0 net/socket.c:2125
          [<0000000066999e0e>] do_syscall_x64 arch/x86/entry/common.c:50 [inline]
          [<0000000066999e0e>] do_syscall_64+0x38/0x90 arch/x86/entry/common.c:80
          [<0000000017f238c1>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
      
      Fixes: f214f915 ("tcp: enable MSG_ZEROCOPY")
      Fixes: b5947e5d ("udp: msg_zerocopy")
      Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
      Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      50749f2d
    • Gencen Gan's avatar
      net: amd: Fix link leak when verifying config failed · d325c34d
      Gencen Gan authored
      After failing to verify configuration, it returns directly without
      releasing link, which may cause memory leak.
      
      Paolo Abeni thinks that the whole code of this driver is quite
      "suboptimal" and looks unmainatained since at least ~15y, so he
      suggests that we could simply remove the whole driver, please
      take it into consideration.
      
      Simon Horman suggests that the fix label should be set to
      "Linux-2.6.12-rc2" considering that the problem has existed
      since the driver was introduced and the commit above doesn't
      seem to exist in net/net-next.
      
      Fixes: 1da177e4 ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarGan Gecen <gangecen@hust.edu.cn>
      Reviewed-by: default avatarDongliang Mu <dzm91@hust.edu.cn>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d325c34d
    • Kuniyuki Iwashima's avatar
      netlink: Use copy_to_user() for optval in netlink_getsockopt(). · d913d32c
      Kuniyuki Iwashima authored
      Brad Spencer provided a detailed report [0] that when calling getsockopt()
      for AF_NETLINK, some SOL_NETLINK options set only 1 byte even though such
      options require at least sizeof(int) as length.
      
      The options return a flag value that fits into 1 byte, but such behaviour
      confuses users who do not initialise the variable before calling
      getsockopt() and do not strictly check the returned value as char.
      
      Currently, netlink_getsockopt() uses put_user() to copy data to optlen and
      optval, but put_user() casts the data based on the pointer, char *optval.
      As a result, only 1 byte is set to optval.
      
      To avoid this behaviour, we need to use copy_to_user() or cast optval for
      put_user().
      
      Note that this changes the behaviour on big-endian systems, but we document
      that the size of optval is int in the man page.
      
        $ man 7 netlink
        ...
        Socket options
             To set or get a netlink socket option, call getsockopt(2) to read
             or setsockopt(2) to write the option with the option level argument
             set to SOL_NETLINK.  Unless otherwise noted, optval is a pointer to
             an int.
      
      Fixes: 9a4595bc ("[NETLINK]: Add set/getsockopt options to support more than 32 groups")
      Fixes: be0c22a4 ("netlink: add NETLINK_BROADCAST_ERROR socket option")
      Fixes: 38938bfe ("netlink: add NETLINK_NO_ENOBUFS socket flag")
      Fixes: 0a6a3a23 ("netlink: add NETLINK_CAP_ACK socket option")
      Fixes: 2d4bc933 ("netlink: extended ACK reporting")
      Fixes: 89d35528 ("netlink: Add new socket option to enable strict checking on dumps")
      Reported-by: default avatarBrad Spencer <bspencer@blackberry.com>
      Link: https://lore.kernel.org/netdev/ZD7VkNWFfp22kTDt@datsun.rim.net/Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
      Reviewed-by: default avatarJohannes Berg <johannes@sipsolutions.net>
      Link: https://lore.kernel.org/r/20230421185255.94606-1-kuniyu@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      d913d32c
  2. 24 Apr, 2023 1 commit
  3. 23 Apr, 2023 7 commits
  4. 22 Apr, 2023 11 commits
  5. 21 Apr, 2023 12 commits
    • Jakub Kicinski's avatar
      Merge tag 'nf-23-04-21' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf · f9bcdcec
      Jakub Kicinski authored
      Pablo Neira Ayuso says:
      
      ====================
      Netfilter fixes for net
      
      1) Set on IPS_CONFIRMED before change_status() otherwise EBUSY is
         bogusly hit. This bug was introduced in the 6.3 release cycle.
      
      2) Fix nfnetlink_queue conntrack support: Set/dump timeout
         accordingly for unconfirmed conntrack entries. Make sure this
         is done after IPS_CONFIRMED is set on. This is an old bug, it
         happens since the introduction of this feature.
      
      * tag 'nf-23-04-21' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf:
        netfilter: conntrack: fix wrong ct->timeout value
        netfilter: conntrack: restore IPS_CONFIRMED out of nf_conntrack_hash_check_insert()
      ====================
      
      Link: https://lore.kernel.org/r/20230421105700.325438-1-pablo@netfilter.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      f9bcdcec
    • Jeroen de Borst's avatar
      e375b503
    • Vlad Buslov's avatar
      Revert "net/mlx5e: Don't use termination table when redundant" · 081abcac
      Vlad Buslov authored
      This reverts commit 14624d72.
      
      The termination table usage is requires for DMFS steering mode as firmware
      doesn't support mixed table destinations list which causes following
      syndrome with hairpin rules:
      
      [81922.283225] mlx5_core 0000:08:00.0: mlx5_cmd_out_err:803:(pid 25977): SET_FLOW_TABLE_ENTRY(0x936) op_mod(0x0) failed, status bad parameter(0x3), syndrome (0xaca205), err(-22)
      
      Fixes: 14624d72 ("net/mlx5e: Don't use termination table when redundant")
      Signed-off-by: default avatarVlad Buslov <vladbu@nvidia.com>
      Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
      Reviewed-by: default avatarMaor Dickman <maord@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      081abcac
    • Aya Levin's avatar
      net/mlx5e: Nullify table pointer when failing to create · 1b540dec
      Aya Levin authored
      On failing to create promisc flow steering table, the pointer is
      returned with an error. Nullify it so unloading the driver won't try to
      destroy a non existing table.
      
      Failing to create promisc table may happen over BF devices when the ARM
      side is going through a firmware tear down. The host side start a
      reload flow. While the driver unloads, it tries to remove the promisc
      table. Remove WARN in this state as it is a valid error flow.
      
      Fixes: 1c46d740 ("net/mlx5e: Optimize promiscuous mode")
      Signed-off-by: default avatarAya Levin <ayal@nvidia.com>
      Reviewed-by: default avatarTariq Toukan <tariqt@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      1b540dec
    • Moshe Shemesh's avatar
      net/mlx5: Use recovery timeout on sync reset flow · dfad9975
      Moshe Shemesh authored
      Use the same timeout for sync reset flow and health recovery flow, since
      the former involves driver's recovery from firmware reset, which is
      similar to health recovery. Otherwise, in some cases, such as a firmware
      upgrade on the DPU, the firmware pre-init bit may not be ready within
      current timeout and the driver will abort loading back after reset.
      Signed-off-by: default avatarMoshe Shemesh <moshe@nvidia.com>
      Fixes: 37ca95e6 ("net/mlx5: Increase FW pre-init timeout for health recovery")
      Reviewed-by: default avatarMaher Sanalla <msanalla@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      dfad9975
    • Moshe Shemesh's avatar
      Revert "net/mlx5: Remove "recovery" arg from mlx5_load_one() function" · 21608a2c
      Moshe Shemesh authored
      This reverts commit 5977ac39.
      
      Revert this patch as we need the "recovery" arg back in mlx5_load_one()
      function. This arg will be used in the next patch for using recovery
      timeout during sync reset flow.
      Signed-off-by: default avatarMoshe Shemesh <moshe@nvidia.com>
      Reviewed-by: default avatarMaher Sanalla <msanalla@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      21608a2c
    • Roi Dayan's avatar
      net/mlx5e: Fix error flow in representor failing to add vport rx rule · 0a6b069c
      Roi Dayan authored
      On representor init rx error flow the flow steering pointer is being
      released so mlx5e_attach_netdev() doesn't have a valid fs pointer
      in its error flow. Make sure the pointer is nullified when released
      and add a check in mlx5e_fs_cleanup() to verify fs is not null
      as representor cleanup callback would be called anyway.
      
      Fixes: af8bbf73 ("net/mlx5e: Convert mlx5e_flow_steering member of mlx5e_priv to pointer")
      Signed-off-by: default avatarRoi Dayan <roid@nvidia.com>
      Reviewed-by: default avatarMaor Dickman <maord@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      0a6b069c
    • Chris Mi's avatar
      net/mlx5: Release tunnel device after tc update skb · 4fbef0f8
      Chris Mi authored
      The cited commit causes a regression. Tunnel device is not released
      after tc update skb if skb needs to be freed. The following error
      message will be printed:
      
        unregister_netdevice: waiting for vxlan1 to become free. Usage count = 11
      
      Fix it by releasing tunnel device if skb needs to be freed.
      
      Fixes: 93a1ab2c ("net/mlx5: Refactor tc miss handling to a single function")
      Signed-off-by: default avatarChris Mi <cmi@nvidia.com>
      Reviewed-by: default avatarMaor Dickman <maord@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      4fbef0f8
    • Chris Mi's avatar
      net/mlx5: E-switch, Don't destroy indirect table in split rule · 4c818930
      Chris Mi authored
      Source port rewrite (forward to ovs internal port or statck device) isn't
      supported in the rule of split action. So there is no indirect table in
      split rule. The cited commit destroyes indirect table in split rule. The
      indirect table for other rules will be destroyed wrongly. It will cause
      traffic loss.
      
      Fix it by removing the destroy function in split rule. And also remove
      the destroy function in error flow.
      
      Fixes: 10742efc ("net/mlx5e: VF tunnel TX traffic offloading")
      Signed-off-by: default avatarChris Mi <cmi@nvidia.com>
      Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
      Reviewed-by: default avatarMaor Dickman <maord@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      4c818930
    • Chris Mi's avatar
      net/mlx5: E-switch, Create per vport table based on devlink encap mode · fd745f4c
      Chris Mi authored
      Currently when creating per vport table, create flags are hardcoded.
      Devlink encap mode is set based on user input and HW capability.
      Create per vport table based on devlink encap mode.
      
      Fixes: c796bb7c ("net/mlx5: E-switch, Generalize per vport table API")
      Signed-off-by: default avatarChris Mi <cmi@nvidia.com>
      Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
      Reviewed-by: default avatarMaor Dickman <maord@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      fd745f4c
    • Vlad Buslov's avatar
      net/mlx5e: Release the label when replacing existing ct entry · 8ac04a28
      Vlad Buslov authored
      Cited commit doesn't release the label mapping when replacing existing ct
      entry which leads to following memleak report:
      
      unreferenced object 0xffff8881854cf280 (size 96):
        comm "kworker/u48:74", pid 23093, jiffies 4296664564 (age 175.944s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        backtrace:
          [<000000002722d368>] __kmalloc+0x4b/0x1c0
          [<00000000cc44e18f>] mapping_add+0x6e8/0xc90 [mlx5_core]
          [<000000003ad942a7>] mlx5_get_label_mapping+0x66/0xe0 [mlx5_core]
          [<00000000266308ac>] mlx5_tc_ct_entry_create_mod_hdr+0x1c4/0xf50 [mlx5_core]
          [<000000009a768b4f>] mlx5_tc_ct_entry_add_rule+0x16f/0xaf0 [mlx5_core]
          [<00000000a178f3e5>] mlx5_tc_ct_block_flow_offload_add+0x10cb/0x1f90 [mlx5_core]
          [<000000007b46c496>] mlx5_tc_ct_block_flow_offload+0x14a/0x630 [mlx5_core]
          [<00000000a9a18ac5>] nf_flow_offload_tuple+0x1a3/0x390 [nf_flow_table]
          [<00000000d0881951>] flow_offload_work_handler+0x257/0xd30 [nf_flow_table]
          [<000000009e4935a4>] process_one_work+0x7c2/0x13e0
          [<00000000f5cd36a7>] worker_thread+0x59d/0xec0
          [<00000000baed1daf>] kthread+0x28f/0x330
          [<0000000063d282a4>] ret_from_fork+0x1f/0x30
      
      Fix the issue by correctly releasing the label mapping.
      
      Fixes: 94ceffb4 ("net/mlx5e: Implement CT entry update")
      Signed-off-by: default avatarVlad Buslov <vladbu@nvidia.com>
      Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
      Reviewed-by: default avatarPaul Blakey <paulb@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      8ac04a28
    • Vlad Buslov's avatar
      net/mlx5e: Don't clone flow post action attributes second time · e9fce818
      Vlad Buslov authored
      The code already clones post action attributes in
      mlx5e_clone_flow_attr_for_post_act(). Creating another copy in
      mlx5e_tc_post_act_add() is a erroneous leftover from original
      implementation. Instead, assign handle->attribute to post_attr provided by
      the caller. Note that cloning the attribute second time is not just
      wasteful but also causes issues like second copy not being properly updated
      in neigh update code which leads to following use-after-free:
      
      Feb 21 09:02:00 c-237-177-40-045 kernel: BUG: KASAN: use-after-free in mlx5_cmd_set_fte+0x200d/0x24c0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_report+0xbb/0x1a0
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_save_stack+0x1e/0x40
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_set_track+0x21/0x30
      Feb 21 09:02:00 c-237-177-40-045 kernel:  __kasan_kmalloc+0x7a/0x90
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_save_stack+0x1e/0x40
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_set_track+0x21/0x30
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_save_free_info+0x2a/0x40
      Feb 21 09:02:00 c-237-177-40-045 kernel:  ____kasan_slab_free+0x11a/0x1b0
      Feb 21 09:02:00 c-237-177-40-045 kernel: page dumped because: kasan: bad access detected
      Feb 21 09:02:00 c-237-177-40-045 kernel: mlx5_core 0000:08:00.0: mlx5_cmd_out_err:803:(pid 8833): SET_FLOW_TABLE_ENTRY(0x936) op_mod(0x0) failed, status bad resource state(0x9), syndrome (0xf2ff71), err(-22)
      Feb 21 09:02:00 c-237-177-40-045 kernel: mlx5_core 0000:08:00.0 enp8s0f0: Failed to add post action rule
      Feb 21 09:02:00 c-237-177-40-045 kernel: mlx5_core 0000:08:00.0: mlx5e_tc_encap_flows_add:190:(pid 8833): Failed to update flow post acts, -22
      Feb 21 09:02:00 c-237-177-40-045 kernel: Call Trace:
      Feb 21 09:02:00 c-237-177-40-045 kernel:  <TASK>
      Feb 21 09:02:00 c-237-177-40-045 kernel:  dump_stack_lvl+0x57/0x7d
      Feb 21 09:02:00 c-237-177-40-045 kernel:  print_report+0x170/0x471
      Feb 21 09:02:00 c-237-177-40-045 kernel:  ? mlx5_cmd_set_fte+0x200d/0x24c0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_report+0xbb/0x1a0
      Feb 21 09:02:00 c-237-177-40-045 kernel:  ? mlx5_cmd_set_fte+0x200d/0x24c0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5_cmd_set_fte+0x200d/0x24c0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  ? __module_address.part.0+0x62/0x200
      Feb 21 09:02:00 c-237-177-40-045 kernel:  ? mlx5_cmd_stub_create_flow_table+0xd0/0xd0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  ? __raw_spin_lock_init+0x3b/0x110
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5_cmd_create_fte+0x80/0xb0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  add_rule_fg+0xe80/0x19c0 [mlx5_core]
      --
      Feb 21 09:02:00 c-237-177-40-045 kernel: Allocated by task 13476:
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_save_stack+0x1e/0x40
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_set_track+0x21/0x30
      Feb 21 09:02:00 c-237-177-40-045 kernel:  __kasan_kmalloc+0x7a/0x90
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5_packet_reformat_alloc+0x7b/0x230 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_tc_tun_create_header_ipv4+0x977/0xf10 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_attach_encap+0x15b4/0x1e10 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  post_process_attr+0x305/0xa30 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_tc_add_fdb_flow+0x4c0/0xcf0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  __mlx5e_add_fdb_flow+0x7cf/0xe90 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_configure_flower+0xcaa/0x4b90 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_rep_setup_tc_cls_flower+0x99/0x1b0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_rep_setup_tc_cb+0x133/0x1e0 [mlx5_core]
      --
      Feb 21 09:02:00 c-237-177-40-045 kernel: Freed by task 8833:
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_save_stack+0x1e/0x40
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_set_track+0x21/0x30
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kasan_save_free_info+0x2a/0x40
      Feb 21 09:02:00 c-237-177-40-045 kernel:  ____kasan_slab_free+0x11a/0x1b0
      Feb 21 09:02:00 c-237-177-40-045 kernel:  __kmem_cache_free+0x1de/0x400
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5_packet_reformat_dealloc+0xad/0x100 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_tc_encap_flows_del+0x3c0/0x500 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_rep_update_flows+0x40c/0xa80 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  mlx5e_rep_neigh_update+0x473/0x7a0 [mlx5_core]
      Feb 21 09:02:00 c-237-177-40-045 kernel:  process_one_work+0x7c2/0x1310
      Feb 21 09:02:00 c-237-177-40-045 kernel:  worker_thread+0x59d/0xec0
      Feb 21 09:02:00 c-237-177-40-045 kernel:  kthread+0x28f/0x330
      
      Fixes: 8300f225 ("net/mlx5e: Create new flow attr for multi table actions")
      Signed-off-by: default avatarVlad Buslov <vladbu@nvidia.com>
      Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
      e9fce818
  6. 20 Apr, 2023 6 commits
    • Joe Damato's avatar
      ixgbe: Enable setting RSS table to default values · e85d3d55
      Joe Damato authored
      ethtool uses `ETHTOOL_GRXRINGS` to compute how many queues are supported
      by RSS. The driver should return the smaller of either:
        - The maximum number of RSS queues the device supports, OR
        - The number of RX queues configured
      
      Prior to this change, running `ethtool -X $iface default` fails if the
      number of queues configured is larger than the number supported by RSS,
      even though changing the queue count correctly resets the flowhash to
      use all supported queues.
      
      Other drivers (for example, i40e) will succeed but the flow hash will
      reset to support the maximum number of queues supported by RSS, even if
      that amount is smaller than the configured amount.
      
      Prior to this change:
      
      $ sudo ethtool -L eth1 combined 20
      $ sudo ethtool -x eth1
      RX flow hash indirection table for eth1 with 20 RX ring(s):
          0:      0     1     2     3     4     5     6     7
          8:      8     9    10    11    12    13    14    15
         16:      0     1     2     3     4     5     6     7
         24:      8     9    10    11    12    13    14    15
         32:      0     1     2     3     4     5     6     7
      ...
      
      You can see that the flowhash was correctly set to use the maximum
      number of queues supported by the driver (16).
      
      However, asking the NIC to reset to "default" fails:
      
      $ sudo ethtool -X eth1 default
      Cannot set RX flow hash configuration: Invalid argument
      
      After this change, the flowhash can be reset to default which will use
      all of the available RSS queues (16) or the configured queue count,
      whichever is smaller.
      
      Starting with eth1 which has 10 queues and a flowhash distributing to
      all 10 queues:
      
      $ sudo ethtool -x eth1
      RX flow hash indirection table for eth1 with 10 RX ring(s):
          0:      0     1     2     3     4     5     6     7
          8:      8     9     0     1     2     3     4     5
         16:      6     7     8     9     0     1     2     3
      ...
      
      Increasing the queue count to 48 resets the flowhash to distribute to 16
      queues, as it did before this patch:
      
      $ sudo ethtool -L eth1 combined 48
      $ sudo ethtool -x eth1
      RX flow hash indirection table for eth1 with 16 RX ring(s):
          0:      0     1     2     3     4     5     6     7
          8:      8     9    10    11    12    13    14    15
         16:      0     1     2     3     4     5     6     7
      ...
      
      Due to the other bugfix in this series, the flowhash can be set to use
      queues 0-5:
      
      $ sudo ethtool -X eth1 equal 5
      $ sudo ethtool -x eth1
      RX flow hash indirection table for eth1 with 16 RX ring(s):
          0:      0     1     2     3     4     0     1     2
          8:      3     4     0     1     2     3     4     0
         16:      1     2     3     4     0     1     2     3
      ...
      
      Due to this bugfix, the flowhash can be reset to default and use 16
      queues:
      
      $ sudo ethtool -X eth1 default
      $ sudo ethtool -x eth1
      RX flow hash indirection table for eth1 with 16 RX ring(s):
          0:      0     1     2     3     4     5     6     7
          8:      8     9    10    11    12    13    14    15
         16:      0     1     2     3     4     5     6     7
      ...
      
      Fixes: 91cd94bf ("ixgbe: add basic support for setting and getting nfc controls")
      Signed-off-by: default avatarJoe Damato <jdamato@fastly.com>
      Reviewed-by: default avatarSridhar Samudrala <sridhar.samudrala@intel.com>
      Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      e85d3d55
    • Joe Damato's avatar
      ixgbe: Allow flow hash to be set via ethtool · 4f3ed129
      Joe Damato authored
      ixgbe currently returns `EINVAL` whenever the flowhash it set by ethtool
      because the ethtool code in the kernel passes a non-zero value for hfunc
      that ixgbe should allow.
      
      When ethtool is called with `ETHTOOL_SRXFHINDIR`,
      `ethtool_set_rxfh_indir` will call ixgbe's set_rxfh function
      with `ETH_RSS_HASH_NO_CHANGE`. This value should be accepted.
      
      When ethtool is called with `ETHTOOL_SRSSH`, `ethtool_set_rxfh` will
      call ixgbe's set_rxfh function with `rxfh.hfunc`, which appears to be
      hardcoded in ixgbe to always be `ETH_RSS_HASH_TOP`. This value should
      also be accepted.
      
      Before this patch:
      
      $ sudo ethtool -L eth1 combined 10
      $ sudo ethtool -X eth1 default
      Cannot set RX flow hash configuration: Invalid argument
      
      After this patch:
      
      $ sudo ethtool -L eth1 combined 10
      $ sudo ethtool -X eth1 default
      $ sudo ethtool -x eth1
      RX flow hash indirection table for eth1 with 10 RX ring(s):
          0:      0     1     2     3     4     5     6     7
          8:      8     9     0     1     2     3     4     5
         16:      6     7     8     9     0     1     2     3
         24:      4     5     6     7     8     9     0     1
         ...
      
      Fixes: 1c7cf078 ("ixgbe: support for ethtool set_rxfh")
      Signed-off-by: default avatarJoe Damato <jdamato@fastly.com>
      Reviewed-by: default avatarSridhar Samudrala <sridhar.samudrala@intel.com>
      Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      4f3ed129
    • Toke Høiland-Jørgensen's avatar
      wifi: ath9k: Don't mark channelmap stack variable read-only in ath9k_mci_update_wlan_channels() · 0f2a4af2
      Toke Høiland-Jørgensen authored
      This partially reverts commit e161d4b6.
      
      Turns out the channelmap variable is not actually read-only, it's modified
      through the MCI_GPM_CLR_CHANNEL_BIT() macro further down in the function,
      so making it read-only causes page faults when that code is hit.
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=217183
      Link: https://lore.kernel.org/r/20230413214118.153781-1-toke@toke.dk
      Fixes: e161d4b6 ("wifi: ath9k: Make arrays prof_prio and channelmap static const")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarToke Høiland-Jørgensen <toke@toke.dk>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      0f2a4af2
    • Linus Torvalds's avatar
      Merge tag 'rust-fixes-6.3' of https://github.com/Rust-for-Linux/linux · 6a66fdd2
      Linus Torvalds authored
      Pull Rust fixes from Miguel Ojeda:
       "Most of these are straightforward.
      
        The last one is more complex, but it only touches Rust + GCC builds
        which are for the moment best-effort.
      
         - Code: Missing 'extern "C"' fix.
      
         - Scripts: 'is_rust_module.sh' and 'generate_rust_analyzer.py' fixes.
      
         - A couple trivial fixes
      
         - Build: Rust + GCC build fix and 'grep' warning fix"
      
      * tag 'rust-fixes-6.3' of https://github.com/Rust-for-Linux/linux:
        rust: allow to use INIT_STACK_ALL_ZERO
        rust: fix regexp in scripts/is_rust_module.sh
        rust: build: Fix grep warning
        scripts: generate_rust_analyzer: Handle sub-modules with no Makefile
        rust: kernel: Mark rust_fmt_argument as extern "C"
        rust: sort uml documentation arch support table
        rust: str: fix requierments->requirements typo
      6a66fdd2
    • Linus Torvalds's avatar
      Merge tag 'net-6.3-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net · 23309d60
      Linus Torvalds authored
      Pull networking fixes from Paolo Abeni:
       "Including fixes from netfilter and bpf.
      
        There are a few fixes for new code bugs, including the Mellanox one
        noted in the last networking pull. No known regressions outstanding.
      
        Current release - regressions:
      
         - sched: clear actions pointer in miss cookie init fail
      
         - mptcp: fix accept vs worker race
      
         - bpf: fix bpf_arch_text_poke() with new_addr == NULL on s390
      
         - eth: bnxt_en: fix a possible NULL pointer dereference in unload
           path
      
         - eth: veth: take into account peer device for
           NETDEV_XDP_ACT_NDO_XMIT xdp_features flag
      
        Current release - new code bugs:
      
         - eth: revert "net/mlx5: Enable management PF initialization"
      
        Previous releases - regressions:
      
         - netfilter: fix recent physdev match breakage
      
         - bpf: fix incorrect verifier pruning due to missing register
           precision taints
      
         - eth: virtio_net: fix overflow inside xdp_linearize_page()
      
         - eth: cxgb4: fix use after free bugs caused by circular dependency
           problem
      
         - eth: mlxsw: pci: fix possible crash during initialization
      
        Previous releases - always broken:
      
         - sched: sch_qfq: prevent slab-out-of-bounds in qfq_activate_agg
      
         - netfilter: validate catch-all set elements
      
         - bridge: don't notify FDB entries with "master dynamic"
      
         - eth: bonding: fix memory leak when changing bond type to ethernet
      
         - eth: i40e: fix accessing vsi->active_filters without holding lock
      
        Misc:
      
         - Mat is back as MPTCP co-maintainer"
      
      * tag 'net-6.3-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (33 commits)
        net: bridge: switchdev: don't notify FDB entries with "master dynamic"
        Revert "net/mlx5: Enable management PF initialization"
        MAINTAINERS: Resume MPTCP co-maintainer role
        mailmap: add entries for Mat Martineau
        e1000e: Disable TSO on i219-LM card to increase speed
        bnxt_en: fix free-runnig PHC mode
        net: dsa: microchip: ksz8795: Correctly handle huge frame configuration
        bpf: Fix incorrect verifier pruning due to missing register precision taints
        hamradio: drop ISA_DMA_API dependency
        mlxsw: pci: Fix possible crash during initialization
        mptcp: fix accept vs worker race
        mptcp: stops worker on unaccepted sockets at listener close
        net: rpl: fix rpl header size calculation
        net: vmxnet3: Fix NULL pointer dereference in vmxnet3_rq_rx_complete()
        bonding: Fix memory leak when changing bond type to Ethernet
        veth: take into account peer device for NETDEV_XDP_ACT_NDO_XMIT xdp_features flag
        mlxfw: fix null-ptr-deref in mlxfw_mfa2_tlv_next()
        bnxt_en: Fix a possible NULL pointer dereference in unload path
        bnxt_en: Do not initialize PTP on older P3/P4 chips
        netfilter: nf_tables: tighten netlink attribute requirements for catch-all elements
        ...
      23309d60
    • Vladimir Oltean's avatar
      net: bridge: switchdev: don't notify FDB entries with "master dynamic" · 927cdea5
      Vladimir Oltean authored
      There is a structural problem in switchdev, where the flag bits in
      struct switchdev_notifier_fdb_info (added_by_user, is_local etc) only
      represent a simplified / denatured view of what's in struct
      net_bridge_fdb_entry :: flags (BR_FDB_ADDED_BY_USER, BR_FDB_LOCAL etc).
      Each time we want to pass more information about struct
      net_bridge_fdb_entry :: flags to struct switchdev_notifier_fdb_info
      (here, BR_FDB_STATIC), we find that FDB entries were already notified to
      switchdev with no regard to this flag, and thus, switchdev drivers had
      no indication whether the notified entries were static or not.
      
      For example, this command:
      
      ip link add br0 type bridge && ip link set swp0 master br0
      bridge fdb add dev swp0 00:01:02:03:04:05 master dynamic
      
      has never worked as intended with switchdev. It causes a struct
      net_bridge_fdb_entry to be passed to br_switchdev_fdb_notify() which has
      a single flag set: BR_FDB_ADDED_BY_USER.
      
      This is further passed to the switchdev notifier chain, where interested
      drivers have no choice but to assume this is a static (does not age) and
      sticky (does not migrate) FDB entry. So currently, all drivers offload
      it to hardware as such, as can be seen below ("offload" is set).
      
      bridge fdb get 00:01:02:03:04:05 dev swp0 master
      00:01:02:03:04:05 dev swp0 offload master br0
      
      The software FDB entry expires $ageing_time centiseconds after the
      kernel last sees a packet with this MAC SA, and the bridge notifies its
      deletion as well, so it eventually disappears from hardware too.
      
      This is a problem, because it is actually desirable to start offloading
      "master dynamic" FDB entries correctly - they should expire $ageing_time
      centiseconds after the *hardware* port last sees a packet with this
      MAC SA - and this is how the current incorrect behavior was discovered.
      With an offloaded data plane, it can be expected that software only sees
      exception path packets, so an otherwise active dynamic FDB entry would
      be aged out by software sooner than it should.
      
      With the change in place, these FDB entries are no longer offloaded:
      
      bridge fdb get 00:01:02:03:04:05 dev swp0 master
      00:01:02:03:04:05 dev swp0 master br0
      
      and this also constitutes a better way (assuming a backport to stable
      kernels) for user space to determine whether the kernel has the
      capability of doing something sane with these or not.
      
      As opposed to "master dynamic" FDB entries, on the current behavior of
      which no one currently depends on (which can be deduced from the lack of
      kselftests), Ido Schimmel explains that entries with the "extern_learn"
      flag (BR_FDB_ADDED_BY_EXT_LEARN) should still be notified to switchdev,
      since the spectrum driver listens to them (and this is kind of okay,
      because although they are treated identically to "static", they are
      expected to not age, and to roam).
      
      Fixes: 6b26b51b ("net: bridge: Add support for notifying devices about FDB add/del")
      Link: https://lore.kernel.org/netdev/20230327115206.jk5q5l753aoelwus@skbuf/Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Reviewed-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
      Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
      Tested-by: default avatarIdo Schimmel <idosch@nvidia.com>
      Link: https://lore.kernel.org/r/20230418155902.898627-1-vladimir.oltean@nxp.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      927cdea5