[dpdk-stable] [PATCH v2][20.11] common/mlx5: fix physical port name recognition
Xueming(Steven) Li
xuemingl at nvidia.com
Wed Nov 3 12:09:47 CET 2021
On Wed, 2021-11-03 at 11:18 +0200, Viacheslav Ovsiienko wrote:
> From: Xueming Li <xuemingl at nvidia.com>
>
> [ upstream commit 59df97f1a832a0edfd7f77ffbe5149e553e860b5 ]
>
> While device probing mlx5 PMD get the physical port name
> and checks against the set of patterns. If there is no
> any pattern match, the driver assumes the port belongs
> to PF device, this behaviour provides compatibility with
> legacy kernel drivers (before and early SR-IOV support).
>
> The newer kernels added the PCI subfunction support and
> representor names with pattern like pf0sf1. This pattern
> was not recognized by PMD and the first found subfunction
> representor was considered as master device.
>
> This patch supports representor name parsing for SF,
> and SF representors are just ignored by PMD (as there is
> no support for SF in 20.11-LTS release).
>
> Signed-off-by: Xueming Li <xuemingl at nvidia.com>
> Acked-by: Viacheslav Ovsiienko <viacheslavo at nvidia.com>
> ---
> drivers/common/mlx5/linux/mlx5_common_os.c | 32 +++++++++++++++-------
> drivers/common/mlx5/linux/mlx5_nl.c | 3 ++
> drivers/common/mlx5/mlx5_common.h | 2 ++
> drivers/net/mlx5/linux/mlx5_ethdev_os.c | 3 ++
> 4 files changed, 30 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/common/mlx5/linux/mlx5_common_os.c b/drivers/common/mlx5/linux/mlx5_common_os.c
> index 0edd78ea6d..5cf9576921 100644
> --- a/drivers/common/mlx5/linux/mlx5_common_os.c
> +++ b/drivers/common/mlx5/linux/mlx5_common_os.c
> @@ -97,22 +97,34 @@ void
> mlx5_translate_port_name(const char *port_name_in,
> struct mlx5_switch_info *port_info_out)
> {
> - char pf_c1, pf_c2, vf_c1, vf_c2, eol;
> + char ctrl = 0, pf_c1, pf_c2, vf_c1, vf_c2, eol;
> char *end;
> int sc_items;
>
> - /*
> - * Check for port-name as a string of the form pf0vf0
> - * (support kernel ver >= 5.0 or OFED ver >= 4.6).
> - */
> + sc_items = sscanf(port_name_in, "%c%d",
> + &ctrl, &port_info_out->ctrl_num);
> + if (sc_items == 2 && ctrl == 'c') {
> + port_name_in++; /* 'c' */
> + port_name_in += snprintf(NULL, 0, "%d",
> + port_info_out->ctrl_num);
> + }
> + /* Check for port-name as a string of the form pf0vf0 or pf0sf0 */
> sc_items = sscanf(port_name_in, "%c%c%d%c%c%d%c",
> &pf_c1, &pf_c2, &port_info_out->pf_num,
> &vf_c1, &vf_c2, &port_info_out->port_name, &eol);
> - if (sc_items == 6 &&
> - pf_c1 == 'p' && pf_c2 == 'f' &&
> - vf_c1 == 'v' && vf_c2 == 'f') {
> - port_info_out->name_type = MLX5_PHYS_PORT_NAME_TYPE_PFVF;
> - return;
> + if (sc_items == 6 && pf_c1 == 'p' && pf_c2 == 'f') {
> + if (vf_c1 == 'v' && vf_c2 == 'f') {
> + /* Kernel ver >= 5.0 or OFED ver >= 4.6 */
> + port_info_out->name_type =
> + MLX5_PHYS_PORT_NAME_TYPE_PFVF;
> + return;
> + }
> + if (vf_c1 == 's' && vf_c2 == 'f') {
> + /* Kernel ver >= 5.11 or OFED ver >= 5.1 */
> + port_info_out->name_type =
> + MLX5_PHYS_PORT_NAME_TYPE_PFSF;
> + return;
> + }
> }
> /*
> * Check for port-name as a string of the form p0
> diff --git a/drivers/common/mlx5/linux/mlx5_nl.c b/drivers/common/mlx5/linux/mlx5_nl.c
> index 1f765dca07..145e354b2c 100644
> --- a/drivers/common/mlx5/linux/mlx5_nl.c
> +++ b/drivers/common/mlx5/linux/mlx5_nl.c
> @@ -789,6 +789,7 @@ mlx5_nl_mac_addr_sync(int nlsk_fd, unsigned int iface_idx,
> int i;
> int ret;
>
> + memset(macs, 0, n * sizeof(macs[0]));
> ret = mlx5_nl_mac_addr_list(nlsk_fd, iface_idx, &macs, &macs_n);
> if (ret)
> return;
> @@ -1201,6 +1202,8 @@ mlx5_nl_check_switch_info(bool num_vf_set,
> case MLX5_PHYS_PORT_NAME_TYPE_PFHPF:
> /* Fallthrough */
> case MLX5_PHYS_PORT_NAME_TYPE_PFVF:
> + /* Fallthrough */
> + case MLX5_PHYS_PORT_NAME_TYPE_PFSF:
> /* New representors naming schema. */
> switch_info->representor = 1;
> break;
> diff --git a/drivers/common/mlx5/mlx5_common.h b/drivers/common/mlx5/mlx5_common.h
> index a484b74b9c..4c75addd08 100644
> --- a/drivers/common/mlx5/mlx5_common.h
> +++ b/drivers/common/mlx5/mlx5_common.h
> @@ -153,6 +153,7 @@ enum mlx5_nl_phys_port_name_type {
> MLX5_PHYS_PORT_NAME_TYPE_UPLINK, /* p0, kernel ver >= 5.0 */
> MLX5_PHYS_PORT_NAME_TYPE_PFVF, /* pf0vf0, kernel ver >= 5.0 */
> MLX5_PHYS_PORT_NAME_TYPE_PFHPF, /* pf0, kernel ver >= 5.7, HPF rep */
> + MLX5_PHYS_PORT_NAME_TYPE_PFSF, /* pf0sf0, kernel ver >= 5.0 */
> MLX5_PHYS_PORT_NAME_TYPE_UNKNOWN, /* Unrecognized. */
> };
>
> @@ -161,6 +162,7 @@ struct mlx5_switch_info {
> uint32_t master:1; /**< Master device. */
> uint32_t representor:1; /**< Representor device. */
> enum mlx5_nl_phys_port_name_type name_type; /** < Port name type. */
> + int32_t ctrl_num; /**< Controller number (valid for c#pf#vf# format). */
> int32_t pf_num; /**< PF number (valid for pfxvfx format only). */
> int32_t port_name; /**< Representor port name. */
> uint64_t switch_id; /**< Switch identifier. */
> diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
> index f641cb936e..08b51b7dc8 100644
> --- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c
> +++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
> @@ -1013,6 +1013,9 @@ mlx5_sysfs_check_switch_info(bool device_dir,
> /* New representors naming schema. */
> switch_info->representor = 1;
> break;
> + default:
> + switch_info->master = device_dir;
> + break;
> }
> }
>
Thanks for upate! add LTS version to subject.
More information about the stable
mailing list