All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
To: Karthik Sundaravel <ksundara@redhat.com>
Cc: pmenzel@molgen.mpg.de, aharivel@redhat.com, jiri@resnulli.us,
	cfontain@redhat.com, intel-wired-lan@lists.osuosl.org,
	jesse.brandeburg@intel.com, linux-kernel@vger.kernel.org,
	edumazet@google.com, anthony.l.nguyen@intel.com,
	vchundur@redhat.com, netdev@vger.kernel.org,
	jacob.e.keller@intel.com, kuba@kernel.org, rjarry@redhat.com,
	pabeni@redhat.com, davem@davemloft.net
Subject: Re: [Intel-wired-lan] [PATCH v3] ice: Add get/set hw address for VFs using devlink commands
Date: Tue, 13 Feb 2024 13:50:59 +0100	[thread overview]
Message-ID: <ZctlswYbV1RHU2ip@mev-dev> (raw)
In-Reply-To: <20240209100912.82473-1-ksundara@redhat.com>

On Fri, Feb 09, 2024 at 03:39:12PM +0530, Karthik Sundaravel wrote:
> Changing the MAC address of the VFs are not available
> via devlink. Add the function handlers to set and get
> the HW address for the VFs.
> 
> Signed-off-by: Karthik Sundaravel <ksundara@redhat.com>
> ---
>  drivers/net/ethernet/intel/ice/ice_devlink.c | 86 +++++++++++++++++++-
>  1 file changed, 85 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c
> index 80dc5445b50d..7ed61b10312c 100644
> --- a/drivers/net/ethernet/intel/ice/ice_devlink.c
> +++ b/drivers/net/ethernet/intel/ice/ice_devlink.c
> @@ -1576,6 +1576,89 @@ void ice_devlink_destroy_pf_port(struct ice_pf *pf)
>  	devlink_port_unregister(&pf->devlink_port);
>  }
>  
> +/**
> + * ice_devlink_port_get_vf_mac_address - .port_fn_hw_addr_get devlink handler
> + * @port: devlink port structure
> + * @hw_addr: MAC address of the port
> + * @hw_addr_len: length of MAC address
> + * @extack: extended netdev ack structure
> + *
> + * Callback for the devlink .port_fn_hw_addr_get operation
> + * Return: zero on success or an error code on failure.
> + */
> +
> +static int ice_devlink_port_get_vf_mac_address(struct devlink_port *port,
> +					       u8 *hw_addr, int *hw_addr_len,
> +					       struct netlink_ext_ack *extack)
> +{
> +	struct devlink_port_attrs *attrs = &port->attrs;
> +	struct devlink_port_pci_vf_attrs *pci_vf;
> +	struct devlink *devlink = port->devlink;
> +	struct ice_pf *pf;
> +	struct ice_vf *vf;
> +	int vf_id;
> +
> +	pf = devlink_priv(devlink);
> +	if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_VF) {
> +		pci_vf = &attrs->pci_vf;
> +		vf_id = pci_vf->vf;
> +	} else {
> +		NL_SET_ERR_MSG_MOD(extack, "Unable to get the vf id");
> +		return -EADDRNOTAVAIL;
> +	}
> +	vf = ice_get_vf_by_id(pf, vf_id);
You need to call ice_put_vf(vf); when you finish with vf.

This way to get vf pointer is fine, I wonder if it can be done using
container_of on port variable. Jake, what do you think?
CC: Jacob Keller

> +	if (!vf) {
> +		NL_SET_ERR_MSG_MOD(extack, "Unable to get the vf");
> +		return -EINVAL;
> +	}
> +	ether_addr_copy(hw_addr, vf->dev_lan_addr);
> +	*hw_addr_len = ETH_ALEN;
> +	return 0;
> +}
> +
> +/**
> + * ice_devlink_port_set_vf_mac_address - .port_fn_hw_addr_set devlink handler
> + * @port: devlink port structure
> + * @hw_addr: MAC address of the port
> + * @hw_addr_len: length of MAC address
> + * @extack: extended netdev ack structure
> + *
> + * Callback for the devlink .port_fn_hw_addr_set operation
> + * Return: zero on success or an error code on failure.
> + */
> +static int ice_devlink_port_set_vf_mac_address(struct devlink_port *port,
> +					       const u8 *hw_addr,
> +					       int hw_addr_len,
> +					       struct netlink_ext_ack *extack)
> +{
> +	struct net_device *netdev = port->type_eth.netdev;
Is it PF netdev?

> +	struct devlink_port_attrs *attrs = &port->attrs;
> +	struct devlink_port_pci_vf_attrs *pci_vf;
> +	u8 mac[ETH_ALEN];
> +	int vf_id;
> +
> +	if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_VF) {
> +		pci_vf = &attrs->pci_vf;
> +		vf_id = pci_vf->vf;
> +	} else {
> +		NL_SET_ERR_MSG_MOD(extack, "Unable to get the vf id");
> +		return -EADDRNOTAVAIL;
> +	}
> +
> +	if (!netdev) {
> +		NL_SET_ERR_MSG_MOD(extack, "Unable to get the netdev");
> +		return -EADDRNOTAVAIL;
> +	}
> +	ether_addr_copy(mac, hw_addr);
> +
> +	return ice_set_vf_mac(netdev, vf_id, mac);
> +}
> +
> +static const struct devlink_port_ops ice_devlink_vf_port_ops = {
> +	.port_fn_hw_addr_get = ice_devlink_port_get_vf_mac_address,
> +	.port_fn_hw_addr_set = ice_devlink_port_set_vf_mac_address,
> +};
> +
>  /**
>   * ice_devlink_create_vf_port - Create a devlink port for this VF
>   * @vf: the VF to create a port for
> @@ -1611,7 +1694,8 @@ int ice_devlink_create_vf_port(struct ice_vf *vf)
>  	devlink_port_attrs_set(devlink_port, &attrs);
>  	devlink = priv_to_devlink(pf);
>  
> -	err = devlink_port_register(devlink, devlink_port, vsi->idx);
> +	err = devlink_port_register_with_ops(devlink, devlink_port,
> +					     vsi->idx, &ice_devlink_vf_port_ops);
>  	if (err) {
>  		dev_err(dev, "Failed to create devlink port for VF %d, error %d\n",
>  			vf->vf_id, err);
> -- 
> 2.39.3 (Apple Git-145)
> 

WARNING: multiple messages have this Message-ID (diff)
From: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
To: Karthik Sundaravel <ksundara@redhat.com>
Cc: jesse.brandeburg@intel.com, anthony.l.nguyen@intel.com,
	davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
	pabeni@redhat.com, intel-wired-lan@lists.osuosl.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	pmenzel@molgen.mpg.de, jiri@resnulli.us, rjarry@redhat.com,
	aharivel@redhat.com, vchundur@redhat.com, cfontain@redhat.com,
	jacob.e.keller@intel.com
Subject: Re: [PATCH v3] ice: Add get/set hw address for VFs using devlink commands
Date: Tue, 13 Feb 2024 13:50:59 +0100	[thread overview]
Message-ID: <ZctlswYbV1RHU2ip@mev-dev> (raw)
In-Reply-To: <20240209100912.82473-1-ksundara@redhat.com>

On Fri, Feb 09, 2024 at 03:39:12PM +0530, Karthik Sundaravel wrote:
> Changing the MAC address of the VFs are not available
> via devlink. Add the function handlers to set and get
> the HW address for the VFs.
> 
> Signed-off-by: Karthik Sundaravel <ksundara@redhat.com>
> ---
>  drivers/net/ethernet/intel/ice/ice_devlink.c | 86 +++++++++++++++++++-
>  1 file changed, 85 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c
> index 80dc5445b50d..7ed61b10312c 100644
> --- a/drivers/net/ethernet/intel/ice/ice_devlink.c
> +++ b/drivers/net/ethernet/intel/ice/ice_devlink.c
> @@ -1576,6 +1576,89 @@ void ice_devlink_destroy_pf_port(struct ice_pf *pf)
>  	devlink_port_unregister(&pf->devlink_port);
>  }
>  
> +/**
> + * ice_devlink_port_get_vf_mac_address - .port_fn_hw_addr_get devlink handler
> + * @port: devlink port structure
> + * @hw_addr: MAC address of the port
> + * @hw_addr_len: length of MAC address
> + * @extack: extended netdev ack structure
> + *
> + * Callback for the devlink .port_fn_hw_addr_get operation
> + * Return: zero on success or an error code on failure.
> + */
> +
> +static int ice_devlink_port_get_vf_mac_address(struct devlink_port *port,
> +					       u8 *hw_addr, int *hw_addr_len,
> +					       struct netlink_ext_ack *extack)
> +{
> +	struct devlink_port_attrs *attrs = &port->attrs;
> +	struct devlink_port_pci_vf_attrs *pci_vf;
> +	struct devlink *devlink = port->devlink;
> +	struct ice_pf *pf;
> +	struct ice_vf *vf;
> +	int vf_id;
> +
> +	pf = devlink_priv(devlink);
> +	if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_VF) {
> +		pci_vf = &attrs->pci_vf;
> +		vf_id = pci_vf->vf;
> +	} else {
> +		NL_SET_ERR_MSG_MOD(extack, "Unable to get the vf id");
> +		return -EADDRNOTAVAIL;
> +	}
> +	vf = ice_get_vf_by_id(pf, vf_id);
You need to call ice_put_vf(vf); when you finish with vf.

This way to get vf pointer is fine, I wonder if it can be done using
container_of on port variable. Jake, what do you think?
CC: Jacob Keller

> +	if (!vf) {
> +		NL_SET_ERR_MSG_MOD(extack, "Unable to get the vf");
> +		return -EINVAL;
> +	}
> +	ether_addr_copy(hw_addr, vf->dev_lan_addr);
> +	*hw_addr_len = ETH_ALEN;
> +	return 0;
> +}
> +
> +/**
> + * ice_devlink_port_set_vf_mac_address - .port_fn_hw_addr_set devlink handler
> + * @port: devlink port structure
> + * @hw_addr: MAC address of the port
> + * @hw_addr_len: length of MAC address
> + * @extack: extended netdev ack structure
> + *
> + * Callback for the devlink .port_fn_hw_addr_set operation
> + * Return: zero on success or an error code on failure.
> + */
> +static int ice_devlink_port_set_vf_mac_address(struct devlink_port *port,
> +					       const u8 *hw_addr,
> +					       int hw_addr_len,
> +					       struct netlink_ext_ack *extack)
> +{
> +	struct net_device *netdev = port->type_eth.netdev;
Is it PF netdev?

> +	struct devlink_port_attrs *attrs = &port->attrs;
> +	struct devlink_port_pci_vf_attrs *pci_vf;
> +	u8 mac[ETH_ALEN];
> +	int vf_id;
> +
> +	if (attrs->flavour == DEVLINK_PORT_FLAVOUR_PCI_VF) {
> +		pci_vf = &attrs->pci_vf;
> +		vf_id = pci_vf->vf;
> +	} else {
> +		NL_SET_ERR_MSG_MOD(extack, "Unable to get the vf id");
> +		return -EADDRNOTAVAIL;
> +	}
> +
> +	if (!netdev) {
> +		NL_SET_ERR_MSG_MOD(extack, "Unable to get the netdev");
> +		return -EADDRNOTAVAIL;
> +	}
> +	ether_addr_copy(mac, hw_addr);
> +
> +	return ice_set_vf_mac(netdev, vf_id, mac);
> +}
> +
> +static const struct devlink_port_ops ice_devlink_vf_port_ops = {
> +	.port_fn_hw_addr_get = ice_devlink_port_get_vf_mac_address,
> +	.port_fn_hw_addr_set = ice_devlink_port_set_vf_mac_address,
> +};
> +
>  /**
>   * ice_devlink_create_vf_port - Create a devlink port for this VF
>   * @vf: the VF to create a port for
> @@ -1611,7 +1694,8 @@ int ice_devlink_create_vf_port(struct ice_vf *vf)
>  	devlink_port_attrs_set(devlink_port, &attrs);
>  	devlink = priv_to_devlink(pf);
>  
> -	err = devlink_port_register(devlink, devlink_port, vsi->idx);
> +	err = devlink_port_register_with_ops(devlink, devlink_port,
> +					     vsi->idx, &ice_devlink_vf_port_ops);
>  	if (err) {
>  		dev_err(dev, "Failed to create devlink port for VF %d, error %d\n",
>  			vf->vf_id, err);
> -- 
> 2.39.3 (Apple Git-145)
> 

  reply	other threads:[~2024-02-13 12:51 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-09 10:09 [Intel-wired-lan] [PATCH v3] ice: Add get/set hw address for VFs using devlink commands Karthik Sundaravel
2024-02-09 10:09 ` Karthik Sundaravel
2024-02-13 12:50 ` Michal Swiatkowski [this message]
2024-02-13 12:50   ` Michal Swiatkowski
2024-02-24 11:48   ` [Intel-wired-lan] " Karthik Sundaravel
2024-02-24 11:52   ` Karthik Sundaravel
2024-02-24 11:52     ` Karthik Sundaravel

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=ZctlswYbV1RHU2ip@mev-dev \
    --to=michal.swiatkowski@linux.intel.com \
    --cc=aharivel@redhat.com \
    --cc=anthony.l.nguyen@intel.com \
    --cc=cfontain@redhat.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=intel-wired-lan@lists.osuosl.org \
    --cc=jacob.e.keller@intel.com \
    --cc=jesse.brandeburg@intel.com \
    --cc=jiri@resnulli.us \
    --cc=ksundara@redhat.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=pmenzel@molgen.mpg.de \
    --cc=rjarry@redhat.com \
    --cc=vchundur@redhat.com \
    /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.