]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iavf: add VIRTCHNL_OP_ADD_VLAN to success completion handler
authorPetr Oros <poros@redhat.com>
Tue, 28 Apr 2026 05:22:16 +0000 (22:22 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 30 Apr 2026 09:37:38 +0000 (11:37 +0200)
The V1 ADD_VLAN opcode had no success handler; filters sent via V1
stayed in ADDING state permanently.  Add a fallthrough case so V1
filters also transition ADDING -> ACTIVE on PF confirmation.

Critically, add an `if (v_retval) break` guard: the error switch in
iavf_virtchnl_completion() does NOT return after handling errors,
it falls through to the success switch.  Without this guard, a
PF-rejected ADD would incorrectly mark ADDING filters as ACTIVE,
creating a driver/HW mismatch where the driver believes the filter
is installed but the PF never accepted it.

For V2, this is harmless: iavf_vlan_add_reject() in the error
block already kfree'd all ADDING filters, so the success handler
finds nothing to transition.

Fixes: 968996c070ef ("iavf: Fix VLAN_V2 addition/rejection")
Signed-off-by: Petr Oros <poros@redhat.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20260427-jk-iwl-net-petr-oros-fixes-v1-4-cdcb48303fd8@intel.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/intel/iavf/iavf_virtchnl.c

index 93ca79c3e3b535d1a6f30316ae015b4de57f8fb4..4f2defd2331b173b9ae977c62c7bdd65d1eaa964 100644 (file)
@@ -2876,9 +2876,13 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
                spin_unlock_bh(&adapter->adv_rss_lock);
                }
                break;
+       case VIRTCHNL_OP_ADD_VLAN:
        case VIRTCHNL_OP_ADD_VLAN_V2: {
                struct iavf_vlan_filter *f;
 
+               if (v_retval)
+                       break;
+
                spin_lock_bh(&adapter->mac_vlan_list_lock);
                list_for_each_entry(f, &adapter->vlan_filter_list, list) {
                        if (f->state == IAVF_VLAN_ADDING)