From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 38F50A0093 for ; Wed, 9 Mar 2022 17:31:34 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 337084013F; Wed, 9 Mar 2022 17:31:34 +0100 (CET) Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) by mails.dpdk.org (Postfix) with ESMTP id 180024013F for ; Wed, 9 Mar 2022 17:31:32 +0100 (CET) Received: by mail-wr1-f42.google.com with SMTP id h15so3910948wrc.6 for ; Wed, 09 Mar 2022 08:31:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YfO0q9f1vuH8dfAv9wTDg7/tXmU3o49v+8idvk1UHIE=; b=od0Sk8DiYi73R6hFd0t8TRVycrKEG7ypAVT9XhtwigOVwOsKvodoVNC6LRs35xCkPw dAK01iivm0XuZaLez2C6ZdpfBjA4vObVmPsnZxn5XvmNdfH7FKE91ILoU/gKZpkMd1UV /WuZy9iPkw89kW4BpQKzKHyNg9GrD8nGsRL/Pq/ALg9MPg9lbJJpAeQkhF3dOeuLClhN wM82giPNtruKUd8qhz3bv6UwxQsNFnhNwN867fR0FckUjG0XpLQNQzFJ6dyVeJSgvz0i SaRcjBkDVbLHb2yN8KKlq7DVkXXI8zYT3pTRNzavUfXmRYgaxgr1QKvrKBchxxSOi6n2 FFfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YfO0q9f1vuH8dfAv9wTDg7/tXmU3o49v+8idvk1UHIE=; b=S3oxmTs+jrdBZtvoWeu4MESpbWTbN6qlGVQqlq7v4hfHUpeKAxN/ahWyFWzHAMrZky +P/8DLGUwXP2D/6cgP8lYBJOBow/9zy+BnJuQobVWPApfY2IsrPl1U7AkW7TNEG3isQ0 5425PhQWC8mutasa5fQM4LJ7xXpG9r9hSo1zynyHZ7h8vRs/um5kBPmDh8bNIyEN2vLV ITvYi6DIKI1tFyLlshaUyNaSTBOLhzqqLIpeNPoZIizasD6VDnSt23vzGjdL6zygXW8I 5ThkxXrC+Ipt/cJBmInAyW2zCaGSxaOD/Kftv+7JZA2xkTFJCZt9wZUIAKwj84E3UlWI u6cg== X-Gm-Message-State: AOAM531Vee89LwazykMmCsdTuXLaYiq3s9pej9D34YOYSJbldDlLnj4U Cbly5pCQfhBREpl8zt6XqoY= X-Google-Smtp-Source: ABdhPJxKKvoWqxmPp1KbP3so5cSv8lHUXtTs3MgyZXI718mjqt0b3b3HX0FQgF02yOCbBZzHpqW89A== X-Received: by 2002:adf:8067:0:b0:1ea:9c01:d8f3 with SMTP id 94-20020adf8067000000b001ea9c01d8f3mr350474wrk.556.1646843491742; Wed, 09 Mar 2022 08:31:31 -0800 (PST) Received: from localhost ([2a01:4b00:f41a:3600:360b:9754:2e3a:c344]) by smtp.gmail.com with ESMTPSA id a10-20020a7bc1ca000000b00389bc87db45sm2129495wmj.7.2022.03.09.08.31.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Mar 2022 08:31:31 -0800 (PST) From: luca.boccassi@gmail.com To: Dmitry Kozlyuk Cc: Viacheslav Ovsiienko , dpdk stable Subject: patch 'common/mlx5: add Netlink event helpers' has been queued to stable release 20.11.5 Date: Wed, 9 Mar 2022 16:30:28 +0000 Message-Id: <20220309163053.245754-12-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220309163053.245754-1-luca.boccassi@gmail.com> References: <20220218123931.1749595-1-luca.boccassi@gmail.com> <20220309163053.245754-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Hi, FYI, your patch has been queued to stable release 20.11.5 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 03/11/22. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Queued patches are on a temporary branch at: https://github.com/bluca/dpdk-stable This queued commit can be viewed at: https://github.com/bluca/dpdk-stable/commit/cd135f699c1f30f0ad5a2cee9438189e7dfa393c Thanks. Luca Boccassi --- >From cd135f699c1f30f0ad5a2cee9438189e7dfa393c Mon Sep 17 00:00:00 2001 From: Dmitry Kozlyuk Date: Tue, 1 Mar 2022 14:15:12 +0200 Subject: [PATCH] common/mlx5: add Netlink event helpers [ upstream commit be66461cba371c3138ce942eb9fe5657f9e9a446 ] Introduce mlx5_nl_read_events() to read Netlink events (technically, messages) from a socket that was configured to listen for them via a new mlx5_nl_init() parameter. Add mlx5_nl_parse_link_status_update() helper to extract information from link-related events. This patch is a shared base for later fixes. Signed-off-by: Dmitry Kozlyuk Reviewed-by: Viacheslav Ovsiienko --- drivers/common/mlx5/linux/mlx5_nl.c | 102 +++++++++++++++++++++++++- drivers/common/mlx5/linux/mlx5_nl.h | 8 +- drivers/common/mlx5/version.map | 2 + drivers/net/mlx5/linux/mlx5_os.c | 8 +- drivers/net/mlx5/linux/mlx5_vlan_os.c | 2 +- drivers/vdpa/mlx5/mlx5_vdpa.c | 2 +- 6 files changed, 116 insertions(+), 8 deletions(-) diff --git a/drivers/common/mlx5/linux/mlx5_nl.c b/drivers/common/mlx5/linux/mlx5_nl.c index 145e354b2c..9dbb7e909b 100644 --- a/drivers/common/mlx5/linux/mlx5_nl.c +++ b/drivers/common/mlx5/linux/mlx5_nl.c @@ -180,19 +180,22 @@ uint32_t atomic_sn; * * @param protocol * Netlink protocol (e.g. NETLINK_ROUTE, NETLINK_RDMA). + * @param groups + * Groups to listen (e.g. RTMGRP_LINK), can be 0. * * @return * A file descriptor on success, a negative errno value otherwise and * rte_errno is set. */ int -mlx5_nl_init(int protocol) +mlx5_nl_init(int protocol, int groups) { int fd; int buf_size; socklen_t opt_size; struct sockaddr_nl local = { .nl_family = AF_NETLINK, + .nl_groups = groups, }; int ret; @@ -1798,3 +1801,100 @@ mlx5_nl_enable_roce_set(int nlsk_fd, int family_id, const char *pci_addr, /* Now, need to reload the driver. */ return mlx5_nl_driver_reload(nlsk_fd, family_id, pci_addr); } + +/** + * Try to parse a Netlink message as a link status update. + * + * @param hdr + * Netlink message header. + * @param[out] ifindex + * Index of the updated interface. + * + * @return + * 0 on success, negative on failure. + */ +int +mlx5_nl_parse_link_status_update(struct nlmsghdr *hdr, uint32_t *ifindex) +{ + struct ifinfomsg *info; + + switch (hdr->nlmsg_type) { + case RTM_NEWLINK: + case RTM_DELLINK: + case RTM_GETLINK: + case RTM_SETLINK: + info = NLMSG_DATA(hdr); + *ifindex = info->ifi_index; + return 0; + } + return -1; +} + +/** + * Read pending events from a Netlink socket. + * + * @param nlsk_fd + * Netlink socket. + * @param cb + * Callback invoked for each of the events. + * @param cb_arg + * User data for the callback. + * + * @return + * 0 on success, including the case when there are no events. + * Negative on failure and rte_errno is set. + */ +int +mlx5_nl_read_events(int nlsk_fd, mlx5_nl_event_cb *cb, void *cb_arg) +{ + char buf[8192]; + struct sockaddr_nl addr; + struct iovec iov = { + .iov_base = buf, + .iov_len = sizeof(buf), + }; + struct msghdr msg = { + .msg_name = &addr, + .msg_namelen = sizeof(addr), + .msg_iov = &iov, + .msg_iovlen = 1, + }; + struct nlmsghdr *hdr; + ssize_t size; + + while (1) { + size = recvmsg(nlsk_fd, &msg, MSG_DONTWAIT); + if (size < 0) { + if (errno == EAGAIN) + return 0; + if (errno == EINTR) + continue; + DRV_LOG(DEBUG, "Failed to receive netlink message: %s", + strerror(errno)); + rte_errno = errno; + return -rte_errno; + } + hdr = (struct nlmsghdr *)buf; + while (size >= (ssize_t)sizeof(*hdr)) { + ssize_t msg_len = hdr->nlmsg_len; + ssize_t data_len = msg_len - sizeof(*hdr); + ssize_t aligned_len; + + if (data_len < 0) { + DRV_LOG(DEBUG, "Netlink message too short"); + rte_errno = EINVAL; + return -rte_errno; + } + aligned_len = NLMSG_ALIGN(msg_len); + if (aligned_len > size) { + DRV_LOG(DEBUG, "Netlink message too long"); + rte_errno = EINVAL; + return -rte_errno; + } + cb(hdr, cb_arg); + hdr = RTE_PTR_ADD(hdr, aligned_len); + size -= aligned_len; + } + } + return 0; +} diff --git a/drivers/common/mlx5/linux/mlx5_nl.h b/drivers/common/mlx5/linux/mlx5_nl.h index 15129ffdc8..05189e997a 100644 --- a/drivers/common/mlx5/linux/mlx5_nl.h +++ b/drivers/common/mlx5/linux/mlx5_nl.h @@ -11,6 +11,7 @@ #include "mlx5_common.h" +typedef void (mlx5_nl_event_cb)(struct nlmsghdr *hdr, void *user_data); /* VLAN netdev for VLAN workaround. */ struct mlx5_nl_vlan_dev { @@ -30,7 +31,7 @@ struct mlx5_nl_vlan_vmwa_context { }; __rte_internal -int mlx5_nl_init(int protocol); +int mlx5_nl_init(int protocol, int groups); __rte_internal int mlx5_nl_mac_addr_add(int nlsk_fd, unsigned int iface_idx, uint64_t *mac_own, struct rte_ether_addr *mac, uint32_t index); @@ -77,4 +78,9 @@ __rte_internal int mlx5_nl_enable_roce_set(int nlsk_fd, int family_id, const char *pci_addr, int enable); +__rte_internal +int mlx5_nl_read_events(int nlsk_fd, mlx5_nl_event_cb *cb, void *cb_arg); +__rte_internal +int mlx5_nl_parse_link_status_update(struct nlmsghdr *hdr, uint32_t *ifindex); + #endif /* RTE_PMD_MLX5_NL_H_ */ diff --git a/drivers/common/mlx5/version.map b/drivers/common/mlx5/version.map index 983714a82c..f5404da3de 100644 --- a/drivers/common/mlx5/version.map +++ b/drivers/common/mlx5/version.map @@ -82,8 +82,10 @@ INTERNAL { mlx5_nl_mac_addr_flush; mlx5_nl_mac_addr_remove; mlx5_nl_mac_addr_sync; + mlx5_nl_parse_link_status_update; mlx5_nl_portnum; mlx5_nl_promisc; + mlx5_nl_read_events; mlx5_nl_switch_info; mlx5_nl_vf_mac_addr_modify; mlx5_nl_vlan_vmwa_create; diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index aa66879d74..b3a5a8d3c7 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -1002,8 +1002,8 @@ err_secondary: priv->pci_dev = spawn->pci_dev; priv->mtu = RTE_ETHER_MTU; /* Some internal functions rely on Netlink sockets, open them now. */ - priv->nl_socket_rdma = mlx5_nl_init(NETLINK_RDMA); - priv->nl_socket_route = mlx5_nl_init(NETLINK_ROUTE); + priv->nl_socket_rdma = mlx5_nl_init(NETLINK_RDMA, 0); + priv->nl_socket_route = mlx5_nl_init(NETLINK_ROUTE, 0); priv->representor = !!switch_info->representor; priv->master = !!switch_info->master; priv->domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID; @@ -1877,8 +1877,8 @@ mlx5_os_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, * matching ones, gathering into the list. */ struct ibv_device *ibv_match[ret + 1]; - int nl_route = mlx5_nl_init(NETLINK_ROUTE); - int nl_rdma = mlx5_nl_init(NETLINK_RDMA); + int nl_route = mlx5_nl_init(NETLINK_ROUTE, 0); + int nl_rdma = mlx5_nl_init(NETLINK_RDMA, 0); unsigned int i; while (ret-- > 0) { diff --git a/drivers/net/mlx5/linux/mlx5_vlan_os.c b/drivers/net/mlx5/linux/mlx5_vlan_os.c index 40e895e080..598026c414 100644 --- a/drivers/net/mlx5/linux/mlx5_vlan_os.c +++ b/drivers/net/mlx5/linux/mlx5_vlan_os.c @@ -136,7 +136,7 @@ mlx5_vlan_vmwa_init(struct rte_eth_dev *dev, uint32_t ifindex) return NULL; } rte_spinlock_init(&vmwa->sl); - vmwa->nl_socket = mlx5_nl_init(NETLINK_ROUTE); + vmwa->nl_socket = mlx5_nl_init(NETLINK_ROUTE, 0); if (vmwa->nl_socket < 0) { DRV_LOG(WARNING, "Can not create Netlink socket" diff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c index 06e602e72a..6519b9c9ac 100644 --- a/drivers/vdpa/mlx5/mlx5_vdpa.c +++ b/drivers/vdpa/mlx5/mlx5_vdpa.c @@ -504,7 +504,7 @@ mlx5_vdpa_get_ib_device_match(struct rte_pci_addr *addr) static int mlx5_vdpa_nl_roce_disable(const char *addr) { - int nlsk_fd = mlx5_nl_init(NETLINK_GENERIC); + int nlsk_fd = mlx5_nl_init(NETLINK_GENERIC, 0); int devlink_id; int enable; int ret; -- 2.30.2 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2022-03-09 16:30:08.986098583 +0000 +++ 0012-common-mlx5-add-Netlink-event-helpers.patch 2022-03-09 16:30:08.515024438 +0000 @@ -1 +1 @@ -From be66461cba371c3138ce942eb9fe5657f9e9a446 Mon Sep 17 00:00:00 2001 +From cd135f699c1f30f0ad5a2cee9438189e7dfa393c Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit be66461cba371c3138ce942eb9fe5657f9e9a446 ] + @@ -13,2 +14,0 @@ -Cc: stable@dpdk.org - @@ -18,6 +18,6 @@ - drivers/common/mlx5/linux/mlx5_common_os.c | 2 +- - drivers/common/mlx5/linux/mlx5_nl.c | 102 ++++++++++++++++++++- - drivers/common/mlx5/linux/mlx5_nl.h | 8 +- - drivers/common/mlx5/version.map | 2 + - drivers/net/mlx5/linux/mlx5_os.c | 8 +- - drivers/net/mlx5/linux/mlx5_vlan_os.c | 2 +- + drivers/common/mlx5/linux/mlx5_nl.c | 102 +++++++++++++++++++++++++- + drivers/common/mlx5/linux/mlx5_nl.h | 8 +- + drivers/common/mlx5/version.map | 2 + + drivers/net/mlx5/linux/mlx5_os.c | 8 +- + drivers/net/mlx5/linux/mlx5_vlan_os.c | 2 +- + drivers/vdpa/mlx5/mlx5_vdpa.c | 2 +- @@ -26,13 +25,0 @@ -diff --git a/drivers/common/mlx5/linux/mlx5_common_os.c b/drivers/common/mlx5/linux/mlx5_common_os.c -index a3c25638da..030ceb561f 100644 ---- a/drivers/common/mlx5/linux/mlx5_common_os.c -+++ b/drivers/common/mlx5/linux/mlx5_common_os.c -@@ -590,7 +590,7 @@ mlx5_os_get_ibv_device(const struct rte_pci_addr *addr) - static int - mlx5_nl_roce_disable(const char *addr) - { -- int nlsk_fd = mlx5_nl_init(NETLINK_GENERIC); -+ int nlsk_fd = mlx5_nl_init(NETLINK_GENERIC, 0); - int devlink_id; - int enable; - int ret; @@ -40 +27 @@ -index fd4c2d2625..5d04857b38 100644 +index 145e354b2c..9dbb7e909b 100644 @@ -43 +30 @@ -@@ -185,19 +185,22 @@ uint32_t atomic_sn; +@@ -180,19 +180,22 @@ uint32_t atomic_sn; @@ -67 +54 @@ -@@ -1862,3 +1865,100 @@ mlx5_nl_enable_roce_set(int nlsk_fd, int family_id, const char *pci_addr, +@@ -1798,3 +1801,100 @@ mlx5_nl_enable_roce_set(int nlsk_fd, int family_id, const char *pci_addr, @@ -169 +156 @@ -index 2063c0deeb..0b7552338a 100644 +index 15129ffdc8..05189e997a 100644 @@ -189 +176 @@ -@@ -75,4 +76,9 @@ int mlx5_nl_enable_roce_get(int nlsk_fd, int family_id, const char *pci_addr, +@@ -77,4 +78,9 @@ __rte_internal @@ -200 +187 @@ -index cb20a7d893..a23a30a6c0 100644 +index 983714a82c..f5404da3de 100644 @@ -203,12 +190,11 @@ -@@ -127,9 +127,11 @@ INTERNAL { - mlx5_nl_mac_addr_flush; # WINDOWS_NO_EXPORT - mlx5_nl_mac_addr_remove; # WINDOWS_NO_EXPORT - mlx5_nl_mac_addr_sync; # WINDOWS_NO_EXPORT -+ mlx5_nl_parse_link_status_update; # WINDOWS_NO_EXPORT - mlx5_nl_port_state; # WINDOWS_NO_EXPORT - mlx5_nl_portnum; # WINDOWS_NO_EXPORT - mlx5_nl_promisc; # WINDOWS_NO_EXPORT -+ mlx5_nl_read_events; # WINDOWS_NO_EXPORT - mlx5_nl_switch_info; # WINDOWS_NO_EXPORT - mlx5_nl_vf_mac_addr_modify; # WINDOWS_NO_EXPORT - mlx5_nl_vlan_vmwa_create; # WINDOWS_NO_EXPORT +@@ -82,8 +82,10 @@ INTERNAL { + mlx5_nl_mac_addr_flush; + mlx5_nl_mac_addr_remove; + mlx5_nl_mac_addr_sync; ++ mlx5_nl_parse_link_status_update; + mlx5_nl_portnum; + mlx5_nl_promisc; ++ mlx5_nl_read_events; + mlx5_nl_switch_info; + mlx5_nl_vf_mac_addr_modify; + mlx5_nl_vlan_vmwa_create; @@ -216 +202 @@ -index be95095521..17e7144cc9 100644 +index aa66879d74..b3a5a8d3c7 100644 @@ -219,10 +205,2 @@ -@@ -1117,7 +1117,7 @@ err_secondary: - sh = mlx5_alloc_shared_dev_ctx(spawn, mkvlist); - if (!sh) - return NULL; -- nl_rdma = mlx5_nl_init(NETLINK_RDMA); -+ nl_rdma = mlx5_nl_init(NETLINK_RDMA, 0); - /* Check port status. */ - if (spawn->phys_port <= UINT8_MAX) { - /* Legacy Verbs api only support u8 port number. */ -@@ -1180,7 +1180,7 @@ err_secondary: +@@ -1002,8 +1002,8 @@ err_secondary: + priv->pci_dev = spawn->pci_dev; @@ -231 +209 @@ - priv->nl_socket_rdma = nl_rdma; +- priv->nl_socket_rdma = mlx5_nl_init(NETLINK_RDMA); @@ -232,0 +211 @@ ++ priv->nl_socket_rdma = mlx5_nl_init(NETLINK_RDMA, 0); @@ -237 +216 @@ -@@ -1927,8 +1927,8 @@ mlx5_os_pci_probe_pf(struct mlx5_common_device *cdev, +@@ -1877,8 +1877,8 @@ mlx5_os_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, @@ -249 +228 @@ -index 80ccd5a460..81611a8d3f 100644 +index 40e895e080..598026c414 100644 @@ -252 +231 @@ -@@ -135,7 +135,7 @@ mlx5_vlan_vmwa_init(struct rte_eth_dev *dev, uint32_t ifindex) +@@ -136,7 +136,7 @@ mlx5_vlan_vmwa_init(struct rte_eth_dev *dev, uint32_t ifindex) @@ -260,0 +240,13 @@ +diff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c +index 06e602e72a..6519b9c9ac 100644 +--- a/drivers/vdpa/mlx5/mlx5_vdpa.c ++++ b/drivers/vdpa/mlx5/mlx5_vdpa.c +@@ -504,7 +504,7 @@ mlx5_vdpa_get_ib_device_match(struct rte_pci_addr *addr) + static int + mlx5_vdpa_nl_roce_disable(const char *addr) + { +- int nlsk_fd = mlx5_nl_init(NETLINK_GENERIC); ++ int nlsk_fd = mlx5_nl_init(NETLINK_GENERIC, 0); + int devlink_id; + int enable; + int ret;