1. 02 May, 2016 26 commits
  2. 01 May, 2016 3 commits
  3. 29 Apr, 2016 11 commits
    • David S. Miller's avatar
      Merge branch 'mlx5-aRFS' · 3cfef195
      David S. Miller authored
      Saeed Mahameed says:
      
      ====================
      Mellanox 100G mlx5 ethernet aRFS support
      
      This series adds accelerated RFS support for the mlx5e driver.
      I have added one patch non-related to aRFS that fixes the rtnl_lock
      warning mlx5 driver been getting since b7aade15 ('vxlan: break dependency with netdev drivers')
      
      aRFS support in details:
      
      A direct TIR per RQ is now required in order to have the essential building blocks
      for aRFS.  Today the driver has one direct TIR that forwards traffic to RQ[0] (core 0),
      and one indirect TIR for RSS indirection table.  For that we've added one direct TIR
      per RQ, e.g.: TIR[i] -> RQ[i] (core i).
      
      Publicize Modify flow rule destination and reveal it in flow steering API, to have the
      ability to dynamically modify the destination TIR(core) for aRFS rules from the
      ethernet driver.
      
      Initializing CPU reverse mapping to notify upper layer on internal receive queue cpu
      mappings.
      
      Some design refactoring for mlx5e ethernet driver flow tables and flow steering API.
      Now the caller of create_flow_table can choose the level of the flow table, this way
      we will create the mlx5e flow tables in a reversed order and connect them as we go,
      we create flow table[i+1] before flow table[i] to be able to set flow table[i + 1] as
      a destination of flow table[i] once flow table[i] is created.
      also we have split the main flow table in the following manner:
          - From before: RX packet had to visit two flow tables until it is delivered to its receive queue:
              RX packet -> vlan filter flow table -> main flow table.
              > vlan filter will check the packet vlan field is allowed.
              > main flow will check if the dest mac is allowed and will check the l3/l4 headers to
              retrieve the RSS hash for steering the packet into its final receive queue.
      
          - Now main flow table is split into l2 dst mac steering table and ttc (traffic type classifier) table:
              RX packet -> vlan filter -> l2 table -> ttc table
              > vlan filter - same as before
              > L2 filter - filter packets according their destination mac address
              > ttc table - classify packet headers for RSS steering
                  - L3/L4 classification rules to steer the packet according to thier headers hash
                  - in case of none of the rules applies the packet is steered to RQ[0]
      
      After the above refactoring all left to-do is to create aRFS flow table which will manage
      aRFS steering rules to forward traffic to the desired RQ (core) and just connect the ttc
      table rules destinations to aRFS flow table.
      
      aRFS flow table in case of a miss will deliver the traffic to the core where the original
      ttc hash would have chosen.
      
      TTC table is not initialized and enabled until the user explicitly asks to, i.e. setting the NETIF_F_NTUPLE
      to ON.  This way there is no need for ttc table to forward traffic to aRFS table unless required.
      When setting back to OFF aRFS flow table is disabled and disconnected.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      3cfef195
    • Maor Gottlieb's avatar
      net/mlx5e: Enabling aRFS mechanism · 45bf454a
      Maor Gottlieb authored
      Accelerated RFS requires that ntuple filtering is enabled via
      ethtool and driver supports ndo_rx_flow_steer.
      When the ntuple filtering is enabled, we modify the l3_l4 ttc
      rules to point on the aRFS flow tables and when the filtering
      is disabled, we modify the l3_l4 ttc rules to point on the RSS
      TIRs.
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      45bf454a
    • Maor Gottlieb's avatar
      net/mlx5e: Add accelerated RFS support · 18c908e4
      Maor Gottlieb authored
      Implement ndo_rx_flow_steer ndo.
      A new flow steering rule will be composed from the
      skb 4-tuple and added to the hardware aRFS flow table.
      
      Each rule is stored in an internal hash table, if such
      skb 4-tuple rule already exists we update the corresponding
      hardware steering rule with the new destination.
      
      For garbage collection rps_may_expire_flow will be
      invoked for a limited amount of old rules upon any
      ndo_rx_flow_steer invocation.
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      18c908e4
    • Maor Gottlieb's avatar
      net/mlx5e: Create aRFS flow tables · 1cabe6b0
      Maor Gottlieb authored
      Create the following four flow tables for aRFS usage:
      1. IPv4 TCP - filtering 4-tuple of IPv4 TCP packets.
      2. IPv6 TCP - filtering 4-tuple of IPv6 TCP packets.
      3. IPv4 UDP - filtering 4-tuple of IPv4 UDP packets.
      4. IPv6 UDP - filtering 4-tuple of IPv6 UDP packets.
      
      Each flow table has two flow groups: one for the 4-tuple
      filtering (full match)  and the other contains * rule for miss rule.
      
      Full match rule means a hit for aRFS and packet will be forwarded
      to the dedicated RQ/Core, miss rule packets will be forwarded to
      default RSS hashing.
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      1cabe6b0
    • Maor Gottlieb's avatar
      net/mlx5: Initializing CPU reverse mapping · 5a7b27eb
      Maor Gottlieb authored
      Allocating CPU rmap and add entry for each IRQ.
      CPU rmap is used in aRFS to get the RX queue number
      of the RX completion interrupts.
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5a7b27eb
    • Maor Gottlieb's avatar
      net/mlx5e: Split the main flow steering table · 33cfaaa8
      Maor Gottlieb authored
      Currently, the main flow table is used for two purposes:
      One is to do mac filtering and the other is to classify
      the packet l3-l4 header in order to steer the packet to
      the right RSS TIR.
      
      This design is very complex, for each configured mac address we
      have to add eleven rules (rule for each traffic type), the same if the
      device is put to promiscuous/allmulti mode.
      This scheme isn't scalable for future features like aRFS.
      
      In order to simplify it, the main flow table is split to two flow
      tables:
      1. l2 table - filter the packet dmac address, if there is a match
      we forward to the ttc flow table.
      
      2. TTC (Traffic Type Classifier) table - classify the traffic
      type of the packet and steer the packet to the right TIR.
      
      In this new design, when new mac address is added, the driver adds
      only one flow rule instead of eleven.
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      33cfaaa8
    • Maor Gottlieb's avatar
      net/mlx5e: Refactor mlx5e flow steering structs · acff797c
      Maor Gottlieb authored
      Slightly refactor and re-order the flow steering structs,
      tables and data-bases for better self-containment and
      flexibility to add more future steering phases
      (tables/rules/data bases) e.g: aRFS.
      
      Changes:
      1. Move the vlan DB and address DB into their table structs.
      2. Rename steering table structs to unique format: mlx5e_*_table,
      e.g: mlx5e_vlan_table.
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      acff797c
    • Maor Gottlieb's avatar
      net/mlx5: Support different attributes for priorities in namespace · 13de6c10
      Maor Gottlieb authored
      Currently, namespace could be initialized only
      with priorities with the same attributes.
      Add support to initialize namespace with priorities
      with different attributes(e.g. different number of levels).
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      13de6c10
    • Maor Gottlieb's avatar
      net/mlx5: Add user chosen levels when allocating flow tables · d63cd286
      Maor Gottlieb authored
      Currently, consumers of the flow steering infrastructure can't
      choose their own flow table levels and are limited to one
      flow table per level. This just waste levels.
      Instead, we introduce here the possibility to use multiple
      flow tables in a level. The user is free to connect these
      flow tables, while following the rule (FTEs in FT of level x
      could only point to FTs of level y where y > x).
      
      In addition this patch switch the order of the create/destroy
      flow tables of the NIC(vlan and main).
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d63cd286
    • Maor Gottlieb's avatar
      net/mlx5: Set number of allowed levels in priority · a257b94a
      Maor Gottlieb authored
      Refactors the flow steering namespace creation,
      by changing the name num_fts to num_levels.
      When new flow table is created, the driver assign new level
      to this flow table therefore the meaning is equivalent.
      Since downstream patches will introduce the ability to create more
      than one flow table per level, the name num_fts is no
      longer accurate.
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a257b94a
    • Maor Gottlieb's avatar
      net/mlx5: Introduce modify flow rule destination · d745098c
      Maor Gottlieb authored
      This API is used for modifying the flow rule destination.
      This is needed for modifying the pointed flow table by the
      traffic type classifier rules to point on the aRFS tables.
      Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
      Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d745098c