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 42841A00C2 for ; Tue, 8 Mar 2022 16:10:56 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3B3434069F; Tue, 8 Mar 2022 16:10:56 +0100 (CET) Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2063.outbound.protection.outlook.com [40.107.93.63]) by mails.dpdk.org (Postfix) with ESMTP id 07B4A40141 for ; Tue, 8 Mar 2022 16:10:54 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UsIagKDV6eORucPf/BbPalI9/Y9vW6jOC5R4N03J7vctb2AsMu+U8rNtxtlc8vXeF+vgiW+deWAW5dt75bpbauOjll/1yZ4gV+dygUFTIL5DUM2qbqdPckpqfwrblR1i0+BP+H28SRelr3TeW4m2oCEKV3EQShRzZo2+A/T94qzLf6cfcI3SkqS1/weR5txxKbfP7GZB/eKYJctn63Kqe6Iv69t8WToRGUQbkxr0dJnnrn3Opr0v9BzMqptSs379JOwrsnpvzZawBCSWIfg8HgMgYHocAWCnnuotVvQhTNRdNvmXJwzkr5Fw270C3qpCGi5KZoHsjurfT71suMxCJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=AjP50SrOhoSKUev/fimnKv0wqtQyOF6vzmOXfm2mfwc=; b=IvMHzitOPvy/oi3NzkBZcQ2wGuYJtSdsDAp5eAUj+rKP3bmhrcmOscEClFDvYOUVAwVfGBDTUq/HUBc2fS708McixaKOe/Aozm4xoqVL6vBH61M2lsQDneNqM+Qf3CPYe1Z/EReXPlQOvnJGuT42ovU54gGGDtmE7fYGOgcZ+D9gMOwqKswluWeG7EEWMwOpFkz5j8XK2blcJaxLrXAdIqvIulTSKvE1LPhqR/oRB9TceKf+JzWN5JJ06WiZ5X5vKoghtKo4HhK8PNiOw/paPuqelE7IwkTelmaXM6qnmXvRpYvYPDqxCcXfyVBXvkHZlb+NRIlSdJQ/rEQjOlTcKA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.236) smtp.rcpttodomain=redhat.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AjP50SrOhoSKUev/fimnKv0wqtQyOF6vzmOXfm2mfwc=; b=IBF+FUHWLwDnLcOVxy2YF8FMnVqbXMR/BdGAHVwRjXDva3/HnsKcO35TlRf4FAMFfeO8nfC0BY83tULVuQ7N74oaV3JZF8l7OiVw8DzZI0YOasYfKuHw4w/fP+0zunnPUuy3uCgKC36iG+tRvZ/LyjPFsbmqu7ZXbb+AujglJsvEWuOqJi2VE1tDoiZe4FfE0iGQQZIuJ8HmwfUD4YGNbpPXnL2nt8deR2hAkZvHuMdU4KJASI+8UuYiLH/uEDxv0d6WTK8dGx00JzeUHkYVijXRAwh6r8MUk4umVub8B6cqcRmR4Ulj2UauR9i5ZYxo8pd/VC9NLCclJ9yUAGKJjw== Received: from DM5PR04CA0052.namprd04.prod.outlook.com (2603:10b6:3:ef::14) by MN2PR12MB2864.namprd12.prod.outlook.com (2603:10b6:208:ac::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5038.15; Tue, 8 Mar 2022 15:10:51 +0000 Received: from DM6NAM11FT059.eop-nam11.prod.protection.outlook.com (2603:10b6:3:ef:cafe::32) by DM5PR04CA0052.outlook.office365.com (2603:10b6:3:ef::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5038.14 via Frontend Transport; Tue, 8 Mar 2022 15:10:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 12.22.5.236) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 12.22.5.236 as permitted sender) receiver=protection.outlook.com; client-ip=12.22.5.236; helo=mail.nvidia.com; Received: from mail.nvidia.com (12.22.5.236) by DM6NAM11FT059.mail.protection.outlook.com (10.13.172.92) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5038.14 via Frontend Transport; Tue, 8 Mar 2022 15:10:51 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by DRHQMAIL109.nvidia.com (10.27.9.19) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Tue, 8 Mar 2022 15:10:50 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.9; Tue, 8 Mar 2022 07:10:50 -0800 Received: from nvidia.com (10.127.8.11) by mail.nvidia.com (10.129.68.7) with Microsoft SMTP Server id 15.2.986.9 via Frontend Transport; Tue, 8 Mar 2022 07:10:48 -0800 From: Dmitry Kozlyuk To: CC: Kevin Traynor , Viacheslav Ovsiienko Subject: [PATCH 21.11 1/3] common/mlx5: add Netlink event helpers Date: Tue, 8 Mar 2022 17:10:42 +0200 Message-ID: <20220308151044.1012413-2-dkozlyuk@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220308151044.1012413-1-dkozlyuk@nvidia.com> References: <20220308151044.1012413-1-dkozlyuk@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: abe44798-106d-47ca-3cb9-08da0115d5b3 X-MS-TrafficTypeDiagnostic: MN2PR12MB2864:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ugzqxOtog1wNWcZbUlDhrJsuUa4OQjl/hxPr5BbAL/wSfogEH1KCVjVojw2hFGW8oRppUqWm8NOcgf6ThSPS4KuE1dthTp+IWwXpjg7EwqZSeDU3KzuRvFUlkmpbZDKAP+YMY3gYlAz/uNIs0d+AnMsWloTfXX2IlsCZZjz3qlDZhXslnIm2ThX5cnD1kblV2+XcyNmi5AvfdPgb5W44iIOrjvKl39zvFe4JrJobmn6Q5FDFjVVQH45USO4pdrHbmxBNx+CoNr3bF6mI7SnwAF3jlHM4jDr7Einj83I4H2dvmx0HSTIB01yBMErfiQE3raXImaKBuALQOInBlCaEP70SQJUsVmYVJhSyeVE/pVdnK3tMaZI6BHVJicbxzVzXLhvJlMXATpm8E/kwNZqUi15s7JcpMNCW3fy9fSecjqX2cNKPdyR5KuLqy30AAa8xYY1WWa+UpUV+JZ9zDMKn9boRRrSE0qrjJPKmoxyS2Koku/SKaKIxdAXkK2PJQTQ5KUFTEWw6qEEbyV8R8b8QHaTNymZxUSwCt9Iky3haN5/NfVBUxkkf/jj3oF47xP0rnhe4TaTxhnvpHYxbEvYUgAjkpOdIjxmgJL0l9DvcVSnyBr5jBPXzbdB3+BIUVRc64ellzlMhX0pJzlJEGTS0d6T73zkl0mLjrqYYOhkcSg0CzHXFt5WSc7cxvcjiJEIee2lz/d3KINuQmWoi/HAUbNThICbn0f6NfW2ULUUf16xPmQtsP6pIraRV/xoLKMxN X-Forefront-Antispam-Report: CIP:12.22.5.236; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:mail.nvidia.com; PTR:InfoNoRecords; CAT:NONE; SFS:(13230001)(4636009)(46966006)(36840700001)(40470700004)(8936002)(186003)(40460700003)(47076005)(55016003)(2616005)(6286002)(316002)(54906003)(7696005)(6916009)(36756003)(508600001)(5660300002)(6666004)(83380400001)(336012)(86362001)(426003)(70586007)(70206006)(26005)(82310400004)(1076003)(8676002)(107886003)(4326008)(36860700001)(81166007)(356005)(2906002)(36900700001)(309714004); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Mar 2022 15:10:51.6487 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: abe44798-106d-47ca-3cb9-08da0115d5b3 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[12.22.5.236]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DM6NAM11FT059.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB2864 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 [ 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_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 +- 6 files changed, 116 insertions(+), 8 deletions(-) diff --git a/drivers/common/mlx5/linux/mlx5_common_os.c b/drivers/common/mlx5/linux/mlx5_common_os.c index 0d3e24e04e..25e09bb55b 100644 --- a/drivers/common/mlx5/linux/mlx5_common_os.c +++ b/drivers/common/mlx5/linux/mlx5_common_os.c @@ -487,7 +487,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; diff --git a/drivers/common/mlx5/linux/mlx5_nl.c b/drivers/common/mlx5/linux/mlx5_nl.c index fd4c2d2625..5d04857b38 100644 --- a/drivers/common/mlx5/linux/mlx5_nl.c +++ b/drivers/common/mlx5/linux/mlx5_nl.c @@ -185,19 +185,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; @@ -1862,3 +1865,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 2063c0deeb..0b7552338a 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); @@ -75,4 +76,9 @@ int mlx5_nl_enable_roce_get(int nlsk_fd, int family_id, const char *pci_addr, 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 34e86004a0..618c1bf27a 100644 --- a/drivers/common/mlx5/version.map +++ b/drivers/common/mlx5/version.map @@ -123,9 +123,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 diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index f587a47f6e..540cf5d708 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -1086,7 +1086,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, " old OFED/rdma-core version or firmware configuration"); #endif config->mpls_en = mpls_en; - 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. */ @@ -1133,7 +1133,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, priv->mtu = RTE_ETHER_MTU; /* Some internal functions rely on Netlink sockets, open them now. */ priv->nl_socket_rdma = nl_rdma; - priv->nl_socket_route = mlx5_nl_init(NETLINK_ROUTE); + 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; @@ -2137,8 +2137,8 @@ mlx5_os_pci_probe_pf(struct mlx5_common_device *cdev, * 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 005904bdfe..7ee2460a23 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" -- 2.25.1