Merge branch 'akpm' (patches from Andrew)
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Nov 2021 22:31:47 +0000 (14:31 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Nov 2021 22:31:47 +0000 (14:31 -0800)
Merge more updates from Andrew Morton:
 "The post-linux-next material.

  7 patches.

  Subsystems affected by this patch series (all mm): debug,
  slab-generic, migration, memcg, and kasan"

* emailed patches from Andrew Morton <akpm@linux-foundation.org>:
  kasan: add kasan mode messages when kasan init
  mm: unexport {,un}lock_page_memcg
  mm: unexport folio_memcg_{,un}lock
  mm/migrate.c: remove MIGRATE_PFN_LOCKED
  mm: migrate: simplify the file-backed pages validation when migrating its mapping
  mm: allow only SLUB on PREEMPT_RT
  mm/page_owner.c: modify the type of argument "order" in some functions

144 files changed:
Documentation/networking/ip-sysctl.rst
Documentation/security/SCTP.rst
MAINTAINERS
arch/arm64/kernel/cpufeature.c
arch/m68k/Kconfig.cpu
arch/m68k/Kconfig.machine
arch/m68k/include/asm/bitops.h
arch/riscv/mm/extable.c
arch/riscv/net/bpf_jit_comp64.c
drivers/net/Kconfig
drivers/net/amt.c
drivers/net/bonding/bond_sysfs_slave.c
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
drivers/net/can/usb/etas_es58x/es58x_core.c
drivers/net/can/usb/peak_usb/pcan_usb.c
drivers/net/dsa/mv88e6xxx/chip.c
drivers/net/dsa/ocelot/felix.c
drivers/net/dsa/qca8k.c
drivers/net/dsa/qca8k.h
drivers/net/ethernet/asix/ax88796c_main.c
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
drivers/net/ethernet/broadcom/tg3.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c
drivers/net/ethernet/chelsio/cxgb4/t4_hw.h
drivers/net/ethernet/google/gve/gve_main.c
drivers/net/ethernet/google/gve/gve_rx.c
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_base.c
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.h
drivers/net/ethernet/lantiq_etop.c
drivers/net/ethernet/litex/litex_liteeth.c
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
drivers/net/ethernet/marvell/octeontx2/Kconfig
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
drivers/net/ethernet/marvell/octeontx2/nic/otx2_vf.c
drivers/net/ethernet/marvell/prestera/prestera_ethtool.c
drivers/net/ethernet/marvell/prestera/prestera_hw.c
drivers/net/ethernet/marvell/prestera/prestera_main.c
drivers/net/ethernet/marvell/prestera/prestera_pci.c
drivers/net/ethernet/mellanox/mlx5/core/lag/port_sel.c
drivers/net/ethernet/microsoft/mana/gdma_main.c
drivers/net/ethernet/sfc/falcon/efx.c
drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
drivers/net/ethernet/ti/cpsw_ale.c
drivers/net/ethernet/ti/davinci_emac.c
drivers/net/hamradio/6pack.c
drivers/net/hamradio/mkiss.c
drivers/net/phy/microchip_t1.c
drivers/net/phy/phy.c
drivers/net/sungem_phy.c
drivers/net/wwan/iosm/iosm_ipc_imem_ops.c
drivers/nfc/pn533/pn533.c
drivers/nfc/port100.c
drivers/usb/core/hcd.c
drivers/usb/host/xhci-hub.c
drivers/usb/host/xhci.c
fs/libfs.c
include/linux/bpf.h
include/linux/dsa/ocelot.h
include/linux/ethtool_netlink.h
include/linux/fs.h
include/linux/lsm_hook_defs.h
include/linux/lsm_hooks.h
include/linux/security.h
include/linux/skbuff.h
include/linux/skmsg.h
include/linux/usb/hcd.h
include/net/llc.h
include/net/sctp/structs.h
include/net/strparser.h
include/net/tcp.h
include/uapi/linux/ethtool_netlink.h
kernel/bpf/core.c
kernel/bpf/verifier.c
kernel/trace/ftrace.c
kernel/trace/ring_buffer.c
mm/shmem.c
net/8021q/vlan.c
net/8021q/vlan_dev.c
net/can/j1939/main.c
net/can/j1939/transport.c
net/core/datagram.c
net/core/dev.c
net/core/devlink.c
net/core/filter.c
net/core/skbuff.c
net/core/sock.c
net/core/sock_map.c
net/dsa/tag_ocelot.c
net/ethtool/pause.c
net/ipv4/tcp.c
net/ipv4/tcp_bpf.c
net/ipv4/tcp_output.c
net/ipv6/seg6.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/mctp/af_mctp.c
net/netfilter/ipvs/ip_vs_ctl.c
net/netfilter/nfnetlink_queue.c
net/nfc/netlink.c
net/sched/sch_taprio.c
net/sctp/sm_statefuns.c
net/sctp/socket.c
net/smc/af_smc.c
net/smc/smc_tracepoint.h
net/strparser/strparser.c
net/vmw_vsock/af_vsock.c
security/security.c
security/selinux/hooks.c
security/selinux/include/netlabel.h
security/selinux/netlabel.c
tools/bpf/bpftool/Makefile
tools/lib/bpf/bpf.c
tools/testing/selftests/bpf/prog_tests/netcnt.c
tools/testing/selftests/bpf/prog_tests/test_bpffs.c
tools/testing/selftests/bpf/progs/for_each_array_map_elem.c
tools/testing/selftests/bpf/test_xdp_redirect_multi.sh
tools/testing/selftests/bpf/verifier/spill_fill.c
tools/testing/selftests/bpf/xdp_redirect_multi.c
tools/testing/selftests/net/Makefile
tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh
tools/testing/selftests/net/forwarding/mirror_gre_changes.sh
tools/testing/selftests/net/forwarding/mirror_gre_vlan_bridge_1q.sh
tools/testing/selftests/net/forwarding/mirror_lib.sh
tools/testing/selftests/net/forwarding/mirror_vlan.sh
tools/testing/selftests/net/gre_gso.sh
tools/testing/selftests/net/reuseport_bpf_numa.c
tools/testing/selftests/net/test_vxlan_under_vrf.sh
tools/testing/selftests/net/tls.c
tools/testing/selftests/net/udpgso_bench_rx.c

index c61cc0219f4c1c31a34a81b2f3da00f622b4cd0c..c04431144f7ab9610d019f598a6b104c5c3e42f3 100644 (file)
@@ -1004,13 +1004,11 @@ udp_l3mdev_accept - BOOLEAN
 udp_mem - vector of 3 INTEGERs: min, pressure, max
        Number of pages allowed for queueing by all UDP sockets.
 
-       min: Below this number of pages UDP is not bothered about its
-       memory appetite. When amount of memory allocated by UDP exceeds
-       this number, UDP starts to moderate memory usage.
+       min: Number of pages allowed for queueing by all UDP sockets.
 
        pressure: This value was introduced to follow format of tcp_mem.
 
-       max: Number of pages allowed for queueing by all UDP sockets.
+       max: This value was introduced to follow format of tcp_mem.
 
        Default is calculated at boot time from amount of available memory.
 
index 0bcf6c1245ee9a862f72946d3af3aa4f089c68a9..406cc68b88087ee2fbb25f04a92dd30570f22392 100644 (file)
@@ -15,10 +15,7 @@ For security module support, three SCTP specific hooks have been implemented::
     security_sctp_assoc_request()
     security_sctp_bind_connect()
     security_sctp_sk_clone()
-
-Also the following security hook has been utilised::
-
-    security_inet_conn_established()
+    security_sctp_assoc_established()
 
 The usage of these hooks are described below with the SELinux implementation
 described in the `SCTP SELinux Support`_ chapter.
@@ -26,11 +23,11 @@ described in the `SCTP SELinux Support`_ chapter.
 
 security_sctp_assoc_request()
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Passes the ``@ep`` and ``@chunk->skb`` of the association INIT packet to the
+Passes the ``@asoc`` and ``@chunk->skb`` of the association INIT packet to the
 security module. Returns 0 on success, error on failure.
 ::
 
-    @ep - pointer to sctp endpoint structure.
+    @asoc - pointer to sctp association structure.
     @skb - pointer to skbuff of association packet.
 
 
@@ -117,16 +114,17 @@ Called whenever a new socket is created by **accept**\(2)
 calls **sctp_peeloff**\(3).
 ::
 
-    @ep - pointer to current sctp endpoint structure.
+    @asoc - pointer to current sctp association structure.
     @sk - pointer to current sock structure.
-    @sk - pointer to new sock structure.
+    @newsk - pointer to new sock structure.
 
 
-security_inet_conn_established()
+security_sctp_assoc_established()
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Called when a COOKIE ACK is received::
+Called when a COOKIE ACK is received, and the peer secid will be
+saved into ``@asoc->peer_secid`` for client::
 
-    @sk  - pointer to sock structure.
+    @asoc - pointer to sctp association structure.
     @skb - pointer to skbuff of the COOKIE ACK packet.
 
 
@@ -134,7 +132,7 @@ Security Hooks used for Association Establishment
 -------------------------------------------------
 
 The following diagram shows the use of ``security_sctp_bind_connect()``,
-``security_sctp_assoc_request()``, ``security_inet_conn_established()`` when
+``security_sctp_assoc_request()``, ``security_sctp_assoc_established()`` when
 establishing an association.
 ::
 
@@ -151,9 +149,9 @@ establishing an association.
          INIT --------------------------------------------->
                                                    sctp_sf_do_5_1B_init()
                                                  Respond to an INIT chunk.
-                                             SCTP peer endpoint "A" is
-                                             asking for an association. Call
-                                             security_sctp_assoc_request()
+                                             SCTP peer endpoint "A" is asking
+                                             for a temporary association.
+                                             Call security_sctp_assoc_request()
                                              to set the peer label if first
                                              association.
                                              If not first association, check
@@ -163,13 +161,16 @@ establishing an association.
           |                                       discard the packet.
           |
     COOKIE ECHO ------------------------------------------>
-                                                          |
-                                                          |
-                                                          |
+                                                  sctp_sf_do_5_1D_ce()
+                                             Respond to an COOKIE ECHO chunk.
+                                             Confirm the cookie and create a
+                                             permanent association.
+                                             Call security_sctp_assoc_request() to
+                                             do the same as for INIT chunk Response.
           <------------------------------------------- COOKIE ACK
           |                                               |
     sctp_sf_do_5_1E_ca                                    |
- Call security_inet_conn_established()                    |
+ Call security_sctp_assoc_established()                   |
  to set the peer label.                                   |
           |                                               |
           |                               If SCTP_SOCKET_TCP or peeled off
@@ -195,27 +196,27 @@ hooks with the SELinux specifics expanded below::
     security_sctp_assoc_request()
     security_sctp_bind_connect()
     security_sctp_sk_clone()
-    security_inet_conn_established()
+    security_sctp_assoc_established()
 
 
 security_sctp_assoc_request()
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Passes the ``@ep`` and ``@chunk->skb`` of the association INIT packet to the
+Passes the ``@asoc`` and ``@chunk->skb`` of the association INIT packet to the
 security module. Returns 0 on success, error on failure.
 ::
 
-    @ep - pointer to sctp endpoint structure.
+    @asoc - pointer to sctp association structure.
     @skb - pointer to skbuff of association packet.
 
 The security module performs the following operations:
-     IF this is the first association on ``@ep->base.sk``, then set the peer
+     IF this is the first association on ``@asoc->base.sk``, then set the peer
      sid to that in ``@skb``. This will ensure there is only one peer sid
-     assigned to ``@ep->base.sk`` that may support multiple associations.
+     assigned to ``@asoc->base.sk`` that may support multiple associations.
 
-     ELSE validate the ``@ep->base.sk peer_sid`` against the ``@skb peer sid``
+     ELSE validate the ``@asoc->base.sk peer_sid`` against the ``@skb peer sid``
      to determine whether the association should be allowed or denied.
 
-     Set the sctp ``@ep sid`` to socket's sid (from ``ep->base.sk``) with
+     Set the sctp ``@asoc sid`` to socket's sid (from ``asoc->base.sk``) with
      MLS portion taken from ``@skb peer sid``. This will be used by SCTP
      TCP style sockets and peeled off connections as they cause a new socket
      to be generated.
@@ -259,21 +260,21 @@ security_sctp_sk_clone()
 Called whenever a new socket is created by **accept**\(2) (i.e. a TCP style
 socket) or when a socket is 'peeled off' e.g userspace calls
 **sctp_peeloff**\(3). ``security_sctp_sk_clone()`` will set the new
-sockets sid and peer sid to that contained in the ``@ep sid`` and
-``@ep peer sid`` respectively.
+sockets sid and peer sid to that contained in the ``@asoc sid`` and
+``@asoc peer sid`` respectively.
 ::
 
-    @ep - pointer to current sctp endpoint structure.
+    @asoc - pointer to current sctp association structure.
     @sk - pointer to current sock structure.
-    @sk - pointer to new sock structure.
+    @newsk - pointer to new sock structure.
 
 
-security_inet_conn_established()
+security_sctp_assoc_established()
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Called when a COOKIE ACK is received where it sets the connection's peer sid
 to that in ``@skb``::
 
-    @sk  - pointer to sock structure.
+    @asoc - pointer to sctp association structure.
     @skb - pointer to skbuff of the COOKIE ACK packet.
 
 
index 5b7a13f706fa3e480f8469b68ab5593e41e32d40..ceba033023c34dacf7c93b33cfa7a31dd05cc23a 100644 (file)
@@ -872,9 +872,10 @@ F: Documentation/devicetree/bindings/thermal/amazon,al-thermal.txt
 F:     drivers/thermal/thermal_mmio.c
 
 AMAZON ETHERNET DRIVERS
-M:     Netanel Belgazal <netanel@amazon.com>
+M:     Shay Agroskin <shayagr@amazon.com>
 M:     Arthur Kiyanovski <akiyano@amazon.com>
-R:     Guy Tzalik <gtzalik@amazon.com>
+R:     David Arinzon <darinzon@amazon.com>
+R:     Noam Dagan <ndagan@amazon.com>
 R:     Saeed Bishara <saeedb@amazon.com>
 L:     netdev@vger.kernel.org
 S:     Supported
index 7de96196ae14c9313de8d8cee77f9fc5500e9262..6f3e677d88f158248bd26e7686cb4f79f5b05573 100644 (file)
@@ -2868,6 +2868,7 @@ bool this_cpu_has_cap(unsigned int n)
 
        return false;
 }
+EXPORT_SYMBOL_GPL(this_cpu_has_cap);
 
 /*
  * This helper function is used in a narrow window when,
index 277d61a094637ce32b1966dac259ad9ca361d3b0..0d00ef5117dceed96b21a5d5eeb4f0ca4fd5ebf4 100644 (file)
@@ -53,17 +53,6 @@ config M68000
          System-On-Chip devices (eg 68328, 68302, etc). It does not contain
          a paging MMU.
 
-config MCPU32
-       bool
-       select CPU_HAS_NO_BITFIELDS
-       select CPU_HAS_NO_CAS
-       select CPU_HAS_NO_UNALIGNED
-       select CPU_NO_EFFICIENT_FFS
-       help
-         The Freescale (was then Motorola) CPU32 is a CPU core that is
-         based on the 68020 processor. For the most part it is used in
-         System-On-Chip parts, and does not contain a paging MMU.
-
 config M68020
        bool "68020 support"
        depends on MMU
index 36fa0c3ef129676869a461549b17eff9af91e994..eeab4f3e6c197dbdfd14f67776e4f85ce4834cd7 100644 (file)
@@ -203,6 +203,7 @@ config INIT_LCD
 config MEMORY_RESERVE
        int "Memory reservation (MiB)"
        depends on (UCSIMM || UCDIMM)
+       default 0
        help
          Reserve certain memory regions on 68x328 based boards.
 
index 7b414099e5fc20fa821238101cddb6e8e83d619a..7b93e1fd8ffa902f3cdbba84afe87297fc1accd1 100644 (file)
@@ -451,7 +451,7 @@ static inline unsigned long ffz(unsigned long word)
  *     generic functions for those.
  */
 #if (defined(__mcfisaaplus__) || defined(__mcfisac__)) && \
-       !defined(CONFIG_M68000) && !defined(CONFIG_MCPU32)
+       !defined(CONFIG_M68000)
 static inline unsigned long __ffs(unsigned long x)
 {
        __asm__ __volatile__ ("bitrev %0; ff1 %0"
index 18bf338303b677fa8de0b3a47e9b1ef5dac4815b..ddb7d3b99e891d328de720c51c5456703d009374 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/module.h>
 #include <linux/uaccess.h>
 
-#ifdef CONFIG_BPF_JIT
+#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I)
 int rv_bpf_fixup_exception(const struct exception_table_entry *ex, struct pt_regs *regs);
 #endif
 
@@ -23,7 +23,7 @@ int fixup_exception(struct pt_regs *regs)
        if (!fixup)
                return 0;
 
-#ifdef CONFIG_BPF_JIT
+#if defined(CONFIG_BPF_JIT) && defined(CONFIG_ARCH_RV64I)
        if (regs->epc >= BPF_JIT_REGION_START && regs->epc < BPF_JIT_REGION_END)
                return rv_bpf_fixup_exception(fixup, regs);
 #endif
index 2ca345c7b0bf328ebaef910818a864da88d023e2..f2a779c7e225deaefdc16a16575ec971b85ceb40 100644 (file)
@@ -459,6 +459,8 @@ static int emit_call(bool fixed, u64 addr, struct rv_jit_context *ctx)
 #define BPF_FIXUP_OFFSET_MASK   GENMASK(26, 0)
 #define BPF_FIXUP_REG_MASK      GENMASK(31, 27)
 
+int rv_bpf_fixup_exception(const struct exception_table_entry *ex,
+                               struct pt_regs *regs);
 int rv_bpf_fixup_exception(const struct exception_table_entry *ex,
                                struct pt_regs *regs)
 {
index 034dbd487c3347eef8674f1c1d76ecc3755a119d..10506a4b66ef85b9d5202e668729e1a9e5ba1bee 100644 (file)
@@ -294,6 +294,7 @@ config GTP
 config AMT
        tristate "Automatic Multicast Tunneling (AMT)"
        depends on INET && IP_MULTICAST
+       depends on IPV6 || !IPV6
        select NET_UDP_TUNNEL
        help
          This allows one to create AMT(Automatic Multicast Tunneling)
index 60a7053a9cf7e2d6dab87fe24f71db9e36cc53ff..47a04c330885ef33a06e117b3f10e8393f4fa5ff 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/igmp.h>
 #include <linux/workqueue.h>
 #include <net/net_namespace.h>
-#include <net/protocol.h>
 #include <net/ip.h>
 #include <net/udp.h>
 #include <net/udp_tunnel.h>
@@ -23,7 +22,6 @@
 #include <linux/security.h>
 #include <net/gro_cells.h>
 #include <net/ipv6.h>
-#include <net/protocol.h>
 #include <net/if_inet6.h>
 #include <net/ndisc.h>
 #include <net/addrconf.h>
@@ -2767,7 +2765,7 @@ static int amt_err_lookup(struct sock *sk, struct sk_buff *skb)
        rcu_read_lock_bh();
        amt = rcu_dereference_sk_user_data(sk);
        if (!amt)
-               goto drop;
+               goto out;
 
        if (amt->mode != AMT_MODE_GATEWAY)
                goto drop;
@@ -2789,6 +2787,7 @@ static int amt_err_lookup(struct sock *sk, struct sk_buff *skb)
        default:
                goto drop;
        }
+out:
        rcu_read_unlock_bh();
        return 0;
 drop:
@@ -3259,8 +3258,10 @@ static int __init amt_init(void)
                goto unregister_notifier;
 
        amt_wq = alloc_workqueue("amt", WQ_UNBOUND, 1);
-       if (!amt_wq)
+       if (!amt_wq) {
+               err = -ENOMEM;
                goto rtnl_unregister;
+       }
 
        spin_lock_init(&source_gc_lock);
        spin_lock_bh(&source_gc_lock);
@@ -3285,7 +3286,7 @@ static void __exit amt_fini(void)
 {
        rtnl_link_unregister(&amt_link_ops);
        unregister_netdevice_notifier(&amt_notifier_block);
-       flush_delayed_work(&source_gc_wq);
+       cancel_delayed_work(&source_gc_wq);
        __amt_source_gc_work();
        destroy_workqueue(amt_wq);
 }
index fd07561da0348abdaf7f7d9d06e061c4d5361db2..6a6cdd0bb2585bd3f77d2cb590da9910f89f0337 100644 (file)
@@ -108,15 +108,15 @@ static ssize_t ad_partner_oper_port_state_show(struct slave *slave, char *buf)
 }
 static SLAVE_ATTR_RO(ad_partner_oper_port_state);
 
-static const struct slave_attribute *slave_attrs[] = {
-       &slave_attr_state,
-       &slave_attr_mii_status,
-       &slave_attr_link_failure_count,
-       &slave_attr_perm_hwaddr,
-       &slave_attr_queue_id,
-       &slave_attr_ad_aggregator_id,
-       &slave_attr_ad_actor_oper_port_state,
-       &slave_attr_ad_partner_oper_port_state,
+static const struct attribute *slave_attrs[] = {
+       &slave_attr_state.attr,
+       &slave_attr_mii_status.attr,
+       &slave_attr_link_failure_count.attr,
+       &slave_attr_perm_hwaddr.attr,
+       &slave_attr_queue_id.attr,
+       &slave_attr_ad_aggregator_id.attr,
+       &slave_attr_ad_actor_oper_port_state.attr,
+       &slave_attr_ad_partner_oper_port_state.attr,
        NULL
 };
 
@@ -137,24 +137,10 @@ const struct sysfs_ops slave_sysfs_ops = {
 
 int bond_sysfs_slave_add(struct slave *slave)
 {
-       const struct slave_attribute **a;
-       int err;
-
-       for (a = slave_attrs; *a; ++a) {
-               err = sysfs_create_file(&slave->kobj, &((*a)->attr));
-               if (err) {
-                       kobject_put(&slave->kobj);
-                       return err;
-               }
-       }
-
-       return 0;
+       return sysfs_create_files(&slave->kobj, slave_attrs);
 }
 
 void bond_sysfs_slave_del(struct slave *slave)
 {
-       const struct slave_attribute **a;
-
-       for (a = slave_attrs; *a; ++a)
-               sysfs_remove_file(&slave->kobj, &((*a)->attr));
+       sysfs_remove_files(&slave->kobj, slave_attrs);
 }
index 673861ab665a4aea56fa7019f5fc7def467dab8d..e16dc482f3270b6353462d50a20d09a92461c70c 100644 (file)
@@ -1092,7 +1092,7 @@ static int mcp251xfd_chip_start(struct mcp251xfd_priv *priv)
 
        err = mcp251xfd_chip_rx_int_enable(priv);
        if (err)
-               return err;
+               goto out_chip_stop;
 
        err = mcp251xfd_chip_ecc_init(priv);
        if (err)
@@ -2290,8 +2290,10 @@ static irqreturn_t mcp251xfd_irq(int irq, void *dev_id)
                         * check will fail, too. So leave IRQ handler
                         * directly.
                         */
-                       if (priv->can.state == CAN_STATE_BUS_OFF)
+                       if (priv->can.state == CAN_STATE_BUS_OFF) {
+                               can_rx_offload_threaded_irq_finish(&priv->offload);
                                return IRQ_HANDLED;
+                       }
                }
 
                handled = IRQ_HANDLED;
index 96a13c770e4a18d84905fb0386c074d21d8a2a01..24627ab146261703bb9360bd8e01e59e8cd24107 100644 (file)
@@ -664,7 +664,7 @@ int es58x_rx_err_msg(struct net_device *netdev, enum es58x_err error,
        struct can_device_stats *can_stats = &can->can_stats;
        struct can_frame *cf = NULL;
        struct sk_buff *skb;
-       int ret;
+       int ret = 0;
 
        if (!netif_running(netdev)) {
                if (net_ratelimit())
@@ -823,8 +823,6 @@ int es58x_rx_err_msg(struct net_device *netdev, enum es58x_err error,
                        can->state = CAN_STATE_BUS_OFF;
                        can_bus_off(netdev);
                        ret = can->do_set_mode(netdev, CAN_MODE_STOP);
-                       if (ret)
-                               return ret;
                }
                break;
 
@@ -881,7 +879,7 @@ int es58x_rx_err_msg(struct net_device *netdev, enum es58x_err error,
                                        ES58X_EVENT_BUSOFF, timestamp);
        }
 
-       return 0;
+       return ret;
 }
 
 /**
index 837b3fecd71e95e69ee66dcfec09ca5cab05c7eb..8762187527669b76d46d8636c064ae8cf3a5f4f5 100644 (file)
@@ -841,14 +841,14 @@ static int pcan_usb_start(struct peak_usb_device *dev)
        pdev->bec.rxerr = 0;
        pdev->bec.txerr = 0;
 
-       /* be notified on error counter changes (if requested by user) */
-       if (dev->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
-               err = pcan_usb_set_err_frame(dev, PCAN_USB_BERR_MASK);
-               if (err)
-                       netdev_warn(dev->netdev,
-                                   "Asking for BERR reporting error %u\n",
-                                   err);
-       }
+       /* always ask the device for BERR reporting, to be able to switch from
+        * WARNING to PASSIVE state
+        */
+       err = pcan_usb_set_err_frame(dev, PCAN_USB_BERR_MASK);
+       if (err)
+               netdev_warn(dev->netdev,
+                           "Asking for BERR reporting error %u\n",
+                           err);
 
        /* if revision greater than 3, can put silent mode on/off */
        if (dev->device_rev > 3) {
@@ -883,6 +883,11 @@ static int pcan_usb_init(struct peak_usb_device *dev)
                return err;
        }
 
+       dev_info(dev->netdev->dev.parent,
+                "PEAK-System %s adapter hwrev %u serial %08X (%u channel)\n",
+                pcan_usb.name, dev->device_rev, serial_number,
+                pcan_usb.ctrl_count);
+
        /* Since rev 4.1, PCAN-USB is able to make single-shot as well as
         * looped back frames.
         */
@@ -896,11 +901,6 @@ static int pcan_usb_init(struct peak_usb_device *dev)
                         "Firmware update available. Please contact support@peak-system.com\n");
        }
 
-       dev_info(dev->netdev->dev.parent,
-                "PEAK-System %s adapter hwrev %u serial %08X (%u channel)\n",
-                pcan_usb.name, dev->device_rev, serial_number,
-                pcan_usb.ctrl_count);
-
        return 0;
 }
 
@@ -986,7 +986,6 @@ const struct peak_usb_adapter pcan_usb = {
        .device_id = PCAN_USB_PRODUCT_ID,
        .ctrl_count = 1,
        .ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
-                             CAN_CTRLMODE_BERR_REPORTING |
                              CAN_CTRLMODE_CC_LEN8_DLC,
        .clock = {
                .freq = PCAN_USB_CRYSTAL_HZ / 2,
index 14c678a9e41b3501678a74a04b83b2cbb8b36ddb..f00cbf5753b914040be2dc3b31f2a15cb4274976 100644 (file)
@@ -640,7 +640,10 @@ static void mv88e6393x_phylink_validate(struct mv88e6xxx_chip *chip, int port,
                                        unsigned long *mask,
                                        struct phylink_link_state *state)
 {
-       if (port == 0 || port == 9 || port == 10) {
+       bool is_6191x =
+               chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6191X;
+
+       if (((port == 0 || port == 9) && !is_6191x) || port == 10) {
                phylink_set(mask, 10000baseT_Full);
                phylink_set(mask, 10000baseKR_Full);
                phylink_set(mask, 10000baseCR_Full);
index 83808e7dbddaf5beea96e63811bcc514d38a96ed..327cc46548065461995cbaf3b23f2abfaba129a5 100644 (file)
@@ -1370,12 +1370,12 @@ out:
 static bool felix_rxtstamp(struct dsa_switch *ds, int port,
                           struct sk_buff *skb, unsigned int type)
 {
-       u8 *extraction = skb->data - ETH_HLEN - OCELOT_TAG_LEN;
+       u32 tstamp_lo = OCELOT_SKB_CB(skb)->tstamp_lo;
        struct skb_shared_hwtstamps *shhwtstamps;
        struct ocelot *ocelot = ds->priv;
-       u32 tstamp_lo, tstamp_hi;
        struct timespec64 ts;
-       u64 tstamp, val;
+       u32 tstamp_hi;
+       u64 tstamp;
 
        /* If the "no XTR IRQ" workaround is in use, tell DSA to defer this skb
         * for RX timestamping. Then free it, and poll for its copy through
@@ -1390,9 +1390,6 @@ static bool felix_rxtstamp(struct dsa_switch *ds, int port,
        ocelot_ptp_gettime64(&ocelot->ptp_info, &ts);
        tstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
 
-       ocelot_xfh_get_rew_val(extraction, &val);
-       tstamp_lo = (u32)val;
-
        tstamp_hi = tstamp >> 32;
        if ((tstamp & 0xffffffff) < tstamp_lo)
                tstamp_hi--;
index ea7f1277892219f7f72c624442e1290b2ef64087..a429c9750add1bddcd5f1afaa1174d6f7ca7a9e4 100644 (file)
@@ -1109,6 +1109,14 @@ qca8k_setup(struct dsa_switch *ds)
        if (ret)
                return ret;
 
+       /* Make sure MAC06 is disabled */
+       ret = qca8k_reg_clear(priv, QCA8K_REG_PORT0_PAD_CTRL,
+                             QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN);
+       if (ret) {
+               dev_err(priv->dev, "failed disabling MAC06 exchange");
+               return ret;
+       }
+
        /* Enable CPU Port */
        ret = qca8k_reg_set(priv, QCA8K_REG_GLOBAL_FW_CTRL0,
                            QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN);
index e10571a398c98a1cabec9ca85ab036e9589bef16..128b8cf85e0804c519acb0b0f3acf8e164812138 100644 (file)
@@ -34,6 +34,7 @@
 #define   QCA8K_MASK_CTRL_DEVICE_ID_MASK               GENMASK(15, 8)
 #define   QCA8K_MASK_CTRL_DEVICE_ID(x)                 ((x) >> 8)
 #define QCA8K_REG_PORT0_PAD_CTRL                       0x004
+#define   QCA8K_PORT0_PAD_MAC06_EXCHANGE_EN            BIT(31)
 #define   QCA8K_PORT0_PAD_SGMII_RXCLK_FALLING_EDGE     BIT(19)
 #define   QCA8K_PORT0_PAD_SGMII_TXCLK_FALLING_EDGE     BIT(18)
 #define QCA8K_REG_PORT5_PAD_CTRL                       0x008
index 4b0c5a09fd57ffbdaadecab84f71c1a26429f4f3..e230d8d0ff739ca7101935417eef7a3adfefebb9 100644 (file)
@@ -934,7 +934,7 @@ static const struct net_device_ops ax88796c_netdev_ops = {
        .ndo_stop               = ax88796c_close,
        .ndo_start_xmit         = ax88796c_start_xmit,
        .ndo_get_stats64        = ax88796c_get_stats64,
-       .ndo_do_ioctl           = ax88796c_ioctl,
+       .ndo_eth_ioctl          = ax88796c_ioctl,
        .ndo_set_mac_address    = eth_mac_addr,
        .ndo_set_features       = ax88796c_set_features,
 };
@@ -1114,11 +1114,13 @@ static int ax88796c_remove(struct spi_device *spi)
        return 0;
 }
 
+#ifdef CONFIG_OF
 static const struct of_device_id ax88796c_dt_ids[] = {
        { .compatible = "asix,ax88796c" },
        {},
 };
 MODULE_DEVICE_TABLE(of, ax88796c_dt_ids);
+#endif
 
 static const struct spi_device_id asix_id[] = {
        { "ax88796c", 0 },
index ce790e9b45c3026ef171c1036bd0332becd60761..5c464ea73576f40bb0e8d418aa6e4a3be6140416 100644 (file)
@@ -443,7 +443,7 @@ static int bnxt_dl_reload_down(struct devlink *dl, bool netns_change,
        case DEVLINK_RELOAD_ACTION_DRIVER_REINIT: {
                if (BNXT_PF(bp) && bp->pf.active_vfs) {
                        NL_SET_ERR_MSG_MOD(extack,
-                                          "reload is unsupported when VFs are allocated\n");
+                                          "reload is unsupported when VFs are allocated");
                        return -EOPNOTSUPP;
                }
                rtnl_lock();
index b1328c5524b535ea7704f278069beb5fbf1a2a1f..85ca3909859d2d4f5d8f08f030c7d0b811af1bf6 100644 (file)
@@ -5503,7 +5503,6 @@ static bool tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status)
        int workaround, port_a;
 
        serdes_cfg = 0;
-       expected_sg_dig_ctrl = 0;
        workaround = 0;
        port_a = 1;
        current_link_up = false;
index 5903bdb78916fa62b18dc579dea4277801c3cb7d..129352bbe1143b713a51b8570fbd22556fef56eb 100644 (file)
@@ -2015,12 +2015,15 @@ static int cxgb4_get_module_info(struct net_device *dev,
                if (ret)
                        return ret;
 
-               if (!sff8472_comp || (sff_diag_type & 4)) {
+               if (!sff8472_comp || (sff_diag_type & SFP_DIAG_ADDRMODE)) {
                        modinfo->type = ETH_MODULE_SFF_8079;
                        modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
                } else {
                        modinfo->type = ETH_MODULE_SFF_8472;
-                       modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
+                       if (sff_diag_type & SFP_DIAG_IMPLEMENTED)
+                               modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
+                       else
+                               modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN / 2;
                }
                break;
 
index 002fc62ea7262cc102942c1dff933934b889b9b1..63bc956d20376baf860ce0d476af1edae80f16ab 100644 (file)
@@ -293,6 +293,8 @@ enum {
 #define I2C_PAGE_SIZE          0x100
 #define SFP_DIAG_TYPE_ADDR     0x5c
 #define SFP_DIAG_TYPE_LEN      0x1
+#define SFP_DIAG_ADDRMODE      BIT(2)
+#define SFP_DIAG_IMPLEMENTED   BIT(6)
 #define SFF_8472_COMP_ADDR     0x5e
 #define SFF_8472_COMP_LEN      0x1
 #define SFF_REV_ADDR           0x1
index 6b02ef432eda6b6d0c372fe08c35c221552e1f76..59b66f679e46e896f122da9cee171ff301968735 100644 (file)
@@ -1137,7 +1137,7 @@ static void gve_tx_timeout(struct net_device *dev, unsigned int txqueue)
                goto reset;
 
        ntfy_idx = gve_tx_idx_to_ntfy(priv, txqueue);
-       if (ntfy_idx > priv->num_ntfy_blks)
+       if (ntfy_idx >= priv->num_ntfy_blks)
                goto reset;
 
        block = &priv->ntfy_blocks[ntfy_idx];
index c8500babbd1db90e358c3485ebf29ea6b3e5cf05..3d04b5aff331b4daaebb6d1d7d10694289b0af77 100644 (file)
@@ -500,7 +500,8 @@ static struct sk_buff *gve_rx_skb(struct gve_priv *priv, struct gve_rx_ring *rx,
                        rx->rx_copied_pkt++;
                        rx->rx_frag_copy_cnt++;
                        rx->rx_copybreak_pkt++;
-               }       u64_stats_update_end(&rx->statss);
+                       u64_stats_update_end(&rx->statss);
+               }
        } else {
                if (rx->data.raw_addressing) {
                        int recycle = gve_rx_can_recycle_buffer(page_info);
index a2b993d62822e1ff60606af3cb189751ee07950f..9ccebbaa0d696e748636a508053aa957c43841ae 100644 (file)
@@ -4210,6 +4210,13 @@ int hns3_clean_rx_ring(struct hns3_enet_ring *ring, int budget,
        }
 
 out:
+       /* sync head pointer before exiting, since hardware will calculate
+        * FBD number with head pointer
+        */
+       if (unused_count > 0)
+               failure = failure ||
+                         hns3_nic_alloc_rx_buffers(ring, unused_count);
+
        return failure ? budget : recv_pkts;
 }
 
index 9fdedd83f39225592cd09b6b4e0f8c556569b135..c8442b86df9417cdcfad68512c882acc119b952d 100644 (file)
@@ -238,9 +238,11 @@ static void hns3_lb_clear_tx_ring(struct hns3_nic_priv *priv, u32 start_ringid,
 }
 
 /**
- * hns3_lp_run_test -  run loopback test
+ * hns3_lp_run_test - run loopback test
  * @ndev: net device
  * @mode: loopback type
+ *
+ * Return: %0 for success or a NIC loopback test error code on failure
  */
 static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode)
 {
@@ -398,7 +400,7 @@ static void hns3_do_selftest(struct net_device *ndev, int (*st_param)[2],
 }
 
 /**
- * hns3_nic_self_test - self test
+ * hns3_self_test - self test
  * @ndev: net device
  * @eth_test: test cmd
  * @data: test result
index c327df9dbac4095a2dac08c3da88d94f18322bc5..c5d5466810bb2ee007312b347d60bd45c8bba405 100644 (file)
@@ -483,6 +483,7 @@ static int hclge_firmware_compat_config(struct hclge_dev *hdev, bool en)
                if (hnae3_dev_phy_imp_supported(hdev))
                        hnae3_set_bit(compat, HCLGE_PHY_IMP_EN_B, 1);
                hnae3_set_bit(compat, HCLGE_MAC_STATS_EXT_EN_B, 1);
+               hnae3_set_bit(compat, HCLGE_SYNC_RX_RING_HEAD_EN_B, 1);
 
                req->compat = cpu_to_le32(compat);
        }
index c38b57fc6c6a549c127ac1be50b55f722a5d736d..d24e5902879831f32de6bd9dfe8c332ff107c781 100644 (file)
@@ -1151,6 +1151,7 @@ struct hclge_query_ppu_pf_other_int_dfx_cmd {
 #define HCLGE_NCSI_ERROR_REPORT_EN_B   1
 #define HCLGE_PHY_IMP_EN_B             2
 #define HCLGE_MAC_STATS_EXT_EN_B       3
+#define HCLGE_SYNC_RX_RING_HEAD_EN_B   4
 struct hclge_firmware_compat_cmd {
        __le32 compat;
        u8 rsv[20];
index 91cb578f56b80a2bd229441d550c5343dbb347ad..375ebf105a9aae48bf07384e6515a480b7e8eeda 100644 (file)
@@ -129,7 +129,7 @@ static int hclge_ets_sch_mode_validate(struct hclge_dev *hdev,
        u32 total_ets_bw = 0;
        u8 i;
 
-       for (i = 0; i < hdev->tc_max; i++) {
+       for (i = 0; i < HNAE3_MAX_TC; i++) {
                switch (ets->tc_tsa[i]) {
                case IEEE_8021QAZ_TSA_STRICT:
                        if (hdev->tm_info.tc_info[i].tc_sch_mode !=
@@ -286,28 +286,24 @@ err_out:
 
 static int hclge_ieee_getpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
 {
-       u64 requests[HNAE3_MAX_TC], indications[HNAE3_MAX_TC];
        struct hclge_vport *vport = hclge_get_vport(h);
        struct hclge_dev *hdev = vport->back;
        int ret;
-       u8 i;
 
        memset(pfc, 0, sizeof(*pfc));
        pfc->pfc_cap = hdev->pfc_max;
        pfc->pfc_en = hdev->tm_info.pfc_en;
 
-       ret = hclge_pfc_tx_stats_get(hdev, requests);
-       if (ret)
+       ret = hclge_mac_update_stats(hdev);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "failed to update MAC stats, ret = %d.\n", ret);
                return ret;
+       }
 
-       ret = hclge_pfc_rx_stats_get(hdev, indications);
-       if (ret)
-               return ret;
+       hclge_pfc_tx_stats_get(hdev, pfc->requests);
+       hclge_pfc_rx_stats_get(hdev, pfc->indications);
 
-       for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               pfc->requests[i] = requests[i];
-               pfc->indications[i] = indications[i];
-       }
        return 0;
 }
 
index 2e41aa2d1df80fce32170ee44820205e05f9a703..c2a58101144e3b4bbcd1237d77a4a58bedf3547a 100644 (file)
@@ -26,8 +26,6 @@
 #include "hclge_devlink.h"
 
 #define HCLGE_NAME                     "hclge"
-#define HCLGE_STATS_READ(p, offset) (*(u64 *)((u8 *)(p) + (offset)))
-#define HCLGE_MAC_STATS_FIELD_OFF(f) (offsetof(struct hclge_mac_stats, f))
 
 #define HCLGE_BUF_SIZE_UNIT    256U
 #define HCLGE_BUF_MUL_BY       2
@@ -568,6 +566,16 @@ static int hclge_mac_query_reg_num(struct hclge_dev *hdev, u32 *reg_num)
        struct hclge_desc desc;
        int ret;
 
+       /* Driver needs total register number of both valid registers and
+        * reserved registers, but the old firmware only returns number
+        * of valid registers in device V2. To be compatible with these
+        * devices, driver uses a fixed value.
+        */
+       if (hdev->ae_dev->dev_version == HNAE3_DEVICE_VERSION_V2) {
+               *reg_num = HCLGE_MAC_STATS_MAX_NUM_V1;
+               return 0;
+       }
+
        hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_MAC_REG_NUM, true);
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        if (ret) {
@@ -587,7 +595,7 @@ static int hclge_mac_query_reg_num(struct hclge_dev *hdev, u32 *reg_num)
        return 0;
 }
 
-static int hclge_mac_update_stats(struct hclge_dev *hdev)
+int hclge_mac_update_stats(struct hclge_dev *hdev)
 {
        /* The firmware supports the new statistics acquisition method */
        if (hdev->ae_dev->dev_specs.mac_stats_num)
@@ -2581,7 +2589,7 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
        if (hdev->num_msi < hdev->num_nic_msi + hdev->num_roce_msi)
                return -EINVAL;
 
-       roce->rinfo.base_vector = hdev->roce_base_vector;
+       roce->rinfo.base_vector = hdev->num_nic_msi;
 
        roce->rinfo.netdev = nic->kinfo.netdev;
        roce->rinfo.roce_io_base = hdev->hw.io_base;
@@ -2617,10 +2625,6 @@ static int hclge_init_msi(struct hclge_dev *hdev)
        hdev->num_msi = vectors;
        hdev->num_msi_left = vectors;
 
-       hdev->base_msi_vector = pdev->irq;
-       hdev->roce_base_vector = hdev->base_msi_vector +
-                               hdev->num_nic_msi;
-
        hdev->vector_status = devm_kcalloc(&pdev->dev, hdev->num_msi,
                                           sizeof(u16), GFP_KERNEL);
        if (!hdev->vector_status) {
@@ -8949,8 +8953,11 @@ int hclge_add_mc_addr_common(struct hclge_vport *vport,
 
 err_no_space:
        /* if already overflow, not to print each time */
-       if (!(vport->overflow_promisc_flags & HNAE3_OVERFLOW_MPE))
+       if (!(vport->overflow_promisc_flags & HNAE3_OVERFLOW_MPE)) {
+               vport->overflow_promisc_flags |= HNAE3_OVERFLOW_MPE;
                dev_err(&hdev->pdev->dev, "mc mac vlan table is full\n");
+       }
+
        return -ENOSPC;
 }
 
@@ -9006,12 +9013,17 @@ int hclge_rm_mc_addr_common(struct hclge_vport *vport,
 
 static void hclge_sync_vport_mac_list(struct hclge_vport *vport,
                                      struct list_head *list,
-                                     int (*sync)(struct hclge_vport *,
-                                                 const unsigned char *))
+                                     enum HCLGE_MAC_ADDR_TYPE mac_type)
 {
+       int (*sync)(struct hclge_vport *vport, const unsigned char *addr);
        struct hclge_mac_node *mac_node, *tmp;
        int ret;
 
+       if (mac_type == HCLGE_MAC_ADDR_UC)
+               sync = hclge_add_uc_addr_common;
+       else
+               sync = hclge_add_mc_addr_common;
+
        list_for_each_entry_safe(mac_node, tmp, list, node) {
                ret = sync(vport, mac_node->mac_addr);
                if (!ret) {
@@ -9023,8 +9035,13 @@ static void hclge_sync_vport_mac_list(struct hclge_vport *vport,
                        /* If one unicast mac address is existing in hardware,
                         * we need to try whether other unicast mac addresses
                         * are new addresses that can be added.
+                        * Multicast mac address can be reusable, even though
+                        * there is no space to add new multicast mac address,
+                        * we should check whether other mac addresses are
+                        * existing in hardware for reuse.
                         */
-                       if (ret != -EEXIST)
+                       if ((mac_type == HCLGE_MAC_ADDR_UC && ret != -EEXIST) ||
+                           (mac_type == HCLGE_MAC_ADDR_MC && ret != -ENOSPC))
                                break;
                }
        }
@@ -9032,12 +9049,17 @@ static void hclge_sync_vport_mac_list(struct hclge_vport *vport,
 
 static void hclge_unsync_vport_mac_list(struct hclge_vport *vport,
                                        struct list_head *list,
-                                       int (*unsync)(struct hclge_vport *,
-                                                     const unsigned char *))
+                                       enum HCLGE_MAC_ADDR_TYPE mac_type)
 {
+       int (*unsync)(struct hclge_vport *vport, const unsigned char *addr);
        struct hclge_mac_node *mac_node, *tmp;
        int ret;
 
+       if (mac_type == HCLGE_MAC_ADDR_UC)
+               unsync = hclge_rm_uc_addr_common;
+       else
+               unsync = hclge_rm_mc_addr_common;
+
        list_for_each_entry_safe(mac_node, tmp, list, node) {
                ret = unsync(vport, mac_node->mac_addr);
                if (!ret || ret == -ENOENT) {
@@ -9168,17 +9190,8 @@ stop_traverse:
        spin_unlock_bh(&vport->mac_list_lock);
 
        /* delete first, in order to get max mac table space for adding */
-       if (mac_type == HCLGE_MAC_ADDR_UC) {
-               hclge_unsync_vport_mac_list(vport, &tmp_del_list,
-                                           hclge_rm_uc_addr_common);
-               hclge_sync_vport_mac_list(vport, &tmp_add_list,
-                                         hclge_add_uc_addr_common);
-       } else {
-               hclge_unsync_vport_mac_list(vport, &tmp_del_list,
-                                           hclge_rm_mc_addr_common);
-               hclge_sync_vport_mac_list(vport, &tmp_add_list,
-                                         hclge_add_mc_addr_common);
-       }
+       hclge_unsync_vport_mac_list(vport, &tmp_del_list, mac_type);
+       hclge_sync_vport_mac_list(vport, &tmp_add_list, mac_type);
 
        /* if some mac addresses were added/deleted fail, move back to the
         * mac_list, and retry at next time.
@@ -9337,12 +9350,7 @@ static void hclge_uninit_vport_mac_list(struct hclge_vport *vport,
 
        spin_unlock_bh(&vport->mac_list_lock);
 
-       if (mac_type == HCLGE_MAC_ADDR_UC)
-               hclge_unsync_vport_mac_list(vport, &tmp_del_list,
-                                           hclge_rm_uc_addr_common);
-       else
-               hclge_unsync_vport_mac_list(vport, &tmp_del_list,
-                                           hclge_rm_mc_addr_common);
+       hclge_unsync_vport_mac_list(vport, &tmp_del_list, mac_type);
 
        if (!list_empty(&tmp_del_list))
                dev_warn(&hdev->pdev->dev,
@@ -9410,36 +9418,6 @@ static int hclge_get_mac_ethertype_cmd_status(struct hclge_dev *hdev,
        return return_status;
 }
 
-static bool hclge_check_vf_mac_exist(struct hclge_vport *vport, int vf_idx,
-                                    u8 *mac_addr)
-{
-       struct hclge_mac_vlan_tbl_entry_cmd req;
-       struct hclge_dev *hdev = vport->back;
-       struct hclge_desc desc;
-       u16 egress_port = 0;
-       int i;
-
-       if (is_zero_ether_addr(mac_addr))
-               return false;
-
-       memset(&req, 0, sizeof(req));
-       hnae3_set_field(egress_port, HCLGE_MAC_EPORT_VFID_M,
-                       HCLGE_MAC_EPORT_VFID_S, vport->vport_id);
-       req.egress_port = cpu_to_le16(egress_port);
-       hclge_prepare_mac_addr(&req, mac_addr, false);
-
-       if (hclge_lookup_mac_vlan_tbl(vport, &req, &desc, false) != -ENOENT)
-               return true;
-
-       vf_idx += HCLGE_VF_VPORT_START_NUM;
-       for (i = HCLGE_VF_VPORT_START_NUM; i < hdev->num_alloc_vport; i++)
-               if (i != vf_idx &&
-                   ether_addr_equal(mac_addr, hdev->vport[i].vf_info.mac))
-                       return true;
-
-       return false;
-}
-
 static int hclge_set_vf_mac(struct hnae3_handle *handle, int vf,
                            u8 *mac_addr)
 {
@@ -9457,12 +9435,6 @@ static int hclge_set_vf_mac(struct hnae3_handle *handle, int vf,
                return 0;
        }
 
-       if (hclge_check_vf_mac_exist(vport, vf, mac_addr)) {
-               dev_err(&hdev->pdev->dev, "Specified MAC(=%pM) exists!\n",
-                       mac_addr);
-               return -EEXIST;
-       }
-
        ether_addr_copy(vport->vf_info.mac, mac_addr);
 
        if (test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state)) {
index 9e1eede599ec8fa31711fe954d8a5ea62fc9d326..ebba603483a04f1034a70254c25ac8ffe6b1c882 100644 (file)
@@ -404,7 +404,7 @@ struct hclge_tm_info {
 };
 
 /* max number of mac statistics on each version */
-#define HCLGE_MAC_STATS_MAX_NUM_V1             84
+#define HCLGE_MAC_STATS_MAX_NUM_V1             87
 #define HCLGE_MAC_STATS_MAX_NUM_V2             105
 
 struct hclge_comm_stats_str {
@@ -852,6 +852,9 @@ struct hclge_vf_vlan_cfg {
                (y) = (_k_ ^ ~_v_) & (_k_); \
        } while (0)
 
+#define HCLGE_MAC_STATS_FIELD_OFF(f) (offsetof(struct hclge_mac_stats, f))
+#define HCLGE_STATS_READ(p, offset) (*(u64 *)((u8 *)(p) + (offset)))
+
 #define HCLGE_MAC_TNL_LOG_SIZE 8
 #define HCLGE_VPORT_NUM 256
 struct hclge_dev {
@@ -904,12 +907,10 @@ struct hclge_dev {
        u16 num_msi;
        u16 num_msi_left;
        u16 num_msi_used;
-       u32 base_msi_vector;
        u16 *vector_status;
        int *vector_irq;
        u16 num_nic_msi;        /* Num of nic vectors for this PF */
        u16 num_roce_msi;       /* Num of roce vectors for this PF */
-       int roce_base_vector;
 
        unsigned long service_timer_period;
        unsigned long service_timer_previous;
@@ -1168,4 +1169,5 @@ void hclge_inform_vf_promisc_info(struct hclge_vport *vport);
 int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len);
 int hclge_push_vf_link_status(struct hclge_vport *vport);
 int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en);
+int hclge_mac_update_stats(struct hclge_dev *hdev);
 #endif
index 95074e91a8466a3064eab898007511990acf9edf..429652a8cde167a062dffd28f5c754d5bb49a7d3 100644 (file)
@@ -113,50 +113,50 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level,
        return 0;
 }
 
-static int hclge_pfc_stats_get(struct hclge_dev *hdev,
-                              enum hclge_opcode_type opcode, u64 *stats)
-{
-       struct hclge_desc desc[HCLGE_TM_PFC_PKT_GET_CMD_NUM];
-       int ret, i, j;
-
-       if (!(opcode == HCLGE_OPC_QUERY_PFC_RX_PKT_CNT ||
-             opcode == HCLGE_OPC_QUERY_PFC_TX_PKT_CNT))
-               return -EINVAL;
-
-       for (i = 0; i < HCLGE_TM_PFC_PKT_GET_CMD_NUM - 1; i++) {
-               hclge_cmd_setup_basic_desc(&desc[i], opcode, true);
-               desc[i].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
-       }
-
-       hclge_cmd_setup_basic_desc(&desc[i], opcode, true);
+static const u16 hclge_pfc_tx_stats_offset[] = {
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri0_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri1_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri2_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri3_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri4_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri5_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri6_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri7_pkt_num)
+};
 
-       ret = hclge_cmd_send(&hdev->hw, desc, HCLGE_TM_PFC_PKT_GET_CMD_NUM);
-       if (ret)
-               return ret;
+static const u16 hclge_pfc_rx_stats_offset[] = {
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri0_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri1_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri2_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri3_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri4_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri5_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri6_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri7_pkt_num)
+};
 
-       for (i = 0; i < HCLGE_TM_PFC_PKT_GET_CMD_NUM; i++) {
-               struct hclge_pfc_stats_cmd *pfc_stats =
-                               (struct hclge_pfc_stats_cmd *)desc[i].data;
+static void hclge_pfc_stats_get(struct hclge_dev *hdev, bool tx, u64 *stats)
+{
+       const u16 *offset;
+       int i;
 
-               for (j = 0; j < HCLGE_TM_PFC_NUM_GET_PER_CMD; j++) {
-                       u32 index = i * HCLGE_TM_PFC_PKT_GET_CMD_NUM + j;
+       if (tx)
+               offset = hclge_pfc_tx_stats_offset;
+       else
+               offset = hclge_pfc_rx_stats_offset;
 
-                       if (index < HCLGE_MAX_TC_NUM)
-                               stats[index] =
-                                       le64_to_cpu(pfc_stats->pkt_num[j]);
-               }
-       }
-       return 0;
+       for (i = 0; i < HCLGE_MAX_TC_NUM; i++)
+               stats[i] = HCLGE_STATS_READ(&hdev->mac_stats, offset[i]);
 }
 
-int hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats)
+void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats)
 {
-       return hclge_pfc_stats_get(hdev, HCLGE_OPC_QUERY_PFC_RX_PKT_CNT, stats);
+       hclge_pfc_stats_get(hdev, false, stats);
 }
 
-int hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats)
+void hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats)
 {
-       return hclge_pfc_stats_get(hdev, HCLGE_OPC_QUERY_PFC_TX_PKT_CNT, stats);
+       hclge_pfc_stats_get(hdev, true, stats);
 }
 
 int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx)
@@ -1123,7 +1123,6 @@ static int hclge_tm_pri_tc_base_dwrr_cfg(struct hclge_dev *hdev)
 
 static int hclge_tm_ets_tc_dwrr_cfg(struct hclge_dev *hdev)
 {
-#define DEFAULT_TC_WEIGHT      1
 #define DEFAULT_TC_OFFSET      14
 
        struct hclge_ets_tc_weight_cmd *ets_weight;
@@ -1136,13 +1135,7 @@ static int hclge_tm_ets_tc_dwrr_cfg(struct hclge_dev *hdev)
        for (i = 0; i < HNAE3_MAX_TC; i++) {
                struct hclge_pg_info *pg_info;
 
-               ets_weight->tc_weight[i] = DEFAULT_TC_WEIGHT;
-
-               if (!(hdev->hw_tc_map & BIT(i)))
-                       continue;
-
-               pg_info =
-                       &hdev->tm_info.pg_info[hdev->tm_info.tc_info[i].pgid];
+               pg_info = &hdev->tm_info.pg_info[hdev->tm_info.tc_info[i].pgid];
                ets_weight->tc_weight[i] = pg_info->tc_dwrr[i];
        }
 
index 2ee9b795f71dc48c3b83f5a974b52ef75e548253..1db7f40b4525512e6af84853e28811cf2e6b7c07 100644 (file)
@@ -228,8 +228,8 @@ int hclge_tm_dwrr_cfg(struct hclge_dev *hdev);
 int hclge_tm_init_hw(struct hclge_dev *hdev, bool init);
 int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx);
 int hclge_pause_addr_cfg(struct hclge_dev *hdev, const u8 *mac_addr);
-int hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats);
-int hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats);
+void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats);
+void hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats);
 int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate);
 int hclge_tm_get_qset_num(struct hclge_dev *hdev, u16 *qset_num);
 int hclge_tm_get_pri_num(struct hclge_dev *hdev, u8 *pri_num);
index f89bfb352adfdcb556953f40618f0c52fb80dfec..e605c2c5bcce7db4804520fd3db917fd32ccd359 100644 (file)
@@ -434,8 +434,28 @@ err_csq:
        return ret;
 }
 
+static int hclgevf_firmware_compat_config(struct hclgevf_dev *hdev, bool en)
+{
+       struct hclgevf_firmware_compat_cmd *req;
+       struct hclgevf_desc desc;
+       u32 compat = 0;
+
+       hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_IMP_COMPAT_CFG, false);
+
+       if (en) {
+               req = (struct hclgevf_firmware_compat_cmd *)desc.data;
+
+               hnae3_set_bit(compat, HCLGEVF_SYNC_RX_RING_HEAD_EN_B, 1);
+
+               req->compat = cpu_to_le32(compat);
+       }
+
+       return hclgevf_cmd_send(&hdev->hw, &desc, 1);
+}
+
 int hclgevf_cmd_init(struct hclgevf_dev *hdev)
 {
+       struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
        int ret;
 
        spin_lock_bh(&hdev->hw.cmq.csq.lock);
@@ -484,6 +504,17 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
                 hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE0_MASK,
                                 HNAE3_FW_VERSION_BYTE0_SHIFT));
 
+       if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3) {
+               /* ask the firmware to enable some features, driver can work
+                * without it.
+                */
+               ret = hclgevf_firmware_compat_config(hdev, true);
+               if (ret)
+                       dev_warn(&hdev->pdev->dev,
+                                "Firmware compatible features not enabled(%d).\n",
+                                ret);
+       }
+
        return 0;
 
 err_cmd_init:
@@ -508,6 +539,7 @@ static void hclgevf_cmd_uninit_regs(struct hclgevf_hw *hw)
 
 void hclgevf_cmd_uninit(struct hclgevf_dev *hdev)
 {
+       hclgevf_firmware_compat_config(hdev, false);
        set_bit(HCLGEVF_STATE_CMD_DISABLE, &hdev->state);
        /* wait to ensure that the firmware completes the possible left
         * over commands.
index 39d0b589c720aa3361ddcc67f1efae0a61abb6b3..edc9e154061afb763038f6d5173d1219e581eaf1 100644 (file)
 struct hclgevf_hw;
 struct hclgevf_dev;
 
+#define HCLGEVF_SYNC_RX_RING_HEAD_EN_B 4
+struct hclgevf_firmware_compat_cmd {
+       __le32 compat;
+       u8 rsv[20];
+};
+
 struct hclgevf_desc {
        __le16 opcode;
        __le16 flag;
@@ -107,6 +113,9 @@ enum hclgevf_opcode_type {
        HCLGEVF_OPC_RSS_TC_MODE         = 0x0D08,
        /* Mailbox cmd */
        HCLGEVF_OPC_MBX_VF_TO_PF        = 0x2001,
+
+       /* IMP stats command */
+       HCLGEVF_OPC_IMP_COMPAT_CFG      = 0x701A,
 };
 
 #define HCLGEVF_TQP_REG_OFFSET         0x80000
index 645b2c0011e6bc71cd4ce8bd2e06d9cbdcc93106..25c419d40066dc2cbeacd6f4caff5124aa96d40a 100644 (file)
@@ -2557,7 +2557,7 @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev)
            hdev->num_msi_left == 0)
                return -EINVAL;
 
-       roce->rinfo.base_vector = hdev->roce_base_vector;
+       roce->rinfo.base_vector = hdev->roce_base_msix_offset;
 
        roce->rinfo.netdev = nic->kinfo.netdev;
        roce->rinfo.roce_io_base = hdev->hw.io_base;
@@ -2823,9 +2823,6 @@ static int hclgevf_init_msi(struct hclgevf_dev *hdev)
        hdev->num_msi = vectors;
        hdev->num_msi_left = vectors;
 
-       hdev->base_msi_vector = pdev->irq;
-       hdev->roce_base_vector = pdev->irq + hdev->roce_base_msix_offset;
-
        hdev->vector_status = devm_kcalloc(&pdev->dev, hdev->num_msi,
                                           sizeof(u16), GFP_KERNEL);
        if (!hdev->vector_status) {
@@ -3013,7 +3010,10 @@ static void hclgevf_uninit_client_instance(struct hnae3_client *client,
 
        /* un-init roce, if it exists */
        if (hdev->roce_client) {
+               while (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state))
+                       msleep(HCLGEVF_WAIT_RESET_DONE);
                clear_bit(HCLGEVF_STATE_ROCE_REGISTERED, &hdev->state);
+
                hdev->roce_client->ops->uninit_instance(&hdev->roce, 0);
                hdev->roce_client = NULL;
                hdev->roce.client = NULL;
@@ -3022,6 +3022,8 @@ static void hclgevf_uninit_client_instance(struct hnae3_client *client,
        /* un-init nic/unic, if this was not called by roce client */
        if (client->ops->uninit_instance && hdev->nic_client &&
            client->type != HNAE3_CLIENT_ROCE) {
+               while (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state))
+                       msleep(HCLGEVF_WAIT_RESET_DONE);
                clear_bit(HCLGEVF_STATE_NIC_REGISTERED, &hdev->state);
 
                client->ops->uninit_instance(&hdev->nic, 0);
index 28288d7e33032c33d679d3667591e30a345793b0..f6f736c0091c050cf5ca7aae460c560a774e2d32 100644 (file)
 #define HCLGEVF_VF_RST_ING             0x07008
 #define HCLGEVF_VF_RST_ING_BIT         BIT(16)
 
+#define HCLGEVF_WAIT_RESET_DONE                100
+
 #define HCLGEVF_RSS_IND_TBL_SIZE               512
 #define HCLGEVF_RSS_SET_BITMAP_MSK     0xffff
 #define HCLGEVF_RSS_KEY_SIZE           40
@@ -308,8 +310,6 @@ struct hclgevf_dev {
        u16 num_nic_msix;       /* Num of nic vectors for this VF */
        u16 num_roce_msix;      /* Num of roce vectors for this VF */
        u16 roce_base_msix_offset;
-       int roce_base_vector;
-       u32 base_msi_vector;
        u16 *vector_status;
        int *vector_irq;
 
index bf4ecd9a517c8d772a3f35b127b5cb165f3a442b..b2db39ee5f85c0c3a3b802f4bb5d2c0bb035d3ae 100644 (file)
 #define ice_for_each_chnl_tc(i)        \
        for ((i) = ICE_CHNL_START_TC; (i) < ICE_CHNL_MAX_TC; (i)++)
 
-#define ICE_UCAST_PROMISC_BITS (ICE_PROMISC_UCAST_TX | ICE_PROMISC_MCAST_TX | \
-                               ICE_PROMISC_UCAST_RX | ICE_PROMISC_MCAST_RX)
+#define ICE_UCAST_PROMISC_BITS (ICE_PROMISC_UCAST_TX | ICE_PROMISC_UCAST_RX)
 
 #define ICE_UCAST_VLAN_PROMISC_BITS (ICE_PROMISC_UCAST_TX | \
-                                    ICE_PROMISC_MCAST_TX | \
                                     ICE_PROMISC_UCAST_RX | \
-                                    ICE_PROMISC_MCAST_RX | \
                                     ICE_PROMISC_VLAN_TX  | \
                                     ICE_PROMISC_VLAN_RX)
 
index fa6cd63cbf1f0994d7634e35e0921ed9952b71f0..1efc635cc0f5e2e774a0e2faee8435f750f168f5 100644 (file)
@@ -962,7 +962,7 @@ ice_vsi_stop_tx_ring(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,
        } else if (status == ICE_ERR_DOES_NOT_EXIST) {
                dev_dbg(ice_pf_to_dev(vsi->back), "LAN Tx queues do not exist, nothing to disable\n");
        } else if (status) {
-               dev_err(ice_pf_to_dev(vsi->back), "Failed to disable LAN Tx queues, error: %s\n",
+               dev_dbg(ice_pf_to_dev(vsi->back), "Failed to disable LAN Tx queues, error: %s\n",
                        ice_stat_str(status));
                return -ENODEV;
        }
index 2ac21484b8766925698df4105095618b5e7ab819..217ff5e9a6f1434d00c67b8945048411ab315024 100644 (file)
@@ -638,8 +638,7 @@ void ice_free_vfs(struct ice_pf *pf)
 
        /* Avoid wait time by stopping all VFs at the same time */
        ice_for_each_vf(pf, i)
-               if (test_bit(ICE_VF_STATE_QS_ENA, pf->vf[i].vf_states))
-                       ice_dis_vf_qs(&pf->vf[i]);
+               ice_dis_vf_qs(&pf->vf[i]);
 
        tmp = pf->num_alloc_vfs;
        pf->num_qps_per_vf = 0;
@@ -651,6 +650,8 @@ void ice_free_vfs(struct ice_pf *pf)
                        set_bit(ICE_VF_STATE_DIS, pf->vf[i].vf_states);
                        ice_free_vf_res(&pf->vf[i]);
                }
+
+               mutex_destroy(&pf->vf[i].cfg_lock);
        }
 
        if (ice_sriov_free_msix_res(pf))
@@ -1695,8 +1696,7 @@ bool ice_reset_vf(struct ice_vf *vf, bool is_vflr)
 
        vsi = ice_get_vf_vsi(vf);
 
-       if (test_bit(ICE_VF_STATE_QS_ENA, vf->vf_states))
-               ice_dis_vf_qs(vf);
+       ice_dis_vf_qs(vf);
 
        /* Call Disable LAN Tx queue AQ whether or not queues are
         * enabled. This is needed for successful completion of VFR.
@@ -1948,6 +1948,8 @@ static void ice_set_dflt_settings_vfs(struct ice_pf *pf)
                ice_vf_fdir_init(vf);
 
                ice_vc_set_dflt_vf_ops(&vf->vc_ops);
+
+               mutex_init(&vf->cfg_lock);
        }
 }
 
@@ -3013,6 +3015,7 @@ bool ice_is_any_vf_in_promisc(struct ice_pf *pf)
 static int ice_vc_cfg_promiscuous_mode_msg(struct ice_vf *vf, u8 *msg)
 {
        enum virtchnl_status_code v_ret = VIRTCHNL_STATUS_SUCCESS;
+       enum ice_status mcast_status = 0, ucast_status = 0;
        bool rm_promisc, alluni = false, allmulti = false;
        struct virtchnl_promisc_info *info =
            (struct virtchnl_promisc_info *)msg;
@@ -3054,24 +3057,6 @@ static int ice_vc_cfg_promiscuous_mode_msg(struct ice_vf *vf, u8 *msg)
        rm_promisc = !allmulti && !alluni;
 
        if (vsi->num_vlan || vf->port_vlan_info) {
-               struct ice_vsi *pf_vsi = ice_get_main_vsi(pf);
-               struct net_device *pf_netdev;
-
-               if (!pf_vsi) {
-                       v_ret = VIRTCHNL_STATUS_ERR_PARAM;
-                       goto error_param;
-               }
-
-               pf_netdev = pf_vsi->netdev;
-
-               ret = ice_set_vf_spoofchk(pf_netdev, vf->vf_id, rm_promisc);
-               if (ret) {
-                       dev_err(dev, "Failed to update spoofchk to %s for VF %d VSI %d when setting promiscuous mode\n",
-                               rm_promisc ? "ON" : "OFF", vf->vf_id,
-                               vsi->vsi_num);
-                       v_ret = VIRTCHNL_STATUS_ERR_PARAM;
-               }
-
                if (rm_promisc)
                        ret = ice_cfg_vlan_pruning(vsi, true);
                else
@@ -3105,52 +3090,51 @@ static int ice_vc_cfg_promiscuous_mode_msg(struct ice_vf *vf, u8 *msg)
                        goto error_param;
                }
        } else {
-               enum ice_status status;
-               u8 promisc_m;
-
-               if (alluni) {
-                       if (vf->port_vlan_info || vsi->num_vlan)
-                               promisc_m = ICE_UCAST_VLAN_PROMISC_BITS;
-                       else
-                               promisc_m = ICE_UCAST_PROMISC_BITS;
-               } else if (allmulti) {
-                       if (vf->port_vlan_info || vsi->num_vlan)
-                               promisc_m = ICE_MCAST_VLAN_PROMISC_BITS;
-                       else
-                               promisc_m = ICE_MCAST_PROMISC_BITS;
+               u8 mcast_m, ucast_m;
+
+               if (vf->port_vlan_info || vsi->num_vlan > 1) {
+                       mcast_m = ICE_MCAST_VLAN_PROMISC_BITS;
+                       ucast_m = ICE_UCAST_VLAN_PROMISC_BITS;
                } else {
-                       if (vf->port_vlan_info || vsi->num_vlan)
-                               promisc_m = ICE_UCAST_VLAN_PROMISC_BITS;
-                       else
-                               promisc_m = ICE_UCAST_PROMISC_BITS;
+                       mcast_m = ICE_MCAST_PROMISC_BITS;
+                       ucast_m = ICE_UCAST_PROMISC_BITS;
                }
 
-               /* Configure multicast/unicast with or without VLAN promiscuous
-                * mode
-                */
-               status = ice_vf_set_vsi_promisc(vf, vsi, promisc_m, rm_promisc);
-               if (status) {
-                       dev_err(dev, "%sable Tx/Rx filter promiscuous mode on VF-%d failed, error: %s\n",
-                               rm_promisc ? "dis" : "en", vf->vf_id,
-                               ice_stat_str(status));
-                       v_ret = ice_err_to_virt_err(status);
-                       goto error_param;
-               } else {
-                       dev_dbg(dev, "%sable Tx/Rx filter promiscuous mode on VF-%d succeeded\n",
-                               rm_promisc ? "dis" : "en", vf->vf_id);
+               ucast_status = ice_vf_set_vsi_promisc(vf, vsi, ucast_m,
+                                                     !alluni);
+               if (ucast_status) {
+                       dev_err(dev, "%sable Tx/Rx filter promiscuous mode on VF-%d failed\n",
+                               alluni ? "en" : "dis", vf->vf_id);
+                       v_ret = ice_err_to_virt_err(ucast_status);
+               }
+
+               mcast_status = ice_vf_set_vsi_promisc(vf, vsi, mcast_m,
+                                                     !allmulti);
+               if (mcast_status) {
+                       dev_err(dev, "%sable Tx/Rx filter promiscuous mode on VF-%d failed\n",
+                               allmulti ? "en" : "dis", vf->vf_id);
+                       v_ret = ice_err_to_virt_err(mcast_status);
                }
        }
 
-       if (allmulti &&
-           !test_and_set_bit(ICE_VF_STATE_MC_PROMISC, vf->vf_states))
-               dev_info(dev, "VF %u successfully set multicast promiscuous mode\n", vf->vf_id);
-       else if (!allmulti && test_and_clear_bit(ICE_VF_STATE_MC_PROMISC, vf->vf_states))
-               dev_info(dev, "VF %u successfully unset multicast promiscuous mode\n", vf->vf_id);
+       if (!mcast_status) {
+               if (allmulti &&
+                   !test_and_set_bit(ICE_VF_STATE_MC_PROMISC, vf->vf_states))
+                       dev_info(dev, "VF %u successfully set multicast promiscuous mode\n",
+                                vf->vf_id);
+               else if (!allmulti && test_and_clear_bit(ICE_VF_STATE_MC_PROMISC, vf->vf_states))
+                       dev_info(dev, "VF %u successfully unset multicast promiscuous mode\n",
+                                vf->vf_id);
+       }
 
-       if (alluni && !test_and_set_bit(ICE_VF_STATE_UC_PROMISC, vf->vf_states))
-               dev_info(dev, "VF %u successfully set unicast promiscuous mode\n", vf->vf_id);
-       else if (!alluni && test_and_clear_bit(ICE_VF_STATE_UC_PROMISC, vf->vf_states))
-               dev_info(dev, "VF %u successfully unset unicast promiscuous mode\n", vf->vf_id);
+       if (!ucast_status) {
+               if (alluni && !test_and_set_bit(ICE_VF_STATE_UC_PROMISC, vf->vf_states))
+                       dev_info(dev, "VF %u successfully set unicast promiscuous mode\n",
+                                vf->vf_id);
+               else if (!alluni && test_and_clear_bit(ICE_VF_STATE_UC_PROMISC, vf->vf_states))
+                       dev_info(dev, "VF %u successfully unset unicast promiscuous mode\n",
+                                vf->vf_id);
+       }
 
 error_param:
        return ice_vc_send_msg_to_vf(vf, VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE,
@@ -3824,6 +3808,7 @@ ice_vc_add_mac_addr(struct ice_vf *vf, struct ice_vsi *vsi,
        struct device *dev = ice_pf_to_dev(vf->pf);
        u8 *mac_addr = vc_ether_addr->addr;
        enum ice_status status;
+       int ret = 0;
 
        /* device MAC already added */
        if (ether_addr_equal(mac_addr, vf->dev_lan_addr.addr))
@@ -3836,20 +3821,23 @@ ice_vc_add_mac_addr(struct ice_vf *vf, struct ice_vsi *vsi,
 
        status = ice_fltr_add_mac(vsi, mac_addr, ICE_FWD_TO_VSI);
        if (status == ICE_ERR_ALREADY_EXISTS) {
-               dev_err(dev, "MAC %pM already exists for VF %d\n", mac_addr,
+               dev_dbg(dev, "MAC %pM already exists for VF %d\n", mac_addr,
                        vf->vf_id);
-               return -EEXIST;
+               /* don't return since we might need to update
+                * the primary MAC in ice_vfhw_mac_add() below
+                */
+               ret = -EEXIST;
        } else if (status) {
                dev_err(dev, "Failed to add MAC %pM for VF %d\n, error %s\n",
                        mac_addr, vf->vf_id, ice_stat_str(status));
                return -EIO;
+       } else {
+               vf->num_mac++;
        }
 
        ice_vfhw_mac_add(vf, vc_ether_addr);
 
-       vf->num_mac++;
-
-       return 0;
+       return ret;
 }
 
 /**
@@ -4151,6 +4139,8 @@ ice_set_vf_port_vlan(struct net_device *netdev, int vf_id, u16 vlan_id, u8 qos,
                return 0;
        }
 
+       mutex_lock(&vf->cfg_lock);
+
        vf->port_vlan_info = vlanprio;
 
        if (vf->port_vlan_info)
@@ -4160,6 +4150,7 @@ ice_set_vf_port_vlan(struct net_device *netdev, int vf_id, u16 vlan_id, u8 qos,
                dev_info(dev, "Clearing port VLAN on VF %d\n", vf_id);
 
        ice_vc_reset_vf(vf);
+       mutex_unlock(&vf->cfg_lock);
 
        return 0;
 }
@@ -4699,6 +4690,15 @@ error_handler:
                return;
        }
 
+       /* VF is being configured in another context that triggers a VFR, so no
+        * need to process this message
+        */
+       if (!mutex_trylock(&vf->cfg_lock)) {
+               dev_info(dev, "VF %u is being configured in another context that will trigger a VFR, so there is no need to handle this message\n",
+                        vf->vf_id);
+               return;
+       }
+
        switch (v_opcode) {
        case VIRTCHNL_OP_VERSION:
                err = ops->get_ver_msg(vf, msg);
@@ -4787,6 +4787,8 @@ error_handler:
                dev_info(dev, "PF failed to honor VF %d, opcode %d, error %d\n",
                         vf_id, v_opcode, err);
        }
+
+       mutex_unlock(&vf->cfg_lock);
 }
 
 /**
@@ -4902,6 +4904,8 @@ int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
                return -EINVAL;
        }
 
+       mutex_lock(&vf->cfg_lock);
+
        /* VF is notified of its new MAC via the PF's response to the
         * VIRTCHNL_OP_GET_VF_RESOURCES message after the VF has been reset
         */
@@ -4920,6 +4924,7 @@ int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
        }
 
        ice_vc_reset_vf(vf);
+       mutex_unlock(&vf->cfg_lock);
        return 0;
 }
 
@@ -4954,11 +4959,15 @@ int ice_set_vf_trust(struct net_device *netdev, int vf_id, bool trusted)
        if (trusted == vf->trusted)
                return 0;
 
+       mutex_lock(&vf->cfg_lock);
+
        vf->trusted = trusted;
        ice_vc_reset_vf(vf);
        dev_info(ice_pf_to_dev(pf), "VF %u is now %strusted\n",
                 vf_id, trusted ? "" : "un");
 
+       mutex_unlock(&vf->cfg_lock);
+
        return 0;
 }
 
index 5ff93a08f54c94d4e54fd2461255ee71f0534220..7e28ecbbe7af0d4e8f8bca1bc91786ec7b9eb693 100644 (file)
@@ -100,6 +100,11 @@ struct ice_vc_vf_ops {
 struct ice_vf {
        struct ice_pf *pf;
 
+       /* Used during virtchnl message handling and NDO ops against the VF
+        * that will trigger a VFR
+        */
+       struct mutex cfg_lock;
+
        u16 vf_id;                      /* VF ID in the PF space */
        u16 lan_vsi_idx;                /* index into PF struct */
        u16 ctrl_vsi_idx;
index 2258e3f19161073e2d75c4fa4ec4a3f2af90de27..6433c909c6b26d3c0c19267312f2c8f95ba5f8a7 100644 (file)
@@ -262,7 +262,7 @@ ltq_etop_hw_init(struct net_device *dev)
        /* enable crc generation */
        ltq_etop_w32(PPE32_CGEN, LQ_PPE32_ENET_MAC_CFG);
 
-       ltq_dma_init_port(DMA_PORT_ETOP, priv->tx_burst_len, rx_burst_len);
+       ltq_dma_init_port(DMA_PORT_ETOP, priv->tx_burst_len, priv->rx_burst_len);
 
        for (i = 0; i < MAX_DMA_CHAN; i++) {
                int irq = LTQ_DMA_CH0_INT + i;
index 3d9385a4989b7ad52e53cac65c0e934f2121e3d3..fdd99f0de424dce95aba61410afcca7a8aa30838 100644 (file)
@@ -242,10 +242,8 @@ static int liteeth_probe(struct platform_device *pdev)
        priv->dev = &pdev->dev;
 
        irq = platform_get_irq(pdev, 0);
-       if (irq < 0) {
-               dev_err(&pdev->dev, "Failed to get IRQ %d\n", irq);
+       if (irq < 0)
                return irq;
-       }
        netdev->irq = irq;
 
        priv->base = devm_platform_ioremap_resource_byname(pdev, "mac");
@@ -289,7 +287,6 @@ static int liteeth_remove(struct platform_device *pdev)
        struct net_device *netdev = platform_get_drvdata(pdev);
 
        unregister_netdev(netdev);
-       free_netdev(netdev);
 
        return 0;
 }
index 587def69a6f75cc58a18a91dd365edb254058175..2b18d89d9756d8e08df8b0a698920f5267810677 100644 (file)
@@ -1605,7 +1605,7 @@ static void mvpp22_gop_fca_set_periodic_timer(struct mvpp2_port *port)
        mvpp22_gop_fca_enable_periodic(port, true);
 }
 
-static int mvpp22_gop_init(struct mvpp2_port *port)
+static int mvpp22_gop_init(struct mvpp2_port *port, phy_interface_t interface)
 {
        struct mvpp2 *priv = port->priv;
        u32 val;
@@ -1613,7 +1613,7 @@ static int mvpp22_gop_init(struct mvpp2_port *port)
        if (!priv->sysctrl_base)
                return 0;
 
-       switch (port->phy_interface) {
+       switch (interface) {
        case PHY_INTERFACE_MODE_RGMII:
        case PHY_INTERFACE_MODE_RGMII_ID:
        case PHY_INTERFACE_MODE_RGMII_RXID:
@@ -1743,15 +1743,15 @@ static void mvpp22_gop_setup_irq(struct mvpp2_port *port)
  * lanes by the physical layer. This is why configurations like
  * "PPv2 (2500BaseX) - COMPHY (2500SGMII)" are valid.
  */
-static int mvpp22_comphy_init(struct mvpp2_port *port)
+static int mvpp22_comphy_init(struct mvpp2_port *port,
+                             phy_interface_t interface)
 {
        int ret;
 
        if (!port->comphy)
                return 0;
 
-       ret = phy_set_mode_ext(port->comphy, PHY_MODE_ETHERNET,
-                              port->phy_interface);
+       ret = phy_set_mode_ext(port->comphy, PHY_MODE_ETHERNET, interface);
        if (ret)
                return ret;
 
@@ -2172,7 +2172,8 @@ static void mvpp22_pcs_reset_assert(struct mvpp2_port *port)
        writel(val & ~MVPP22_XPCS_CFG0_RESET_DIS, xpcs + MVPP22_XPCS_CFG0);
 }
 
-static void mvpp22_pcs_reset_deassert(struct mvpp2_port *port)
+static void mvpp22_pcs_reset_deassert(struct mvpp2_port *port,
+                                     phy_interface_t interface)
 {
        struct mvpp2 *priv = port->priv;
        void __iomem *mpcs, *xpcs;
@@ -2184,7 +2185,7 @@ static void mvpp22_pcs_reset_deassert(struct mvpp2_port *port)
        mpcs = priv->iface_base + MVPP22_MPCS_BASE(port->gop_id);
        xpcs = priv->iface_base + MVPP22_XPCS_BASE(port->gop_id);
 
-       switch (port->phy_interface) {
+       switch (interface) {
        case PHY_INTERFACE_MODE_10GBASER:
                val = readl(mpcs + MVPP22_MPCS_CLK_RESET);
                val |= MAC_CLK_RESET_MAC | MAC_CLK_RESET_SD_RX |
@@ -4529,7 +4530,8 @@ static int mvpp2_poll(struct napi_struct *napi, int budget)
        return rx_done;
 }
 
-static void mvpp22_mode_reconfigure(struct mvpp2_port *port)
+static void mvpp22_mode_reconfigure(struct mvpp2_port *port,
+                                   phy_interface_t interface)
 {
        u32 ctrl3;
 
@@ -4540,18 +4542,18 @@ static void mvpp22_mode_reconfigure(struct mvpp2_port *port)
        mvpp22_pcs_reset_assert(port);
 
        /* comphy reconfiguration */
-       mvpp22_comphy_init(port);
+       mvpp22_comphy_init(port, interface);
 
        /* gop reconfiguration */
-       mvpp22_gop_init(port);
+       mvpp22_gop_init(port, interface);
 
-       mvpp22_pcs_reset_deassert(port);
+       mvpp22_pcs_reset_deassert(port, interface);
 
        if (mvpp2_port_supports_xlg(port)) {
                ctrl3 = readl(port->base + MVPP22_XLG_CTRL3_REG);
                ctrl3 &= ~MVPP22_XLG_CTRL3_MACMODESELECT_MASK;
 
-               if (mvpp2_is_xlg(port->phy_interface))
+               if (mvpp2_is_xlg(interface))
                        ctrl3 |= MVPP22_XLG_CTRL3_MACMODESELECT_10G;
                else
                        ctrl3 |= MVPP22_XLG_CTRL3_MACMODESELECT_GMAC;
@@ -4559,7 +4561,7 @@ static void mvpp22_mode_reconfigure(struct mvpp2_port *port)
                writel(ctrl3, port->base + MVPP22_XLG_CTRL3_REG);
        }
 
-       if (mvpp2_port_supports_xlg(port) && mvpp2_is_xlg(port->phy_interface))
+       if (mvpp2_port_supports_xlg(port) && mvpp2_is_xlg(interface))
                mvpp2_xlg_max_rx_size_set(port);
        else
                mvpp2_gmac_max_rx_size_set(port);
@@ -4579,7 +4581,7 @@ static void mvpp2_start_dev(struct mvpp2_port *port)
        mvpp2_interrupts_enable(port);
 
        if (port->priv->hw_version >= MVPP22)
-               mvpp22_mode_reconfigure(port);
+               mvpp22_mode_reconfigure(port, port->phy_interface);
 
        if (port->phylink) {
                phylink_start(port->phylink);
@@ -6444,6 +6446,9 @@ static int mvpp2__mac_prepare(struct phylink_config *config, unsigned int mode,
                        mvpp22_gop_mask_irq(port);
 
                        phy_power_off(port->comphy);
+
+                       /* Reconfigure the serdes lanes */
+                       mvpp22_mode_reconfigure(port, interface);
                }
        }
 
@@ -6498,9 +6503,6 @@ static int mvpp2_mac_finish(struct phylink_config *config, unsigned int mode,
            port->phy_interface != interface) {
                port->phy_interface = interface;
 
-               /* Reconfigure the serdes lanes */
-               mvpp22_mode_reconfigure(port);
-
                /* Unmask interrupts */
                mvpp22_gop_unmask_irq(port);
        }
@@ -6961,7 +6963,7 @@ static int mvpp2_port_probe(struct platform_device *pdev,
         * driver does this, we can remove this code.
         */
        if (port->comphy) {
-               err = mvpp22_comphy_init(port);
+               err = mvpp22_comphy_init(port, port->phy_interface);
                if (err == 0)
                        phy_power_off(port->comphy);
        }
index 3f982ccf2c85f7069af9a3db2510a47cac837074..639893d870550cafae53b09d3c22abb6a5e96159 100644 (file)
@@ -31,6 +31,7 @@ config NDC_DIS_DYNAMIC_CACHING
 config OCTEONTX2_PF
        tristate "Marvell OcteonTX2 NIC Physical Function driver"
        select OCTEONTX2_MBOX
+       select NET_DEVLINK
        depends on (64BIT && COMPILE_TEST) || ARM64
        depends on PCI
        depends on PTP_1588_CLOCK_OPTIONAL
index bb6b42bbefa44debd2a581caec0d2a88db296a4b..c0005a1feee69ff178a1495b4594670da9aaa512 100644 (file)
@@ -2450,9 +2450,7 @@ alloc:
                bmap = mcam->bmap_reverse;
                start = mcam->bmap_entries - start;
                end = mcam->bmap_entries - end;
-               index = start;
-               start = end;
-               end = index;
+               swap(start, end);
        } else {
                bmap = mcam->bmap;
        }
index e6cb8cd0787d3094a97413e3a96467a4ec09cd63..78944ad3492ff0a6cc698883826fab1e3488686f 100644 (file)
@@ -501,7 +501,7 @@ static const struct net_device_ops otx2vf_netdev_ops = {
        .ndo_set_features = otx2vf_set_features,
        .ndo_get_stats64 = otx2_get_stats64,
        .ndo_tx_timeout = otx2_tx_timeout,
-       .ndo_do_ioctl   = otx2_ioctl,
+       .ndo_eth_ioctl  = otx2_ioctl,
 };
 
 static int otx2_wq_init(struct otx2_nic *vf)
index 6011454dba71f239e3b4b64b61a53a22a201c8d2..40d5b89573bb0bff078cc8c9ba77b6d3dca7787a 100644 (file)
@@ -499,7 +499,8 @@ static void prestera_port_mdix_get(struct ethtool_link_ksettings *ecmd,
 {
        struct prestera_port_phy_state *state = &port->state_phy;
 
-       if (prestera_hw_port_phy_mode_get(port, &state->mdix, NULL, NULL, NULL)) {
+       if (prestera_hw_port_phy_mode_get(port,
+                                         &state->mdix, NULL, NULL, NULL)) {
                netdev_warn(port->dev, "MDIX params get failed");
                state->mdix = ETH_TP_MDI_INVALID;
        }
index 41ba17cb29657392961525c9fd4d85163a750e1e..9b8b1ed474fce16c4d31ef4b8546019346aa9441 100644 (file)
@@ -180,108 +180,113 @@ struct prestera_msg_common_resp {
        struct prestera_msg_ret ret;
 };
 
-union prestera_msg_switch_param {
-       u8 mac[ETH_ALEN];
-       __le32 ageing_timeout_ms;
-} __packed;
-
 struct prestera_msg_switch_attr_req {
        struct prestera_msg_cmd cmd;
        __le32 attr;
-       union prestera_msg_switch_param param;
+       union {
+               __le32 ageing_timeout_ms;
+               struct {
+                       u8 mac[ETH_ALEN];
+                       u8 __pad[2];
+               };
+       } param;
 };
 
 struct prestera_msg_switch_init_resp {
        struct prestera_msg_ret ret;
        __le32 port_count;
        __le32 mtu_max;
-       u8  switch_id;
-       u8  lag_max;
-       u8  lag_member_max;
        __le32 size_tbl_router_nexthop;
-} __packed __aligned(4);
+       u8 switch_id;
+       u8 lag_max;
+       u8 lag_member_max;
+};
 
 struct prestera_msg_event_port_param {
        union {
                struct {
-                       u8 oper;
                        __le32 mode;
                        __le32 speed;
+                       u8 oper;
                        u8 duplex;
                        u8 fc;
                        u8 fec;
-               } __packed mac;
+               } mac;
                struct {
-                       u8 mdix;
                        __le64 lmode_bmap;
+                       u8 mdix;
                        u8 fc;
-               } __packed phy;
-       } __packed;
-} __packed __aligned(4);
+                       u8 __pad[2];
+               } __packed phy; /* make sure always 12 bytes size */
+       };
+};
 
 struct prestera_msg_port_cap_param {
        __le64 link_mode;
-       u8  type;
-       u8  fec;
-       u8  fc;
-       u8  transceiver;
+       u8 type;
+       u8 fec;
+       u8 fc;
+       u8 transceiver;
 };
 
 struct prestera_msg_port_flood_param {
        u8 type;
        u8 enable;
+       u8 __pad[2];
 };
 
 union prestera_msg_port_param {
+       __le32 mtu;
+       __le32 speed;
+       __le32 link_mode;
        u8 admin_state;
        u8 oper_state;
-       __le32 mtu;
        u8 mac[ETH_ALEN];
        u8 accept_frm_type;
-       __le32 speed;
        u8 learning;
        u8 flood;
-       __le32 link_mode;
        u8 type;
        u8 duplex;
        u8 fec;
        u8 fc;
-
        union {
                struct {
-                       u8 admin:1;
+                       u8 admin;
                        u8 fc;
                        u8 ap_enable;
+                       u8 __reserved[5];
                        union {
                                struct {
                                        __le32 mode;
-                                       u8  inband:1;
                                        __le32 speed;
-                                       u8  duplex;
-                                       u8  fec;
-                                       u8  fec_supp;
-                               } __packed reg_mode;
+                                       u8 inband;
+                                       u8 duplex;
+                                       u8 fec;
+                                       u8 fec_supp;
+                               } reg_mode;
                                struct {
                                        __le32 mode;
                                        __le32 speed;
-                                       u8  fec;
-                                       u8  fec_supp;
-                               } __packed ap_modes[PRESTERA_AP_PORT_MAX];
-                       } __packed;
-               } __packed mac;
+                                       u8 fec;
+                                       u8 fec_supp;
+                                       u8 __pad[2];
+                               } ap_modes[PRESTERA_AP_PORT_MAX];
+                       };
+               } mac;
                struct {
-                       u8 admin:1;
-                       u8 adv_enable;
                        __le64 modes;
                        __le32 mode;
+                       u8 admin;
+                       u8 adv_enable;
                        u8 mdix;
-               } __packed phy;
-       } __packed link;
+                       u8 __pad;
+               } phy;
+       } link;
 
        struct prestera_msg_port_cap_param cap;
        struct prestera_msg_port_flood_param flood_ext;
        struct prestera_msg_event_port_param link_evt;
-} __packed;
+};
 
 struct prestera_msg_port_attr_req {
        struct prestera_msg_cmd cmd;
@@ -289,14 +294,12 @@ struct prestera_msg_port_attr_req {
        __le32 port;
        __le32 dev;
        union prestera_msg_port_param param;
-} __packed __aligned(4);
-
+};
 
 struct prestera_msg_port_attr_resp {
        struct prestera_msg_ret ret;
        union prestera_msg_port_param param;
-} __packed __aligned(4);
-
+};
 
 struct prestera_msg_port_stats_resp {
        struct prestera_msg_ret ret;
@@ -313,6 +316,7 @@ struct prestera_msg_port_info_resp {
        __le32 hw_id;
        __le32 dev_id;
        __le16 fp_id;
+       u8 pad[2];
 };
 
 struct prestera_msg_vlan_req {
@@ -320,13 +324,13 @@ struct prestera_msg_vlan_req {
        __le32 port;
        __le32 dev;
        __le16 vid;
-       u8  is_member;
-       u8  is_tagged;
+       u8 is_member;
+       u8 is_tagged;
 };
 
 struct prestera_msg_fdb_req {
        struct prestera_msg_cmd cmd;
-       u8 dest_type;
+       __le32 flush_mode;
        union {
                struct {
                        __le32 port;
@@ -334,22 +338,25 @@ struct prestera_msg_fdb_req {
                };
                __le16 lag_id;
        } dest;
-       u8  mac[ETH_ALEN];
        __le16 vid;
-       u8  dynamic;
-       __le32 flush_mode;
-} __packed __aligned(4);
+       u8 dest_type;
+       u8 dynamic;
+       u8 mac[ETH_ALEN];
+       u8 __pad[2];
+};
 
 struct prestera_msg_bridge_req {
        struct prestera_msg_cmd cmd;
        __le32 port;
        __le32 dev;
        __le16 bridge;
+       u8 pad[2];
 };
 
 struct prestera_msg_bridge_resp {
        struct prestera_msg_ret ret;
        __le16 bridge;
+       u8 pad[2];
 };
 
 struct prestera_msg_acl_action {
@@ -359,11 +366,12 @@ struct prestera_msg_acl_action {
 
 struct prestera_msg_acl_match {
        __le32 type;
+       __le32 __reserved;
        union {
                struct {
                        u8 key;
                        u8 mask;
-               } __packed u8;
+               } u8;
                struct {
                        __le16 key;
                        __le16 mask;
@@ -379,7 +387,7 @@ struct prestera_msg_acl_match {
                struct {
                        u8 key[ETH_ALEN];
                        u8 mask[ETH_ALEN];
-               } __packed mac;
+               } mac;
        } keymask;
 };
 
@@ -408,16 +416,19 @@ struct prestera_msg_acl_ruleset_bind_req {
        __le32 port;
        __le32 dev;
        __le16 ruleset_id;
+       u8 pad[2];
 };
 
 struct prestera_msg_acl_ruleset_req {
        struct prestera_msg_cmd cmd;
        __le16 id;
+       u8 pad[2];
 };
 
 struct prestera_msg_acl_ruleset_resp {
        struct prestera_msg_ret ret;
        __le16 id;
+       u8 pad[2];
 };
 
 struct prestera_msg_span_req {
@@ -425,11 +436,13 @@ struct prestera_msg_span_req {
        __le32 port;
        __le32 dev;
        u8 id;
+       u8 pad[3];
 };
 
 struct prestera_msg_span_resp {
        struct prestera_msg_ret ret;
        u8 id;
+       u8 pad[3];
 };
 
 struct prestera_msg_stp_req {
@@ -437,12 +450,14 @@ struct prestera_msg_stp_req {
        __le32 port;
        __le32 dev;
        __le16 vid;
-       u8  state;
+       u8 state;
+       u8 __pad;
 };
 
 struct prestera_msg_rxtx_req {
        struct prestera_msg_cmd cmd;
        u8 use_sdma;
+       u8 pad[3];
 };
 
 struct prestera_msg_rxtx_resp {
@@ -455,12 +470,14 @@ struct prestera_msg_lag_req {
        __le32 port;
        __le32 dev;
        __le16 lag_id;
+       u8 pad[2];
 };
 
 struct prestera_msg_cpu_code_counter_req {
        struct prestera_msg_cmd cmd;
        u8 counter_type;
        u8 code;
+       u8 pad[2];
 };
 
 struct mvsw_msg_cpu_code_counter_ret {
@@ -485,21 +502,21 @@ union prestera_msg_event_fdb_param {
 
 struct prestera_msg_event_fdb {
        struct prestera_msg_event id;
-       u8 dest_type;
+       __le32 vid;
        union {
                __le32 port_id;
                __le16 lag_id;
        } dest;
-       __le32 vid;
        union prestera_msg_event_fdb_param param;
-} __packed __aligned(4);
+       u8 dest_type;
+};
 
-static inline void prestera_hw_build_tests(void)
+static void prestera_hw_build_tests(void)
 {
        /* check requests */
        BUILD_BUG_ON(sizeof(struct prestera_msg_common_req) != 4);
        BUILD_BUG_ON(sizeof(struct prestera_msg_switch_attr_req) != 16);
-       BUILD_BUG_ON(sizeof(struct prestera_msg_port_attr_req) != 120);
+       BUILD_BUG_ON(sizeof(struct prestera_msg_port_attr_req) != 144);
        BUILD_BUG_ON(sizeof(struct prestera_msg_port_info_req) != 8);
        BUILD_BUG_ON(sizeof(struct prestera_msg_vlan_req) != 16);
        BUILD_BUG_ON(sizeof(struct prestera_msg_fdb_req) != 28);
@@ -516,7 +533,7 @@ static inline void prestera_hw_build_tests(void)
        /* check responses */
        BUILD_BUG_ON(sizeof(struct prestera_msg_common_resp) != 8);
        BUILD_BUG_ON(sizeof(struct prestera_msg_switch_init_resp) != 24);
-       BUILD_BUG_ON(sizeof(struct prestera_msg_port_attr_resp) != 112);
+       BUILD_BUG_ON(sizeof(struct prestera_msg_port_attr_resp) != 136);
        BUILD_BUG_ON(sizeof(struct prestera_msg_port_stats_resp) != 248);
        BUILD_BUG_ON(sizeof(struct prestera_msg_port_info_resp) != 20);
        BUILD_BUG_ON(sizeof(struct prestera_msg_bridge_resp) != 12);
@@ -549,9 +566,9 @@ static int __prestera_cmd_ret(struct prestera_switch *sw,
        if (err)
                return err;
 
-       if (__le32_to_cpu(ret->cmd.type) != PRESTERA_CMD_TYPE_ACK)
+       if (ret->cmd.type != __cpu_to_le32(PRESTERA_CMD_TYPE_ACK))
                return -EBADE;
-       if (__le32_to_cpu(ret->status) != PRESTERA_CMD_ACK_OK)
+       if (ret->status != __cpu_to_le32(PRESTERA_CMD_ACK_OK))
                return -EINVAL;
 
        return 0;
@@ -1344,7 +1361,8 @@ int prestera_hw_port_speed_get(const struct prestera_port *port, u32 *speed)
 int prestera_hw_port_autoneg_restart(struct prestera_port *port)
 {
        struct prestera_msg_port_attr_req req = {
-               .attr = __cpu_to_le32(PRESTERA_CMD_PORT_ATTR_PHY_AUTONEG_RESTART),
+               .attr =
+                   __cpu_to_le32(PRESTERA_CMD_PORT_ATTR_PHY_AUTONEG_RESTART),
                .port = __cpu_to_le32(port->hw_id),
                .dev = __cpu_to_le32(port->dev_id),
        };
index 625b40149facfbb7bac9cb8892bbf7a6dc4a028e..4369a3ffad45b7c660c5a93ecb20225e5afa7f3c 100644 (file)
@@ -405,7 +405,8 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
 
        err = prestera_port_cfg_mac_write(port, &cfg_mac);
        if (err) {
-               dev_err(prestera_dev(sw), "Failed to set port(%u) mac mode\n", id);
+               dev_err(prestera_dev(sw),
+                       "Failed to set port(%u) mac mode\n", id);
                goto err_port_init;
        }
 
@@ -418,7 +419,8 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
                                                    false, 0, 0,
                                                    port->cfg_phy.mdix);
                if (err) {
-                       dev_err(prestera_dev(sw), "Failed to set port(%u) phy mode\n", id);
+                       dev_err(prestera_dev(sw),
+                               "Failed to set port(%u) phy mode\n", id);
                        goto err_port_init;
                }
        }
index d650082496d64cfa53914c90eb20559599998f0c..f538a749ebd4d21d0e4ce4e74ce7f1d7d1663987 100644 (file)
@@ -411,7 +411,8 @@ static int prestera_fw_cmd_send(struct prestera_fw *fw, int qid,
                goto cmd_exit;
        }
 
-       memcpy_fromio(out_msg, prestera_fw_cmdq_buf(fw, qid) + in_size, ret_size);
+       memcpy_fromio(out_msg,
+                     prestera_fw_cmdq_buf(fw, qid) + in_size, ret_size);
 
 cmd_exit:
        prestera_fw_write(fw, PRESTERA_CMDQ_REQ_CTL_REG(qid),
index adc836b3d857ff5d9e249a74ad4051ef3311646f..ad63dd45c8fb9dbf4d401e16c35f5343b41af857 100644 (file)
@@ -289,7 +289,7 @@ mlx5_lag_create_definer(struct mlx5_lag *ldev, enum netdev_lag_hash hash,
 
        lag_definer = kzalloc(sizeof(*lag_definer), GFP_KERNEL);
        if (!lag_definer)
-               return ERR_PTR(ENOMEM);
+               return ERR_PTR(-ENOMEM);
 
        match_definer_mask = kvzalloc(MLX5_FLD_SZ_BYTES(match_definer,
                                                        match_mask),
index c96ac81212f74c899c53782d6c12fcd8b85b6d78..636dfef24a6cf26e9663f14741b2a62421bc1bd1 100644 (file)
@@ -1424,7 +1424,7 @@ static void mana_gd_shutdown(struct pci_dev *pdev)
 {
        struct gdma_context *gc = pci_get_drvdata(pdev);
 
-       dev_info(&pdev->dev, "Shutdown was calledd\n");
+       dev_info(&pdev->dev, "Shutdown was called\n");
 
        mana_remove(&gc->mana, true);
 
index c68837a951f47eb1f73fb01207246201edcb1805..314c9c69eb0e940de66b80657606bb19fd8737d7 100644 (file)
@@ -817,9 +817,7 @@ ef4_realloc_channels(struct ef4_nic *efx, u32 rxq_entries, u32 txq_entries)
        efx->rxq_entries = rxq_entries;
        efx->txq_entries = txq_entries;
        for (i = 0; i < efx->n_channels; i++) {
-               channel = efx->channel[i];
-               efx->channel[i] = other_channel[i];
-               other_channel[i] = channel;
+               swap(efx->channel[i], other_channel[i]);
        }
 
        /* Restart buffer table allocation */
@@ -863,9 +861,7 @@ rollback:
        efx->rxq_entries = old_rxq_entries;
        efx->txq_entries = old_txq_entries;
        for (i = 0; i < efx->n_channels; i++) {
-               channel = efx->channel[i];
-               efx->channel[i] = other_channel[i];
-               other_channel[i] = channel;
+               swap(efx->channel[i], other_channel[i]);
        }
        goto out;
 }
index 8160087ee92f2fd4932581f1169635c0156b0177..1c4ea0b1b845b3c162f533656a0eadca56f8600e 100644 (file)
@@ -786,8 +786,6 @@ static int tc_setup_taprio(struct stmmac_priv *priv,
                goto disable;
        if (qopt->num_entries >= dep)
                return -EINVAL;
-       if (!qopt->base_time)
-               return -ERANGE;
        if (!qopt->cycle_time)
                return -ERANGE;
 
index 0c75e0576ee1f0817e1212ed3b785ed57b99e610..1ef0aaef5c61cd25d8b10c1e5396c622196a8b87 100644 (file)
@@ -1299,10 +1299,8 @@ struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
        if (!ale)
                return ERR_PTR(-ENOMEM);
 
-       ale->p0_untag_vid_mask =
-               devm_kmalloc_array(params->dev, BITS_TO_LONGS(VLAN_N_VID),
-                                  sizeof(unsigned long),
-                                  GFP_KERNEL);
+       ale->p0_untag_vid_mask = devm_bitmap_zalloc(params->dev, VLAN_N_VID,
+                                                   GFP_KERNEL);
        if (!ale->p0_untag_vid_mask)
                return ERR_PTR(-ENOMEM);
 
index 2d2dcf70563f3219d3c875a56796a720534f39ea..d55f06120ce7b65612403a4c3c3b260d3706e39b 100644 (file)
@@ -420,8 +420,20 @@ static int emac_set_coalesce(struct net_device *ndev,
        u32 int_ctrl, num_interrupts = 0;
        u32 prescale = 0, addnl_dvdr = 1, coal_intvl = 0;
 
-       if (!coal->rx_coalesce_usecs)
-               return -EINVAL;
+       if (!coal->rx_coalesce_usecs) {
+               priv->coal_intvl = 0;
+
+               switch (priv->version) {
+               case EMAC_VERSION_2:
+                       emac_ctrl_write(EMAC_DM646X_CMINTCTRL, 0);
+                       break;
+               default:
+                       emac_ctrl_write(EMAC_CTRL_EWINTTCNT, 0);
+                       break;
+               }
+
+               return 0;
+       }
 
        coal_intvl = coal->rx_coalesce_usecs;
 
index 49f10053a7943a3442ae095819220bccb1e84db0..bfdf89e54752c59b5b43f26ecccfac66f47cf907 100644 (file)
@@ -672,11 +672,13 @@ static void sixpack_close(struct tty_struct *tty)
        del_timer_sync(&sp->tx_t);
        del_timer_sync(&sp->resync_t);
 
-       /* Free all 6pack frame buffers. */
+       unregister_netdev(sp->dev);
+
+       /* Free all 6pack frame buffers after unreg. */
        kfree(sp->rbuff);
        kfree(sp->xbuff);
 
-       unregister_netdev(sp->dev);
+       free_netdev(sp->dev);
 }
 
 /* Perform I/O control on an active 6pack channel. */
index 867252a0247b1019a2cec072830f85c689ea06c4..e2b332b54f06d2babe198e51e03b02aed0980122 100644 (file)
@@ -792,13 +792,14 @@ static void mkiss_close(struct tty_struct *tty)
         */
        netif_stop_queue(ax->dev);
 
-       /* Free all AX25 frame buffers. */
-       kfree(ax->rbuff);
-       kfree(ax->xbuff);
-
        ax->tty = NULL;
 
        unregister_netdev(ax->dev);
+
+       /* Free all AX25 frame buffers after unreg. */
+       kfree(ax->rbuff);
+       kfree(ax->xbuff);
+
        free_netdev(ax->dev);
 }
 
index a4de3d2081c5c40d50f9188ea2987e5bbcbcd36b..bc50224d43dd3cfb821d0168684cdd69724f114b 100644 (file)
 #define LAN87XX_MASK_LINK_UP                    (0x0004)
 #define LAN87XX_MASK_LINK_DOWN                  (0x0002)
 
+/* MISC Control 1 Register */
+#define LAN87XX_CTRL_1                          (0x11)
+#define LAN87XX_MASK_RGMII_TXC_DLY_EN           (0x4000)
+#define LAN87XX_MASK_RGMII_RXC_DLY_EN           (0x2000)
+
 /* phyaccess nested types */
 #define        PHYACC_ATTR_MODE_READ           0
 #define        PHYACC_ATTR_MODE_WRITE          1
@@ -112,6 +117,43 @@ static int access_ereg_modify_changed(struct phy_device *phydev,
        return rc;
 }
 
+static int lan87xx_config_rgmii_delay(struct phy_device *phydev)
+{
+       int rc;
+
+       if (!phy_interface_is_rgmii(phydev))
+               return 0;
+
+       rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ,
+                        PHYACC_ATTR_BANK_MISC, LAN87XX_CTRL_1, 0);
+       if (rc < 0)
+               return rc;
+
+       switch (phydev->interface) {
+       case PHY_INTERFACE_MODE_RGMII:
+               rc &= ~LAN87XX_MASK_RGMII_TXC_DLY_EN;
+               rc &= ~LAN87XX_MASK_RGMII_RXC_DLY_EN;
+               break;
+       case PHY_INTERFACE_MODE_RGMII_ID:
+               rc |= LAN87XX_MASK_RGMII_TXC_DLY_EN;
+               rc |= LAN87XX_MASK_RGMII_RXC_DLY_EN;
+               break;
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+               rc &= ~LAN87XX_MASK_RGMII_TXC_DLY_EN;
+               rc |= LAN87XX_MASK_RGMII_RXC_DLY_EN;
+               break;
+       case PHY_INTERFACE_MODE_RGMII_TXID:
+               rc |= LAN87XX_MASK_RGMII_TXC_DLY_EN;
+               rc &= ~LAN87XX_MASK_RGMII_RXC_DLY_EN;
+               break;
+       default:
+               return 0;
+       }
+
+       return access_ereg(phydev, PHYACC_ATTR_MODE_WRITE,
+                          PHYACC_ATTR_BANK_MISC, LAN87XX_CTRL_1, rc);
+}
+
 static int lan87xx_phy_init(struct phy_device *phydev)
 {
        static const struct access_ereg_val init[] = {
@@ -185,7 +227,7 @@ static int lan87xx_phy_init(struct phy_device *phydev)
                        return rc;
        }
 
-       return 0;
+       return lan87xx_config_rgmii_delay(phydev);
 }
 
 static int lan87xx_phy_config_intr(struct phy_device *phydev)
index a3bfb156c83d7b101e16343df87da802e9a8bcf8..beb2b66da13246db6f668ae65f2037a693b44ff1 100644 (file)
@@ -815,7 +815,12 @@ int phy_ethtool_ksettings_set(struct phy_device *phydev,
        phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl;
 
        /* Restart the PHY */
-       _phy_start_aneg(phydev);
+       if (phy_is_started(phydev)) {
+               phydev->state = PHY_UP;
+               phy_trigger_machine(phydev);
+       } else {
+               _phy_start_aneg(phydev);
+       }
 
        mutex_unlock(&phydev->lock);
        return 0;
index 291fa449993fb553d2f937440957a238fb2cf419..4daac5fda073cf75623c5fa6bacb70233f0da0f3 100644 (file)
@@ -409,7 +409,7 @@ static int genmii_read_link(struct mii_phy *phy)
         * though magic-aneg shouldn't prevent this case from occurring
         */
 
-        return 0;
+       return 0;
 }
 
 static int generic_suspend(struct mii_phy* phy)
index b885a657023598b2b68f3fabd61504a681f4c3e4..825e8e5ffb2aedc8c32f0066e1451ab9b778b0b5 100644 (file)
@@ -394,12 +394,10 @@ void ipc_imem_sys_devlink_close(struct iosm_devlink *ipc_devlink)
        int boot_check_timeout = BOOT_CHECK_DEFAULT_TIMEOUT;
        enum ipc_mem_exec_stage exec_stage;
        struct ipc_mem_channel *channel;
-       enum ipc_phase curr_phase;
        int status = 0;
        u32 tail = 0;
 
        channel = ipc_imem->ipc_devlink->devlink_sio.channel;
-       curr_phase = ipc_imem->phase;
        /* Increase the total wait time to boot_check_timeout */
        do {
                exec_stage = ipc_mmio_get_exec_stage(ipc_imem->mmio);
index 787bcbd290f7b407455e6575bd9e6f3eaa3ca788..a491db46e3bd468e0c835b6c706a1252ea110987 100644 (file)
@@ -2216,7 +2216,7 @@ static int pn533_fill_fragment_skbs(struct pn533 *dev, struct sk_buff *skb)
                frag = pn533_alloc_skb(dev, frag_size);
                if (!frag) {
                        skb_queue_purge(&dev->fragment_skb);
-                       break;
+                       return -ENOMEM;
                }
 
                if (!dev->tgt_mode) {
@@ -2285,7 +2285,7 @@ static int pn533_transceive(struct nfc_dev *nfc_dev,
                /* jumbo frame ? */
                if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) {
                        rc = pn533_fill_fragment_skbs(dev, skb);
-                       if (rc <= 0)
+                       if (rc < 0)
                                goto error;
 
                        skb = skb_dequeue(&dev->fragment_skb);
@@ -2353,7 +2353,7 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb)
        /* let's split in multiple chunks if size's too big */
        if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) {
                rc = pn533_fill_fragment_skbs(dev, skb);
-               if (rc <= 0)
+               if (rc < 0)
                        goto error;
 
                /* get the first skb */
index 16ceb763594fc92654aa14b747cbb1d8a0379792..d7db1a0e6be1253fce4f284ac360e7c5360dc1f5 100644 (file)
@@ -624,7 +624,7 @@ static void port100_recv_response(struct urb *urb)
                break; /* success */
        case -ECONNRESET:
        case -ENOENT:
-               nfc_err(&dev->interface->dev,
+               nfc_dbg(&dev->interface->dev,
                        "The urb has been canceled (status %d)\n", urb->status);
                goto sched_wq;
        case -ESHUTDOWN:
@@ -678,7 +678,7 @@ static void port100_recv_ack(struct urb *urb)
                break; /* success */
        case -ECONNRESET:
        case -ENOENT:
-               nfc_err(&dev->interface->dev,
+               nfc_dbg(&dev->interface->dev,
                        "The urb has been stopped (status %d)\n", urb->status);
                goto sched_wq;
        case -ESHUTDOWN:
@@ -942,7 +942,7 @@ static void port100_send_complete(struct urb *urb)
                break; /* success */
        case -ECONNRESET:
        case -ENOENT:
-               nfc_err(&dev->interface->dev,
+               nfc_dbg(&dev->interface->dev,
                        "The urb has been stopped (status %d)\n", urb->status);
                break;
        case -ESHUTDOWN:
index a3311e93784754aecaa7065b9bd22be96a337869..4d326ee12c36a76e8a7755bd35170958dbbe2d96 100644 (file)
@@ -2795,7 +2795,6 @@ int usb_add_hcd(struct usb_hcd *hcd,
 {
        int retval;
        struct usb_device *rhdev;
-       struct usb_hcd *shared_hcd;
 
        if (!hcd->skip_phy_initialization && usb_hcd_is_primary_hcd(hcd)) {
                hcd->phy_roothub = usb_phy_roothub_alloc(hcd->self.sysdev);
@@ -2956,26 +2955,13 @@ int usb_add_hcd(struct usb_hcd *hcd,
                goto err_hcd_driver_start;
        }
 
-       /* starting here, usbcore will pay attention to the shared HCD roothub */
-       shared_hcd = hcd->shared_hcd;
-       if (!usb_hcd_is_primary_hcd(hcd) && shared_hcd && HCD_DEFER_RH_REGISTER(shared_hcd)) {
-               retval = register_root_hub(shared_hcd);
-               if (retval != 0)
-                       goto err_register_root_hub;
-
-               if (shared_hcd->uses_new_polling && HCD_POLL_RH(shared_hcd))
-                       usb_hcd_poll_rh_status(shared_hcd);
-       }
-
        /* starting here, usbcore will pay attention to this root hub */
-       if (!HCD_DEFER_RH_REGISTER(hcd)) {
-               retval = register_root_hub(hcd);
-               if (retval != 0)
-                       goto err_register_root_hub;
+       retval = register_root_hub(hcd);
+       if (retval != 0)
+               goto err_register_root_hub;
 
-               if (hcd->uses_new_polling && HCD_POLL_RH(hcd))
-                       usb_hcd_poll_rh_status(hcd);
-       }
+       if (hcd->uses_new_polling && HCD_POLL_RH(hcd))
+               usb_hcd_poll_rh_status(hcd);
 
        return retval;
 
@@ -3013,7 +2999,6 @@ EXPORT_SYMBOL_GPL(usb_add_hcd);
 void usb_remove_hcd(struct usb_hcd *hcd)
 {
        struct usb_device *rhdev = hcd->self.root_hub;
-       bool rh_registered;
 
        dev_info(hcd->self.controller, "remove, state %x\n", hcd->state);
 
@@ -3024,7 +3009,6 @@ void usb_remove_hcd(struct usb_hcd *hcd)
 
        dev_dbg(hcd->self.controller, "roothub graceful disconnect\n");
        spin_lock_irq (&hcd_root_hub_lock);
-       rh_registered = hcd->rh_registered;
        hcd->rh_registered = 0;
        spin_unlock_irq (&hcd_root_hub_lock);
 
@@ -3034,8 +3018,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)
        cancel_work_sync(&hcd->died_work);
 
        mutex_lock(&usb_bus_idr_lock);
-       if (rh_registered)
-               usb_disconnect(&rhdev);         /* Sets rhdev to NULL */
+       usb_disconnect(&rhdev);         /* Sets rhdev to NULL */
        mutex_unlock(&usb_bus_idr_lock);
 
        /*
index a3f875eea751928dfcd189ff854d2f4bb0bc2f45..af946c42b6f0a0be25b948a0d0f6b5daf7e1a97b 100644 (file)
@@ -257,7 +257,6 @@ static void xhci_common_hub_descriptor(struct xhci_hcd *xhci,
 {
        u16 temp;
 
-       desc->bPwrOn2PwrGood = 10;      /* xhci section 5.4.9 says 20ms max */
        desc->bHubContrCurrent = 0;
 
        desc->bNbrPorts = ports;
@@ -292,6 +291,7 @@ static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
        desc->bDescriptorType = USB_DT_HUB;
        temp = 1 + (ports / 8);
        desc->bDescLength = USB_DT_HUB_NONVAR_SIZE + 2 * temp;
+       desc->bPwrOn2PwrGood = 10;      /* xhci section 5.4.8 says 20ms */
 
        /* The Device Removable bits are reported on a byte granularity.
         * If the port doesn't exist within that byte, the bit is set to 0.
@@ -344,6 +344,7 @@ static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
        xhci_common_hub_descriptor(xhci, desc, ports);
        desc->bDescriptorType = USB_DT_SS_HUB;
        desc->bDescLength = USB_DT_SS_HUB_SIZE;
+       desc->bPwrOn2PwrGood = 50;      /* usb 3.1 may fail if less than 100ms */
 
        /* header decode latency should be zero for roothubs,
         * see section 4.23.5.2.
index 541fe4dcc43a22d51704c145f9291dd91545b973..902f410874e8eac93552b3821dc02dc0dad3f41f 100644 (file)
@@ -692,7 +692,6 @@ int xhci_run(struct usb_hcd *hcd)
                if (ret)
                        xhci_free_command(xhci, command);
        }
-       set_bit(HCD_FLAG_DEFER_RH_REGISTER, &hcd->flags);
        xhci_dbg_trace(xhci, trace_xhci_dbg_init,
                        "Finished xhci_run for USB2 roothub");
 
index 51b4de3b3447fdcb04bb16986685e4c7d35e02c9..ba7438ab93710f9df4ed44609ecc6947eeb0cf0b 100644 (file)
@@ -448,6 +448,30 @@ int simple_rmdir(struct inode *dir, struct dentry *dentry)
 }
 EXPORT_SYMBOL(simple_rmdir);
 
+int simple_rename_exchange(struct inode *old_dir, struct dentry *old_dentry,
+                          struct inode *new_dir, struct dentry *new_dentry)
+{
+       bool old_is_dir = d_is_dir(old_dentry);
+       bool new_is_dir = d_is_dir(new_dentry);
+
+       if (old_dir != new_dir && old_is_dir != new_is_dir) {
+               if (old_is_dir) {
+                       drop_nlink(old_dir);
+                       inc_nlink(new_dir);
+               } else {
+                       drop_nlink(new_dir);
+                       inc_nlink(old_dir);
+               }
+       }
+       old_dir->i_ctime = old_dir->i_mtime =
+       new_dir->i_ctime = new_dir->i_mtime =
+       d_inode(old_dentry)->i_ctime =
+       d_inode(new_dentry)->i_ctime = current_time(old_dir);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(simple_rename_exchange);
+
 int simple_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
                  struct dentry *old_dentry, struct inode *new_dir,
                  struct dentry *new_dentry, unsigned int flags)
@@ -455,9 +479,12 @@ int simple_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
        struct inode *inode = d_inode(old_dentry);
        int they_are_dirs = d_is_dir(old_dentry);
 
-       if (flags & ~RENAME_NOREPLACE)
+       if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
                return -EINVAL;
 
+       if (flags & RENAME_EXCHANGE)
+               return simple_rename_exchange(old_dir, old_dentry, new_dir, new_dentry);
+
        if (!simple_empty(new_dentry))
                return -ENOTEMPTY;
 
index 2be6dfd68df995c2562c7776c59dc1a8b760a056..f715e8863f4de97703ccf9397eb78f78dd0770e3 100644 (file)
@@ -484,6 +484,12 @@ bpf_ctx_record_field_size(struct bpf_insn_access_aux *aux, u32 size)
        aux->ctx_field_size = size;
 }
 
+static inline bool bpf_pseudo_func(const struct bpf_insn *insn)
+{
+       return insn->code == (BPF_LD | BPF_IMM | BPF_DW) &&
+              insn->src_reg == BPF_PSEUDO_FUNC;
+}
+
 struct bpf_prog_ops {
        int (*test_run)(struct bpf_prog *prog, const union bpf_attr *kattr,
                        union bpf_attr __user *uattr);
index d42010cf54682d9b55146011cd245ff54d0444c1..7ee708ad7df241329b82d2f903783af7acc27655 100644 (file)
@@ -12,6 +12,7 @@
 struct ocelot_skb_cb {
        struct sk_buff *clone;
        unsigned int ptp_class; /* valid only for clones */
+       u32 tstamp_lo;
        u8 ptp_cmd;
        u8 ts_id;
 };
index 1e7bf78cb3829cc4059862a1256746d562492116..aba348d58ff61c5265b76c3e51f83417582e519e 100644 (file)
@@ -10,6 +10,9 @@
 #define __ETHTOOL_LINK_MODE_MASK_NWORDS \
        DIV_ROUND_UP(__ETHTOOL_LINK_MODE_MASK_NBITS, 32)
 
+#define ETHTOOL_PAUSE_STAT_CNT (__ETHTOOL_A_PAUSE_STAT_CNT -           \
+                                ETHTOOL_A_PAUSE_STAT_TX_FRAMES)
+
 enum ethtool_multicast_groups {
        ETHNL_MCGRP_MONITOR,
 };
index 3afca821df32e5c16c34ea5f7b374f62d96f0d54..1cb616fc11053beda5c7dd6be6da84122a3adc61 100644 (file)
@@ -3385,6 +3385,8 @@ extern int simple_open(struct inode *inode, struct file *file);
 extern int simple_link(struct dentry *, struct inode *, struct dentry *);
 extern int simple_unlink(struct inode *, struct dentry *);
 extern int simple_rmdir(struct inode *, struct dentry *);
+extern int simple_rename_exchange(struct inode *old_dir, struct dentry *old_dentry,
+                                 struct inode *new_dir, struct dentry *new_dentry);
 extern int simple_rename(struct user_namespace *, struct inode *,
                         struct dentry *, struct inode *, struct dentry *,
                         unsigned int);
index a9ac70ae01abf1420435e9e6b35e6db1aa67398d..442a611fa0fbc1def752740ddd8ebc918ce854e9 100644 (file)
@@ -329,12 +329,14 @@ LSM_HOOK(int, 0, tun_dev_create, void)
 LSM_HOOK(int, 0, tun_dev_attach_queue, void *security)
 LSM_HOOK(int, 0, tun_dev_attach, struct sock *sk, void *security)
 LSM_HOOK(int, 0, tun_dev_open, void *security)
-LSM_HOOK(int, 0, sctp_assoc_request, struct sctp_endpoint *ep,
+LSM_HOOK(int, 0, sctp_assoc_request, struct sctp_association *asoc,
         struct sk_buff *skb)
 LSM_HOOK(int, 0, sctp_bind_connect, struct sock *sk, int optname,
         struct sockaddr *address, int addrlen)
-LSM_HOOK(void, LSM_RET_VOID, sctp_sk_clone, struct sctp_endpoint *ep,
+LSM_HOOK(void, LSM_RET_VOID, sctp_sk_clone, struct sctp_association *asoc,
         struct sock *sk, struct sock *newsk)
+LSM_HOOK(void, LSM_RET_VOID, sctp_assoc_established, struct sctp_association *asoc,
+        struct sk_buff *skb)
 #endif /* CONFIG_SECURITY_NETWORK */
 
 #ifdef CONFIG_SECURITY_INFINIBAND
index 0bada4df23fce35aa24d0596a3980388873592ab..d6823214d5c1ef4f580a20f680aedc060bbcdcc5 100644 (file)
  * Security hooks for SCTP
  *
  * @sctp_assoc_request:
- *     Passes the @ep and @chunk->skb of the association INIT packet to
+ *     Passes the @asoc and @chunk->skb of the association INIT packet to
  *     the security module.
- *     @ep pointer to sctp endpoint structure.
+ *     @asoc pointer to sctp association structure.
  *     @skb pointer to skbuff of association packet.
  *     Return 0 on success, error on failure.
  * @sctp_bind_connect:
  *     Called whenever a new socket is created by accept(2) (i.e. a TCP
  *     style socket) or when a socket is 'peeled off' e.g userspace
  *     calls sctp_peeloff(3).
- *     @ep pointer to current sctp endpoint structure.
+ *     @asoc pointer to current sctp association structure.
  *     @sk pointer to current sock structure.
- *     @sk pointer to new sock structure.
+ *     @newsk pointer to new sock structure.
+ * @sctp_assoc_established:
+ *     Passes the @asoc and @chunk->skb of the association COOKIE_ACK packet
+ *     to the security module.
+ *     @asoc pointer to sctp association structure.
+ *     @skb pointer to skbuff of association packet.
  *
  * Security hooks for Infiniband
  *
index 7e0ba63b5dde270ddbff4b972ab60df26e407ae9..06eac4e61a135e7a55fed126321273c314913768 100644 (file)
@@ -179,7 +179,7 @@ struct xfrm_policy;
 struct xfrm_state;
 struct xfrm_user_sec_ctx;
 struct seq_file;
-struct sctp_endpoint;
+struct sctp_association;
 
 #ifdef CONFIG_MMU
 extern unsigned long mmap_min_addr;
@@ -1425,11 +1425,13 @@ int security_tun_dev_create(void);
 int security_tun_dev_attach_queue(void *security);
 int security_tun_dev_attach(struct sock *sk, void *security);
 int security_tun_dev_open(void *security);
-int security_sctp_assoc_request(struct sctp_endpoint *ep, struct sk_buff *skb);
+int security_sctp_assoc_request(struct sctp_association *asoc, struct sk_buff *skb);
 int security_sctp_bind_connect(struct sock *sk, int optname,
                               struct sockaddr *address, int addrlen);
-void security_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk,
+void security_sctp_sk_clone(struct sctp_association *asoc, struct sock *sk,
                            struct sock *newsk);
+void security_sctp_assoc_established(struct sctp_association *asoc,
+                                    struct sk_buff *skb);
 
 #else  /* CONFIG_SECURITY_NETWORK */
 static inline int security_unix_stream_connect(struct sock *sock,
@@ -1631,7 +1633,7 @@ static inline int security_tun_dev_open(void *security)
        return 0;
 }
 
-static inline int security_sctp_assoc_request(struct sctp_endpoint *ep,
+static inline int security_sctp_assoc_request(struct sctp_association *asoc,
                                              struct sk_buff *skb)
 {
        return 0;
@@ -1644,11 +1646,16 @@ static inline int security_sctp_bind_connect(struct sock *sk, int optname,
        return 0;
 }
 
-static inline void security_sctp_sk_clone(struct sctp_endpoint *ep,
+static inline void security_sctp_sk_clone(struct sctp_association *asoc,
                                          struct sock *sk,
                                          struct sock *newsk)
 {
 }
+
+static inline void security_sctp_assoc_established(struct sctp_association *asoc,
+                                                  struct sk_buff *skb)
+{
+}
 #endif /* CONFIG_SECURITY_NETWORK */
 
 #ifdef CONFIG_SECURITY_INFINIBAND
index 0bd6520329f6fd04420c9e1772277b948931ac99..686a666d073d5106526f3c5c20d64f26131be72d 100644 (file)
@@ -454,9 +454,15 @@ enum {
         * all frags to avoid possible bad checksum
         */
        SKBFL_SHARED_FRAG = BIT(1),
+
+       /* segment contains only zerocopy data and should not be
+        * charged to the kernel memory.
+        */
+       SKBFL_PURE_ZEROCOPY = BIT(2),
 };
 
 #define SKBFL_ZEROCOPY_FRAG    (SKBFL_ZEROCOPY_ENABLE | SKBFL_SHARED_FRAG)
+#define SKBFL_ALL_ZEROCOPY     (SKBFL_ZEROCOPY_FRAG | SKBFL_PURE_ZEROCOPY)
 
 /*
  * The callback notifies userspace to release buffers when skb DMA is done in
@@ -1464,6 +1470,17 @@ static inline struct ubuf_info *skb_zcopy(struct sk_buff *skb)
        return is_zcopy ? skb_uarg(skb) : NULL;
 }
 
+static inline bool skb_zcopy_pure(const struct sk_buff *skb)
+{
+       return skb_shinfo(skb)->flags & SKBFL_PURE_ZEROCOPY;
+}
+
+static inline bool skb_pure_zcopy_same(const struct sk_buff *skb1,
+                                      const struct sk_buff *skb2)
+{
+       return skb_zcopy_pure(skb1) == skb_zcopy_pure(skb2);
+}
+
 static inline void net_zcopy_get(struct ubuf_info *uarg)
 {
        refcount_inc(&uarg->refcnt);
@@ -1528,7 +1545,7 @@ static inline void skb_zcopy_clear(struct sk_buff *skb, bool zerocopy_success)
                if (!skb_zcopy_is_nouarg(skb))
                        uarg->callback(skb, uarg, zerocopy_success);
 
-               skb_shinfo(skb)->flags &= ~SKBFL_ZEROCOPY_FRAG;
+               skb_shinfo(skb)->flags &= ~SKBFL_ALL_ZEROCOPY;
        }
 }
 
@@ -1675,6 +1692,22 @@ static inline int skb_unclone(struct sk_buff *skb, gfp_t pri)
        return 0;
 }
 
+/* This variant of skb_unclone() makes sure skb->truesize is not changed */
+static inline int skb_unclone_keeptruesize(struct sk_buff *skb, gfp_t pri)
+{
+       might_sleep_if(gfpflags_allow_blocking(pri));
+
+       if (skb_cloned(skb)) {
+               unsigned int save = skb->truesize;
+               int res;
+
+               res = pskb_expand_head(skb, 0, 0, pri);
+               skb->truesize = save;
+               return res;
+       }
+       return 0;
+}
+
 /**
  *     skb_header_cloned - is the header a clone
  *     @skb: buffer to check
index b4256847c70791eff8622d583c92bf1425f8d595..584d94be9c8b06e43dff0eecfcc25a63a17a652d 100644 (file)
@@ -507,6 +507,18 @@ static inline bool sk_psock_strp_enabled(struct sk_psock *psock)
        return !!psock->saved_data_ready;
 }
 
+static inline bool sk_is_tcp(const struct sock *sk)
+{
+       return sk->sk_type == SOCK_STREAM &&
+              sk->sk_protocol == IPPROTO_TCP;
+}
+
+static inline bool sk_is_udp(const struct sock *sk)
+{
+       return sk->sk_type == SOCK_DGRAM &&
+              sk->sk_protocol == IPPROTO_UDP;
+}
+
 #if IS_ENABLED(CONFIG_NET_SOCK_MSG)
 
 #define BPF_F_STRPARSER        (1UL << 1)
index 2c1fc9212cf287ae4ef8622a3e59e54081fed0d6..548a028f2dabb70fd4e6c7465abea66619fd7183 100644 (file)
@@ -124,7 +124,6 @@ struct usb_hcd {
 #define HCD_FLAG_RH_RUNNING            5       /* root hub is running? */
 #define HCD_FLAG_DEAD                  6       /* controller has died? */
 #define HCD_FLAG_INTF_AUTHORIZED       7       /* authorize interfaces? */
-#define HCD_FLAG_DEFER_RH_REGISTER     8       /* Defer roothub registration */
 
        /* The flags can be tested using these macros; they are likely to
         * be slightly faster than test_bit().
@@ -135,7 +134,6 @@ struct usb_hcd {
 #define HCD_WAKEUP_PENDING(hcd)        ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING))
 #define HCD_RH_RUNNING(hcd)    ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING))
 #define HCD_DEAD(hcd)          ((hcd)->flags & (1U << HCD_FLAG_DEAD))
-#define HCD_DEFER_RH_REGISTER(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEFER_RH_REGISTER))
 
        /*
         * Specifies if interfaces are authorized by default
index fd1f9a3fd8dda463cc24d95e0d3a528e505927b4..e250dca03963bf14750d16ebf1cb6d976b7206d3 100644 (file)
@@ -72,7 +72,9 @@ struct llc_sap {
 static inline
 struct hlist_head *llc_sk_dev_hash(struct llc_sap *sap, int ifindex)
 {
-       return &sap->sk_dev_hash[ifindex % LLC_SK_DEV_HASH_ENTRIES];
+       u32 bucket = hash_32(ifindex, LLC_SK_DEV_HASH_BITS);
+
+       return &sap->sk_dev_hash[bucket];
 }
 
 static inline
index 651bba654d77db4121979cf4d36bfa1d161fe192..899c29c326ba13daa6792330fd2e467edc2d55dc 100644 (file)
@@ -1355,16 +1355,6 @@ struct sctp_endpoint {
              reconf_enable:1;
 
        __u8  strreset_enable;
-
-       /* Security identifiers from incoming (INIT). These are set by
-        * security_sctp_assoc_request(). These will only be used by
-        * SCTP TCP type sockets and peeled off connections as they
-        * cause a new socket to be generated. security_sctp_sk_clone()
-        * will then plug these into the new socket.
-        */
-
-       u32 secid;
-       u32 peer_secid;
 };
 
 /* Recover the outter endpoint structure. */
@@ -2104,6 +2094,16 @@ struct sctp_association {
        __u64 abandoned_unsent[SCTP_PR_INDEX(MAX) + 1];
        __u64 abandoned_sent[SCTP_PR_INDEX(MAX) + 1];
 
+       /* Security identifiers from incoming (INIT). These are set by
+        * security_sctp_assoc_request(). These will only be used by
+        * SCTP TCP type sockets and peeled off connections as they
+        * cause a new socket to be generated. security_sctp_sk_clone()
+        * will then plug these into the new socket.
+        */
+
+       u32 secid;
+       u32 peer_secid;
+
        struct rcu_head rcu;
 };
 
index 1d20b98493a103030d203add46a540c6d1f8010f..732b7097d78e41b43d0c7bd4868f49a28e401271 100644 (file)
@@ -54,10 +54,28 @@ struct strp_msg {
        int offset;
 };
 
+struct _strp_msg {
+       /* Internal cb structure. struct strp_msg must be first for passing
+        * to upper layer.
+        */
+       struct strp_msg strp;
+       int accum_len;
+};
+
+struct sk_skb_cb {
+#define SK_SKB_CB_PRIV_LEN 20
+       unsigned char data[SK_SKB_CB_PRIV_LEN];
+       struct _strp_msg strp;
+       /* temp_reg is a temporary register used for bpf_convert_data_end_access
+        * when dst_reg == src_reg.
+        */
+       u64 temp_reg;
+};
+
 static inline struct strp_msg *strp_msg(struct sk_buff *skb)
 {
        return (struct strp_msg *)((void *)skb->cb +
-               offsetof(struct qdisc_skb_cb, data));
+               offsetof(struct sk_skb_cb, strp));
 }
 
 /* Structure for an attached lower socket */
index 70972f3ac8fa391e0d747c878cf9fd8a7a0cedff..4da22b41bde688dec4a3741f510346dae0cf32e0 100644 (file)
@@ -293,7 +293,10 @@ static inline bool tcp_out_of_memory(struct sock *sk)
 static inline void tcp_wmem_free_skb(struct sock *sk, struct sk_buff *skb)
 {
        sk_wmem_queued_add(sk, -skb->truesize);
-       sk_mem_uncharge(sk, skb->truesize);
+       if (!skb_zcopy_pure(skb))
+               sk_mem_uncharge(sk, skb->truesize);
+       else
+               sk_mem_uncharge(sk, SKB_TRUESIZE(skb_end_offset(skb)));
        __kfree_skb(skb);
 }
 
@@ -974,7 +977,8 @@ static inline bool tcp_skb_can_collapse(const struct sk_buff *to,
                                        const struct sk_buff *from)
 {
        return likely(tcp_skb_can_collapse_to(to) &&
-                     mptcp_skb_can_collapse(to, from));
+                     mptcp_skb_can_collapse(to, from) &&
+                     skb_pure_zcopy_same(to, from));
 }
 
 /* Events passed to congestion control interface */
index ca5fbb59fa4212dc26e420d93d9e4136f2c1d5ae..999777d32dcfdce5360353c445cfb965af808b6d 100644 (file)
@@ -411,7 +411,9 @@ enum {
        ETHTOOL_A_PAUSE_STAT_TX_FRAMES,
        ETHTOOL_A_PAUSE_STAT_RX_FRAMES,
 
-       /* add new constants above here */
+       /* add new constants above here
+        * adjust ETHTOOL_PAUSE_STAT_CNT if adding non-stats!
+        */
        __ETHTOOL_A_PAUSE_STAT_CNT,
        ETHTOOL_A_PAUSE_STAT_MAX = (__ETHTOOL_A_PAUSE_STAT_CNT - 1)
 };
index 327e3996eadbd970821418581c3320009669f105..2405e39d800fe5331e04750b665145d5dffb7120 100644 (file)
@@ -390,6 +390,13 @@ static int bpf_adj_branches(struct bpf_prog *prog, u32 pos, s32 end_old,
                        i = end_new;
                        insn = prog->insnsi + end_old;
                }
+               if (bpf_pseudo_func(insn)) {
+                       ret = bpf_adj_delta_to_imm(insn, pos, end_old,
+                                                  end_new, i, probe_pass);
+                       if (ret)
+                               return ret;
+                       continue;
+               }
                code = insn->code;
                if ((BPF_CLASS(code) != BPF_JMP &&
                     BPF_CLASS(code) != BPF_JMP32) ||
index f0dca726ebfde5fae755070d22c2a58e2128cf1f..890b3ec375a394a862799cc5b07718d571d19a4d 100644 (file)
@@ -240,12 +240,6 @@ static bool bpf_pseudo_kfunc_call(const struct bpf_insn *insn)
               insn->src_reg == BPF_PSEUDO_KFUNC_CALL;
 }
 
-static bool bpf_pseudo_func(const struct bpf_insn *insn)
-{
-       return insn->code == (BPF_LD | BPF_IMM | BPF_DW) &&
-              insn->src_reg == BPF_PSEUDO_FUNC;
-}
-
 struct bpf_call_arg_meta {
        struct bpf_map *map_ptr;
        bool raw_mode;
@@ -1960,16 +1954,10 @@ static int add_subprog_and_kfunc(struct bpf_verifier_env *env)
                        return -EPERM;
                }
 
-               if (bpf_pseudo_func(insn)) {
-                       ret = add_subprog(env, i + insn->imm + 1);
-                       if (ret >= 0)
-                               /* remember subprog */
-                               insn[1].imm = ret;
-               } else if (bpf_pseudo_call(insn)) {
+               if (bpf_pseudo_func(insn) || bpf_pseudo_call(insn))
                        ret = add_subprog(env, i + insn->imm + 1);
-               } else {
+               else
                        ret = add_kfunc_call(env, insn->imm, insn->off);
-               }
 
                if (ret < 0)
                        return ret;
@@ -3088,9 +3076,12 @@ static int check_stack_read_fixed_off(struct bpf_verifier_env *env,
        reg = &reg_state->stack[spi].spilled_ptr;
 
        if (is_spilled_reg(&reg_state->stack[spi])) {
-               if (size != BPF_REG_SIZE) {
-                       u8 scalar_size = 0;
+               u8 spill_size = 1;
+
+               for (i = BPF_REG_SIZE - 1; i > 0 && stype[i - 1] == STACK_SPILL; i--)
+                       spill_size++;
 
+               if (size != BPF_REG_SIZE || spill_size != BPF_REG_SIZE) {
                        if (reg->type != SCALAR_VALUE) {
                                verbose_linfo(env, env->insn_idx, "; ");
                                verbose(env, "invalid size of register fill\n");
@@ -3101,10 +3092,7 @@ static int check_stack_read_fixed_off(struct bpf_verifier_env *env,
                        if (dst_regno < 0)
                                return 0;
 
-                       for (i = BPF_REG_SIZE; i > 0 && stype[i - 1] == STACK_SPILL; i--)
-                               scalar_size++;
-
-                       if (!(off % BPF_REG_SIZE) && size == scalar_size) {
+                       if (!(off % BPF_REG_SIZE) && size == spill_size) {
                                /* The earlier check_reg_arg() has decided the
                                 * subreg_def for this insn.  Save it first.
                                 */
@@ -3128,12 +3116,6 @@ static int check_stack_read_fixed_off(struct bpf_verifier_env *env,
                        state->regs[dst_regno].live |= REG_LIVE_WRITTEN;
                        return 0;
                }
-               for (i = 1; i < BPF_REG_SIZE; i++) {
-                       if (stype[(slot - i) % BPF_REG_SIZE] != STACK_SPILL) {
-                               verbose(env, "corrupted spill memory\n");
-                               return -EACCES;
-                       }
-               }
 
                if (dst_regno >= 0) {
                        /* restore register state from stack */
@@ -9393,7 +9375,8 @@ static int check_ld_imm(struct bpf_verifier_env *env, struct bpf_insn *insn)
 
        if (insn->src_reg == BPF_PSEUDO_FUNC) {
                struct bpf_prog_aux *aux = env->prog->aux;
-               u32 subprogno = insn[1].imm;
+               u32 subprogno = find_subprog(env,
+                                            env->insn_idx + insn->imm + 1);
 
                if (!aux->func_info) {
                        verbose(env, "missing btf func_info\n");
@@ -12563,14 +12546,9 @@ static int jit_subprogs(struct bpf_verifier_env *env)
                return 0;
 
        for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
-               if (bpf_pseudo_func(insn)) {
-                       env->insn_aux_data[i].call_imm = insn->imm;
-                       /* subprog is encoded in insn[1].imm */
+               if (!bpf_pseudo_func(insn) && !bpf_pseudo_call(insn))
                        continue;
-               }
 
-               if (!bpf_pseudo_call(insn))
-                       continue;
                /* Upon error here we cannot fall back to interpreter but
                 * need a hard reject of the program. Thus -EFAULT is
                 * propagated in any case.
@@ -12591,6 +12569,12 @@ static int jit_subprogs(struct bpf_verifier_env *env)
                env->insn_aux_data[i].call_imm = insn->imm;
                /* point imm to __bpf_call_base+1 from JITs point of view */
                insn->imm = 1;
+               if (bpf_pseudo_func(insn))
+                       /* jit (e.g. x86_64) may emit fewer instructions
+                        * if it learns a u32 imm is the same as a u64 imm.
+                        * Force a non zero here.
+                        */
+                       insn[1].imm = 1;
        }
 
        err = bpf_prog_alloc_jited_linfo(prog);
@@ -12675,7 +12659,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
                insn = func[i]->insnsi;
                for (j = 0; j < func[i]->len; j++, insn++) {
                        if (bpf_pseudo_func(insn)) {
-                               subprog = insn[1].imm;
+                               subprog = insn->off;
                                insn[0].imm = (u32)(long)func[subprog]->bpf_func;
                                insn[1].imm = ((u64)(long)func[subprog]->bpf_func) >> 32;
                                continue;
@@ -12726,7 +12710,8 @@ static int jit_subprogs(struct bpf_verifier_env *env)
        for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
                if (bpf_pseudo_func(insn)) {
                        insn[0].imm = env->insn_aux_data[i].call_imm;
-                       insn[1].imm = find_subprog(env, i + insn[0].imm + 1);
+                       insn[1].imm = insn->off;
+                       insn->off = 0;
                        continue;
                }
                if (!bpf_pseudo_call(insn))
index 007a3ded0358fff93ea2c7a3eb4523aa7e50fc34..30bc880c3849cb6f1ff386b515fd7ffebf4baa7d 100644 (file)
@@ -5602,10 +5602,11 @@ int modify_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr)
                }
        }
 
+       mutex_unlock(&ftrace_lock);
+
        /* Removing the tmp_ops will add the updated direct callers to the functions */
        unregister_ftrace_function(&tmp_ops);
 
-       mutex_unlock(&ftrace_lock);
  out_direct:
        mutex_unlock(&direct_mutex);
        return err;
index f6520d0a4c8c87947e13bdb564ed8b59370a07ce..2699e9e562b1da75f1324e10a47ba29faed57895 100644 (file)
@@ -5228,6 +5228,9 @@ void ring_buffer_reset(struct trace_buffer *buffer)
        struct ring_buffer_per_cpu *cpu_buffer;
        int cpu;
 
+       /* prevent another thread from changing buffer sizes */
+       mutex_lock(&buffer->mutex);
+
        for_each_buffer_cpu(buffer, cpu) {
                cpu_buffer = buffer->buffers[cpu];
 
@@ -5246,6 +5249,8 @@ void ring_buffer_reset(struct trace_buffer *buffer)
                atomic_dec(&cpu_buffer->record_disabled);
                atomic_dec(&cpu_buffer->resize_disabled);
        }
+
+       mutex_unlock(&buffer->mutex);
 }
 EXPORT_SYMBOL_GPL(ring_buffer_reset);
 
index 23c91a8beb781d79d802479aae05ed90145dc9b8..f0eee4e221a76f21ee190dce760a01548210602f 100644 (file)
@@ -2960,28 +2960,6 @@ static int shmem_rmdir(struct inode *dir, struct dentry *dentry)
        return shmem_unlink(dir, dentry);
 }
 
-static int shmem_exchange(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry)
-{
-       bool old_is_dir = d_is_dir(old_dentry);
-       bool new_is_dir = d_is_dir(new_dentry);
-
-       if (old_dir != new_dir && old_is_dir != new_is_dir) {
-               if (old_is_dir) {
-                       drop_nlink(old_dir);
-                       inc_nlink(new_dir);
-               } else {
-                       drop_nlink(new_dir);
-                       inc_nlink(old_dir);
-               }
-       }
-       old_dir->i_ctime = old_dir->i_mtime =
-       new_dir->i_ctime = new_dir->i_mtime =
-       d_inode(old_dentry)->i_ctime =
-       d_inode(new_dentry)->i_ctime = current_time(old_dir);
-
-       return 0;
-}
-
 static int shmem_whiteout(struct user_namespace *mnt_userns,
                          struct inode *old_dir, struct dentry *old_dentry)
 {
@@ -3027,7 +3005,7 @@ static int shmem_rename2(struct user_namespace *mnt_userns,
                return -EINVAL;
 
        if (flags & RENAME_EXCHANGE)
-               return shmem_exchange(old_dir, old_dentry, new_dir, new_dentry);
+               return simple_rename_exchange(old_dir, old_dentry, new_dir, new_dentry);
 
        if (!simple_empty(new_dentry))
                return -ENOTEMPTY;
index 55275ef9a31a7c6f0cc447078ceda97e365dc5fe..a3a0a5e994f5aeae550404701e72253a7e38a991 100644 (file)
@@ -123,9 +123,6 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)
        }
 
        vlan_vid_del(real_dev, vlan->vlan_proto, vlan_id);
-
-       /* Get rid of the vlan's reference to real_dev */
-       dev_put(real_dev);
 }
 
 int vlan_check_real_dev(struct net_device *real_dev,
index 90330b893134f811f54eb6984fd3646ab661322d..ab6dee28536daaaf825dfc22120ca111c6197f4b 100644 (file)
@@ -843,6 +843,9 @@ static void vlan_dev_free(struct net_device *dev)
 
        free_percpu(vlan->vlan_pcpu_stats);
        vlan->vlan_pcpu_stats = NULL;
+
+       /* Get rid of the vlan's reference to real_dev */
+       dev_put(vlan->real_dev);
 }
 
 void vlan_setup(struct net_device *dev)
index 9bc55ecb37f9fafa751e46d4a6914b9f05d0f805..8452b0fbb78c9a4b327fbb0f998d2df0eab12495 100644 (file)
@@ -75,6 +75,13 @@ static void j1939_can_recv(struct sk_buff *iskb, void *data)
        skcb->addr.pgn = (cf->can_id >> 8) & J1939_PGN_MAX;
        /* set default message type */
        skcb->addr.type = J1939_TP;
+
+       if (!j1939_address_is_valid(skcb->addr.sa)) {
+               netdev_err_once(priv->ndev, "%s: sa is broadcast address, ignoring!\n",
+                               __func__);
+               goto done;
+       }
+
        if (j1939_pgn_is_pdu1(skcb->addr.pgn)) {
                /* Type 1: with destination address */
                skcb->addr.da = skcb->addr.pgn;
index 6c0a0ebdd024c206e99d1432bab805fb6aae5f3f..a271688780a2c1a3bff6c2578502f972da34a30b 100644 (file)
@@ -2023,6 +2023,11 @@ static void j1939_tp_cmd_recv(struct j1939_priv *priv, struct sk_buff *skb)
                extd = J1939_ETP;
                fallthrough;
        case J1939_TP_CMD_BAM:
+               if (cmd == J1939_TP_CMD_BAM && !j1939_cb_is_broadcast(skcb)) {
+                       netdev_err_once(priv->ndev, "%s: BAM to unicast (%02x), ignoring!\n",
+                                       __func__, skcb->addr.sa);
+                       return;
+               }
                fallthrough;
        case J1939_TP_CMD_RTS:
                if (skcb->addr.type != extd)
@@ -2085,6 +2090,12 @@ static void j1939_tp_cmd_recv(struct j1939_priv *priv, struct sk_buff *skb)
                break;
 
        case J1939_ETP_CMD_ABORT: /* && J1939_TP_CMD_ABORT */
+               if (j1939_cb_is_broadcast(skcb)) {
+                       netdev_err_once(priv->ndev, "%s: abort to broadcast (%02x), ignoring!\n",
+                                       __func__, skcb->addr.sa);
+                       return;
+               }
+
                if (j1939_tp_im_transmitter(skcb))
                        j1939_xtp_rx_abort(priv, skb, true);
 
index 15ab9ffb27fe999c9038d67d822de715d1e61baa..ee290776c661d02fd65aaa38ed9d5b5c2b6bb946 100644 (file)
@@ -646,7 +646,8 @@ int __zerocopy_sg_from_iter(struct sock *sk, struct sk_buff *skb,
                skb->truesize += truesize;
                if (sk && sk->sk_type == SOCK_STREAM) {
                        sk_wmem_queued_add(sk, truesize);
-                       sk_mem_charge(sk, truesize);
+                       if (!skb_zcopy_pure(skb))
+                               sk_mem_charge(sk, truesize);
                } else {
                        refcount_add(truesize, &skb->sk->sk_wmem_alloc);
                }
index edeb811c454e6caf4298aae723237aea2c363c3c..15ac064b5562d7b99f885610a3d12733b63aa325 100644 (file)
@@ -6928,7 +6928,7 @@ void napi_disable(struct napi_struct *n)
        might_sleep();
        set_bit(NAPI_STATE_DISABLE, &n->state);
 
-       do {
+       for ( ; ; ) {
                val = READ_ONCE(n->state);
                if (val & (NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC)) {
                        usleep_range(20, 200);
@@ -6937,7 +6937,10 @@ void napi_disable(struct napi_struct *n)
 
                new = val | NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC;
                new &= ~(NAPIF_STATE_THREADED | NAPIF_STATE_PREFER_BUSY_POLL);
-       } while (cmpxchg(&n->state, val, new) != val);
+
+               if (cmpxchg(&n->state, val, new) == val)
+                       break;
+       }
 
        hrtimer_cancel(&n->timer);
 
index 6b5ee862429ebe9d4c33fd07e8483413905ab705..5ba4f9434acda17426f1c2f63fd67d604c363361 100644 (file)
@@ -66,7 +66,7 @@ struct devlink {
        u8 reload_failed:1;
        refcount_t refcount;
        struct completion comp;
-       char priv[0] __aligned(NETDEV_ALIGN);
+       char priv[] __aligned(NETDEV_ALIGN);
 };
 
 void *devlink_priv(struct devlink *devlink)
index 8e8d3b49c2976725cd37baa9cbecd2d4e6f66019..e471c9b0967057c29fa12fb8a5f0023b3535b51b 100644 (file)
@@ -9756,22 +9756,46 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type,
 static struct bpf_insn *bpf_convert_data_end_access(const struct bpf_insn *si,
                                                    struct bpf_insn *insn)
 {
-       /* si->dst_reg = skb->data */
+       int reg;
+       int temp_reg_off = offsetof(struct sk_buff, cb) +
+                          offsetof(struct sk_skb_cb, temp_reg);
+
+       if (si->src_reg == si->dst_reg) {
+               /* We need an extra register, choose and save a register. */
+               reg = BPF_REG_9;
+               if (si->src_reg == reg || si->dst_reg == reg)
+                       reg--;
+               if (si->src_reg == reg || si->dst_reg == reg)
+                       reg--;
+               *insn++ = BPF_STX_MEM(BPF_DW, si->src_reg, reg, temp_reg_off);
+       } else {
+               reg = si->dst_reg;
+       }
+
+       /* reg = skb->data */
        *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, data),
-                             si->dst_reg, si->src_reg,
+                             reg, si->src_reg,
                              offsetof(struct sk_buff, data));
        /* AX = skb->len */
        *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, len),
                              BPF_REG_AX, si->src_reg,
                              offsetof(struct sk_buff, len));
-       /* si->dst_reg = skb->data + skb->len */
-       *insn++ = BPF_ALU64_REG(BPF_ADD, si->dst_reg, BPF_REG_AX);
+       /* reg = skb->data + skb->len */
+       *insn++ = BPF_ALU64_REG(BPF_ADD, reg, BPF_REG_AX);
        /* AX = skb->data_len */
        *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, data_len),
                              BPF_REG_AX, si->src_reg,
                              offsetof(struct sk_buff, data_len));
-       /* si->dst_reg = skb->data + skb->len - skb->data_len */
-       *insn++ = BPF_ALU64_REG(BPF_SUB, si->dst_reg, BPF_REG_AX);
+
+       /* reg = skb->data + skb->len - skb->data_len */
+       *insn++ = BPF_ALU64_REG(BPF_SUB, reg, BPF_REG_AX);
+
+       if (si->src_reg == si->dst_reg) {
+               /* Restore the saved register */
+               *insn++ = BPF_MOV64_REG(BPF_REG_AX, si->src_reg);
+               *insn++ = BPF_MOV64_REG(si->dst_reg, reg);
+               *insn++ = BPF_LDX_MEM(BPF_DW, reg, BPF_REG_AX, temp_reg_off);
+       }
 
        return insn;
 }
@@ -9782,11 +9806,33 @@ static u32 sk_skb_convert_ctx_access(enum bpf_access_type type,
                                     struct bpf_prog *prog, u32 *target_size)
 {
        struct bpf_insn *insn = insn_buf;
+       int off;
 
        switch (si->off) {
        case offsetof(struct __sk_buff, data_end):
                insn = bpf_convert_data_end_access(si, insn);
                break;
+       case offsetof(struct __sk_buff, cb[0]) ...
+            offsetofend(struct __sk_buff, cb[4]) - 1:
+               BUILD_BUG_ON(sizeof_field(struct sk_skb_cb, data) < 20);
+               BUILD_BUG_ON((offsetof(struct sk_buff, cb) +
+                             offsetof(struct sk_skb_cb, data)) %
+                            sizeof(__u64));
+
+               prog->cb_access = 1;
+               off  = si->off;
+               off -= offsetof(struct __sk_buff, cb[0]);
+               off += offsetof(struct sk_buff, cb);
+               off += offsetof(struct sk_skb_cb, data);
+               if (type == BPF_WRITE)
+                       *insn++ = BPF_STX_MEM(BPF_SIZE(si->code), si->dst_reg,
+                                             si->src_reg, off);
+               else
+                       *insn++ = BPF_LDX_MEM(BPF_SIZE(si->code), si->dst_reg,
+                                             si->src_reg, off);
+               break;
+
+
        default:
                return bpf_convert_ctx_access(type, si, insn_buf, prog,
                                              target_size);
@@ -10423,8 +10469,10 @@ BPF_CALL_3(bpf_sk_lookup_assign, struct bpf_sk_lookup_kern *, ctx,
                return -EINVAL;
        if (unlikely(sk && sk_is_refcounted(sk)))
                return -ESOCKTNOSUPPORT; /* reject non-RCU freed sockets */
-       if (unlikely(sk && sk->sk_state == TCP_ESTABLISHED))
-               return -ESOCKTNOSUPPORT; /* reject connected sockets */
+       if (unlikely(sk && sk_is_tcp(sk) && sk->sk_state != TCP_LISTEN))
+               return -ESOCKTNOSUPPORT; /* only accept TCP socket in LISTEN */
+       if (unlikely(sk && sk_is_udp(sk) && sk->sk_state != TCP_CLOSE))
+               return -ESOCKTNOSUPPORT; /* only accept UDP socket in CLOSE */
 
        /* Check if socket is suitable for packet L3/L4 protocol */
        if (sk && sk->sk_protocol != ctx->protocol)
index 67a9188d8a49c83ce722f68d3064e9ba0545ea37..ba2f38246f07e5ba5a4f97922b4be33bdb8ad6d6 100644 (file)
@@ -3433,8 +3433,9 @@ static inline void skb_split_no_header(struct sk_buff *skb,
 void skb_split(struct sk_buff *skb, struct sk_buff *skb1, const u32 len)
 {
        int pos = skb_headlen(skb);
+       const int zc_flags = SKBFL_SHARED_FRAG | SKBFL_PURE_ZEROCOPY;
 
-       skb_shinfo(skb1)->flags |= skb_shinfo(skb)->flags & SKBFL_SHARED_FRAG;
+       skb_shinfo(skb1)->flags |= skb_shinfo(skb)->flags & zc_flags;
        skb_zerocopy_clone(skb1, skb, 0);
        if (len < pos)  /* Split line is inside header. */
                skb_split_inside_header(skb, skb1, len, pos);
@@ -3449,19 +3450,7 @@ EXPORT_SYMBOL(skb_split);
  */
 static int skb_prepare_for_shift(struct sk_buff *skb)
 {
-       int ret = 0;
-
-       if (skb_cloned(skb)) {
-               /* Save and restore truesize: pskb_expand_head() may reallocate
-                * memory where ksize(kmalloc(S)) != ksize(kmalloc(S)), but we
-                * cannot change truesize at this point.
-                */
-               unsigned int save_truesize = skb->truesize;
-
-               ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
-               skb->truesize = save_truesize;
-       }
-       return ret;
+       return skb_unclone_keeptruesize(skb, GFP_ATOMIC);
 }
 
 /**
index 9862eefce21ede8644f84c99c539643ec31c7908..8f2b2f2c0e7b1decdb4a5c8d86327ed7caa62c99 100644 (file)
@@ -976,7 +976,7 @@ static int sock_reserve_memory(struct sock *sk, int bytes)
        bool charged;
        int pages;
 
-       if (!mem_cgroup_sockets_enabled || !sk->sk_memcg)
+       if (!mem_cgroup_sockets_enabled || !sk->sk_memcg || !sk_has_account(sk))
                return -EOPNOTSUPP;
 
        if (!bytes)
index e252b8ec2b85e9ca8badac025a71745abe214600..f39ef79ced679dd19b2b3746363a7b9e6ef7b047 100644 (file)
@@ -511,12 +511,6 @@ static bool sock_map_op_okay(const struct bpf_sock_ops_kern *ops)
               ops->op == BPF_SOCK_OPS_TCP_LISTEN_CB;
 }
 
-static bool sk_is_tcp(const struct sock *sk)
-{
-       return sk->sk_type == SOCK_STREAM &&
-              sk->sk_protocol == IPPROTO_TCP;
-}
-
 static bool sock_map_redirect_allowed(const struct sock *sk)
 {
        if (sk_is_tcp(sk))
index cd60b94fc175f74655ecd0f8ff52b88dfb21aef3..de1c849a0a70558c87886c6d0006cd8d0f38c310 100644 (file)
@@ -101,6 +101,7 @@ static struct sk_buff *ocelot_rcv(struct sk_buff *skb,
        struct dsa_port *dp;
        u8 *extraction;
        u16 vlan_tpid;
+       u64 rew_val;
 
        /* Revert skb->data by the amount consumed by the DSA master,
         * so it points to the beginning of the frame.
@@ -130,6 +131,7 @@ static struct sk_buff *ocelot_rcv(struct sk_buff *skb,
        ocelot_xfh_get_qos_class(extraction, &qos_class);
        ocelot_xfh_get_tag_type(extraction, &tag_type);
        ocelot_xfh_get_vlan_tci(extraction, &vlan_tci);
+       ocelot_xfh_get_rew_val(extraction, &rew_val);
 
        skb->dev = dsa_master_find_slave(netdev, 0, src_port);
        if (!skb->dev)
@@ -143,6 +145,7 @@ static struct sk_buff *ocelot_rcv(struct sk_buff *skb,
 
        dsa_default_offload_fwd_mark(skb);
        skb->priority = qos_class;
+       OCELOT_SKB_CB(skb)->tstamp_lo = rew_val;
 
        /* Ocelot switches copy frames unmodified to the CPU. However, it is
         * possible for the user to request a VLAN modification through
index 9009f412151e7878bed59ae4dec9d0b91382241a..ee1e5806bc93a4bf60fe18bf15ee9b01af190b62 100644 (file)
@@ -56,8 +56,7 @@ static int pause_reply_size(const struct ethnl_req_info *req_base,
 
        if (req_base->flags & ETHTOOL_FLAG_STATS)
                n += nla_total_size(0) +        /* _PAUSE_STATS */
-                       nla_total_size_64bit(sizeof(u64)) *
-                               (ETHTOOL_A_PAUSE_STAT_MAX - 2);
+                    nla_total_size_64bit(sizeof(u64)) * ETHTOOL_PAUSE_STAT_CNT;
        return n;
 }
 
index 3c6498dab6bd5ca1ad40aeec94e0c2d939504e48..b7796b4cf0a099e9f14b28e50cb07367021a7cbf 100644 (file)
@@ -862,6 +862,7 @@ struct sk_buff *tcp_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp,
        if (likely(skb)) {
                bool mem_scheduled;
 
+               skb->truesize = SKB_TRUESIZE(skb_end_offset(skb));
                if (force_schedule) {
                        mem_scheduled = true;
                        sk_forced_mem_schedule(sk, skb->truesize);
@@ -1318,6 +1319,15 @@ new_segment:
 
                        copy = min_t(int, copy, pfrag->size - pfrag->offset);
 
+                       /* skb changing from pure zc to mixed, must charge zc */
+                       if (unlikely(skb_zcopy_pure(skb))) {
+                               if (!sk_wmem_schedule(sk, skb->data_len))
+                                       goto wait_for_space;
+
+                               sk_mem_charge(sk, skb->data_len);
+                               skb_shinfo(skb)->flags &= ~SKBFL_PURE_ZEROCOPY;
+                       }
+
                        if (!sk_wmem_schedule(sk, copy))
                                goto wait_for_space;
 
@@ -1338,8 +1348,16 @@ new_segment:
                        }
                        pfrag->offset += copy;
                } else {
-                       if (!sk_wmem_schedule(sk, copy))
-                               goto wait_for_space;
+                       /* First append to a fragless skb builds initial
+                        * pure zerocopy skb
+                        */
+                       if (!skb->len)
+                               skb_shinfo(skb)->flags |= SKBFL_PURE_ZEROCOPY;
+
+                       if (!skb_zcopy_pure(skb)) {
+                               if (!sk_wmem_schedule(sk, copy))
+                                       goto wait_for_space;
+                       }
 
                        err = skb_zerocopy_iter_stream(sk, skb, msg, copy, uarg);
                        if (err == -EMSGSIZE || err == -EEXIST) {
index 5f4d6f45d87f78b2667284cd940bd3a97cf6e3ce..f70aa0932bd6c9b96449237e26c6411fda75ae25 100644 (file)
@@ -172,6 +172,41 @@ static int tcp_msg_wait_data(struct sock *sk, struct sk_psock *psock,
        return ret;
 }
 
+static int tcp_bpf_recvmsg_parser(struct sock *sk,
+                                 struct msghdr *msg,
+                                 size_t len,
+                                 int nonblock,
+                                 int flags,
+                                 int *addr_len)
+{
+       struct sk_psock *psock;
+       int copied;
+
+       if (unlikely(flags & MSG_ERRQUEUE))
+               return inet_recv_error(sk, msg, len, addr_len);
+
+       psock = sk_psock_get(sk);
+       if (unlikely(!psock))
+               return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
+
+       lock_sock(sk);
+msg_bytes_ready:
+       copied = sk_msg_recvmsg(sk, psock, msg, len, flags);
+       if (!copied) {
+               long timeo;
+               int data;
+
+               timeo = sock_rcvtimeo(sk, nonblock);
+               data = tcp_msg_wait_data(sk, psock, timeo);
+               if (data && !sk_psock_queue_empty(psock))
+                       goto msg_bytes_ready;
+               copied = -EAGAIN;
+       }
+       release_sock(sk);
+       sk_psock_put(sk, psock);
+       return copied;
+}
+
 static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
                    int nonblock, int flags, int *addr_len)
 {
@@ -464,6 +499,8 @@ enum {
 enum {
        TCP_BPF_BASE,
        TCP_BPF_TX,
+       TCP_BPF_RX,
+       TCP_BPF_TXRX,
        TCP_BPF_NUM_CFGS,
 };
 
@@ -475,7 +512,6 @@ static void tcp_bpf_rebuild_protos(struct proto prot[TCP_BPF_NUM_CFGS],
                                   struct proto *base)
 {
        prot[TCP_BPF_BASE]                      = *base;
-       prot[TCP_BPF_BASE].unhash               = sock_map_unhash;
        prot[TCP_BPF_BASE].close                = sock_map_close;
        prot[TCP_BPF_BASE].recvmsg              = tcp_bpf_recvmsg;
        prot[TCP_BPF_BASE].sock_is_readable     = sk_msg_is_readable;
@@ -483,6 +519,12 @@ static void tcp_bpf_rebuild_protos(struct proto prot[TCP_BPF_NUM_CFGS],
        prot[TCP_BPF_TX]                        = prot[TCP_BPF_BASE];
        prot[TCP_BPF_TX].sendmsg                = tcp_bpf_sendmsg;
        prot[TCP_BPF_TX].sendpage               = tcp_bpf_sendpage;
+
+       prot[TCP_BPF_RX]                        = prot[TCP_BPF_BASE];
+       prot[TCP_BPF_RX].recvmsg                = tcp_bpf_recvmsg_parser;
+
+       prot[TCP_BPF_TXRX]                      = prot[TCP_BPF_TX];
+       prot[TCP_BPF_TXRX].recvmsg              = tcp_bpf_recvmsg_parser;
 }
 
 static void tcp_bpf_check_v6_needs_rebuild(struct proto *ops)
@@ -520,6 +562,10 @@ int tcp_bpf_update_proto(struct sock *sk, struct sk_psock *psock, bool restore)
        int family = sk->sk_family == AF_INET6 ? TCP_BPF_IPV6 : TCP_BPF_IPV4;
        int config = psock->progs.msg_parser   ? TCP_BPF_TX   : TCP_BPF_BASE;
 
+       if (psock->progs.stream_verdict || psock->progs.skb_verdict) {
+               config = (config == TCP_BPF_TX) ? TCP_BPF_TXRX : TCP_BPF_RX;
+       }
+
        if (restore) {
                if (inet_csk_has_ulp(sk)) {
                        /* TLS does not have an unhash proto in SW cases,
index 6fbbf155803372efed056a6f4df8809f7734be68..2e6e5a70168ebd037661dcee51595183b91f36f6 100644 (file)
@@ -408,13 +408,13 @@ static inline bool tcp_urg_mode(const struct tcp_sock *tp)
        return tp->snd_una != tp->snd_up;
 }
 
-#define OPTION_SACK_ADVERTISE  (1 << 0)
-#define OPTION_TS              (1 << 1)
-#define OPTION_MD5             (1 << 2)
-#define OPTION_WSCALE          (1 << 3)
-#define OPTION_FAST_OPEN_COOKIE        (1 << 8)
-#define OPTION_SMC             (1 << 9)
-#define OPTION_MPTCP           (1 << 10)
+#define OPTION_SACK_ADVERTISE  BIT(0)
+#define OPTION_TS              BIT(1)
+#define OPTION_MD5             BIT(2)
+#define OPTION_WSCALE          BIT(3)
+#define OPTION_FAST_OPEN_COOKIE        BIT(8)
+#define OPTION_SMC             BIT(9)
+#define OPTION_MPTCP           BIT(10)
 
 static void smc_options_write(__be32 *ptr, u16 *options)
 {
@@ -1559,7 +1559,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue,
                return -ENOMEM;
        }
 
-       if (skb_unclone(skb, gfp))
+       if (skb_unclone_keeptruesize(skb, gfp))
                return -ENOMEM;
 
        /* Get a new skb... force flag on. */
@@ -1667,7 +1667,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
 {
        u32 delta_truesize;
 
-       if (skb_unclone(skb, GFP_ATOMIC))
+       if (skb_unclone_keeptruesize(skb, GFP_ATOMIC))
                return -ENOMEM;
 
        delta_truesize = __pskb_trim_head(skb, len);
@@ -1677,7 +1677,8 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
        if (delta_truesize) {
                skb->truesize      -= delta_truesize;
                sk_wmem_queued_add(sk, -delta_truesize);
-               sk_mem_uncharge(sk, delta_truesize);
+               if (!skb_zcopy_pure(skb))
+                       sk_mem_uncharge(sk, delta_truesize);
        }
 
        /* Any change of skb->len requires recalculation of tso factor. */
@@ -2295,7 +2296,9 @@ static bool tcp_can_coalesce_send_queue_head(struct sock *sk, int len)
                if (len <= skb->len)
                        break;
 
-               if (unlikely(TCP_SKB_CB(skb)->eor) || tcp_has_tx_tstamp(skb))
+               if (unlikely(TCP_SKB_CB(skb)->eor) ||
+                   tcp_has_tx_tstamp(skb) ||
+                   !skb_pure_zcopy_same(skb, next))
                        return false;
 
                len -= skb->len;
@@ -3166,7 +3169,7 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)
                                 cur_mss, GFP_ATOMIC))
                        return -ENOMEM; /* We'll try again later. */
        } else {
-               if (skb_unclone(skb, GFP_ATOMIC))
+               if (skb_unclone_keeptruesize(skb, GFP_ATOMIC))
                        return -ENOMEM;
 
                diff = tcp_skb_pcount(skb);
index 5daa1c3ed83ba87d847db6e42878603824a84ed5..a8b5784afb1ae1fb400650a6781e3088a293c35d 100644 (file)
@@ -378,7 +378,7 @@ static int __net_init seg6_net_init(struct net *net)
                kfree(rcu_dereference_raw(sdata->tun_src));
                kfree(sdata);
                return -ENOMEM;
-       };
+       }
 #endif
 
        return 0;
index 2cc9b0e53ad1c8e2d35fc9c6dbd1e90fee40b632..551fce49841d7f53a111b0435855634cece2b40a 100644 (file)
@@ -1263,7 +1263,6 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *
 
                inet_sk(newsk)->pinet6 = tcp_inet6_sk(newsk);
 
-               newinet = inet_sk(newsk);
                newnp = tcp_inet6_sk(newsk);
                newtp = tcp_sk(newsk);
 
index 12c12619ee357d4010045e1802c37f13a10d770c..e43b31d25fb61c7875f3bb8a93eb74da244d912a 100644 (file)
@@ -700,9 +700,9 @@ static int udpv6_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)
 
                        ret = encap_rcv(sk, skb);
                        if (ret <= 0) {
-                               __UDP_INC_STATS(sock_net(sk),
-                                               UDP_MIB_INDATAGRAMS,
-                                               is_udplite);
+                               __UDP6_INC_STATS(sock_net(sk),
+                                                UDP_MIB_INDATAGRAMS,
+                                                is_udplite);
                                return -ret;
                        }
                }
index d344b02a1cde68975d15e6eeee9d623958c9b3bd..871cf62661258f2f2e53b71b42fe81b271304df0 100644 (file)
@@ -33,6 +33,19 @@ static int mctp_release(struct socket *sock)
        return 0;
 }
 
+/* Generic sockaddr checks, padding checks only so far */
+static bool mctp_sockaddr_is_ok(const struct sockaddr_mctp *addr)
+{
+       return !addr->__smctp_pad0 && !addr->__smctp_pad1;
+}
+
+static bool mctp_sockaddr_ext_is_ok(const struct sockaddr_mctp_ext *addr)
+{
+       return !addr->__smctp_pad0[0] &&
+              !addr->__smctp_pad0[1] &&
+              !addr->__smctp_pad0[2];
+}
+
 static int mctp_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
 {
        struct sock *sk = sock->sk;
@@ -52,6 +65,9 @@ static int mctp_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
        /* it's a valid sockaddr for MCTP, cast and do protocol checks */
        smctp = (struct sockaddr_mctp *)addr;
 
+       if (!mctp_sockaddr_is_ok(smctp))
+               return -EINVAL;
+
        lock_sock(sk);
 
        /* TODO: allow rebind */
@@ -87,6 +103,8 @@ static int mctp_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
                        return -EINVAL;
                if (addr->smctp_family != AF_MCTP)
                        return -EINVAL;
+               if (!mctp_sockaddr_is_ok(addr))
+                       return -EINVAL;
                if (addr->smctp_tag & ~(MCTP_TAG_MASK | MCTP_TAG_OWNER))
                        return -EINVAL;
 
@@ -124,7 +142,8 @@ static int mctp_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
                DECLARE_SOCKADDR(struct sockaddr_mctp_ext *,
                                 extaddr, msg->msg_name);
 
-               if (extaddr->smctp_halen > sizeof(cb->haddr)) {
+               if (!mctp_sockaddr_ext_is_ok(extaddr) ||
+                   extaddr->smctp_halen > sizeof(cb->haddr)) {
                        rc = -EINVAL;
                        goto err_free;
                }
@@ -198,11 +217,13 @@ static int mctp_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
 
                addr = msg->msg_name;
                addr->smctp_family = AF_MCTP;
+               addr->__smctp_pad0 = 0;
                addr->smctp_network = cb->net;
                addr->smctp_addr.s_addr = hdr->src;
                addr->smctp_type = type;
                addr->smctp_tag = hdr->flags_seq_tag &
                                        (MCTP_HDR_TAG_MASK | MCTP_HDR_FLAG_TO);
+               addr->__smctp_pad1 = 0;
                msg->msg_namelen = sizeof(*addr);
 
                if (msk->addr_ext) {
@@ -211,6 +232,7 @@ static int mctp_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
                        msg->msg_namelen = sizeof(*ae);
                        ae->smctp_ifindex = cb->ifindex;
                        ae->smctp_halen = cb->halen;
+                       memset(ae->__smctp_pad0, 0x0, sizeof(ae->__smctp_pad0));
                        memset(ae->smctp_haddr, 0x0, sizeof(ae->smctp_haddr));
                        memcpy(ae->smctp_haddr, cb->haddr, cb->halen);
                }
index 816f74dadfa385b63985960cc9143b989d09c933..39c523bd775c3a873339c635f4ee4c24f78d2a4f 100644 (file)
@@ -47,6 +47,8 @@
 
 #include <net/ip_vs.h>
 
+MODULE_ALIAS_GENL_FAMILY(IPVS_GENL_NAME);
+
 /* semaphore for IPVS sockopts. And, [gs]etsockopt may sleep. */
 static DEFINE_MUTEX(__ip_vs_mutex);
 
index 4c3fbaaeb10303d48c1c388ef8c9e2b8aedbd716..4acc4b8e9fe5a0fde7305afda92e6ac01c59ac02 100644 (file)
@@ -560,7 +560,7 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
                goto nla_put_failure;
 
        if (indev && entskb->dev &&
-           entskb->mac_header != entskb->network_header) {
+           skb_mac_header_was_set(entskb)) {
                struct nfqnl_msg_packet_hw phw;
                int len;
 
index 49089c50872e683e5b75875630f9a80f26cd7ad9..334f63c9529efaf6170c82a0ec5bd7805d5f44da 100644 (file)
@@ -1664,31 +1664,37 @@ static const struct genl_ops nfc_genl_ops[] = {
                .cmd = NFC_CMD_DEV_UP,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_dev_up,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DEV_DOWN,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_dev_down,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_START_POLL,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_start_poll,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_STOP_POLL,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_stop_poll,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DEP_LINK_UP,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_dep_link_up,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DEP_LINK_DOWN,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_dep_link_down,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_GET_TARGET,
@@ -1706,26 +1712,31 @@ static const struct genl_ops nfc_genl_ops[] = {
                .cmd = NFC_CMD_LLC_SET_PARAMS,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_llc_set_params,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_LLC_SDREQ,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_llc_sdreq,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_FW_DOWNLOAD,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_fw_download,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_ENABLE_SE,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_enable_se,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DISABLE_SE,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_disable_se,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_GET_SE,
@@ -1737,21 +1748,25 @@ static const struct genl_ops nfc_genl_ops[] = {
                .cmd = NFC_CMD_SE_IO,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_se_io,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_ACTIVATE_TARGET,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_activate_target,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_VENDOR,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_vendor_cmd,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DEACTIVATE_TARGET,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_deactivate_target,
+               .flags = GENL_ADMIN_PERM,
        },
 };
 
index 9ab068fa2672be8febd227b96cbcf646bf51f661..377f896bdedc4575316c3bab1d661d9c88142ec0 100644 (file)
@@ -95,18 +95,22 @@ static ktime_t sched_base_time(const struct sched_gate_list *sched)
        return ns_to_ktime(sched->base_time);
 }
 
-static ktime_t taprio_get_time(struct taprio_sched *q)
+static ktime_t taprio_mono_to_any(const struct taprio_sched *q, ktime_t mono)
 {
-       ktime_t mono = ktime_get();
+       /* This pairs with WRITE_ONCE() in taprio_parse_clockid() */
+       enum tk_offsets tk_offset = READ_ONCE(q->tk_offset);
 
-       switch (q->tk_offset) {
+       switch (tk_offset) {
        case TK_OFFS_MAX:
                return mono;
        default:
-               return ktime_mono_to_any(mono, q->tk_offset);
+               return ktime_mono_to_any(mono, tk_offset);
        }
+}
 
-       return KTIME_MAX;
+static ktime_t taprio_get_time(const struct taprio_sched *q)
+{
+       return taprio_mono_to_any(q, ktime_get());
 }
 
 static void taprio_free_sched_cb(struct rcu_head *head)
@@ -319,7 +323,7 @@ static ktime_t get_tcp_tstamp(struct taprio_sched *q, struct sk_buff *skb)
                return 0;
        }
 
-       return ktime_mono_to_any(skb->skb_mstamp_ns, q->tk_offset);
+       return taprio_mono_to_any(q, skb->skb_mstamp_ns);
 }
 
 /* There are a few scenarios where we will have to modify the txtime from
@@ -1352,6 +1356,7 @@ static int taprio_parse_clockid(struct Qdisc *sch, struct nlattr **tb,
                }
        } else if (tb[TCA_TAPRIO_ATTR_SCHED_CLOCKID]) {
                int clockid = nla_get_s32(tb[TCA_TAPRIO_ATTR_SCHED_CLOCKID]);
+               enum tk_offsets tk_offset;
 
                /* We only support static clockids and we don't allow
                 * for it to be modified after the first init.
@@ -1366,22 +1371,24 @@ static int taprio_parse_clockid(struct Qdisc *sch, struct nlattr **tb,
 
                switch (clockid) {
                case CLOCK_REALTIME:
-                       q->tk_offset = TK_OFFS_REAL;
+                       tk_offset = TK_OFFS_REAL;
                        break;
                case CLOCK_MONOTONIC:
-                       q->tk_offset = TK_OFFS_MAX;
+                       tk_offset = TK_OFFS_MAX;
                        break;
                case CLOCK_BOOTTIME:
-                       q->tk_offset = TK_OFFS_BOOT;
+                       tk_offset = TK_OFFS_BOOT;
                        break;
                case CLOCK_TAI:
-                       q->tk_offset = TK_OFFS_TAI;
+                       tk_offset = TK_OFFS_TAI;
                        break;
                default:
                        NL_SET_ERR_MSG(extack, "Invalid 'clockid'");
                        err = -EINVAL;
                        goto out;
                }
+               /* This pairs with READ_ONCE() in taprio_mono_to_any */
+               WRITE_ONCE(q->tk_offset, tk_offset);
 
                q->clockid = clockid;
        } else {
index fb3da4d8f4a340cd65387010cc2319db38409b70..39ba82ee87cec1daf48b231815e125dff35a5c34 100644 (file)
@@ -326,11 +326,6 @@ enum sctp_disposition sctp_sf_do_5_1B_init(struct net *net,
        struct sctp_packet *packet;
        int len;
 
-       /* Update socket peer label if first association. */
-       if (security_sctp_assoc_request((struct sctp_endpoint *)ep,
-                                       chunk->skb))
-               return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
-
        /* 6.10 Bundling
         * An endpoint MUST NOT bundle INIT, INIT ACK or
         * SHUTDOWN COMPLETE with any other chunks.
@@ -415,6 +410,12 @@ enum sctp_disposition sctp_sf_do_5_1B_init(struct net *net,
        if (!new_asoc)
                goto nomem;
 
+       /* Update socket peer label if first association. */
+       if (security_sctp_assoc_request(new_asoc, chunk->skb)) {
+               sctp_association_free(new_asoc);
+               return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
+       }
+
        if (sctp_assoc_set_bind_addr_from_ep(new_asoc,
                                             sctp_scope(sctp_source(chunk)),
                                             GFP_ATOMIC) < 0)
@@ -780,6 +781,10 @@ enum sctp_disposition sctp_sf_do_5_1D_ce(struct net *net,
                }
        }
 
+       if (security_sctp_assoc_request(new_asoc, chunk->skb)) {
+               sctp_association_free(new_asoc);
+               return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
+       }
 
        /* Delay state machine commands until later.
         *
@@ -941,7 +946,7 @@ enum sctp_disposition sctp_sf_do_5_1E_ca(struct net *net,
        sctp_add_cmd_sf(commands, SCTP_CMD_INIT_COUNTER_RESET, SCTP_NULL());
 
        /* Set peer label for connection. */
-       security_inet_conn_established(ep->base.sk, chunk->skb);
+       security_sctp_assoc_established((struct sctp_association *)asoc, chunk->skb);
 
        /* RFC 2960 5.1 Normal Establishment of an Association
         *
@@ -1517,11 +1522,6 @@ static enum sctp_disposition sctp_sf_do_unexpected_init(
        struct sctp_packet *packet;
        int len;
 
-       /* Update socket peer label if first association. */
-       if (security_sctp_assoc_request((struct sctp_endpoint *)ep,
-                                       chunk->skb))
-               return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
-
        /* 6.10 Bundling
         * An endpoint MUST NOT bundle INIT, INIT ACK or
         * SHUTDOWN COMPLETE with any other chunks.
@@ -1594,6 +1594,12 @@ static enum sctp_disposition sctp_sf_do_unexpected_init(
        if (!new_asoc)
                goto nomem;
 
+       /* Update socket peer label if first association. */
+       if (security_sctp_assoc_request(new_asoc, chunk->skb)) {
+               sctp_association_free(new_asoc);
+               return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
+       }
+
        if (sctp_assoc_set_bind_addr_from_ep(new_asoc,
                                sctp_scope(sctp_source(chunk)), GFP_ATOMIC) < 0)
                goto nomem;
@@ -2255,8 +2261,7 @@ enum sctp_disposition sctp_sf_do_5_2_4_dupcook(
        }
 
        /* Update socket peer label if first association. */
-       if (security_sctp_assoc_request((struct sctp_endpoint *)ep,
-                                       chunk->skb)) {
+       if (security_sctp_assoc_request(new_asoc, chunk->skb)) {
                sctp_association_free(new_asoc);
                return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
        }
@@ -4893,9 +4898,6 @@ static enum sctp_disposition sctp_sf_violation_chunk(
 {
        static const char err_str[] = "The following chunk violates protocol:";
 
-       if (!asoc)
-               return sctp_sf_violation(net, ep, asoc, type, arg, commands);
-
        return sctp_sf_abort_violation(net, ep, asoc, arg, commands, err_str,
                                       sizeof(err_str));
 }
index 6b937bfd475159df6b15e6a30023e30f09ff0a07..33391254fa82b2277551387bfcdf95259bea7e0d 100644 (file)
@@ -9412,7 +9412,6 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
        struct inet_sock *inet = inet_sk(sk);
        struct inet_sock *newinet;
        struct sctp_sock *sp = sctp_sk(sk);
-       struct sctp_endpoint *ep = sp->ep;
 
        newsk->sk_type = sk->sk_type;
        newsk->sk_bound_dev_if = sk->sk_bound_dev_if;
@@ -9457,9 +9456,9 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
                net_enable_timestamp();
 
        /* Set newsk security attributes from original sk and connection
-        * security attribute from ep.
+        * security attribute from asoc.
         */
-       security_sctp_sk_clone(ep, sk, newsk);
+       security_sctp_sk_clone(asoc, sk, newsk);
 }
 
 static inline void sctp_copy_descendant(struct sock *sk_to,
index 0cf7ed2f5d41b5a626907a7df5ae7db5841a0730..59284da9116d787b95704be7fda6d62e351e36aa 100644 (file)
@@ -149,14 +149,18 @@ static int __smc_release(struct smc_sock *smc)
                sock_set_flag(sk, SOCK_DEAD);
                sk->sk_shutdown |= SHUTDOWN_MASK;
        } else {
-               if (sk->sk_state != SMC_LISTEN && sk->sk_state != SMC_INIT)
-                       sock_put(sk); /* passive closing */
-               if (sk->sk_state == SMC_LISTEN) {
-                       /* wake up clcsock accept */
-                       rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR);
+               if (sk->sk_state != SMC_CLOSED) {
+                       if (sk->sk_state != SMC_LISTEN &&
+                           sk->sk_state != SMC_INIT)
+                               sock_put(sk); /* passive closing */
+                       if (sk->sk_state == SMC_LISTEN) {
+                               /* wake up clcsock accept */
+                               rc = kernel_sock_shutdown(smc->clcsock,
+                                                         SHUT_RDWR);
+                       }
+                       sk->sk_state = SMC_CLOSED;
+                       sk->sk_state_change(sk);
                }
-               sk->sk_state = SMC_CLOSED;
-               sk->sk_state_change(sk);
                smc_restore_fallback_changes(smc);
        }
 
index b4c36795a9280f5016febe1da071731e521af9e6..ec17f29646f5707d8361741552e42b8a3848d64c 100644 (file)
@@ -99,7 +99,7 @@ TRACE_EVENT(smcr_link_down,
                           __entry->location = location;
            ),
 
-           TP_printk("lnk=%p lgr=%p state=%d dev=%s location=%p",
+           TP_printk("lnk=%p lgr=%p state=%d dev=%s location=%pS",
                      __entry->lnk, __entry->lgr,
                      __entry->state, __get_str(name),
                      __entry->location)
index 9c0343568d2a0609cf1077043bf7742dd8d8585d..1a72c67afed5e6acedee4eed9111b0a2ba07e5be 100644 (file)
 
 static struct workqueue_struct *strp_wq;
 
-struct _strp_msg {
-       /* Internal cb structure. struct strp_msg must be first for passing
-        * to upper layer.
-        */
-       struct strp_msg strp;
-       int accum_len;
-};
-
 static inline struct _strp_msg *_strp_msg(struct sk_buff *skb)
 {
        return (struct _strp_msg *)((void *)skb->cb +
-               offsetof(struct qdisc_skb_cb, data));
+               offsetof(struct sk_skb_cb, strp));
 }
 
 /* Lower lock held */
index 7d851eb3a683074e078911e4771a8492ad4c1661..ed0df839c38ce68882047129d7514370b453f4c4 100644 (file)
@@ -1322,6 +1322,8 @@ static int vsock_connect(struct socket *sock, struct sockaddr *addr,
                 * non-blocking call.
                 */
                err = -EALREADY;
+               if (flags & O_NONBLOCK)
+                       goto out;
                break;
        default:
                if ((sk->sk_state == TCP_LISTEN) ||
index 95e30fadba78956d2ba06e47baef02f89de8a06c..779a9edea0a0354967c9296bb4aa1dd5e7d36fb2 100644 (file)
@@ -2367,9 +2367,9 @@ int security_tun_dev_open(void *security)
 }
 EXPORT_SYMBOL(security_tun_dev_open);
 
-int security_sctp_assoc_request(struct sctp_endpoint *ep, struct sk_buff *skb)
+int security_sctp_assoc_request(struct sctp_association *asoc, struct sk_buff *skb)
 {
-       return call_int_hook(sctp_assoc_request, 0, ep, skb);
+       return call_int_hook(sctp_assoc_request, 0, asoc, skb);
 }
 EXPORT_SYMBOL(security_sctp_assoc_request);
 
@@ -2381,13 +2381,20 @@ int security_sctp_bind_connect(struct sock *sk, int optname,
 }
 EXPORT_SYMBOL(security_sctp_bind_connect);
 
-void security_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk,
+void security_sctp_sk_clone(struct sctp_association *asoc, struct sock *sk,
                            struct sock *newsk)
 {
-       call_void_hook(sctp_sk_clone, ep, sk, newsk);
+       call_void_hook(sctp_sk_clone, asoc, sk, newsk);
 }
 EXPORT_SYMBOL(security_sctp_sk_clone);
 
+void security_sctp_assoc_established(struct sctp_association *asoc,
+                                    struct sk_buff *skb)
+{
+       call_void_hook(sctp_assoc_established, asoc, skb);
+}
+EXPORT_SYMBOL(security_sctp_assoc_established);
+
 #endif /* CONFIG_SECURITY_NETWORK */
 
 #ifdef CONFIG_SECURITY_INFINIBAND
index ea7b2876a5ae267cd28f0298e8be810f647d304a..5e5215fe2e83e0d6202e6ef5e9f35a5093404397 100644 (file)
@@ -5339,10 +5339,10 @@ static void selinux_sock_graft(struct sock *sk, struct socket *parent)
  * connect(2), sctp_connectx(3) or sctp_sendmsg(3) (with no association
  * already present).
  */
-static int selinux_sctp_assoc_request(struct sctp_endpoint *ep,
+static int selinux_sctp_assoc_request(struct sctp_association *asoc,
                                      struct sk_buff *skb)
 {
-       struct sk_security_struct *sksec = ep->base.sk->sk_security;
+       struct sk_security_struct *sksec = asoc->base.sk->sk_security;
        struct common_audit_data ad;
        struct lsm_network_audit net = {0,};
        u8 peerlbl_active;
@@ -5359,7 +5359,7 @@ static int selinux_sctp_assoc_request(struct sctp_endpoint *ep,
                /* This will return peer_sid = SECSID_NULL if there are
                 * no peer labels, see security_net_peersid_resolve().
                 */
-               err = selinux_skb_peerlbl_sid(skb, ep->base.sk->sk_family,
+               err = selinux_skb_peerlbl_sid(skb, asoc->base.sk->sk_family,
                                              &peer_sid);
                if (err)
                        return err;
@@ -5383,7 +5383,7 @@ static int selinux_sctp_assoc_request(struct sctp_endpoint *ep,
                 */
                ad.type = LSM_AUDIT_DATA_NET;
                ad.u.net = &net;
-               ad.u.net->sk = ep->base.sk;
+               ad.u.net->sk = asoc->base.sk;
                err = avc_has_perm(&selinux_state,
                                   sksec->peer_sid, peer_sid, sksec->sclass,
                                   SCTP_SOCKET__ASSOCIATION, &ad);
@@ -5392,7 +5392,7 @@ static int selinux_sctp_assoc_request(struct sctp_endpoint *ep,
        }
 
        /* Compute the MLS component for the connection and store
-        * the information in ep. This will be used by SCTP TCP type
+        * the information in asoc. This will be used by SCTP TCP type
         * sockets and peeled off connections as they cause a new
         * socket to be generated. selinux_sctp_sk_clone() will then
         * plug this into the new socket.
@@ -5401,11 +5401,11 @@ static int selinux_sctp_assoc_request(struct sctp_endpoint *ep,
        if (err)
                return err;
 
-       ep->secid = conn_sid;
-       ep->peer_secid = peer_sid;
+       asoc->secid = conn_sid;
+       asoc->peer_secid = peer_sid;
 
        /* Set any NetLabel labels including CIPSO/CALIPSO options. */
-       return selinux_netlbl_sctp_assoc_request(ep, skb);
+       return selinux_netlbl_sctp_assoc_request(asoc, skb);
 }
 
 /* Check if sctp IPv4/IPv6 addresses are valid for binding or connecting
@@ -5490,7 +5490,7 @@ static int selinux_sctp_bind_connect(struct sock *sk, int optname,
 }
 
 /* Called whenever a new socket is created by accept(2) or sctp_peeloff(3). */
-static void selinux_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk,
+static void selinux_sctp_sk_clone(struct sctp_association *asoc, struct sock *sk,
                                  struct sock *newsk)
 {
        struct sk_security_struct *sksec = sk->sk_security;
@@ -5502,8 +5502,9 @@ static void selinux_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk,
        if (!selinux_policycap_extsockclass())
                return selinux_sk_clone_security(sk, newsk);
 
-       newsksec->sid = ep->secid;
-       newsksec->peer_sid = ep->peer_secid;
+       if (asoc->secid != SECSID_WILD)
+               newsksec->sid = asoc->secid;
+       newsksec->peer_sid = asoc->peer_secid;
        newsksec->sclass = sksec->sclass;
        selinux_netlbl_sctp_sk_clone(sk, newsk);
 }
@@ -5558,6 +5559,16 @@ static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
        selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
 }
 
+static void selinux_sctp_assoc_established(struct sctp_association *asoc,
+                                          struct sk_buff *skb)
+{
+       struct sk_security_struct *sksec = asoc->base.sk->sk_security;
+
+       selinux_inet_conn_established(asoc->base.sk, skb);
+       asoc->peer_secid = sksec->peer_sid;
+       asoc->secid = SECSID_WILD;
+}
+
 static int selinux_secmark_relabel_packet(u32 sid)
 {
        const struct task_security_struct *__tsec;
@@ -7228,6 +7239,7 @@ static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
        LSM_HOOK_INIT(sctp_assoc_request, selinux_sctp_assoc_request),
        LSM_HOOK_INIT(sctp_sk_clone, selinux_sctp_sk_clone),
        LSM_HOOK_INIT(sctp_bind_connect, selinux_sctp_bind_connect),
+       LSM_HOOK_INIT(sctp_assoc_established, selinux_sctp_assoc_established),
        LSM_HOOK_INIT(inet_conn_request, selinux_inet_conn_request),
        LSM_HOOK_INIT(inet_csk_clone, selinux_inet_csk_clone),
        LSM_HOOK_INIT(inet_conn_established, selinux_inet_conn_established),
index 0c58f62dc6abf8e7c83b71c27c1c98a5815ccff8..4d0456d3d45933b87263b3b03d4707f592ac8efc 100644 (file)
@@ -39,7 +39,7 @@ int selinux_netlbl_skbuff_getsid(struct sk_buff *skb,
 int selinux_netlbl_skbuff_setsid(struct sk_buff *skb,
                                 u16 family,
                                 u32 sid);
-int selinux_netlbl_sctp_assoc_request(struct sctp_endpoint *ep,
+int selinux_netlbl_sctp_assoc_request(struct sctp_association *asoc,
                                     struct sk_buff *skb);
 int selinux_netlbl_inet_conn_request(struct request_sock *req, u16 family);
 void selinux_netlbl_inet_csk_clone(struct sock *sk, u16 family);
@@ -98,7 +98,7 @@ static inline int selinux_netlbl_skbuff_setsid(struct sk_buff *skb,
        return 0;
 }
 
-static inline int selinux_netlbl_sctp_assoc_request(struct sctp_endpoint *ep,
+static inline int selinux_netlbl_sctp_assoc_request(struct sctp_association *asoc,
                                                    struct sk_buff *skb)
 {
        return 0;
index 29b88e81869bebcf44e2fbd4d57f10ab55964980..1321f15799e2f8bf29cefe064facc663db4275a9 100644 (file)
@@ -261,30 +261,30 @@ skbuff_setsid_return:
 
 /**
  * selinux_netlbl_sctp_assoc_request - Label an incoming sctp association.
- * @ep: incoming association endpoint.
+ * @asoc: incoming association.
  * @skb: the packet.
  *
  * Description:
- * A new incoming connection is represented by @ep, ......
+ * A new incoming connection is represented by @asoc, ......
  * Returns zero on success, negative values on failure.
  *
  */
-int selinux_netlbl_sctp_assoc_request(struct sctp_endpoint *ep,
+int selinux_netlbl_sctp_assoc_request(struct sctp_association *asoc,
                                     struct sk_buff *skb)
 {
        int rc;
        struct netlbl_lsm_secattr secattr;
-       struct sk_security_struct *sksec = ep->base.sk->sk_security;
+       struct sk_security_struct *sksec = asoc->base.sk->sk_security;
        struct sockaddr_in addr4;
        struct sockaddr_in6 addr6;
 
-       if (ep->base.sk->sk_family != PF_INET &&
-                               ep->base.sk->sk_family != PF_INET6)
+       if (asoc->base.sk->sk_family != PF_INET &&
+           asoc->base.sk->sk_family != PF_INET6)
                return 0;
 
        netlbl_secattr_init(&secattr);
        rc = security_netlbl_sid_to_secattr(&selinux_state,
-                                           ep->secid, &secattr);
+                                           asoc->secid, &secattr);
        if (rc != 0)
                goto assoc_request_return;
 
@@ -294,11 +294,11 @@ int selinux_netlbl_sctp_assoc_request(struct sctp_endpoint *ep,
        if (ip_hdr(skb)->version == 4) {
                addr4.sin_family = AF_INET;
                addr4.sin_addr.s_addr = ip_hdr(skb)->saddr;
-               rc = netlbl_conn_setattr(ep->base.sk, (void *)&addr4, &secattr);
+               rc = netlbl_conn_setattr(asoc->base.sk, (void *)&addr4, &secattr);
        } else if (IS_ENABLED(CONFIG_IPV6) && ip_hdr(skb)->version == 6) {
                addr6.sin6_family = AF_INET6;
                addr6.sin6_addr = ipv6_hdr(skb)->saddr;
-               rc = netlbl_conn_setattr(ep->base.sk, (void *)&addr6, &secattr);
+               rc = netlbl_conn_setattr(asoc->base.sk, (void *)&addr6, &secattr);
        } else {
                rc = -EAFNOSUPPORT;
        }
index c0c30e56988f2cbee3b61c2fd32c8ce58eb722ac..7cfba11c30146dea782944389d144cf93b009340 100644 (file)
@@ -22,24 +22,29 @@ else
   _OUTPUT := $(CURDIR)
 endif
 BOOTSTRAP_OUTPUT := $(_OUTPUT)/bootstrap/
+
 LIBBPF_OUTPUT := $(_OUTPUT)/libbpf/
 LIBBPF_DESTDIR := $(LIBBPF_OUTPUT)
 LIBBPF_INCLUDE := $(LIBBPF_DESTDIR)/include
 LIBBPF_HDRS_DIR := $(LIBBPF_INCLUDE)/bpf
+LIBBPF := $(LIBBPF_OUTPUT)libbpf.a
 
-LIBBPF = $(LIBBPF_OUTPUT)libbpf.a
-LIBBPF_BOOTSTRAP_OUTPUT = $(BOOTSTRAP_OUTPUT)libbpf/
-LIBBPF_BOOTSTRAP = $(LIBBPF_BOOTSTRAP_OUTPUT)libbpf.a
+LIBBPF_BOOTSTRAP_OUTPUT := $(BOOTSTRAP_OUTPUT)libbpf/
+LIBBPF_BOOTSTRAP_DESTDIR := $(LIBBPF_BOOTSTRAP_OUTPUT)
+LIBBPF_BOOTSTRAP_INCLUDE := $(LIBBPF_BOOTSTRAP_DESTDIR)/include
+LIBBPF_BOOTSTRAP_HDRS_DIR := $(LIBBPF_BOOTSTRAP_INCLUDE)/bpf
+LIBBPF_BOOTSTRAP := $(LIBBPF_BOOTSTRAP_OUTPUT)libbpf.a
 
 # We need to copy hashmap.h and nlattr.h which is not otherwise exported by
 # libbpf, but still required by bpftool.
 LIBBPF_INTERNAL_HDRS := $(addprefix $(LIBBPF_HDRS_DIR)/,hashmap.h nlattr.h)
+LIBBPF_BOOTSTRAP_INTERNAL_HDRS := $(addprefix $(LIBBPF_BOOTSTRAP_HDRS_DIR)/,hashmap.h)
 
 ifeq ($(BPFTOOL_VERSION),)
 BPFTOOL_VERSION := $(shell make -rR --no-print-directory -sC ../../.. kernelversion)
 endif
 
-$(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) $(LIBBPF_BOOTSTRAP_OUTPUT) $(LIBBPF_HDRS_DIR):
+$(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) $(LIBBPF_BOOTSTRAP_OUTPUT) $(LIBBPF_HDRS_DIR) $(LIBBPF_BOOTSTRAP_HDRS_DIR):
        $(QUIET_MKDIR)mkdir -p $@
 
 $(LIBBPF): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_OUTPUT)
@@ -52,7 +57,12 @@ $(LIBBPF_INTERNAL_HDRS): $(LIBBPF_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_HDRS_
 
 $(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT)
        $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \
-               ARCH= CC=$(HOSTCC) LD=$(HOSTLD) $@
+               DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR) prefix= \
+               ARCH= CC=$(HOSTCC) LD=$(HOSTLD) $@ install_headers
+
+$(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR)
+       $(call QUIET_INSTALL, $@)
+       $(Q)install -m 644 -t $(LIBBPF_BOOTSTRAP_HDRS_DIR) $<
 
 $(LIBBPF)-clean: FORCE | $(LIBBPF_OUTPUT)
        $(call QUIET_CLEAN, libbpf)
@@ -172,11 +182,11 @@ else
        $(Q)cp "$(VMLINUX_H)" $@
 endif
 
-$(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF)
+$(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP)
        $(QUIET_CLANG)$(CLANG) \
                -I$(if $(OUTPUT),$(OUTPUT),.) \
                -I$(srctree)/tools/include/uapi/ \
-               -I$(LIBBPF_INCLUDE) \
+               -I$(LIBBPF_BOOTSTRAP_INCLUDE) \
                -g -O2 -Wall -target bpf -c $< -o $@ && $(LLVM_STRIP) -g $@
 
 $(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP)
@@ -209,8 +219,10 @@ $(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP)
 $(OUTPUT)bpftool: $(OBJS) $(LIBBPF)
        $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
 
-$(BOOTSTRAP_OUTPUT)%.o: %.c $(LIBBPF_INTERNAL_HDRS) | $(BOOTSTRAP_OUTPUT)
-       $(QUIET_CC)$(HOSTCC) $(CFLAGS) -c -MMD -o $@ $<
+$(BOOTSTRAP_OUTPUT)%.o: %.c $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS) | $(BOOTSTRAP_OUTPUT)
+       $(QUIET_CC)$(HOSTCC) \
+               $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),$(CFLAGS)) \
+               -c -MMD -o $@ $<
 
 $(OUTPUT)%.o: %.c
        $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
@@ -257,6 +269,6 @@ doc-uninstall:
 FORCE:
 
 .SECONDARY:
-.PHONY: all FORCE clean install-bin install uninstall
+.PHONY: all FORCE bootstrap clean install-bin install uninstall
 .PHONY: doc doc-clean doc-install doc-uninstall
 .DEFAULT_GOAL := all
index c09cbb868c9f123ccdc8812eca4dc3e5895bb057..725701235fd855e322118826891a35018e9556a1 100644 (file)
@@ -515,6 +515,7 @@ int bpf_map_lookup_and_delete_elem(int fd, const void *key, void *value)
 int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, void *value, __u64 flags)
 {
        union bpf_attr attr;
+       int ret;
 
        memset(&attr, 0, sizeof(attr));
        attr.map_fd = fd;
@@ -522,7 +523,8 @@ int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, void *value, _
        attr.value = ptr_to_u64(value);
        attr.flags = flags;
 
-       return sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, sizeof(attr));
+       return libbpf_err_errno(ret);
 }
 
 int bpf_map_delete_elem(int fd, const void *key)
index 6ede48bde91b74f92e15804aeeadb70eb261b443..954964f0ac3db8df343ad7c2eaa735a34194dfa3 100644 (file)
@@ -8,7 +8,7 @@
 
 #define CG_NAME "/netcnt"
 
-void test_netcnt(void)
+void serial_test_netcnt(void)
 {
        union percpu_net_cnt *percpu_netcnt = NULL;
        struct bpf_cgroup_storage_key key;
index 172c999e523c10440814cea1334b1e4534d88ad2..d29ebfeef9c546a85a6741147c946e32b13179bc 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 /* Copyright (c) 2020 Facebook */
 #define _GNU_SOURCE
+#include <stdio.h>
 #include <sched.h>
 #include <sys/mount.h>
 #include <sys/stat.h>
@@ -29,44 +30,106 @@ static int read_iter(char *file)
 
 static int fn(void)
 {
-       int err, duration = 0;
+       struct stat a, b, c;
+       int err, map;
 
        err = unshare(CLONE_NEWNS);
-       if (CHECK(err, "unshare", "failed: %d\n", errno))
+       if (!ASSERT_OK(err, "unshare"))
                goto out;
 
        err = mount("", "/", "", MS_REC | MS_PRIVATE, NULL);
-       if (CHECK(err, "mount /", "failed: %d\n", errno))
+       if (!ASSERT_OK(err, "mount /"))
                goto out;
 
        err = umount(TDIR);
-       if (CHECK(err, "umount " TDIR, "failed: %d\n", errno))
+       if (!ASSERT_OK(err, "umount " TDIR))
                goto out;
 
        err = mount("none", TDIR, "tmpfs", 0, NULL);
-       if (CHECK(err, "mount", "mount root failed: %d\n", errno))
+       if (!ASSERT_OK(err, "mount tmpfs"))
                goto out;
 
        err = mkdir(TDIR "/fs1", 0777);
-       if (CHECK(err, "mkdir "TDIR"/fs1", "failed: %d\n", errno))
+       if (!ASSERT_OK(err, "mkdir " TDIR "/fs1"))
                goto out;
        err = mkdir(TDIR "/fs2", 0777);
-       if (CHECK(err, "mkdir "TDIR"/fs2", "failed: %d\n", errno))
+       if (!ASSERT_OK(err, "mkdir " TDIR "/fs2"))
                goto out;
 
        err = mount("bpf", TDIR "/fs1", "bpf", 0, NULL);
-       if (CHECK(err, "mount bpffs "TDIR"/fs1", "failed: %d\n", errno))
+       if (!ASSERT_OK(err, "mount bpffs " TDIR "/fs1"))
                goto out;
        err = mount("bpf", TDIR "/fs2", "bpf", 0, NULL);
-       if (CHECK(err, "mount bpffs " TDIR "/fs2", "failed: %d\n", errno))
+       if (!ASSERT_OK(err, "mount bpffs " TDIR "/fs2"))
                goto out;
 
        err = read_iter(TDIR "/fs1/maps.debug");
-       if (CHECK(err, "reading " TDIR "/fs1/maps.debug", "failed\n"))
+       if (!ASSERT_OK(err, "reading " TDIR "/fs1/maps.debug"))
                goto out;
        err = read_iter(TDIR "/fs2/progs.debug");
-       if (CHECK(err, "reading " TDIR "/fs2/progs.debug", "failed\n"))
+       if (!ASSERT_OK(err, "reading " TDIR "/fs2/progs.debug"))
                goto out;
+
+       err = mkdir(TDIR "/fs1/a", 0777);
+       if (!ASSERT_OK(err, "creating " TDIR "/fs1/a"))
+               goto out;
+       err = mkdir(TDIR "/fs1/a/1", 0777);
+       if (!ASSERT_OK(err, "creating " TDIR "/fs1/a/1"))
+               goto out;
+       err = mkdir(TDIR "/fs1/b", 0777);
+       if (!ASSERT_OK(err, "creating " TDIR "/fs1/b"))
+               goto out;
+
+       map = bpf_create_map(BPF_MAP_TYPE_ARRAY, 4, 4, 1, 0);
+       if (!ASSERT_GT(map, 0, "create_map(ARRAY)"))
+               goto out;
+       err = bpf_obj_pin(map, TDIR "/fs1/c");
+       if (!ASSERT_OK(err, "pin map"))
+               goto out;
+       close(map);
+
+       /* Check that RENAME_EXCHANGE works for directories. */
+       err = stat(TDIR "/fs1/a", &a);
+       if (!ASSERT_OK(err, "stat(" TDIR "/fs1/a)"))
+               goto out;
+       err = renameat2(0, TDIR "/fs1/a", 0, TDIR "/fs1/b", RENAME_EXCHANGE);
+       if (!ASSERT_OK(err, "renameat2(/fs1/a, /fs1/b, RENAME_EXCHANGE)"))
+               goto out;
+       err = stat(TDIR "/fs1/b", &b);
+       if (!ASSERT_OK(err, "stat(" TDIR "/fs1/b)"))
+               goto out;
+       if (!ASSERT_EQ(a.st_ino, b.st_ino, "b should have a's inode"))
+               goto out;
+       err = access(TDIR "/fs1/b/1", F_OK);
+       if (!ASSERT_OK(err, "access(" TDIR "/fs1/b/1)"))
+               goto out;
+
+       /* Check that RENAME_EXCHANGE works for mixed file types. */
+       err = stat(TDIR "/fs1/c", &c);
+       if (!ASSERT_OK(err, "stat(" TDIR "/fs1/map)"))
+               goto out;
+       err = renameat2(0, TDIR "/fs1/c", 0, TDIR "/fs1/b", RENAME_EXCHANGE);
+       if (!ASSERT_OK(err, "renameat2(/fs1/c, /fs1/b, RENAME_EXCHANGE)"))
+               goto out;
+       err = stat(TDIR "/fs1/b", &b);
+       if (!ASSERT_OK(err, "stat(" TDIR "/fs1/b)"))
+               goto out;
+       if (!ASSERT_EQ(c.st_ino, b.st_ino, "b should have c's inode"))
+               goto out;
+       err = access(TDIR "/fs1/c/1", F_OK);
+       if (!ASSERT_OK(err, "access(" TDIR "/fs1/c/1)"))
+               goto out;
+
+       /* Check that RENAME_NOREPLACE works. */
+       err = renameat2(0, TDIR "/fs1/b", 0, TDIR "/fs1/a", RENAME_NOREPLACE);
+       if (!ASSERT_ERR(err, "renameat2(RENAME_NOREPLACE)")) {
+               err = -EINVAL;
+               goto out;
+       }
+       err = access(TDIR "/fs1/b", F_OK);
+       if (!ASSERT_OK(err, "access(" TDIR "/fs1/b)"))
+               goto out;
+
 out:
        umount(TDIR "/fs1");
        umount(TDIR "/fs2");
index df918b2469da04b6acc45624e9ac063f1923d039..52f6995ff29c6c0d19072e808ee41f66bea3c8b2 100644 (file)
@@ -23,6 +23,16 @@ struct callback_ctx {
        int output;
 };
 
+const volatile int bypass_unused = 1;
+
+static __u64
+unused_subprog(struct bpf_map *map, __u32 *key, __u64 *val,
+              struct callback_ctx *data)
+{
+       data->output = 0;
+       return 1;
+}
+
 static __u64
 check_array_elem(struct bpf_map *map, __u32 *key, __u64 *val,
                 struct callback_ctx *data)
@@ -54,6 +64,8 @@ int test_pkt_access(struct __sk_buff *skb)
 
        data.output = 0;
        bpf_for_each_map_elem(&arraymap, check_array_elem, &data, 0);
+       if (!bypass_unused)
+               bpf_for_each_map_elem(&arraymap, unused_subprog, &data, 0);
        arraymap_output = data.output;
 
        bpf_for_each_map_elem(&percpu_map, check_percpu_elem, (void *)0, 0);
index 351955c2bdfd8048bc25e50e57b9c86b6d7c3be7..05f8727409997d50cc6a03c37c02c6238b2b06f0 100755 (executable)
@@ -2,11 +2,11 @@
 # SPDX-License-Identifier: GPL-2.0
 #
 # Test topology:
-#     - - - - - - - - - - - - - - - - - - - - - - - - -
-#    | veth1         veth2         veth3 |  ... init net
+#    - - - - - - - - - - - - - - - - - - -
+#    | veth1         veth2         veth3 |  ns0
 #     - -| - - - - - - | - - - - - - | - -
 #    ---------     ---------     ---------
-#    | veth0 |     | veth0 |     | veth0 |  ...
+#    | veth0 |     | veth0 |     | veth0 |
 #    ---------     ---------     ---------
 #       ns1           ns2           ns3
 #
@@ -31,6 +31,7 @@ IFACES=""
 DRV_MODE="xdpgeneric xdpdrv xdpegress"
 PASS=0
 FAIL=0
+LOG_DIR=$(mktemp -d)
 
 test_pass()
 {
@@ -50,6 +51,7 @@ clean_up()
                ip link del veth$i 2> /dev/null
                ip netns del ns$i 2> /dev/null
        done
+       ip netns del ns0 2> /dev/null
 }
 
 # Kselftest framework requirement - SKIP code is 4.
@@ -77,10 +79,12 @@ setup_ns()
                mode="xdpdrv"
        fi
 
+       ip netns add ns0
        for i in $(seq $NUM); do
                ip netns add ns$i
-               ip link add veth$i type veth peer name veth0 netns ns$i
-               ip link set veth$i up
+               ip -n ns$i link add veth0 index 2 type veth \
+                       peer name veth$i netns ns0 index $((1 + $i))
+               ip -n ns0 link set veth$i up
                ip -n ns$i link set veth0 up
 
                ip -n ns$i addr add 192.0.2.$i/24 dev veth0
@@ -91,7 +95,7 @@ setup_ns()
                        xdp_dummy.o sec xdp &> /dev/null || \
                        { test_fail "Unable to load dummy xdp" && exit 1; }
                IFACES="$IFACES veth$i"
-               veth_mac[$i]=$(ip link show veth$i | awk '/link\/ether/ {print $2}')
+               veth_mac[$i]=$(ip -n ns0 link show veth$i | awk '/link\/ether/ {print $2}')
        done
 }
 
@@ -100,17 +104,17 @@ do_egress_tests()
        local mode=$1
 
        # mac test
-       ip netns exec ns2 tcpdump -e -i veth0 -nn -l -e &> mac_ns1-2_${mode}.log &
-       ip netns exec ns3 tcpdump -e -i veth0 -nn -l -e &> mac_ns1-3_${mode}.log &
+       ip netns exec ns2 tcpdump -e -i veth0 -nn -l -e &> ${LOG_DIR}/mac_ns1-2_${mode}.log &
+       ip netns exec ns3 tcpdump -e -i veth0 -nn -l -e &> ${LOG_DIR}/mac_ns1-3_${mode}.log &
        sleep 0.5
        ip netns exec ns1 ping 192.0.2.254 -i 0.1 -c 4 &> /dev/null
        sleep 0.5
-       pkill -9 tcpdump
+       pkill tcpdump
 
        # mac check
-       grep -q "${veth_mac[2]} > ff:ff:ff:ff:ff:ff" mac_ns1-2_${mode}.log && \
+       grep -q "${veth_mac[2]} > ff:ff:ff:ff:ff:ff" ${LOG_DIR}/mac_ns1-2_${mode}.log && \
               test_pass "$mode mac ns1-2" || test_fail "$mode mac ns1-2"
-       grep -q "${veth_mac[3]} > ff:ff:ff:ff:ff:ff" mac_ns1-3_${mode}.log && \
+       grep -q "${veth_mac[3]} > ff:ff:ff:ff:ff:ff" ${LOG_DIR}/mac_ns1-3_${mode}.log && \
                test_pass "$mode mac ns1-3" || test_fail "$mode mac ns1-3"
 }
 
@@ -121,46 +125,46 @@ do_ping_tests()
        # ping6 test: echo request should be redirect back to itself, not others
        ip netns exec ns1 ip neigh add 2001:db8::2 dev veth0 lladdr 00:00:00:00:00:02
 
-       ip netns exec ns1 tcpdump -i veth0 -nn -l -e &> ns1-1_${mode}.log &
-       ip netns exec ns2 tcpdump -i veth0 -nn -l -e &> ns1-2_${mode}.log &
-       ip netns exec ns3 tcpdump -i veth0 -nn -l -e &> ns1-3_${mode}.log &
+       ip netns exec ns1 tcpdump -i veth0 -nn -l -e &> ${LOG_DIR}/ns1-1_${mode}.log &
+       ip netns exec ns2 tcpdump -i veth0 -nn -l -e &> ${LOG_DIR}/ns1-2_${mode}.log &
+       ip netns exec ns3 tcpdump -i veth0 -nn -l -e &> ${LOG_DIR}/ns1-3_${mode}.log &
        sleep 0.5
        # ARP test
-       ip netns exec ns1 ping 192.0.2.254 -i 0.1 -c 4 &> /dev/null
+       ip netns exec ns1 arping -q -c 2 -I veth0 192.0.2.254
        # IPv4 test
        ip netns exec ns1 ping 192.0.2.253 -i 0.1 -c 4 &> /dev/null
        # IPv6 test
        ip netns exec ns1 ping6 2001:db8::2 -i 0.1 -c 2 &> /dev/null
        sleep 0.5
-       pkill -9 tcpdump
+       pkill tcpdump
 
        # All netns should receive the redirect arp requests
-       [ $(grep -c "who-has 192.0.2.254" ns1-1_${mode}.log) -gt 4 ] && \
+       [ $(grep -cF "who-has 192.0.2.254" ${LOG_DIR}/ns1-1_${mode}.log) -eq 4 ] && \
                test_pass "$mode arp(F_BROADCAST) ns1-1" || \
                test_fail "$mode arp(F_BROADCAST) ns1-1"
-       [ $(grep -c "who-has 192.0.2.254" ns1-2_${mode}.log) -le 4 ] && \
+       [ $(grep -cF "who-has 192.0.2.254" ${LOG_DIR}/ns1-2_${mode}.log) -eq 2 ] && \
                test_pass "$mode arp(F_BROADCAST) ns1-2" || \
                test_fail "$mode arp(F_BROADCAST) ns1-2"
-       [ $(grep -c "who-has 192.0.2.254" ns1-3_${mode}.log) -le 4 ] && \
+       [ $(grep -cF "who-has 192.0.2.254" ${LOG_DIR}/ns1-3_${mode}.log) -eq 2 ] && \
                test_pass "$mode arp(F_BROADCAST) ns1-3" || \
                test_fail "$mode arp(F_BROADCAST) ns1-3"
 
        # ns1 should not receive the redirect echo request, others should
-       [ $(grep -c "ICMP echo request" ns1-1_${mode}.log) -eq 4 ] && \
+       [ $(grep -c "ICMP echo request" ${LOG_DIR}/ns1-1_${mode}.log) -eq 4 ] && \
                test_pass "$mode IPv4 (F_BROADCAST|F_EXCLUDE_INGRESS) ns1-1" || \
                test_fail "$mode IPv4 (F_BROADCAST|F_EXCLUDE_INGRESS) ns1-1"
-       [ $(grep -c "ICMP echo request" ns1-2_${mode}.log) -eq 4 ] && \
+       [ $(grep -c "ICMP echo request" ${LOG_DIR}/ns1-2_${mode}.log) -eq 4 ] && \
                test_pass "$mode IPv4 (F_BROADCAST|F_EXCLUDE_INGRESS) ns1-2" || \
                test_fail "$mode IPv4 (F_BROADCAST|F_EXCLUDE_INGRESS) ns1-2"
-       [ $(grep -c "ICMP echo request" ns1-3_${mode}.log) -eq 4 ] && \
+       [ $(grep -c "ICMP echo request" ${LOG_DIR}/ns1-3_${mode}.log) -eq 4 ] && \
                test_pass "$mode IPv4 (F_BROADCAST|F_EXCLUDE_INGRESS) ns1-3" || \
                test_fail "$mode IPv4 (F_BROADCAST|F_EXCLUDE_INGRESS) ns1-3"
 
        # ns1 should receive the echo request, ns2 should not
-       [ $(grep -c "ICMP6, echo request" ns1-1_${mode}.log) -eq 4 ] && \
+       [ $(grep -c "ICMP6, echo request" ${LOG_DIR}/ns1-1_${mode}.log) -eq 4 ] && \
                test_pass "$mode IPv6 (no flags) ns1-1" || \
                test_fail "$mode IPv6 (no flags) ns1-1"
-       [ $(grep -c "ICMP6, echo request" ns1-2_${mode}.log) -eq 0 ] && \
+       [ $(grep -c "ICMP6, echo request" ${LOG_DIR}/ns1-2_${mode}.log) -eq 0 ] && \
                test_pass "$mode IPv6 (no flags) ns1-2" || \
                test_fail "$mode IPv6 (no flags) ns1-2"
 }
@@ -176,9 +180,13 @@ do_tests()
                xdpgeneric) drv_p="-S";;
        esac
 
-       ./xdp_redirect_multi $drv_p $IFACES &> xdp_redirect_${mode}.log &
+       ip netns exec ns0 ./xdp_redirect_multi $drv_p $IFACES &> ${LOG_DIR}/xdp_redirect_${mode}.log &
        xdp_pid=$!
        sleep 1
+       if ! ps -p $xdp_pid > /dev/null; then
+               test_fail "$mode xdp_redirect_multi start failed"
+               return 1
+       fi
 
        if [ "$mode" = "xdpegress" ]; then
                do_egress_tests $mode
@@ -189,16 +197,16 @@ do_tests()
        kill $xdp_pid
 }
 
-trap clean_up 0 2 3 6 9
+trap clean_up EXIT
 
 check_env
-rm -f xdp_redirect_*.log ns*.log mac_ns*.log
 
 for mode in ${DRV_MODE}; do
        setup_ns $mode
        do_tests $mode
        clean_up
 done
+rm -rf ${LOG_DIR}
 
 echo "Summary: PASS $PASS, FAIL $FAIL"
 [ $FAIL -eq 0 ] && exit 0 || exit 1
index c9991c3f3bd274275fe3c524a55ba1cc471e04df..7ab3de1087614663dcb6f3cd0f775f9762ba1681 100644 (file)
        .result = ACCEPT,
        .prog_type = BPF_PROG_TYPE_SCHED_CLS,
 },
+{
+       "Spill a u32 scalar at fp-4 and then at fp-8",
+       .insns = {
+       /* r4 = 4321 */
+       BPF_MOV32_IMM(BPF_REG_4, 4321),
+       /* *(u32 *)(r10 -4) = r4 */
+       BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_4, -4),
+       /* *(u32 *)(r10 -8) = r4 */
+       BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_4, -8),
+       /* r4 = *(u64 *)(r10 -8) */
+       BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .result = ACCEPT,
+       .prog_type = BPF_PROG_TYPE_SCHED_CLS,
+},
index 3696a8f32c235f138fa848c44e9f84b334969360..f5ffba341c174343f7340a5a8de9da070519f478 100644 (file)
@@ -129,7 +129,7 @@ int main(int argc, char **argv)
                goto err_out;
        }
 
-       printf("Get interfaces");
+       printf("Get interfaces:");
        for (i = 0; i < MAX_IFACE_NUM && argv[optind + i]; i++) {
                ifaces[i] = if_nametoindex(argv[optind + i]);
                if (!ifaces[i])
@@ -139,7 +139,7 @@ int main(int argc, char **argv)
                        goto err_out;
                }
                if (ifaces[i] > MAX_INDEX_NUM) {
-                       printf("Interface index to large\n");
+                       printf(" interface index too large\n");
                        goto err_out;
                }
                printf(" %d", ifaces[i]);
index aee76d1bb9da1b84a503516adb015b76e05d8195..7615f29831ebd6f0961ad7b0fb650c8cdf12fc2c 100644 (file)
@@ -12,7 +12,7 @@ TEST_PROGS += udpgro_bench.sh udpgro.sh test_vxlan_under_vrf.sh reuseport_addr_a
 TEST_PROGS += test_vxlan_fdb_changelink.sh so_txtime.sh ipv6_flowlabel.sh
 TEST_PROGS += tcp_fastopen_backup_key.sh fcnal-test.sh l2tp.sh traceroute.sh
 TEST_PROGS += fin_ack_lat.sh fib_nexthop_multiprefix.sh fib_nexthops.sh
-TEST_PROGS += altnames.sh icmp_redirect.sh ip6_gre_headroom.sh
+TEST_PROGS += altnames.sh icmp.sh icmp_redirect.sh ip6_gre_headroom.sh
 TEST_PROGS += route_localnet.sh
 TEST_PROGS += reuseaddr_ports_exhausted.sh
 TEST_PROGS += txtimestamp.sh
@@ -30,7 +30,12 @@ TEST_PROGS += ioam6.sh
 TEST_PROGS += gro.sh
 TEST_PROGS += gre_gso.sh
 TEST_PROGS += cmsg_so_mark.sh
-TEST_PROGS_EXTENDED := in_netns.sh
+TEST_PROGS += srv6_end_dt46_l3vpn_test.sh
+TEST_PROGS += srv6_end_dt4_l3vpn_test.sh
+TEST_PROGS += srv6_end_dt6_l3vpn_test.sh
+TEST_PROGS += vrf_strict_mode_test.sh
+TEST_PROGS_EXTENDED := in_netns.sh setup_loopback.sh setup_veth.sh
+TEST_PROGS_EXTENDED += toeplitz_client.sh toeplitz.sh
 TEST_GEN_FILES =  socket nettest
 TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any
 TEST_GEN_FILES += tcp_mmap tcp_inq psock_snd txring_overwrite
index f8cda822c1cec3291b01ad7c8f30e73090c216a9..1b27f2b0f19606f7d3cdedf7ddffb8506ad70921 100755 (executable)
@@ -80,7 +80,7 @@ test_gretap()
 
 test_ip6gretap()
 {
-       test_vlan_match gt6 'skip_hw vlan_id 555 vlan_ethtype ip' \
+       test_vlan_match gt6 'skip_hw vlan_id 555 vlan_ethtype ipv6' \
                        "mirror to ip6gretap"
 }
 
index 472bd023e2a5fb591727dee854641adacb5d87fe..aff88f78e339152d67bd1d979bdd1d5c0cc471c3 100755 (executable)
@@ -74,7 +74,7 @@ test_span_gre_ttl()
 
        mirror_install $swp1 ingress $tundev "matchall $tcflags"
        tc filter add dev $h3 ingress pref 77 prot $prot \
-               flower ip_ttl 50 action pass
+               flower skip_hw ip_ttl 50 action pass
 
        mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 0
 
index 880e3ab9d088df56ca84da61fd1b870d6c5f5443..c8a9b5bd841fe04964db44203c426d396ed47bd5 100755 (executable)
@@ -141,7 +141,7 @@ test_gretap()
 
 test_ip6gretap()
 {
-       test_vlan_match gt6 'skip_hw vlan_id 555 vlan_ethtype ip' \
+       test_vlan_match gt6 'skip_hw vlan_id 555 vlan_ethtype ipv6' \
                        "mirror to ip6gretap"
 }
 
@@ -218,6 +218,7 @@ test_ip6gretap_forbidden_egress()
 test_span_gre_untagged_egress()
 {
        local tundev=$1; shift
+       local ul_proto=$1; shift
        local what=$1; shift
 
        RET=0
@@ -225,7 +226,7 @@ test_span_gre_untagged_egress()
        mirror_install $swp1 ingress $tundev "matchall $tcflags"
 
        quick_test_span_gre_dir $tundev ingress
-       quick_test_span_vlan_dir $h3 555 ingress
+       quick_test_span_vlan_dir $h3 555 ingress "$ul_proto"
 
        h3_addr_add_del del $h3.555
        bridge vlan add dev $swp3 vid 555 pvid untagged
@@ -233,7 +234,7 @@ test_span_gre_untagged_egress()
        sleep 5
 
        quick_test_span_gre_dir $tundev ingress
-       fail_test_span_vlan_dir $h3 555 ingress
+       fail_test_span_vlan_dir $h3 555 ingress "$ul_proto"
 
        h3_addr_add_del del $h3
        bridge vlan add dev $swp3 vid 555
@@ -241,7 +242,7 @@ test_span_gre_untagged_egress()
        sleep 5
 
        quick_test_span_gre_dir $tundev ingress
-       quick_test_span_vlan_dir $h3 555 ingress
+       quick_test_span_vlan_dir $h3 555 ingress "$ul_proto"
 
        mirror_uninstall $swp1 ingress
 
@@ -250,12 +251,12 @@ test_span_gre_untagged_egress()
 
 test_gretap_untagged_egress()
 {
-       test_span_gre_untagged_egress gt4 "mirror to gretap"
+       test_span_gre_untagged_egress gt4 ip "mirror to gretap"
 }
 
 test_ip6gretap_untagged_egress()
 {
-       test_span_gre_untagged_egress gt6 "mirror to ip6gretap"
+       test_span_gre_untagged_egress gt6 ipv6 "mirror to ip6gretap"
 }
 
 test_span_gre_fdb_roaming()
index 6406cd76a19d8f66e36f285ca97e109192e61d98..3e8ebeff3019ff536a5c747433e3de9a9eff84e2 100644 (file)
@@ -115,13 +115,14 @@ do_test_span_vlan_dir_ips()
        local dev=$1; shift
        local vid=$1; shift
        local direction=$1; shift
+       local ul_proto=$1; shift
        local ip1=$1; shift
        local ip2=$1; shift
 
        # Install the capture as skip_hw to avoid double-counting of packets.
        # The traffic is meant for local box anyway, so will be trapped to
        # kernel.
-       vlan_capture_install $dev "skip_hw vlan_id $vid vlan_ethtype ip"
+       vlan_capture_install $dev "skip_hw vlan_id $vid vlan_ethtype $ul_proto"
        mirror_test v$h1 $ip1 $ip2 $dev 100 $expect
        mirror_test v$h2 $ip2 $ip1 $dev 100 $expect
        vlan_capture_uninstall $dev
index 9ab2ce77b332cb133640a4c055d12b1fe65076f8..0b44e148235e01f787fe3fefbddcf37228c71ce8 100755 (executable)
@@ -85,9 +85,9 @@ test_tagged_vlan_dir()
        RET=0
 
        mirror_install $swp1 $direction $swp3.555 "matchall $tcflags"
-       do_test_span_vlan_dir_ips 10 "$h3.555" 111 "$direction" \
+       do_test_span_vlan_dir_ips 10 "$h3.555" 111 "$direction" ip \
                                  192.0.2.17 192.0.2.18
-       do_test_span_vlan_dir_ips  0 "$h3.555" 555 "$direction" \
+       do_test_span_vlan_dir_ips  0 "$h3.555" 555 "$direction" ip \
                                  192.0.2.17 192.0.2.18
        mirror_uninstall $swp1 $direction
 
index facbb0c80443966101851074c88660e5ab5c17e6..fdeb44d621eb937bafd79572a36dee25dea6b21a 100755 (executable)
@@ -116,17 +116,18 @@ gre_gst_test_checks()
 {
        local name=$1
        local addr=$2
+       local proto=$3
 
-       $NS_EXEC nc -kl $port >/dev/null &
+       $NS_EXEC nc $proto -kl $port >/dev/null &
        PID=$!
        while ! $NS_EXEC ss -ltn | grep -q $port; do ((i++)); sleep 0.01; done
 
-       cat $TMPFILE | timeout 1 nc $addr $port
+       cat $TMPFILE | timeout 1 nc $proto -N $addr $port
        log_test $? 0 "$name - copy file w/ TSO"
 
        ethtool -K veth0 tso off
 
-       cat $TMPFILE | timeout 1 nc $addr $port
+       cat $TMPFILE | timeout 1 nc $proto -N $addr $port
        log_test $? 0 "$name - copy file w/ GSO"
 
        ethtool -K veth0 tso on
@@ -155,7 +156,7 @@ gre6_gso_test()
        sleep 2
 
        gre_gst_test_checks GREv6/v4 172.16.2.2
-       gre_gst_test_checks GREv6/v6 2001:db8:1::2
+       gre_gst_test_checks GREv6/v6 2001:db8:1::2 -6
 
        cleanup
 }
index c9f478b40996d3bc0037c8e3b08dc477725a85d0..b2eebf669b8cfe736a497b6087f46b6533f4c02f 100644 (file)
@@ -211,12 +211,16 @@ static void test(int *rcv_fd, int len, int family, int proto)
 
        /* Forward iterate */
        for (node = 0; node < len; ++node) {
+               if (!numa_bitmask_isbitset(numa_nodes_ptr, node))
+                       continue;
                send_from_node(node, family, proto);
                receive_on_node(rcv_fd, len, epfd, node, proto);
        }
 
        /* Reverse iterate */
        for (node = len - 1; node >= 0; --node) {
+               if (!numa_bitmask_isbitset(numa_nodes_ptr, node))
+                       continue;
                send_from_node(node, family, proto);
                receive_on_node(rcv_fd, len, epfd, node, proto);
        }
index 534c8b7699ab9825f39b808296eae37545a4be92..ea5a7a808f120a1ae4c1e3c9cad874924eb95b9a 100755 (executable)
@@ -101,6 +101,8 @@ setup-vm() {
     ip -netns hv-$id link set veth-tap master br0
     ip -netns hv-$id link set veth-tap up
 
+    ip link set veth-hv address 02:1d:8d:dd:0c:6$id
+
     ip link set veth-hv netns vm-$id
     ip -netns vm-$id addr add 10.0.0.$id/24 dev veth-hv
     ip -netns vm-$id link set veth-hv up
index d3047e251fe938a4b01ce0d352fd5b5a57fe3a13..e61fc4c32ba23a9f0b22e4a45356e2f7d15eb9ff 100644 (file)
@@ -654,7 +654,6 @@ TEST_F(tls, recvmsg_single_max)
 TEST_F(tls, recvmsg_multiple)
 {
        unsigned int msg_iovlen = 1024;
-       unsigned int len_compared = 0;
        struct iovec vec[1024];
        char *iov_base[1024];
        unsigned int iov_len = 16;
@@ -675,8 +674,6 @@ TEST_F(tls, recvmsg_multiple)
        hdr.msg_iovlen = msg_iovlen;
        hdr.msg_iov = vec;
        EXPECT_NE(recvmsg(self->cfd, &hdr, 0), -1);
-       for (i = 0; i < msg_iovlen; i++)
-               len_compared += iov_len;
 
        for (i = 0; i < msg_iovlen; i++)
                free(iov_base[i]);
index 76a24052f4b47652dff9e0b9698a81bb0ae2227d..6a193425c367fccdbb18bcc1269f8f4b240acdce 100644 (file)
@@ -293,19 +293,17 @@ static void usage(const char *filepath)
 
 static void parse_opts(int argc, char **argv)
 {
+       const char *bind_addr = NULL;
        int c;
 
-       /* bind to any by default */
-       setup_sockaddr(PF_INET6, "::", &cfg_bind_addr);
        while ((c = getopt(argc, argv, "4b:C:Gl:n:p:rR:S:tv")) != -1) {
                switch (c) {
                case '4':
                        cfg_family = PF_INET;
                        cfg_alen = sizeof(struct sockaddr_in);
-                       setup_sockaddr(PF_INET, "0.0.0.0", &cfg_bind_addr);
                        break;
                case 'b':
-                       setup_sockaddr(cfg_family, optarg, &cfg_bind_addr);
+                       bind_addr = optarg;
                        break;
                case 'C':
                        cfg_connect_timeout_ms = strtoul(optarg, NULL, 0);
@@ -341,6 +339,11 @@ static void parse_opts(int argc, char **argv)
                }
        }
 
+       if (!bind_addr)
+               bind_addr = cfg_family == PF_INET6 ? "::" : "0.0.0.0";
+
+       setup_sockaddr(cfg_family, bind_addr, &cfg_bind_addr);
+
        if (optind != argc)
                usage(argv[0]);