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.coque...@redhat.com> > Sent: Thursday, June 18, 2020 7:07 PM > To: Matan Azrad <ma...@mellanox.com>; Slava Ovsiienko > <viachesl...@mellanox.com> > Cc: dev@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 <ma...@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; > >