mirror_ubuntu-kernels/drivers/net/ethernet/intel
Jacob Keller f9264dd687 ice: fix ice_remove_rule_internal vsi_list handling
When adding multiple VLANs to the same VSI, the ice_add_vlan code will
share the VSI list, so as not to create multiple unnecessary VSI lists.

Consider the following flow

  ice_add_vlan(hw, <VSI 0 VID 7, VSI 0 VID 8, VSI 0 VID 9>)

Where we add three VLAN filters for VIDs 7, 8, and 9, all for VSI 0.

The ice_add_vlan will create a single vsi_list and share it among all
the filters.

Later, if we try to remove a VLAN,

  ice_remove_vlan(hw, <VSI 0 VID 7>)

Then the removal code will update the vsi_list and remove VSI 0 from it.
But, since the vsi_list is shared, this breaks the list for the other
users who reference it. We actually even free the VSI list memory, and
may result in segmentation faults.

This is due to the way that VLAN rule share VSI lists with reference
counts, and is caused because we call ice_rem_update_vsi_list even when
the ref_cnt is greater than one.

To fix this, handle the case where ref_cnt is greater than one
separately. In this case, we need to remove the associated rule without
modifying the vsi_list, since it is currently being referenced by
another rule. Instead, we just need to decrement the VSI list ref_cnt.

The case for handling sharing of VSI lists with multiple VSIs is not
currently supported by this code. No such rules will be created today,
and this code will require changes if/when such code is added.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
2019-02-25 08:56:01 -08:00
..
e1000 cross-tree: phase out dma_zalloc_coherent() 2019-01-08 07:58:37 -05:00
e1000e e1000e: Fix -Wformat-truncation warnings 2019-02-23 13:44:57 -08:00
fm10k fm10k: use struct_size() in kzalloc() 2019-02-08 22:57:28 -08:00
i40e Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2019-02-24 12:06:19 -08:00
iavf flow_offload: add flow_rule and flow_match structures and use them 2019-02-06 10:38:25 -08:00
ice ice: fix ice_remove_rule_internal vsi_list handling 2019-02-25 08:56:01 -08:00
igb igb: use struct_size() helper 2019-02-08 23:03:48 -08:00
igbvf ethernet/intel: consolidate NAPI and NAPI exit 2018-11-21 10:35:23 -08:00
igc igc: Use struct_size() helper 2019-02-08 23:03:48 -08:00
ixgb cross-tree: phase out dma_zalloc_coherent() 2019-01-08 07:58:37 -05:00
ixgbe Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2019-02-24 12:06:19 -08:00
ixgbevf xfrm: prefer secpath_set over secpath_dup 2018-12-19 11:21:38 -08:00
e100.c e100: Fix passing zero to 'PTR_ERR' warning in e100_load_ucode_wait 2018-12-20 11:54:27 -08:00
Kconfig ixgbe: fix Kconfig when driver is not a module 2019-01-04 14:02:16 -08:00
Makefile igc: Add skeletal frame for Intel(R) 2.5G Ethernet Controller support 2018-10-17 12:14:54 -07:00