From: Tony Nguyen <anthony.l.nguyen@intel.com> Date: 2021-08-09 17:10:45
This series contains updates to ice and iavf drivers.
Ani prevents the ice driver from accidentally being probed to a virtual
function and stops processing of VF messages when VFs are being torn
down.
Brett prevents the ice driver from deleting is own MAC address.
Fahad ensures the RSS LUT and key are always set following reset for
iavf.
The following are changes since commit d09c548dbf3b31cb07bba562e0f452edfa01efe3:
net: sched: act_mirred: Reset ct info when mirror/redirect skb
and are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue 100GbE
Anirudh Venkataramanan (2):
ice: Prevent probing virtual functions
ice: Stop processing VF messages during teardown
Brett Creeley (1):
ice: don't remove netdev->dev_addr from uc sync list
Md Fahad Iqbal Polash (1):
iavf: Set RSS LUT and key in reset handle path
drivers/net/ethernet/intel/iavf/iavf_main.c | 13 +++++----
drivers/net/ethernet/intel/ice/ice.h | 1 +
drivers/net/ethernet/intel/ice/ice_main.c | 28 +++++++++++++------
.../net/ethernet/intel/ice/ice_virtchnl_pf.c | 7 +++++
4 files changed, 36 insertions(+), 13 deletions(-)
--
2.26.2
From: Tony Nguyen <anthony.l.nguyen@intel.com> Date: 2021-08-09 17:10:46
From: Anirudh Venkataramanan <redacted>
The userspace utility "driverctl" can be used to change/override the
system's default driver choices. This is useful in some situations
(buggy driver, old driver missing a device ID, trying a workaround,
etc.) where the user needs to load a different driver.
However, this is also prone to user error, where a driver is mapped
to a device it's not designed to drive. For example, if the ice driver
is mapped to driver iavf devices, the ice driver crashes.
Add a check to return an error if the ice driver is being used to
probe a virtual function.
Fixes: 837f08fdecbe ("ice: Add basic driver framework for Intel(R) E800 Series")
Signed-off-by: Anirudh Venkataramanan <redacted>
Tested-by: Gurucharan G <redacted>
Tested-by: Konrad Jankowski <redacted>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/ice/ice_main.c | 5 +++++
1 file changed, 5 insertions(+)
From: Tony Nguyen <anthony.l.nguyen@intel.com> Date: 2021-08-09 17:10:47
From: Anirudh Venkataramanan <redacted>
When VFs are setup and torn down in quick succession, it is possible
that a VF is torn down by the PF while the VF's virtchnl requests are
still in the PF's mailbox ring. Processing the VF's virtchnl request
when the VF itself doesn't exist results in undefined behavior. Fix
this by adding a check to stop processing virtchnl requests when VF
teardown is in progress.
Fixes: ddf30f7ff840 ("ice: Add handler to configure SR-IOV")
Signed-off-by: Anirudh Venkataramanan <redacted>
Tested-by: Konrad Jankowski <redacted>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/ice/ice.h | 1 +
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | 7 +++++++
2 files changed, 8 insertions(+)
From: Tony Nguyen <anthony.l.nguyen@intel.com> Date: 2021-08-09 17:10:48
From: Brett Creeley <redacted>
In some circumstances, such as with bridging, it's possible that the
stack will add the device's own MAC address to its unicast address list.
If, later, the stack deletes this address, the driver will receive a
request to remove this address.
The driver stores its current MAC address as part of the VSI MAC filter
list instead of separately. So, this causes a problem when the device's
MAC address is deleted unexpectedly, which results in traffic failure in
some cases.
The following configuration steps will reproduce the previously
mentioned problem:
ip link set eth0 up
ip link add dev br0 type bridge
ip link set br0 up
ip addr flush dev eth0
ip link set eth0 master br0
echo 1 > /sys/class/net/br0/bridge/vlan_filtering
modprobe -r veth
modprobe -r bridge
ip addr add 192.168.1.100/24 dev eth0
The following ping command fails due to the netdev->dev_addr being
deleted when removing the bridge module.
ping <link partner>
Fix this by making sure to not delete the netdev->dev_addr during MAC
address sync. After fixing this issue it was noticed that the
netdev_warn() in .set_mac was overly verbose, so make it at
netdev_dbg().
Also, there is a possibility of a race condition between .set_mac and
.set_rx_mode. Fix this by calling netif_addr_lock_bh() and
netif_addr_unlock_bh() on the device's netdev when the netdev->dev_addr
is going to be updated in .set_mac.
Fixes: e94d44786693 ("ice: Implement filter sync, NDO operations and bump version")
Signed-off-by: Brett Creeley <redacted>
Tested-by: Liang Li <redacted>
Tested-by: Gurucharan G <redacted>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/ice/ice_main.c | 23 +++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
@@ -191,6 +191,14 @@ static int ice_add_mac_to_unsync_list(struct net_device *netdev, const u8 *addr)structice_netdev_priv*np=netdev_priv(netdev);structice_vsi*vsi=np->vsi;+/* Under some circumstances, we might receive a request to delete our+*owndeviceaddressfromouruclist.Becausewestorethedevice+*addressintheVSI'sMACfilterlist,weneedtoignoresuch+*requestsandnotdeleteourdeviceaddressfromthislist.+*/+if(ether_addr_equal(addr,netdev->dev_addr))+return0;+if(ice_fltr_add_mac_to_list(vsi,&vsi->tmp_unsync_list,addr,ICE_FWD_TO_VSI))return-EINVAL;
@@ -5124,7 +5132,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)return-EADDRNOTAVAIL;if(ether_addr_equal(netdev->dev_addr,mac)){-netdev_warn(netdev,"already using mac %pM\n",mac);+netdev_dbg(netdev,"already using mac %pM\n",mac);return0;}
@@ -5135,6 +5143,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)return-EBUSY;}+netif_addr_lock_bh(netdev);/* Clean up old MAC filter. Not an error if old filter doesn't exist */status=ice_fltr_remove_mac(vsi,netdev->dev_addr,ICE_FWD_TO_VSI);if(status&&status!=ICE_ERR_DOES_NOT_EXIST){
@@ -5144,30 +5153,28 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)/* Add filter for new MAC. If filter exists, return success */status=ice_fltr_add_mac(vsi,mac,ICE_FWD_TO_VSI);-if(status==ICE_ERR_ALREADY_EXISTS){+if(status==ICE_ERR_ALREADY_EXISTS)/* Although this MAC filter is already present in hardware it's*possibleinsomecases(e.g.bonding)thatdev_addrwas*modifiedoutsideofthedriverandneedstoberestoredback*tothisvalue.*/-memcpy(netdev->dev_addr,mac,netdev->addr_len);netdev_dbg(netdev,"filter for MAC %pM already exists\n",mac);-return0;-}--/* error if the new filter addition failed */-if(status)+elseif(status)+/* error if the new filter addition failed */err=-EADDRNOTAVAIL;err_update_filters:if(err){netdev_err(netdev,"can't set MAC %pM. filter update failed\n",mac);+netif_addr_unlock_bh(netdev);returnerr;}/* change the netdev's MAC address */memcpy(netdev->dev_addr,mac,netdev->addr_len);+netif_addr_unlock_bh(netdev);netdev_dbg(vsi->netdev,"updated MAC address to %pM\n",netdev->dev_addr);
From: Tony Nguyen <anthony.l.nguyen@intel.com> Date: 2021-08-09 17:10:50
From: Md Fahad Iqbal Polash <redacted>
iavf driver should set RSS LUT and key unconditionally in reset
path. Currently, the driver does not do that. This patch fixes
this issue.
Fixes: 2c86ac3c7079 ("i40evf: create a generic config RSS function")
Signed-off-by: Md Fahad Iqbal Polash <redacted>
Tested-by: Konrad Jankowski <redacted>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/iavf/iavf_main.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-08-09 22:56:19
On Mon, 9 Aug 2021 10:13:59 -0700 Tony Nguyen wrote:
The userspace utility "driverctl" can be used to change/override the
system's default driver choices. This is useful in some situations
(buggy driver, old driver missing a device ID, trying a workaround,
etc.) where the user needs to load a different driver.
However, this is also prone to user error, where a driver is mapped
to a device it's not designed to drive. For example, if the ice driver
is mapped to driver iavf devices, the ice driver crashes.
Add a check to return an error if the ice driver is being used to
probe a virtual function.
This seems too selective. Also drivers should not trust the HW is sane
and crash the kernel. Please fix the crashes and fail probe gracefully
in all cases without resorting to duct tape.
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-08-09 22:58:40
On Mon, 9 Aug 2021 10:14:00 -0700 Tony Nguyen wrote:
When VFs are setup and torn down in quick succession, it is possible
that a VF is torn down by the PF while the VF's virtchnl requests are
still in the PF's mailbox ring. Processing the VF's virtchnl request
when the VF itself doesn't exist results in undefined behavior. Fix
this by adding a check to stop processing virtchnl requests when VF
teardown is in progress.
What is "undefined behavior" in this context? Please improve the commit
message. It should describe misbehavior visible to the user, failing
that what will happen from kernel/device perspective. Or state that it's
just a "fix" to align with some internal driver <> firmware spec...
From: Jonathan Toppins <hidden> Date: 2021-08-10 14:29:20
On 8/9/21 1:14 PM, Tony Nguyen wrote:
From: Brett Creeley <redacted>
In some circumstances, such as with bridging, it's possible that the
stack will add the device's own MAC address to its unicast address list.
If, later, the stack deletes this address, the driver will receive a
request to remove this address.
The driver stores its current MAC address as part of the VSI MAC filter
list instead of separately. So, this causes a problem when the device's
MAC address is deleted unexpectedly, which results in traffic failure in
some cases.
The following configuration steps will reproduce the previously
mentioned problem:
quoted
ip link set eth0 up
ip link add dev br0 type bridge
ip link set br0 up
ip addr flush dev eth0
ip link set eth0 master br0
echo 1 > /sys/class/net/br0/bridge/vlan_filtering
modprobe -r veth
modprobe -r bridge
ip addr add 192.168.1.100/24 dev eth0
The following ping command fails due to the netdev->dev_addr being
deleted when removing the bridge module.
quoted
ping <link partner>
Fix this by making sure to not delete the netdev->dev_addr during MAC
address sync. After fixing this issue it was noticed that the
netdev_warn() in .set_mac was overly verbose, so make it at
netdev_dbg().
Also, there is a possibility of a race condition between .set_mac and
.set_rx_mode. Fix this by calling netif_addr_lock_bh() and
netif_addr_unlock_bh() on the device's netdev when the netdev->dev_addr
is going to be updated in .set_mac.
Fixes: e94d44786693 ("ice: Implement filter sync, NDO operations and bump version")
Signed-off-by: Brett Creeley <redacted>
Tested-by: Liang Li <redacted>
Tested-by: Gurucharan G <redacted>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
From: Jonathan Toppins <hidden> Date: 2021-08-10 14:30:57
On 8/9/21 1:14 PM, Tony Nguyen wrote:
From: Anirudh Venkataramanan <redacted>
When VFs are setup and torn down in quick succession, it is possible
that a VF is torn down by the PF while the VF's virtchnl requests are
still in the PF's mailbox ring. Processing the VF's virtchnl request
when the VF itself doesn't exist results in undefined behavior. Fix
this by adding a check to stop processing virtchnl requests when VF
teardown is in progress.
Fixes: ddf30f7ff840 ("ice: Add handler to configure SR-IOV")
Signed-off-by: Anirudh Venkataramanan <redacted>
Tested-by: Konrad Jankowski <redacted>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Assuming only the commit message is fixed up.
Tested-by: Jonathan Toppins <redacted>
On Mon, 2021-08-09 at 15:58 -0700, Jakub Kicinski wrote:
On Mon, 9 Aug 2021 10:14:00 -0700 Tony Nguyen wrote:
quoted
When VFs are setup and torn down in quick succession, it is
possible
that a VF is torn down by the PF while the VF's virtchnl requests
are
still in the PF's mailbox ring. Processing the VF's virtchnl
request
when the VF itself doesn't exist results in undefined behavior. Fix
this by adding a check to stop processing virtchnl requests when VF
teardown is in progress.
What is "undefined behavior" in this context? Please improve the
commit
message. It should describe misbehavior visible to the user, failing
that what will happen from kernel/device perspective. Or state that
it's
just a "fix" to align with some internal driver <> firmware spec...
Three different call traces were reported, and that's the reason I
chose to say "undefined behavior" which I suppose isn't very helpful.
Will update the commit message to include more details.
Ani