Skip to content
Permalink
Joe-Damato/net…
Switch branches/tags

Commits on Dec 8, 2021

  1. net/i40e: fix unsigned stat widths

    Change i40e_update_vsi_stats and struct i40e_vsi to use u64 fields to match
    the width of the stats counters in struct i40e_rx_queue_stats.
    
    Signed-off-by: Joe Damato <jdamato@fastly.com>
    jdamato-fsly authored and intel-lab-lkp committed Dec 8, 2021

Commits on Dec 7, 2021

  1. i40e: Remove non-inclusive language

    Remove non-inclusive language from the driver.
    
    Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
    Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
    mpalczew96 authored and anguy11 committed Dec 7, 2021
  2. igb: fix deadlock caused by taking RTNL in RPM resume path

    Recent net core changes caused an issue with few Intel drivers
    (reportedly igb), where taking RTNL in RPM resume path results in a
    deadlock. See [0] for a bug report. I don't think the core changes
    are wrong, but taking RTNL in RPM resume path isn't needed.
    The Intel drivers are the only ones doing this. See [1] for a
    discussion on the issue. Following patch changes the RPM resume path
    to not take RTNL.
    
    [0] https://bugzilla.kernel.org/show_bug.cgi?id=215129
    [1] https://lore.kernel.org/netdev/20211125074949.5f897431@kicinski-fedora-pc1c0hjn.dhcp.thefacebook.com/t/
    
    Fixes: bd86924 ("net: core: try to runtime-resume detached device in __dev_open")
    Fixes: f32a213 ("ethtool: runtime-resume netdev parent before ethtool ioctl ops")
    Tested-by: Martin Stolpe <martin.stolpe@gmail.com>
    Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
    hkallweit authored and anguy11 committed Dec 7, 2021
  3. i40e: fix use-after-free in i40e_sync_filters_subtask()

    Using ifconfig command to delete the ipv6 address will cause
    the i40e network card driver to delete its internal mac_filter and
    i40e_service_task kernel thread will concurrently access the mac_filter.
    These two processes are not protected by lock
    so causing the following use-after-free problems.
    
     print_address_description+0x70/0x360
     ? vprintk_func+0x5e/0xf0
     kasan_report+0x1b2/0x330
     i40e_sync_vsi_filters+0x4f0/0x1850 [i40e]
     i40e_sync_filters_subtask+0xe3/0x130 [i40e]
     i40e_service_task+0x195/0x24c0 [i40e]
     process_one_work+0x3f5/0x7d0
     worker_thread+0x61/0x6c0
     ? process_one_work+0x7d0/0x7d0
     kthread+0x1c3/0x1f0
     ? kthread_park+0xc0/0xc0
     ret_from_fork+0x35/0x40
    
    Allocated by task 2279810:
     kasan_kmalloc+0xa0/0xd0
     kmem_cache_alloc_trace+0xf3/0x1e0
     i40e_add_filter+0x127/0x2b0 [i40e]
     i40e_add_mac_filter+0x156/0x190 [i40e]
     i40e_addr_sync+0x2d/0x40 [i40e]
     __hw_addr_sync_dev+0x154/0x210
     i40e_set_rx_mode+0x6d/0xf0 [i40e]
     __dev_set_rx_mode+0xfb/0x1f0
     __dev_mc_add+0x6c/0x90
     igmp6_group_added+0x214/0x230
     __ipv6_dev_mc_inc+0x338/0x4f0
     addrconf_join_solict.part.7+0xa2/0xd0
     addrconf_dad_work+0x500/0x980
     process_one_work+0x3f5/0x7d0
     worker_thread+0x61/0x6c0
     kthread+0x1c3/0x1f0
     ret_from_fork+0x35/0x40
    
    Freed by task 2547073:
     __kasan_slab_free+0x130/0x180
     kfree+0x90/0x1b0
     __i40e_del_filter+0xa3/0xf0 [i40e]
     i40e_del_mac_filter+0xf3/0x130 [i40e]
     i40e_addr_unsync+0x85/0xa0 [i40e]
     __hw_addr_sync_dev+0x9d/0x210
     i40e_set_rx_mode+0x6d/0xf0 [i40e]
     __dev_set_rx_mode+0xfb/0x1f0
     __dev_mc_del+0x69/0x80
     igmp6_group_dropped+0x279/0x510
     __ipv6_dev_mc_dec+0x174/0x220
     addrconf_leave_solict.part.8+0xa2/0xd0
     __ipv6_ifa_notify+0x4cd/0x570
     ipv6_ifa_notify+0x58/0x80
     ipv6_del_addr+0x259/0x4a0
     inet6_addr_del+0x188/0x260
     addrconf_del_ifaddr+0xcc/0x130
     inet6_ioctl+0x152/0x190
     sock_do_ioctl+0xd8/0x2b0
     sock_ioctl+0x2e5/0x4c0
     do_vfs_ioctl+0x14e/0xa80
     ksys_ioctl+0x7c/0xa0
     __x64_sys_ioctl+0x42/0x50
     do_syscall_64+0x98/0x2c0
     entry_SYSCALL_64_after_hwframe+0x65/0xca
    
    Signed-off-by: Di Zhu <zhudi2@huawei.com>
    Signed-off-by: Rui Zhang <zhangrui182@huawei.com>
    Di Zhu authored and anguy11 committed Dec 7, 2021
  4. ice: remove dead store on XSK hotpath

    The 'if (ntu == rx_ring->count)' block in ice_alloc_rx_buffers_zc()
    was previously residing in the loop, but after introducing the
    batched interface it is used only to wrap-around the NTU descriptor,
    thus no more need to assign 'xdp'.
    
    Fixes: db804cf ("ice: Use the xsk batched rx allocation interface")
    Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
    Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
    alobakin authored and anguy11 committed Dec 7, 2021
  5. i40e: remove dead stores on XSK hotpath

    The 'if (ntu == rx_ring->count)' block in i40e_alloc_rx_buffers_zc()
    was previously residing in the loop, but after introducing the
    batched interface it is used only to wrap-around the NTU descriptor,
    thus no more need to assign 'xdp'.
    
    'cleaned_count' in i40e_clean_rx_irq_zc() was previously being
    incremented in the loop, but after commit f12738b
    ("i40e: remove unnecessary cleaned_count updates") it gets
    assigned only once after it, so the initialization can be dropped.
    
    Fixes: 6aab0bb ("i40e: Use the xsk batched rx allocation interface")
    Fixes: f12738b ("i40e: remove unnecessary cleaned_count updates")
    Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
    Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
    alobakin authored and anguy11 committed Dec 7, 2021
  6. i40e: Fix for failed to init adminq while VF reset

    Fix for failed to init adminq: -53 while VF is resetting via MAC
    address changing procedure.
    Added sync module to avoid reading deadbeef value in reinit adminq
    during software reset.
    Without this patch it is possible to trigger VF reset procedure
    during reinit adminq. This resulted in an incorrect reading of
    value from the AQP registers and generated the -53 error.
    
    Fixes: 5c3c48a ("i40e: implement virtual device interface")
    Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
    Signed-off-by: Karen Sornek <karen.sornek@intel.com>
    ksornek authored and anguy11 committed Dec 7, 2021
  7. iavf: do not override the adapter state in the watchdog task (again)

    The watchdog task incorrectly changes the state to __IAVF_RESETTING,
    instead of letting the reset task take care of that. This was already
    resolved by
    22c8fd7 iavf: do not override the adapter state in the watchdog task
    but the problem was reintroduced by the recent code refactoring in
    45eebd6.
    
    Fixes: 45eebd6 ("iavf: Refactor iavf state machine tracking")
    Signed-off-by: Stefan Assmann <sassmann@kpanic.de>
    sassmann authored and anguy11 committed Dec 7, 2021
  8. ice: Add ability for PF admin to enable VF VLAN pruning

    VFs by default are able to see all tagged traffic regardless of trust
    and VLAN filters. Based on legacy devices (i.e. ixgbe, i40e), customers
    expect VFs to receive all VLAN tagged traffic with a matching
    destination MAC.
    
    Add an ethtool private flag 'vf-vlan-pruning' and set the default to
    off so VFs will receive all VLAN traffic directed towards them. When
    the flag is turned on, VF will only be able to receive untagged
    traffic or traffic with VLAN tags it has created interfaces for.
    
    Also, the flag cannot be changed while any VFs are allocated. This was
    done to simplify the implementation. So, if this flag is needed, then
    the PF admin must enable it. If the user tries to enable the flag while
    VFs are active, then print an unsupported message with the
    vf-vlan-pruning flag included. In case multiple flags were specified, this
    makes it clear to the user which flag failed.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  9. ice: Add support for 802.1ad port VLANs VF

    Currently there is only support for 802.1Q port VLANs on SR-IOV VFs. Add
    support to also allow 802.1ad port VLANs when double VLAN mode is
    enabled.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  10. ice: Advertise 802.1ad VLAN filtering and offloads for PF netdev

    In order for the driver to support 802.1ad VLAN filtering and offloads,
    it needs to advertise those VLAN features and also support modifying
    those VLAN features, so make the necessary changes to
    ice_set_netdev_features(). By default, enable CTAG insertion/stripping
    and CTAG filtering for both Single and Double VLAN Modes (SVM/DVM).
    Also, in DVM, enable STAG filtering by default. This is done by
    setting the feature bits in netdev->features. Also, in DVM, support
    toggling of STAG insertion/stripping, but don't enable them by
    default. This is done by setting the feature bits in
    netdev->hw_features.
    
    Since 802.1ad VLAN filtering and offloads are only supported in DVM, make
    sure they are not enabled by default and that they cannot be enabled
    during runtime, when the device is in SVM.
    
    Add an implementation for the ndo_fix_features() callback. This is
    needed since the hardware cannot support multiple VLAN ethertypes for
    VLAN insertion/stripping simultaneously and all supported VLAN filtering
    must either be enabled or disabled together.
    
    Disable inner VLAN stripping by default when DVM is enabled. If a VSI
    supports stripping the inner VLAN in DVM, then it will have to configure
    that during runtime. For example if a VF is configured in a port VLAN
    while DVM is enabled it will be allowed to offload inner VLANs.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  11. ice: Support configuring the device to Double VLAN Mode

    In order to support configuring the device in Double VLAN Mode (DVM),
    the DDP and FW have to support DVM. If both support DVM, the PF that
    downloads the package needs to update the default recipes, set the
    VLAN mode, and update boost TCAM entries.
    
    To support updating the default recipes in DVM, add support for
    updating an existing switch recipe's lkup_idx and mask. This is done
    by first calling the get recipe AQ (0x0292) with the desired recipe
    ID. Then, if that is successful update one of the lookup indices
    (lkup_idx) and its associated mask if the mask is valid otherwise
    the already existing mask will be used.
    
    The VLAN mode of the device has to be configured while the global
    configuration lock is held while downloading the DDP, specifically after
    the DDP has been downloaded. If supported, the device will default to
    DVM.
    
    Co-developed-by: Dan Nowlin <dan.nowlin@intel.com>
    Signed-off-by: Dan Nowlin <dan.nowlin@intel.com>
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  12. ice: Add support for VIRTCHNL_VF_OFFLOAD_VLAN_V2

    Add support for the VF driver to be able to request
    VIRTCHNL_VF_OFFLOAD_VLAN_V2, negotiate its VLAN capabilities via
    VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS, add/delete VLAN filters, and
    enable/disable VLAN offloads.
    
    VFs supporting VIRTCHNL_OFFLOAD_VLAN_V2 will be able to use the
    following virtchnl opcodes:
    
    VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS
    VIRTCHNL_OP_ADD_VLAN_V2
    VIRTCHNL_OP_DEL_VLAN_V2
    VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2
    VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2
    VIRTCHNL_OP_ENABLE_VLAN_INSERTION_V2
    VIRTCHNL_OP_DISABLE_VLAN_INSERTION_V2
    
    Legacy VF drivers may expect the initial VLAN stripping settings to be
    configured by the PF, so the PF initializes VLAN stripping based on the
    VIRTCHNL_OP_GET_VF_RESOURCES opcode. However, with VLAN support via
    VIRTCHNL_VF_OFFLOAD_VLAN_V2, this function is only expected to be used
    for VFs that only support VIRTCHNL_VF_OFFLOAD_VLAN, which will only
    be supported when a port VLAN is configured. Update the function
    based on the new expectations. Also, change the message when the PF
    can't enable/disable VLAN stripping to a dev_dbg() as this isn't fatal.
    
    When a VF isn't in a port VLAN and it only supports
    VIRTCHNL_VF_OFFLOAD_VLAN when Double VLAN Mode (DVM) is enabled, then
    the PF needs to reject the VIRTCHNL_VF_OFFLOAD_VLAN capability and
    configure the VF in software only VLAN mode. To do this add the new
    function ice_vf_vsi_cfg_legacy_vlan_mode(), which updates the VF's
    inner and outer ice_vsi_vlan_ops functions and sets up software only
    VLAN mode.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  13. ice: Add hot path support for 802.1Q and 802.1ad VLAN offloads

    Currently the driver only supports 802.1Q VLAN insertion and stripping.
    However, once Double VLAN Mode (DVM) is fully supported, then both 802.1Q
    and 802.1ad VLAN insertion and stripping will be supported. Unfortunately
    the VSI context parameters only allow for one VLAN ethertype at a time
    for VLAN offloads so only one or the other VLAN ethertype offload can be
    supported at once.
    
    To support this, multiple changes are needed.
    
    Rx path changes:
    
    [1] In DVM, the Rx queue context l2tagsel field needs to be cleared so
    the outermost tag shows up in the l2tag2_2nd field of the Rx flex
    descriptor. In Single VLAN Mode (SVM), the l2tagsel field should remain
    1 to support SVM configurations.
    
    [2] Modify the ice_test_staterr() function to take a __le16 instead of
    the ice_32b_rx_flex_desc union pointer so this function can be used for
    both rx_desc->wb.status_error0 and rx_desc->wb.status_error1.
    
    [3] Add the new inline function ice_get_vlan_tag_from_rx_desc() that
    checks if there is a VLAN tag in l2tag1 or l2tag2_2nd.
    
    [4] In ice_receive_skb(), add a check to see if NETIF_F_HW_VLAN_STAG_RX
    is enabled in netdev->features. If it is, then this is the VLAN
    ethertype that needs to be added to the stripping VLAN tag. Since
    ice_fix_features() prevents CTAG_RX and STAG_RX from being enabled
    simultaneously, the VLAN ethertype will only ever be 802.1Q or 802.1ad.
    
    Tx path changes:
    
    [1] In DVM, the VLAN tag needs to be placed in the l2tag2 field of the Tx
    context descriptor. The new define ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN was
    added to the list of tx_flags to handle this case.
    
    [2] When the stack requests the VLAN tag to be offloaded on Tx, the
    driver needs to set either ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN or
    ICE_TX_FLAGS_HW_VLAN, so the tag is inserted in l2tag2 or l2tag1
    respectively. To determine which location to use, set a bit in the Tx
    ring flags field during ring allocation that can be used to determine
    which field to use in the Tx descriptor. In DVM, always use l2tag2,
    and in SVM, always use l2tag1.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  14. ice: Add outer_vlan_ops and VSI specific VLAN ops implementations

    Add a new outer_vlan_ops member to the ice_vsi structure as outer VLAN
    ops are only available when the device is in Double VLAN Mode (DVM).
    Depending on the VSI type, the requirements for what operations to
    use/allow differ.
    
    By default all VSI's have unsupported inner and outer VSI VLAN ops. This
    implementation was chosen to prevent unexpected crashes due to null
    pointer dereferences. Instead, if a VSI calls an unsupported op, it will
    just return -EOPNOTSUPP.
    
    Add implementations to support modifying outer VLAN fields for VSI
    context. This includes the ability to modify VLAN stripping, insertion,
    and the port VLAN based on the outer VLAN handling fields of the VSI
    context.
    
    These functions should only ever be used if DVM is enabled because that
    means the firmware supports the outer VLAN fields in the VSI context. If
    the device is in DVM, then always use the outer_vlan_ops, else use the
    vlan_ops since the device is in Single VLAN Mode (SVM).
    
    Also, move adding the untagged VLAN 0 filter from ice_vsi_setup() to
    ice_vsi_vlan_setup() as the latter function is specific to the PF and
    all other VSI types that need an untagged VLAN 0 filter already do this
    in their specific flows. Without this change, Flow Director is failing
    to initialize because it does not implement any VSI VLAN ops.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  15. ice: Adjust naming for inner VLAN operations

    Current operations act on inner VLAN fields. To support double VLAN, outer
    VLAN operations and functions will be implemented. Add the "inner" naming
    to existing VLAN operations to distinguish them from the upcoming outer
    values and functions. Some spacing adjustments are made to align
    values.
    
    Note that the inner is not talking about a tunneled VLAN, but the second
    VLAN in the packet. For SVM the driver uses inner or single VLAN
    filtering and offloads and in Double VLAN Mode the driver uses the
    inner filtering and offloads for SR-IOV VFs in port VLANs in order to
    support offloading the guest VLAN while a port VLAN is configured.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  16. ice: Use the proto argument for VLAN ops

    Currently the proto argument is unused. This is because the driver only
    supports 802.1Q VLAN filtering. This policy is enforced via netdev
    features that the driver sets up when configuring the netdev, so the
    proto argument won't ever be anything other than 802.1Q. However, this
    will allow for future iterations of the driver to seemlessly support
    802.1ad filtering. Begin using the proto argument and extend the related
    structures to support its use.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  17. ice: Refactor vf->port_vlan_info to use ice_vlan

    The current vf->port_vlan_info variable is a packed u16 that contains
    the port VLAN ID and QoS/prio value. This is fine, but changes are
    incoming that allow for an 802.1ad port VLAN. Add flexibility by
    changing the vf->port_vlan_info member to be an ice_vlan structure.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  18. ice: Introduce ice_vlan struct

    Add a new struct for VLAN related information. Currently this holds
    VLAN ID and priority values, but will be expanded to hold TPID value.
    This reduces the changes necessary if any other values are added in
    future. Remove the action argument from these calls as it's always
    ICE_FWD_VSI.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  19. ice: Add new VSI VLAN ops

    Incoming changes to support 802.1Q and/or 802.1ad VLAN filtering and
    offloads require more flexibility when configuring VLANs. The VSI VLAN
    interface will allow flexibility for configuring VLANs for all VSI
    types. Add new files to separate the VSI VLAN ops and move functions to
    make the code more organized.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  20. ice: Add helper function for adding VLAN 0

    There are multiple places where VLAN 0 is being added. Create a function
    to be called in order to minimize changes as the implementation is expanded
    to support double VLAN and avoid duplicated code.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  21. ice: Refactor spoofcheck configuration functions

    Add functions to configure Tx VLAN antispoof based on iproute
    configuration and/or VLAN mode and VF driver support. This is needed
    later so the driver can control when it can be configured. Also, add
    functions that can be used to enable and disable MAC and VLAN
    spoofcheck. Move spoofchk configuration during VSI setup into the
    SR-IOV initialization path and into the post VSI rebuild flow for VF
    VSIs.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  22. iavf: Restrict maximum VLAN filters for VIRTCHNL_VF_OFFLOAD_VLAN_V2

    For VIRTCHNL_VF_OFFLOAD_VLAN, PF's would limit the number of VLAN
    filters a VF was allowed to add. However, by the time the opcode failed,
    the VLAN netdev had already been added. VIRTCHNL_VF_OFFLOAD_VLAN_V2
    added the ability for a PF to tell the VF how many VLAN filters it's
    allowed to add. Make changes to support that functionality.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  23. iavf: Add support for VIRTCHNL_VF_OFFLOAD_VLAN_V2 offload enable/disable

    The new VIRTCHNL_VF_OFFLOAD_VLAN_V2 capability added support that allows
    the VF to support 802.1Q and 802.1ad VLAN insertion and stripping if
    successfully negotiated via VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS.
    Multiple changes were needed to support this new functionality.
    
    1. Added new aq_required flags to support any kind of VLAN stripping and
       insertion offload requests via virtchnl.
    
    2. Added the new method iavf_set_vlan_offload_features() that's
       used during VF initialization, VF reset, and iavf_set_features() to
       set the aq_required bits based on the current VLAN offload
       configuration of the VF's netdev.
    
    3. Added virtchnl handling for VIRTCHNL_OP_ENABLE_STRIPPING_V2,
       VIRTCHNL_OP_DISABLE_STRIPPING_V2, VIRTCHNL_OP_ENABLE_INSERTION_V2,
       and VIRTCHNL_OP_ENABLE_INSERTION_V2.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  24. iavf: Add support for VIRTCHNL_VF_OFFLOAD_VLAN_V2 hotpath

    The new VIRTCHNL_VF_OFFLOAD_VLAN_V2 capability added support that allows
    the PF to set the location of the Tx and Rx VLAN tag for insertion and
    stripping offloads. In order to support this functionality a few changes
    are needed.
    
    1. Add a new method to cache the VLAN tag location based on negotiated
       capabilities for the Tx and Rx ring flags. This needs to be called in
       the initialization and reset paths.
    
    2. Refactor the transmit hotpath to account for the new Tx ring flags.
       When IAVF_TXR_FLAGS_VLAN_LOC_L2TAG2 is set, then the driver needs to
       insert the VLAN tag in the L2TAG2 field of the transmit descriptor.
       When the IAVF_TXRX_FLAGS_VLAN_LOC_L2TAG1 is set, then the driver needs
       to use the l2tag1 field of the data descriptor (same behavior as
       before).
    
    3. Refactor the iavf_tx_prepare_vlan_flags() function to simplify
       transmit hardware VLAN offload functionality by only depending on the
       skb_vlan_tag_present() function. This can be done because the OS
       won't request transmit offload for a VLAN unless the driver told the
       OS it's supported and enabled.
    
    4. Refactor the receive hotpath to account for the new Rx ring flags and
       VLAN ethertypes. This requires checking the Rx ring flags and
       descriptor status bits to determine the location of the VLAN tag.
       Also, since only a single ethertype can be supported at a time, check
       the enabled netdev features before specifying a VLAN ethertype in
       __vlan_hwaccel_put_tag().
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  25. iavf: Add support VIRTCHNL_VF_OFFLOAD_VLAN_V2 during netdev config

    Based on VIRTCHNL_VF_OFFLOAD_VLAN_V2, the VF can now support more VLAN
    capabilities (i.e. 802.1AD offloads and filtering). In order to
    communicate these capabilities to the netdev layer, the VF needs to
    parse its VLAN capabilities based on whether it was able to negotiation
    VIRTCHNL_VF_OFFLOAD_VLAN or VIRTCHNL_VF_OFFLOAD_VLAN_V2 or neither of
    these.
    
    In order to support this, add the following functionality:
    
    iavf_get_netdev_vlan_hw_features() - This is used to determine the VLAN
    features that the underlying hardware supports and that can be toggled
    off/on based on the negotiated capabiltiies. For example, if
    VIRTCHNL_VF_OFFLOAD_VLAN_V2 was negotiated, then any capability marked
    with VIRTCHNL_VLAN_TOGGLE can be toggled on/off by the VF. If
    VIRTCHNL_VF_OFFLOAD_VLAN was negotiated, then only VLAN insertion and/or
    stripping can be toggled on/off.
    
    iavf_get_netdev_vlan_features() - This is used to determine the VLAN
    features that the underlying hardware supports and that should be
    enabled by default. For example, if VIRTHCNL_VF_OFFLOAD_VLAN_V2 was
    negotiated, then any supported capability that has its ethertype_init
    filed set should be enabled by default. If VIRTCHNL_VF_OFFLOAD_VLAN was
    negotiated, then filtering, stripping, and insertion should be enabled
    by default.
    
    Also, refactor iavf_fix_features() to take into account the new
    capabilities. To do this, query all the supported features (enabled by
    default and toggleable) and make sure the requested change is supported.
    If VIRTCHNL_VF_OFFLOAD_VLAN_V2 is successfully negotiated, there is no
    need to check VIRTCHNL_VLAN_TOGGLE here because the driver already told
    the netdev layer which features can be toggled via netdev->hw_features
    during iavf_process_config(), so only those features will be requested
    to change.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  26. iavf: Add support for VIRTCHNL_VF_OFFLOAD_VLAN_V2 negotiation

    In order to support the new VIRTCHNL_VF_OFFLOAD_VLAN_V2 capability the
    VF driver needs to rework it's initialization state machine and reset
    flow. This has to be done because successful negotiation of
    VIRTCHNL_VF_OFFLOAD_VLAN_V2 requires the VF driver to perform a second
    capability request via VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS before
    configuring the adapter and its netdev.
    
    Add the VIRTCHNL_VF_OFFLOAD_VLAN_V2 bit when sending the
    VIRTHCNL_OP_GET_VF_RESOURECES message. The underlying PF will either
    support VIRTCHNL_VF_OFFLOAD_VLAN or VIRTCHNL_VF_OFFLOAD_VLAN_V2 or
    neither. Both of these offloads should never be supported together.
    
    Based on this, add 2 new states to the initialization state machine:
    
    __IAVF_INIT_GET_OFFLOAD_VLAN_V2_CAPS
    __IAVF_INIT_CONFIG_ADAPTER
    
    The __IAVF_INIT_GET_OFFLOAD_VLAN_V2_CAPS state is used to request/store
    the new VLAN capabilities if and only if VIRTCHNL_VLAN_OFFLOAD_VLAN_V2
    was successfully negotiated in the __IAVF_INIT_GET_RESOURCES state.
    
    The __IAVF_INIT_CONFIG_ADAPTER state is used to configure the
    adapter/netdev after the resource requests have finished. The VF will
    move into this state regardless of whether it successfully negotiated
    VIRTCHNL_VF_OFFLOAD_VLAN or VIRTCHNL_VF_OFFLOAD_VLAN_V2.
    
    Also, add a the new flag IAVF_FLAG_AQ_GET_OFFLOAD_VLAN_V2_CAPS and set
    it during VF reset. If VIRTCHNL_VF_OFFLOAD_VLAN_V2 was successfully
    negotiated then the VF will request its VLAN capabilities via
    VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS during the reset. This is needed
    because the PF may change/modify the VF's configuration during VF reset
    (i.e. modifying the VF's port VLAN configuration).
    
    This also, required the VF to call netdev_update_features() since its
    VLAN features may change during VF reset. Make sure to call this under
    rtnl_lock().
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  27. virtchnl: Add support for new VLAN capabilities

    Currently VIRTCHNL only allows for VLAN filtering and offloads to happen
    on a single 802.1Q VLAN. Add support to filter and offload on inner,
    outer, and/or inner + outer VLANs.
    
    This is done by introducing the new capability
    VIRTCHNL_VF_OFFLOAD_VLAN_V2. The flow to negotiate this new capability
    is shown below.
    
    1. VF - sets the VIRTCHNL_VF_OFFLOAD_VLAN_V2 bit in the
       virtchnl_vf_resource.vf_caps_flags during the
       VIRTCHNL_OP_GET_VF_RESOURCES request message. The VF should also set
       the VIRTCHNL_VF_OFFLOAD_VLAN bit in case the PF driver doesn't support
       the new capability.
    
    2. PF - sets the VLAN capability bit it supports in the
       VIRTCHNL_OP_GET_VF_RESOURCES response message. This will either be
       VIRTCHNL_VF_OFFLOAD_VLAN_V2, VIRTCHNL_VF_OFFLOAD_VLAN, or none.
    
    3. VF - If the VIRTCHNL_VF_OFFLOAD_VLAN_V2 capability was ACK'd by the
       PF, then the VF needs to request the VLAN capabilities of the
       PF/Device by issuing a VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS request.
       If the VIRTCHNL_VF_OFFLOAD_VLAN capability was ACK'd then the VF
       knows only single 802.1Q VLAN filtering/offloads are supported. If no
       VLAN capability is ACK'd then the PF/Device doesn't support hardware
       VLAN filtering/offloads for this VF.
    
    4. PF - Populates the virtchnl_vlan_caps structure based on what it
       allows/supports for that VF and sends that response via
       VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS.
    
    After VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS is successfully negotiated
    the VF driver needs to interpret the capabilities supported by the
    underlying PF/Device. The VF will be allowed to filter/offload the
    inner 802.1Q, outer (various ethertype), inner 802.1Q + outer
    (various ethertypes), or none based on which fields are set.
    
    The VF will also need to interpret where the VLAN tag should be inserted
    and/or stripped based on the negotiated capabilities.
    
    Signed-off-by: Brett Creeley <brett.creeley@intel.com>
    bcreeley13 authored and anguy11 committed Dec 7, 2021
  28. i40e: Fix queues reservation for XDP

    When XDP was configured on a system with large number of CPUs
    and X722 NIC there was a call trace with NULL pointer dereference.
    
    i40e 0000:87:00.0: failed to get tracking for 256 queues for VSI 0 err -12
    i40e 0000:87:00.0: setup of MAIN VSI failed
    
    BUG: kernel NULL pointer dereference, address: 0000000000000000
    RIP: 0010:i40e_xdp+0xea/0x1b0 [i40e]
    Call Trace:
    ? i40e_reconfig_rss_queues+0x130/0x130 [i40e]
    dev_xdp_install+0x61/0xe0
    dev_xdp_attach+0x18a/0x4c0
    dev_change_xdp_fd+0x1e6/0x220
    do_setlink+0x616/0x1030
    ? ahci_port_stop+0x80/0x80
    ? ata_qc_issue+0x107/0x1e0
    ? lock_timer_base+0x61/0x80
    ? __mod_timer+0x202/0x380
    rtnl_setlink+0xe5/0x170
    ? bpf_lsm_binder_transaction+0x10/0x10
    ? security_capable+0x36/0x50
    rtnetlink_rcv_msg+0x121/0x350
    ? rtnl_calcit.isra.0+0x100/0x100
    netlink_rcv_skb+0x50/0xf0
    netlink_unicast+0x1d3/0x2a0
    netlink_sendmsg+0x22a/0x440
    sock_sendmsg+0x5e/0x60
    __sys_sendto+0xf0/0x160
    ? __sys_getsockname+0x7e/0xc0
    ? _copy_from_user+0x3c/0x80
    ? __sys_setsockopt+0xc8/0x1a0
    __x64_sys_sendto+0x20/0x30
    do_syscall_64+0x33/0x40
    entry_SYSCALL_64_after_hwframe+0x44/0xae
    RIP: 0033:0x7f83fa7a39e0
    
    This was caused by PF queue pile fragmentation due to
    flow director VSI queue being placed right after main VSI.
    Because of this main VSI was not able to resize its
    queue allocation for XDP resulting in no queues allocated
    for main VSI when XDP was turned on.
    
    Fix this by always allocating last queue in PF queue pile
    for a flow director VSI.
    
    Fixes: 74608d1 ("i40e: add support for XDP_TX action")
    Fixes: 41c445f ("i40e: main driver core")
    Signed-off-by: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>
    Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
    Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
    sylwesterdziedziuch authored and anguy11 committed Dec 7, 2021
  29. ice: add support for DSCP QoS for IDC

    The ice driver provides QoS information to auxiliary drivers
    through the exported function ice_get_qos_params.  This function
    doesn't currently support L3 DSCP QoS.
    
    Add the necessary defines, structure elements and code to support
    DSCP QoS through the IDC functions.
    
    Signed-off-by: Dave Ertman <david.m.ertman@intel.com>
    dmertman authored and anguy11 committed Dec 7, 2021
  30. ixgbevf: switch to napi_build_skb()

    napi_build_skb() reuses per-cpu NAPI skbuff_head cache in order
    to save some cycles on freeing/allocating skbuff_heads on every
    new Rx or completed Tx.
    ixgbevf driver runs Tx completion polling cycle right before the Rx
    one and uses napi_consume_skb() to feed the cache with skbuff_heads
    of completed entries, so it's never empty and always warm at that
    moment. Switch to the napi_build_skb() to relax mm pressure on
    heavy Rx.
    
    Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
    Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
    alobakin authored and anguy11 committed Dec 7, 2021
  31. ixgbe: switch to napi_build_skb()

    napi_build_skb() reuses per-cpu NAPI skbuff_head cache in order
    to save some cycles on freeing/allocating skbuff_heads on every
    new Rx or completed Tx.
    ixgbe driver runs Tx completion polling cycle right before the Rx
    one and uses napi_consume_skb() to feed the cache with skbuff_heads
    of completed entries, so it's never empty and always warm at that
    moment. Switch to the napi_build_skb() to relax mm pressure on
    heavy Rx.
    
    Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
    Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
    alobakin authored and anguy11 committed Dec 7, 2021
  32. igc: switch to napi_build_skb()

    napi_build_skb() reuses per-cpu NAPI skbuff_head cache in order
    to save some cycles on freeing/allocating skbuff_heads on every
    new Rx or completed Tx.
    igc driver runs Tx completion polling cycle right before the Rx
    one and uses napi_consume_skb() to feed the cache with skbuff_heads
    of completed entries, so it's never empty and always warm at that
    moment. Switch to the napi_build_skb() to relax mm pressure on
    heavy Rx.
    
    Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
    Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
    alobakin authored and anguy11 committed Dec 7, 2021
  33. igb: switch to napi_build_skb()

    napi_build_skb() reuses per-cpu NAPI skbuff_head cache in order
    to save some cycles on freeing/allocating skbuff_heads on every
    new Rx or completed Tx.
    igb driver runs Tx completion polling cycle right before the Rx
    one and uses napi_consume_skb() to feed the cache with skbuff_heads
    of completed entries, so it's never empty and always warm at that
    moment. Switch to the napi_build_skb() to relax mm pressure on
    heavy Rx.
    
    Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
    Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
    alobakin authored and anguy11 committed Dec 7, 2021
  34. ice: switch to napi_build_skb()

    napi_build_skb() reuses per-cpu NAPI skbuff_head cache in order
    to save some cycles on freeing/allocating skbuff_heads on every
    new Rx or completed Tx.
    ice driver runs Tx completion polling cycle right before the Rx
    one and uses napi_consume_skb() to feed the cache with skbuff_heads
    of completed entries, so it's never empty and always warm at that
    moment. Switch to the napi_build_skb() to relax mm pressure on
    heavy Rx.
    
    Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
    Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
    alobakin authored and anguy11 committed Dec 7, 2021
Older