All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paul Menzel <pmenzel@molgen.mpg.de>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [PATCH net] ice: don't remove netdev->dev_addr from uc sync list
Date: Thu, 5 Aug 2021 08:51:07 +0200	[thread overview]
Message-ID: <5a641af5-e3fc-3b7c-6ddd-ef25e3f4a1ad@molgen.mpg.de> (raw)
In-Reply-To: <20210728203457.325482-1-brett.creeley@intel.com>

Dear Brett,


Am 28.07.21 um 22:34 schrieb Brett Creeley:
> 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.
> 
> Fix this by making sure to not delete the netdev->dev_addr during
> MAC address sync.

Is it easy to reproduce?

> 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.
> 
> Also, change the netdev_warn() to netdev_dbg() when the device is
> already using the requested mac in .set_mac. The dev_warn() was causing
> a lot of unnecessary noise when configuring/unconfiguring bridging and
> provides no benefit.
> 
> Lastly, instead of using memcpy() to save the netdev->dev_addr, use
> ether_addr_copy() in .set_mac.

It?d be great, if you split the three items out into separate patches, 
and submit it in a patch series.


Kind regards,

Paul


> Fixes: e94d44786693 ("ice: Implement filter sync, NDO operations and bump version")
> Signed-off-by: Brett Creeley <brett.creeley@intel.com>
> ---
>   drivers/net/ethernet/intel/ice/ice_main.c | 25 +++++++++++++++--------
>   1 file changed, 16 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
> index ef8d1815af56..259d73e353bb 100644
> --- a/drivers/net/ethernet/intel/ice/ice_main.c
> +++ b/drivers/net/ethernet/intel/ice/ice_main.c
> @@ -191,6 +191,14 @@ static int ice_add_mac_to_unsync_list(struct net_device *netdev, const u8 *addr)
>   	struct ice_netdev_priv *np = netdev_priv(netdev);
>   	struct ice_vsi *vsi = np->vsi;
>   
> +	/* Under some circumstances, we might receive a request to delete our
> +	 * own device address from our uc list. Because we store the device
> +	 * address in the VSI's MAC filter list, we need to ignore such
> +	 * requests and not delete our device address from this list.
> +	 */
> +	if (ether_addr_equal(addr, netdev->dev_addr))
> +		return 0;
> +
>   	if (ice_fltr_add_mac_to_list(vsi, &vsi->tmp_unsync_list, addr,
>   				     ICE_FWD_TO_VSI))
>   		return -EINVAL;
> @@ -5119,7 +5127,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);
>   		return 0;
>   	}
>   
> @@ -5130,6 +5138,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) {
> @@ -5139,30 +5148,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
>   		 * possible in some cases (e.g. bonding) that dev_addr was
>   		 * modified outside of the driver and needs to be restored back
>   		 * to this value.
>   		 */
> -		memcpy(netdev->dev_addr, mac, netdev->addr_len);
>   		netdev_dbg(netdev, "filter for MAC %pM already exists\n", mac);
> -		return 0;
> -	}
> -
> -	/* error if the new filter addition failed */
> -	if (status)
> +	else if (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);
>   		return err;
>   	}
>   
>   	/* change the netdev's MAC address */
> -	memcpy(netdev->dev_addr, mac, netdev->addr_len);
> +	ether_addr_copy(netdev->dev_addr, mac);
> +	netif_addr_unlock_bh(netdev);
>   	netdev_dbg(vsi->netdev, "updated MAC address to %pM\n",
>   		   netdev->dev_addr);
>   
> 

  parent reply	other threads:[~2021-08-05  6:51 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-28 20:34 [Intel-wired-lan] [PATCH net] ice: don't remove netdev->dev_addr from uc sync list Brett Creeley
2021-08-05  6:45 ` G, GurucharanX
2021-08-05  6:51 ` Paul Menzel [this message]
2021-08-05 18:30   ` Creeley, Brett
2021-08-05 18:56     ` Paul Menzel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5a641af5-e3fc-3b7c-6ddd-ef25e3f4a1ad@molgen.mpg.de \
    --to=pmenzel@molgen.mpg.de \
    --cc=intel-wired-lan@osuosl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.