[dpdk-dev] [PATCH 1/2] common/mlx5: share kernel interface name getter

Matan Azrad matan at mellanox.com
Thu Jun 18 20:28:31 CEST 2020


Yes, more conflict are exists with current master-net-mlx.
I have newest version rebased on master-net-mlx.

I will send new version, for all the old versions...

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin at redhat.com>
> Sent: Thursday, June 18, 2020 7:07 PM
> To: Matan Azrad <matan at mellanox.com>; Slava Ovsiienko
> <viacheslavo at mellanox.com>
> Cc: dev at dpdk.org
> Subject: Re: [PATCH 1/2] common/mlx5: share kernel interface name getter
> 
> Your series does not apply, there are no common ancestor so I can't do 3-
> way merge.
> 
> Could you please rebase it on top of next-virtio's master branch?
> 
> Thanks,
> Maxime
> 
> On 6/2/20 5:53 PM, Matan Azrad wrote:
> > Some configuration of the mlx5 port are done by the kernel net device
> > associated to the IB device represents the PCI device.
> >
> > The DPDK mlx5 driver uses linux system calls, for example ioctl, in
> > order to configure per port configurations requested by the DPDK user.
> >
> > One of the basic knowledges required to access the correct kernel net
> > device is its name.
> >
> > Move function to get interface name from IB device path to the common
> > library.
> >
> > Signed-off-by: Matan Azrad <matan at mellanox.com>
> > ---
> >  drivers/common/mlx5/mlx5_common.c               | 88
> ++++++++++++++++++++++++
> >  drivers/common/mlx5/mlx5_common.h               |  3 +
> >  drivers/common/mlx5/rte_common_mlx5_version.map |  2 +
> >  drivers/net/mlx5/mlx5.c                         |  2 +-
> >  drivers/net/mlx5/mlx5.h                         |  1 -
> >  drivers/net/mlx5/mlx5_ethdev.c                  | 90 +------------------------
> >  6 files changed, 96 insertions(+), 90 deletions(-)
> >
> > diff --git a/drivers/common/mlx5/mlx5_common.c
> > b/drivers/common/mlx5/mlx5_common.c
> > index 1c77763..3f0d8d3 100644
> > --- a/drivers/common/mlx5/mlx5_common.c
> > +++ b/drivers/common/mlx5/mlx5_common.c
> > @@ -8,8 +8,10 @@
> >  #ifdef RTE_IBVERBS_LINK_DLOPEN
> >  #include <dlfcn.h>
> >  #endif
> > +#include <dirent.h>
> >
> >  #include <rte_errno.h>
> > +#include <rte_string_fns.h>
> >
> >  #include "mlx5_common.h"
> >  #include "mlx5_common_utils.h"
> > @@ -167,6 +169,92 @@ enum mlx5_class
> >  	return;
> >  }
> >
> > +/**
> > + * Get kernel interface name from IB device path.
> > + *
> > + * @param[in] ibdev_path
> > + *   Pointer to IB device path.
> > + * @param[out] ifname
> > + *   Interface name output buffer.
> > + *
> > + * @return
> > + *   0 on success, a negative errno value otherwise and rte_errno is set.
> > + */
> > +int
> > +mlx5_get_ifname_sysfs(const char *ibdev_path, char
> > +(*ifname)[IF_NAMESIZE]) {
> > +	DIR *dir;
> > +	struct dirent *dent;
> > +	unsigned int dev_type = 0;
> > +	unsigned int dev_port_prev = ~0u;
> > +	char match[IF_NAMESIZE] = "";
> > +
> > +	MLX5_ASSERT(ibdev_path);
> > +	{
> > +		MKSTR(path, "%s/device/net", ibdev_path);
> > +
> > +		dir = opendir(path);
> > +		if (dir == NULL) {
> > +			rte_errno = errno;
> > +			return -rte_errno;
> > +		}
> > +	}
> > +	while ((dent = readdir(dir)) != NULL) {
> > +		char *name = dent->d_name;
> > +		FILE *file;
> > +		unsigned int dev_port;
> > +		int r;
> > +
> > +		if ((name[0] == '.') &&
> > +		    ((name[1] == '\0') ||
> > +		     ((name[1] == '.') && (name[2] == '\0'))))
> > +			continue;
> > +
> > +		MKSTR(path, "%s/device/net/%s/%s",
> > +		      ibdev_path, name,
> > +		      (dev_type ? "dev_id" : "dev_port"));
> > +
> > +		file = fopen(path, "rb");
> > +		if (file == NULL) {
> > +			if (errno != ENOENT)
> > +				continue;
> > +			/*
> > +			 * Switch to dev_id when dev_port does not exist as
> > +			 * is the case with Linux kernel versions < 3.15.
> > +			 */
> > +try_dev_id:
> > +			match[0] = '\0';
> > +			if (dev_type)
> > +				break;
> > +			dev_type = 1;
> > +			dev_port_prev = ~0u;
> > +			rewinddir(dir);
> > +			continue;
> > +		}
> > +		r = fscanf(file, (dev_type ? "%x" : "%u"), &dev_port);
> > +		fclose(file);
> > +		if (r != 1)
> > +			continue;
> > +		/*
> > +		 * Switch to dev_id when dev_port returns the same value
> for
> > +		 * all ports. May happen when using a MOFED release older
> than
> > +		 * 3.0 with a Linux kernel >= 3.15.
> > +		 */
> > +		if (dev_port == dev_port_prev)
> > +			goto try_dev_id;
> > +		dev_port_prev = dev_port;
> > +		if (dev_port == 0)
> > +			strlcpy(match, name, sizeof(match));
> > +	}
> > +	closedir(dir);
> > +	if (match[0] == '\0') {
> > +		rte_errno = ENOENT;
> > +		return -rte_errno;
> > +	}
> > +	strncpy(*ifname, match, sizeof(*ifname));
> > +	return 0;
> > +}
> > +
> >  #ifdef MLX5_GLUE
> >
> >  /**
> > diff --git a/drivers/common/mlx5/mlx5_common.h
> > b/drivers/common/mlx5/mlx5_common.h
> > index 8cd3ea5..4f6373b 100644
> > --- a/drivers/common/mlx5/mlx5_common.h
> > +++ b/drivers/common/mlx5/mlx5_common.h
> > @@ -6,6 +6,7 @@
> >  #define RTE_PMD_MLX5_COMMON_H_
> >
> >  #include <stdio.h>
> > +#include <net/if.h>
> >
> >  #include <rte_pci.h>
> >  #include <rte_debug.h>
> > @@ -212,6 +213,8 @@ enum mlx5_class {
> >  __rte_internal
> >  void mlx5_translate_port_name(const char *port_name_in,
> >  			      struct mlx5_switch_info *port_info_out);
> > +__rte_internal
> > +int mlx5_get_ifname_sysfs(const char *ibdev_path, char
> > +(*ifname)[IF_NAMESIZE]);
> >
> >  extern uint8_t haswell_broadwell_cpu;
> >
> > diff --git a/drivers/common/mlx5/rte_common_mlx5_version.map
> > b/drivers/common/mlx5/rte_common_mlx5_version.map
> > index b3410df..a62584d 100644
> > --- a/drivers/common/mlx5/rte_common_mlx5_version.map
> > +++ b/drivers/common/mlx5/rte_common_mlx5_version.map
> > @@ -33,6 +33,8 @@ INTERNAL {
> >  	mlx5_devx_cmd_query_virtq;
> >  	mlx5_devx_get_out_command_status;
> >
> > +	mlx5_get_ifname_sysfs;
> > +
> >  	mlx5_mp_init_primary;
> >  	mlx5_mp_uninit_primary;
> >  	mlx5_mp_init_secondary;
> > diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index
> > 469ff73..91af47b 100644
> > --- a/drivers/net/mlx5/mlx5.c
> > +++ b/drivers/net/mlx5/mlx5.c
> > @@ -3570,7 +3570,7 @@ struct mlx5_flow_id_pool *
> >  					 */
> >  					continue;
> >  				}
> > -				ret = mlx5_get_master_ifname
> > +				ret = mlx5_get_ifname_sysfs
> >  					(ibv_match[i]->ibdev_path,
> &ifname);
> >  				if (!ret)
> >  					list[ns].ifindex =
> > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index
> > 2908c8b..536afae 100644
> > --- a/drivers/net/mlx5/mlx5.h
> > +++ b/drivers/net/mlx5/mlx5.h
> > @@ -645,7 +645,6 @@ int mlx5_udp_tunnel_port_add(struct rte_eth_dev
> > *dev,
> >  /* mlx5_ethdev.c */
> >
> >  int mlx5_get_ifname(const struct rte_eth_dev *dev, char
> > (*ifname)[IF_NAMESIZE]); -int mlx5_get_master_ifname(const char
> > *ibdev_path, char (*ifname)[IF_NAMESIZE]);  unsigned int
> > mlx5_ifindex(const struct rte_eth_dev *dev);  int mlx5_ifreq(const
> > struct rte_eth_dev *dev, int req, struct ifreq *ifr);  int
> > mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu); diff --git
> > a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> > index b837ce6..62344d1 100644
> > --- a/drivers/net/mlx5/mlx5_ethdev.c
> > +++ b/drivers/net/mlx5/mlx5_ethdev.c
> > @@ -129,95 +129,9 @@ struct ethtool_link_settings {  #endif
> >
> >  /**
> > - * Get master interface name from private structure.
> > - *
> > - * @param[in] dev
> > - *   Pointer to Ethernet device.
> > - * @param[out] ifname
> > - *   Interface name output buffer.
> > - *
> > - * @return
> > - *   0 on success, a negative errno value otherwise and rte_errno is set.
> > - */
> > -int
> > -mlx5_get_master_ifname(const char *ibdev_path, char
> > (*ifname)[IF_NAMESIZE]) -{
> > -	DIR *dir;
> > -	struct dirent *dent;
> > -	unsigned int dev_type = 0;
> > -	unsigned int dev_port_prev = ~0u;
> > -	char match[IF_NAMESIZE] = "";
> > -
> > -	MLX5_ASSERT(ibdev_path);
> > -	{
> > -		MKSTR(path, "%s/device/net", ibdev_path);
> > -
> > -		dir = opendir(path);
> > -		if (dir == NULL) {
> > -			rte_errno = errno;
> > -			return -rte_errno;
> > -		}
> > -	}
> > -	while ((dent = readdir(dir)) != NULL) {
> > -		char *name = dent->d_name;
> > -		FILE *file;
> > -		unsigned int dev_port;
> > -		int r;
> > -
> > -		if ((name[0] == '.') &&
> > -		    ((name[1] == '\0') ||
> > -		     ((name[1] == '.') && (name[2] == '\0'))))
> > -			continue;
> > -
> > -		MKSTR(path, "%s/device/net/%s/%s",
> > -		      ibdev_path, name,
> > -		      (dev_type ? "dev_id" : "dev_port"));
> > -
> > -		file = fopen(path, "rb");
> > -		if (file == NULL) {
> > -			if (errno != ENOENT)
> > -				continue;
> > -			/*
> > -			 * Switch to dev_id when dev_port does not exist as
> > -			 * is the case with Linux kernel versions < 3.15.
> > -			 */
> > -try_dev_id:
> > -			match[0] = '\0';
> > -			if (dev_type)
> > -				break;
> > -			dev_type = 1;
> > -			dev_port_prev = ~0u;
> > -			rewinddir(dir);
> > -			continue;
> > -		}
> > -		r = fscanf(file, (dev_type ? "%x" : "%u"), &dev_port);
> > -		fclose(file);
> > -		if (r != 1)
> > -			continue;
> > -		/*
> > -		 * Switch to dev_id when dev_port returns the same value
> for
> > -		 * all ports. May happen when using a MOFED release older
> than
> > -		 * 3.0 with a Linux kernel >= 3.15.
> > -		 */
> > -		if (dev_port == dev_port_prev)
> > -			goto try_dev_id;
> > -		dev_port_prev = dev_port;
> > -		if (dev_port == 0)
> > -			strlcpy(match, name, sizeof(match));
> > -	}
> > -	closedir(dir);
> > -	if (match[0] == '\0') {
> > -		rte_errno = ENOENT;
> > -		return -rte_errno;
> > -	}
> > -	strncpy(*ifname, match, sizeof(*ifname));
> > -	return 0;
> > -}
> > -
> > -/**
> >   * Get interface name from private structure.
> >   *
> > - * This is a port representor-aware version of mlx5_get_master_ifname().
> > + * This is a port representor-aware version of mlx5_get_ifname_sysfs().
> >   *
> >   * @param[in] dev
> >   *   Pointer to Ethernet device.
> > @@ -238,7 +152,7 @@ struct ethtool_link_settings {
> >  	ifindex = mlx5_ifindex(dev);
> >  	if (!ifindex) {
> >  		if (!priv->representor)
> > -			return mlx5_get_master_ifname(priv->sh-
> >ibdev_path,
> > +			return mlx5_get_ifname_sysfs(priv->sh-
> >ibdev_path,
> >  						      ifname);
> >  		rte_errno = ENXIO;
> >  		return -rte_errno;
> >



More information about the dev mailing list