1. 25 Aug, 2021 38 commits
    • David S. Miller's avatar
      Merge branch 'dsa-sja1105-vlan-tags' · 6956fa39
      David S. Miller authored
      Vladimir Oltean says:
      
      ====================
      Make sja1105 treat tag_8021q VLANs more like real DSA tags
      
      This series solves a nuisance with the sja1105 driver, which is that
      non-DSA tagged packets sent directly by the DSA master would still exit
      the switch just fine.
      
      We also had an issue for packets coming from the outside world with a
      crafted DSA tag, the switch would not reject that tag but think it was
      valid.
      ====================
      6956fa39
    • Vladimir Oltean's avatar
      net: dsa: tag_sja1105: stop asking the sja1105 driver in sja1105_xmit_tpid · 8ded9160
      Vladimir Oltean authored
      Introduced in commit 38b5beea ("net: dsa: sja1105: prepare tagger
      for handling DSA tags and VLAN simultaneously"), the sja1105_xmit_tpid
      function solved quite a different problem than our needs are now.
      
      Then, we used best-effort VLAN filtering and we were using the xmit_tpid
      to tunnel packets coming from an 8021q upper through the TX VLAN allocated
      by tag_8021q to that egress port. The need for a different VLAN protocol
      depending on switch revision came from the fact that this in itself was
      more of a hack to trick the hardware into accepting tunneled VLANs in
      the first place.
      
      Right now, we deny 8021q uppers (see sja1105_prechangeupper). Even if we
      supported them again, we would not do that using the same method of
      {tunneling the VLAN on egress, retagging the VLAN on ingress} that we
      had in the best-effort VLAN filtering mode. It seems rather simpler that
      we just allocate a VLAN in the VLAN table that is simply not used by the
      bridge at all, or by any other port.
      
      Anyway, I have 2 gripes with the current sja1105_xmit_tpid:
      
      1. When sending packets on behalf of a VLAN-aware bridge (with the new
         TX forwarding offload framework) plus untagged (with the tag_8021q
         VLAN added by the tagger) packets, we can see that on SJA1105P/Q/R/S
         and later (which have a qinq_tpid of ETH_P_8021AD), some packets sent
         through the DSA master have a VLAN protocol of 0x8100 and others of
         0x88a8. This is strange and there is no reason for it now. If we have
         a bridge and are therefore forced to send using that bridge's TPID,
         we can as well blend with that bridge's VLAN protocol for all packets.
      
      2. The sja1105_xmit_tpid introduces a dependency on the sja1105 driver,
         because it looks inside dp->priv. It is desirable to keep as much
         separation between taggers and switch drivers as possible. Now it
         doesn't do that anymore.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8ded9160
    • Vladimir Oltean's avatar
      net: dsa: sja1105: drop untagged packets on the CPU and DSA ports · b0b8c67e
      Vladimir Oltean authored
      The sja1105 driver is a bit special in its use of VLAN headers as DSA
      tags. This is because in VLAN-aware mode, the VLAN headers use an actual
      TPID of 0x8100, which is understood even by the DSA master as an actual
      VLAN header.
      
      Furthermore, control packets such as PTP and STP are transmitted with no
      VLAN header as a DSA tag, because, depending on switch generation, there
      are ways to steer these control packets towards a precise egress port
      other than VLAN tags. Transmitting control packets as untagged means
      leaving a door open for traffic in general to be transmitted as untagged
      from the DSA master, and for it to traverse the switch and exit a random
      switch port according to the FDB lookup.
      
      This behavior is a bit out of line with other DSA drivers which have
      native support for DSA tagging. There, it is to be expected that the
      switch only accepts DSA-tagged packets on its CPU port, dropping
      everything that does not match this pattern.
      
      We perhaps rely a bit too much on the switches' hardware dropping on the
      CPU port, and place no other restrictions in the kernel data path to
      avoid that. For example, sja1105 is also a bit special in that STP/PTP
      packets are transmitted using "management routes"
      (sja1105_port_deferred_xmit): when sending a link-local packet from the
      CPU, we must first write a SPI message to the switch to tell it to
      expect a packet towards multicast MAC DA 01-80-c2-00-00-0e, and to route
      it towards port 3 when it gets it. This entry expires as soon as it
      matches a packet received by the switch, and it needs to be reinstalled
      for the next packet etc. All in all quite a ghetto mechanism, but it is
      all that the sja1105 switches offer for injecting a control packet.
      The driver takes a mutex for serializing control packets and making the
      pairs of SPI writes of a management route and its associated skb atomic,
      but to be honest, a mutex is only relevant as long as all parties agree
      to take it. With the DSA design, it is possible to open an AF_PACKET
      socket on the DSA master net device, and blast packets towards
      01-80-c2-00-00-0e, and whatever locking the DSA switch driver might use,
      it all goes kaput because management routes installed by the driver will
      match skbs sent by the DSA master, and not skbs generated by the driver
      itself. So they will end up being routed on the wrong port.
      
      So through the lens of that, maybe it would make sense to avoid that
      from happening by doing something in the network stack, like: introduce
      a new bit in struct sk_buff, like xmit_from_dsa. Then, somewhere around
      dev_hard_start_xmit(), introduce the following check:
      
      	if (netdev_uses_dsa(dev) && !skb->xmit_from_dsa)
      		kfree_skb(skb);
      
      Ok, maybe that is a bit drastic, but that would at least prevent a bunch
      of problems. For example, right now, even though the majority of DSA
      switches drop packets without DSA tags sent by the DSA master (and
      therefore the majority of garbage that user space daemons like avahi and
      udhcpcd and friends create), it is still conceivable that an aggressive
      user space program can open an AF_PACKET socket and inject a spoofed DSA
      tag directly on the DSA master. We have no protection against that; the
      packet will be understood by the switch and be routed wherever user
      space says. Furthermore: there are some DSA switches where we even have
      register access over Ethernet, using DSA tags. So even user space
      drivers are possible in this way. This is a huge hole.
      
      However, the biggest thing that bothers me is that udhcpcd attempts to
      ask for an IP address on all interfaces by default, and with sja1105, it
      will attempt to get a valid IP address on both the DSA master as well as
      on sja1105 switch ports themselves. So with IP addresses in the same
      subnet on multiple interfaces, the routing table will be messed up and
      the system will be unusable for traffic until it is configured manually
      to not ask for an IP address on the DSA master itself.
      
      It turns out that it is possible to avoid that in the sja1105 driver, at
      least very superficially, by requesting the switch to drop VLAN-untagged
      packets on the CPU port. With the exception of control packets, all
      traffic originated from tag_sja1105.c is already VLAN-tagged, so only
      STP and PTP packets need to be converted. For that, we need to uphold
      the equivalence between an untagged and a pvid-tagged packet, and to
      remember that the CPU port of sja1105 uses a pvid of 4095.
      
      Now that we drop untagged traffic on the CPU port, non-aggressive user
      space applications like udhcpcd stop bothering us, and sja1105 effectively
      becomes just as vulnerable to the aggressive kind of user space programs
      as other DSA switches are (ok, users can also create 8021q uppers on top
      of the DSA master in the case of sja1105, but in future patches we can
      easily deny that, but it still doesn't change the fact that VLAN-tagged
      packets can still be injected over raw sockets).
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      b0b8c67e
    • Vladimir Oltean's avatar
      net: dsa: sja1105: prevent tag_8021q VLANs from being received on user ports · 73ceab83
      Vladimir Oltean authored
      Currently it is possible for an attacker to craft packets with a fake
      DSA tag and send them to us, and our user ports will accept them and
      preserve that VLAN when transmitting towards the CPU. Then the tagger
      will be misled into thinking that the packets came on a different port
      than they really came on.
      
      Up until recently there wasn't a good option to prevent this from
      happening. In SJA1105P and later, the MAC Configuration Table introduced
      two options called:
      - DRPSITAG: Drop Single Inner Tagged Frames
      - DRPSOTAG: Drop Single Outer Tagged Frames
      
      Because the sja1105 driver classifies all VLANs as "outer VLANs" (S-Tags),
      it would be in principle possible to enable the DRPSOTAG bit on ports
      using tag_8021q, and drop on ingress all packets which have a VLAN tag.
      When the switch is VLAN-unaware, this works, because it uses a custom
      TPID of 0xdadb, so any "tagged" packets received on a user port are
      probably a spoofing attempt. But when the switch overall is VLAN-aware,
      and some ports are standalone (therefore they use tag_8021q), the TPID
      is 0x8100, and the port can receive a mix of untagged and VLAN-tagged
      packets. The untagged ones will be classified to the tag_8021q pvid, and
      the tagged ones to the VLAN ID from the packet header. Yes, it is true
      that since commit 4fbc08bd ("net: dsa: sja1105: deny 8021q uppers on
      ports") we no longer support this mixed mode, but that is a temporary
      limitation which will eventually be lifted. It would be nice to not
      introduce one more restriction via DRPSOTAG, which would make the
      standalone ports of a VLAN-aware switch drop genuinely VLAN-tagged
      packets.
      
      Also, the DRPSOTAG bit is not available on the first generation of
      switches (SJA1105E, SJA1105T). So since one of the key features of this
      driver is compatibility across switch generations, this makes it an even
      less desirable approach.
      
      The breakthrough comes from commit bef0746c ("net: dsa: sja1105:
      make sure untagged packets are dropped on ingress ports with no pvid"),
      where it became obvious that untagged packets are not dropped even if
      the ingress port is not in the VMEMB_PORT vector of that port's pvid.
      However, VLAN-tagged packets are subject to VLAN ingress
      checking/dropping. This means that instead of using the catch-all
      DRPSOTAG bit introduced in SJA1105P, we can drop tagged packets on a
      per-VLAN basis, and this is already compatible with SJA1105E/T.
      
      This patch adds an "allowed_ingress" argument to sja1105_vlan_add(), and
      we call it with "false" for tag_8021q VLANs on user ports. The tag_8021q
      VLANs still need to be allowed, of course, on ingress to DSA ports and
      CPU ports.
      
      We also need to refine the drop_untagged check in sja1105_commit_pvid to
      make it not freak out about this new configuration. Currently it will
      try to keep the configuration consistent between untagged and pvid-tagged
      packets, so if the pvid of a port is 1 but VLAN 1 is not in VMEMB_PORT,
      packets tagged with VID 1 will behave the same as untagged packets, and
      be dropped. This behavior is what we want for ports under a VLAN-aware
      bridge, but for the ports with a tag_8021q pvid, we want untagged
      packets to be accepted, but packets tagged with a header recognized by
      the switch as a tag_8021q VLAN to be dropped. So only restrict the
      drop_untagged check to apply to the bridge_pvid, not to the tag_8021q_pvid.
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      73ceab83
    • DENG Qingfang's avatar
      net: dsa: mt7530: manually set up VLAN ID 0 · 1ca8a193
      DENG Qingfang authored
      The driver was relying on dsa_slave_vlan_rx_add_vid to add VLAN ID 0. After
      the blamed commit, VLAN ID 0 won't be set up anymore, breaking software
      bridging fallback on VLAN-unaware bridges.
      
      Manually set up VLAN ID 0 to fix this.
      
      Fixes: 06cfb2df ("net: dsa: don't advertise 'rx-vlan-filter' when not needed")
      Signed-off-by: default avatarDENG Qingfang <dqfext@gmail.com>
      Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      1ca8a193
    • David S. Miller's avatar
      Merge branch 'mana-EQ-sharing' · e93826d3
      David S. Miller authored
      Haiyang Zhang says:
      
      ====================
      net: mana: Add support for EQ sharing
      
      The existing code uses (1 + #vPorts * #Queues) MSIXs, which may exceed
      the device limit.
      
      Support EQ sharing, so that multiple vPorts can share the same set of
      MSIXs.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e93826d3
    • Haiyang Zhang's avatar
      net: mana: Add WARN_ON_ONCE in case of CQE read overflow · c1a3e9f9
      Haiyang Zhang authored
      This is not an expected case normally.
      Add WARN_ON_ONCE in case of CQE read overflow, instead of failing
      silently.
      Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c1a3e9f9
    • Haiyang Zhang's avatar
      net: mana: Add support for EQ sharing · 1e2d0824
      Haiyang Zhang authored
      The existing code uses (1 + #vPorts * #Queues) MSIXs, which may exceed
      the device limit.
      
      Support EQ sharing, so that multiple vPorts (NICs) can share the same
      set of MSIXs.
      
      And, report the EQ-sharing capability bit to the host, which means the
      host can potentially offer more vPorts and queues to the VM.
      
      Also update the resource limit checking and error handling for better
      robustness.
      
      Now, we support up to 256 virtual ports per VF (it was 16/VF), and
      support up to 64 queues per vPort (it was 16).
      Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      1e2d0824
    • Haiyang Zhang's avatar
      net: mana: Move NAPI from EQ to CQ · e1b5683f
      Haiyang Zhang authored
      The existing code has NAPI threads polling on EQ directly. To prepare
      for EQ sharing among vPorts, move NAPI from EQ to CQ so that one EQ
      can serve multiple CQs from different vPorts.
      
      The "arm bit" is only set when CQ processing is completed to reduce
      the number of EQ entries, which in turn reduce the number of interrupts
      on EQ.
      Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e1b5683f
    • Shaokun Zhang's avatar
      netxen_nic: Remove the repeated declaration · 807d1032
      Shaokun Zhang authored
      Function 'netxen_rom_fast_read' is declared twice, so remove the
      repeated declaration.
      
      Cc: Manish Chopra <manishc@marvell.com>
      Cc: Rahul Verma <rahulv@marvell.com>
      Cc: "David S. Miller" <davem@davemloft.net>
      Cc: Jakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarShaokun Zhang <zhangshaokun@hisilicon.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      807d1032
    • Nathan Chancellor's avatar
      cxgb4: Properly revert VPD changes · bc4f128d
      Nathan Chancellor authored
      Clang warns:
      
      drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2785:2: error: variable 'kw_offset' is uninitialized when used here [-Werror,-Wuninitialized]
              FIND_VPD_KW(i, "RV");
              ^~~~~~~~~~~~~~~~~~~~
      drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2776:39: note: expanded from macro 'FIND_VPD_KW'
              var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
                                                   ^~~~~~~~~
      drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2748:34: note: initialize the variable 'kw_offset' to silence this warning
              unsigned int vpdr_len, kw_offset, id_len;
                                              ^
                                               = 0
      drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2785:2: error: variable 'vpdr_len' is uninitialized when used here [-Werror,-Wuninitialized]
              FIND_VPD_KW(i, "RV");
              ^~~~~~~~~~~~~~~~~~~~
      drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2776:50: note: expanded from macro 'FIND_VPD_KW'
              var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
                                                              ^~~~~~~~
      drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2748:23: note: initialize the variable 'vpdr_len' to silence this warning
              unsigned int vpdr_len, kw_offset, id_len;
                                   ^
                                    = 0
      2 errors generated.
      
      The series "PCI/VPD: Convert more users to the new VPD API functions"
      was applied to net-next when it should have been applied to the PCI tree
      because of build errors. However, commit 82e34c8a ("Revert "Revert
      "cxgb4: Search VPD with pci_vpd_find_ro_info_keyword()""") reapplied a
      change, resulting in the warning above.
      
      Properly revert commit 8d63ee60 ("cxgb4: Search VPD with
      pci_vpd_find_ro_info_keyword()") to fix the warning and restore proper
      functionality. This also reverts commit 3a93bede ("cxgb4: Remove
      unused vpd_param member ec") to avoid future merge conflicts, as that
      change has been applied to the PCI tree.
      
      Link: https://lore.kernel.org/r/20210823120929.7c6f7a4f@canb.auug.org.au/
      Link: https://lore.kernel.org/r/1ca29408-7bc7-4da5-59c7-87893c9e0442@gmail.com/Signed-off-by: default avatarNathan Chancellor <nathan@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      bc4f128d
    • David S. Miller's avatar
      Merge branch 'mptcp-next' · cb0f8b03
      David S. Miller authored
      Mat Martineau says:
      
      ====================
      mptcp: Optimize output options and add MP_FAIL
      
      This patch set contains two groups of changes that we've been testing in
      the MPTCP tree.
      
      The first optimizes the code path and data structure for populating
      MPTCP option headers when transmitting.
      
      Patch 1 reorganizes code to reduce the number of conditionals that need
      to be evaluated in common cases.
      
      Patch 2 rearranges struct mptcp_out_options to save 80 bytes (on x86_64).
      
      The next five patches add partial support for the MP_FAIL option as
      defined in RFC 8684. MP_FAIL is an option header used to cleanly handle
      MPTCP checksum failures. When the MPTCP checksum detects an error in the
      MPTCP DSS header or the data mapped by that header, the receiver uses a
      TCP RST with MP_FAIL to close the subflow that experienced the error and
      provide associated MPTCP sequence number information to the peer. RFC
      8684 also describes how a single-subflow connection can discard corrupt
      data and remain connected under certain conditions using MP_FAIL, but
      that feature is not implemented here.
      
      Patches 3-5 implement MP_FAIL transmit and receive, and integrates with
      checksum validation.
      
      Patches 6 & 7 add MP_FAIL selftests and the MIBs required for those
      tests.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      cb0f8b03
    • Geliang Tang's avatar
      selftests: mptcp: add MP_FAIL mibs check · 6bb3ab49
      Geliang Tang authored
      This patch added a function chk_fail_nr to check the mibs for MP_FAIL.
      Signed-off-by: default avatarGeliang Tang <geliangtang@xiaomi.com>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6bb3ab49
    • Geliang Tang's avatar
      mptcp: add the mibs for MP_FAIL · eb7f3365
      Geliang Tang authored
      This patch added the mibs for MP_FAIL: MPTCP_MIB_MPFAILTX and
      MPTCP_MIB_MPFAILRX.
      Signed-off-by: default avatarGeliang Tang <geliangtang@xiaomi.com>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      eb7f3365
    • Geliang Tang's avatar
      mptcp: send out MP_FAIL when data checksum fails · 478d7700
      Geliang Tang authored
      When a bad checksum is detected, set the send_mp_fail flag to send out
      the MP_FAIL option.
      
      Add a new function mptcp_has_another_subflow() to check whether there's
      only a single subflow.
      
      When multiple subflows are in use, close the affected subflow with a RST
      that includes an MP_FAIL option and discard the data with the bad
      checksum.
      
      Set the sk_state of the subsocket to TCP_CLOSE, then the flag
      MPTCP_WORK_CLOSE_SUBFLOW will be set in subflow_sched_work_if_closed,
      and the subflow will be closed.
      
      When a single subfow is in use, temporarily handled by sending MP_FAIL
      with a RST too.
      Signed-off-by: default avatarGeliang Tang <geliangtang@xiaomi.com>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      478d7700
    • Geliang Tang's avatar
      mptcp: MP_FAIL suboption receiving · 5580d41b
      Geliang Tang authored
      This patch added handling for receiving MP_FAIL suboption.
      
      Add a new members mp_fail and fail_seq in struct mptcp_options_received.
      When MP_FAIL suboption is received, set mp_fail to 1 and save the sequence
      number to fail_seq.
      
      Then invoke mptcp_pm_mp_fail_received to deal with the MP_FAIL suboption.
      Signed-off-by: default avatarGeliang Tang <geliangtang@xiaomi.com>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5580d41b
    • Geliang Tang's avatar
      mptcp: MP_FAIL suboption sending · c25aeb4e
      Geliang Tang authored
      This patch added the MP_FAIL suboption sending support.
      
      Add a new flag named send_mp_fail in struct mptcp_subflow_context. If
      this flag is set, send out MP_FAIL suboption.
      
      Add a new member fail_seq in struct mptcp_out_options to save the data
      sequence number to put into the MP_FAIL suboption.
      
      An MP_FAIL option could be included in a RST or on the subflow-level
      ACK.
      Suggested-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarGeliang Tang <geliangtang@xiaomi.com>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c25aeb4e
    • Paolo Abeni's avatar
      mptcp: shrink mptcp_out_options struct · d7b26908
      Paolo Abeni authored
      After the previous patch we can alias with a union several
      fields in mptcp_out_options. Such struct is stack allocated and
      memset() for each plain TCP out packet. Every saved byted counts.
      
      Before:
      pahole -EC mptcp_out_options
       # ...
      /* size: 136, cachelines: 3, members: 17 */
      
      After:
      pahole -EC mptcp_out_options
       # ...
      /* size: 56, cachelines: 1, members: 9 */
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d7b26908
    • Paolo Abeni's avatar
      mptcp: optimize out option generation · 1bff1e43
      Paolo Abeni authored
      Currently we have several protocol constraints on MPTCP options
      generation (e.g. MPC and MPJ subopt are mutually exclusive)
      and some additional ones required by our implementation
      (e.g. almost all ADD_ADDR variant are mutually exclusive with
      everything else).
      
      We can leverage the above to optimize the out option generation:
      we check DSS/MPC/MPJ presence in a mutually exclusive way,
      avoiding many unneeded conditionals in the common cases.
      
      Additionally extend the existing constraints on ADD_ADDR opt on
      all subvariants, so that it becomes fully mutually exclusive with
      the above and we can skip another conditional statement for the
      common case.
      
      This change is also needed by the next patch.
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      1bff1e43
    • David S. Miller's avatar
      Merge branch '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue · d484dc2b
      David S. Miller authored
      Tony Nguyen says:
      
      ====================
      1GbE Intel Wired LAN Driver Updates 2021-08-24
      
      Vinicius Costa Gomes says:
      
      This adds support for PCIe PTM (Precision Time Measurement) to the igc
      driver. PCIe PTM allows the NIC and Host clocks to be compared more
      precisely, improving the clock synchronization accuracy.
      
      Patch 1/4 reverts a commit that made pci_enable_ptm() private to the
      PCI subsystem, reverting makes it possible for it to be called from
      the drivers.
      
      Patch 2/4 adds the pcie_ptm_enabled() helper.
      
      Patch 3/4 calls pci_enable_ptm() from the igc driver.
      
      Patch 4/4 implements the PCIe PTM support. Exposing it via the
      .getcrosststamp() API implies that the time measurements are made
      synchronously with the ioctl(). The hardware was implemented so the
      most convenient way to retrieve that information would be
      asynchronously. So, to follow the expectations of the ioctl() we have
      to use less convenient ways, triggering an PCIe PTM dialog every time
      a ioctl() is received.
      
      Some questions are raised (also pointed out in the commit message):
      
      1. Using convert_art_ns_to_tsc() is too x86 specific, there should be
         a common way to create a 'system_counterval_t' from a timestamp.
      
      2. convert_art_ns_to_tsc() says that it should only be used when
         X86_FEATURE_TSC_KNOWN_FREQ is true, but during tests it works even
         when it returns false. Should that check be done?
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d484dc2b
    • David S. Miller's avatar
      Merge branch 'lan7800-improvements' · 38cbd6e7
      David S. Miller authored
      John Efstathiades says:
      
      ====================
      LAN7800 driver improvements
      
      This patch set introduces a number of improvements and fixes for
      problems found during testing of a modification to add a NAPI-style
      approach to packet handling to improve performance.
      
      NOTE: the NAPI changes are not part of this patch set and the issues
            fixed by this patch set are not coupled to the NAPI changes.
      
      Patch 1 fixes white space and style issues
      
      Patch 2 removes an unused timer
      
      Patch 3 introduces macros to set the internal packet FIFO flow
      control levels, which makes it easier to update the levels in future.
      
      Patch 4 removes an unused queue
      
      Patch 5 (updated for v2) introduces function return value checks and
      error propagation to various parts of the driver where a return
      code was captured but then ignored.
      
      This patch is completely different to patch 5 in version 1 of this patch
      set. The changes in the v1 patch 5 are being set aside for the time
      being.
      
      Patch 6 updates the LAN7800 MAC reset code to ensure there is no
      PHY register access in progress when the MAC is reset. This change
      prevents a kernel exception that can otherwise occur.
      
      Patch 7 fixes problems with system suspend and resume handling while
      the device is transmitting and receiving data.
      
      Patch 8 fixes problems with auto-suspend and resume handling and
      depends on changes introduced by patch 7.
      
      Patch 9 fixes problems with device disconnect handling that can result
      in kernel exceptions and/or hang.
      
      Patch 10 limits the rate at which driver warning messages are emitted.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      38cbd6e7
    • John Efstathiades's avatar
      lan78xx: Limit number of driver warning messages · df0d6f7a
      John Efstathiades authored
      Device removal can result in a large burst of driver warning messages
      (20 - 30) sent to the kernel log. Most of these are register read/write
      failures.
      
      This change limits the rate at which these messages are emitted.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      df0d6f7a
    • John Efstathiades's avatar
      lan78xx: Fix race condition in disconnect handling · 77dfff5b
      John Efstathiades authored
      If there is a device disconnect at roughly the same time as a
      deferred PHY link reset there is a race condition that can result
      in a kernel lock up due to a null pointer dereference in the
      driver's deferred work handling routine lan78xx_delayedwork().
      The following changes fix this problem.
      
      Add new status flag EVENT_DEV_DISCONNECT to indicate when the
      device has been removed and use it to prevent operations, such as
      register access, that will fail once the device is removed.
      
      Stop processing of deferred work items when the driver's USB
      disconnect handler is invoked.
      
      Disconnect the PHY only after the network device has been
      unregistered and all delayed work has been cancelled.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      77dfff5b
    • John Efstathiades's avatar
      lan78xx: Fix race conditions in suspend/resume handling · 5f4cc6e2
      John Efstathiades authored
      If the interface is given an IP address while the device is
      suspended (as a result of an auto-suspend event) there is a race
      between lan78xx_resume() and lan78xx_open() that can result in an
      exception or failure to handle incoming packets. The following
      changes fix this problem.
      
      Introduce a mutex to serialise operations in the network interface
      open and stop entry points with respect to the USB driver suspend
      and resume entry points.
      
      Move Tx and Rx data path start/stop to lan78xx_start() and
      lan78xx_stop() respectively and flush the packet FIFOs before
      starting the Tx and Rx data paths. This prevents the MAC and FIFOs
      getting out of step and delivery of malformed packets to the network
      stack.
      
      Stop processing of received packets before disconnecting the
      PHY from the MAC to prevent a kernel exception caused by handling
      packets after the PHY device has been removed.
      
      Refactor device auto-suspend code to make it consistent with the
      the system suspend code and make the suspend handler easier to read.
      
      Add new code to stop wake-on-lan packets or PHY events resuming the
      host or device from suspend if the device has not been opened
      (typically after an IP address is assigned).
      
      This patch is dependent on changes to lan78xx_suspend() and
      lan78xx_resume() introduced in the previous patch of this patch set.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5f4cc6e2
    • John Efstathiades's avatar
      lan78xx: Fix partial packet errors on suspend/resume · e1210fe6
      John Efstathiades authored
      The MAC can get out of step with the internal packet FIFOs if the
      system goes to sleep when the link is active, especially at high
      data rates. This can result in partial frames in the packet FIFOs
      that in result in malformed frames being delivered to the host.
      This occurs because the driver does not enable/disable the internal
      packet FIFOs in step with the corresponding MAC data path. The
      following changes fix this problem.
      
      Update code that enables/disables the MAC receiver and transmitter
      to the more general Rx and Tx data path, where the data path in each
      direction consists of both the MAC function (Tx or Rx) and the
      corresponding packet FIFO.
      
      In the receive path the packet FIFO must be enabled before the MAC
      receiver but disabled after the MAC receiver.
      
      In the transmit path the opposite is true: the packet FIFO must be
      enabled after the MAC transmitter but disabled before the MAC
      transmitter.
      
      The packet FIFOs can be flushed safely once the corresponding data
      path is stopped.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e1210fe6
    • John Efstathiades's avatar
      lan78xx: Fix exception on link speed change · b1f6696d
      John Efstathiades authored
      An exception is sometimes seen when the link speed is changed
      from auto-negotiation to a fixed speed, or vice versa. The
      exception occurs when the MAC is reset (due to the link speed
      change) at the same time as the PHY state machine is accessing
      a PHY register. The following changes fix this problem.
      
      Rework the MAC reset to ensure there is no outstanding MDIO
      register transaction before the reset and then wait until the
      reset is complete before allowing any further MAC register access.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      b1f6696d
    • John Efstathiades's avatar
      lan78xx: Add missing return code checks · 3415f6ba
      John Efstathiades authored
      There are many places in the driver where the return code from a
      function call is captured but without a subsequent test of the
      return code and appropriate action taken.
      
      This patch adds the missing return code tests and action. In most
      cases the action is an early exit from the calling function.
      
      The function lan78xx_set_suspend() was also updated to make it
      consistent with lan78xx_suspend().
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      3415f6ba
    • John Efstathiades's avatar
      lan78xx: Remove unused pause frame queue · 40b8452f
      John Efstathiades authored
      Remove the pause frame queue from the driver. It is initialised
      but not actually used.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      40b8452f
    • John Efstathiades's avatar
      lan78xx: Set flow control threshold to prevent packet loss · dc35f854
      John Efstathiades authored
      Set threshold at which flow control is triggered to 3/4 full of
      the internal Rx packet FIFO to prevent packet drops at high data
      rates. The new setting reduces the number of dropped UDP frames
      and TCP retransmit requests especially on less capable CPUs.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      dc35f854
    • John Efstathiades's avatar
      lan78xx: Remove unused timer · 3bef6b9e
      John Efstathiades authored
      Remove kernel timer that is not used by the driver.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      3bef6b9e
    • John Efstathiades's avatar
      lan78xx: Fix white space and style issues · 9ceec7d3
      John Efstathiades authored
      Fix white space and code style issues identified by checkpatch.
      Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      9ceec7d3
    • David S. Miller's avatar
      Merge branch 'xen-harden-netfront' · fbd029df
      David S. Miller authored
      Juergen Gross says:
      
      ====================
      xen: harden netfront against malicious backends
      
      Xen backends of para-virtualized devices can live in dom0 kernel, dom0
      user land, or in a driver domain. This means that a backend might
      reside in a less trusted environment than the Xen core components, so
      a backend should not be able to do harm to a Xen guest (it can still
      mess up I/O data, but it shouldn't be able to e.g. crash a guest by
      other means or cause a privilege escalation in the guest).
      
      Unfortunately netfront in the Linux kernel is fully trusting its
      backend. This series is fixing netfront in this regard.
      
      It was discussed to handle this as a security problem, but the topic
      was discussed in public before, so it isn't a real secret.
      
      It should be mentioned that a similar series has been posted some years
      ago by Marek Marczykowski-Górecki, but this series has not been applied
      due to a Xen header not having been available in the Xen git repo at
      that time. Additionally my series is fixing some more DoS cases.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      fbd029df
    • Juergen Gross's avatar
      xen/netfront: don't trust the backend response data blindly · a884daa6
      Juergen Gross authored
      Today netfront will trust the backend to send only sane response data.
      In order to avoid privilege escalations or crashes in case of malicious
      backends verify the data to be within expected limits. Especially make
      sure that the response always references an outstanding request.
      
      Note that only the tx queue needs special id handling, as for the rx
      queue the id is equal to the index in the ring page.
      
      Introduce a new indicator for the device whether it is broken and let
      the device stop working when it is set. Set this indicator in case the
      backend sets any weird data.
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Reviewed-by: default avatarJan Beulich <jbeulich@suse.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a884daa6
    • Juergen Gross's avatar
      xen/netfront: disentangle tx_skb_freelist · 21631d2d
      Juergen Gross authored
      The tx_skb_freelist elements are in a single linked list with the
      request id used as link reference. The per element link field is in a
      union with the skb pointer of an in use request.
      
      Move the link reference out of the union in order to enable a later
      reuse of it for requests which need a populated skb pointer.
      
      Rename add_id_to_freelist() and get_id_from_freelist() to
      add_id_to_list() and get_id_from_list() in order to prepare using
      those for other lists as well. Define ~0 as value to indicate the end
      of a list and place that value into the link for a request not being
      on the list.
      
      When freeing a skb zero the skb pointer in the request. Use a NULL
      value of the skb pointer instead of skb_entry_is_link() for deciding
      whether a request has a skb linked to it.
      
      Remove skb_entry_set_link() and open code it instead as it is really
      trivial now.
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      21631d2d
    • Juergen Gross's avatar
      xen/netfront: don't read data from request on the ring page · 162081ec
      Juergen Gross authored
      In order to avoid a malicious backend being able to influence the local
      processing of a request build the request locally first and then copy
      it to the ring page. Any reading from the request influencing the
      processing in the frontend needs to be done on the local instance.
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Reviewed-by: default avatarJan Beulich <jbeulich@suse.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      162081ec
    • Juergen Gross's avatar
      xen/netfront: read response from backend only once · 8446066b
      Juergen Gross authored
      In order to avoid problems in case the backend is modifying a response
      on the ring page while the frontend has already seen it, just read the
      response into a local buffer in one go and then operate on that buffer
      only.
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Reviewed-by: default avatarJan Beulich <jbeulich@suse.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8446066b
    • Alok Prasad's avatar
      qed: Enable automatic recovery on error condition. · 755f9053
      Alok Prasad authored
      This patch enables automatic recovery by default in case of various
      error condition like fw assert , hardware error etc.
      This also ensure driver can handle multiple iteration of assertion
      conditions.
      Signed-off-by: default avatarAriel Elior <aelior@marvell.com>
      Signed-off-by: default avatarShai Malin <smalin@marvell.com>
      Signed-off-by: default avatarIgor Russkikh <irusskikh@marvell.com>
      Signed-off-by: default avatarAlok Prasad <palok@marvell.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      755f9053
    • Gilad Naaman's avatar
      net-next: When a bond have a massive amount of VLANs with IPv6 addresses,... · 406f42fa
      Gilad Naaman authored
      net-next: When a bond have a massive amount of VLANs with IPv6 addresses, performance of changing link state, attaching a VRF, changing an IPv6 address, etc. go down dramtically.
      
      The source of most of the slow down is the `dev_addr_lists.c` module,
      which mainatins a linked list of HW addresses.
      When using IPv6, this list grows for each IPv6 address added on a
      VLAN, since each IPv6 address has a multicast HW address associated with
      it.
      
      When performing any modification to the involved links, this list is
      traversed many times, often for nothing, all while holding the RTNL
      lock.
      
      Instead, this patch adds an auxilliary rbtree which cuts down
      traversal time significantly.
      
      Performance can be seen with the following script:
      
      	#!/bin/bash
      	ip netns del test || true 2>/dev/null
      	ip netns add test
      
      	echo 1 | ip netns exec test tee /proc/sys/net/ipv6/conf/all/keep_addr_on_down > /dev/null
      
      	set -e
      
      	ip -n test link add foo type veth peer name bar
      	ip -n test link add b1 type bond
      	ip -n test link add florp type vrf table 10
      
      	ip -n test link set bar master b1
      	ip -n test link set foo up
      	ip -n test link set bar up
      	ip -n test link set b1 up
      	ip -n test link set florp up
      
      	VLAN_COUNT=1500
      	BASE_DEV=b1
      
      	echo Creating vlans
      	ip netns exec test time -p bash -c "for i in \$(seq 1 $VLAN_COUNT);
      	do ip -n test link add link $BASE_DEV name foo.\$i type vlan id \$i; done"
      
      	echo Bringing them up
      	ip netns exec test time -p bash -c "for i in \$(seq 1 $VLAN_COUNT);
      	do ip -n test link set foo.\$i up; done"
      
      	echo Assiging IPv6 Addresses
      	ip netns exec test time -p bash -c "for i in \$(seq 1 $VLAN_COUNT);
      	do ip -n test address add dev foo.\$i 2000::\$i/64; done"
      
      	echo Attaching to VRF
      	ip netns exec test time -p bash -c "for i in \$(seq 1 $VLAN_COUNT);
      	do ip -n test link set foo.\$i master florp; done"
      
      On an Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz machine, the performance
      before the patch is (truncated):
      
      	Creating vlans
      	real 108.35
      	Bringing them up
      	real 4.96
      	Assiging IPv6 Addresses
      	real 19.22
      	Attaching to VRF
      	real 458.84
      
      After the patch:
      
      	Creating vlans
      	real 5.59
      	Bringing them up
      	real 5.07
      	Assiging IPv6 Addresses
      	real 5.64
      	Attaching to VRF
      	real 25.37
      
      Cc: David S. Miller <davem@davemloft.net>
      Cc: Jakub Kicinski <kuba@kernel.org>
      Cc: Lu Wei <luwei32@huawei.com>
      Cc: Xiongfeng Wang <wangxiongfeng2@huawei.com>
      Cc: Taehee Yoo <ap420073@gmail.com>
      Signed-off-by: default avatarGilad Naaman <gnaaman@drivenets.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      406f42fa
  2. 24 Aug, 2021 2 commits