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 29698A0C47 for ; Tue, 10 Aug 2021 17:43:15 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1E4E04114F; Tue, 10 Aug 2021 17:43:15 +0200 (CEST) Received: from smtp-relay-canonical-0.canonical.com (smtp-relay-canonical-0.canonical.com [185.125.188.120]) by mails.dpdk.org (Postfix) with ESMTP id 54FAE411C6 for ; Tue, 10 Aug 2021 17:43:13 +0200 (CEST) Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-canonical-0.canonical.com (Postfix) with ESMTPS id 38BDE3F0A4 for ; Tue, 10 Aug 2021 15:43:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1628610193; bh=h7poAc99fpE4kDM7BQfH0qvw70AzDecsndkCSOp3cBM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=wXgYw57mnAqmBQJajhAWRU16ovBuzeuRzqf/hROlgPHOFtr19UVzKeZ0qba9Exp3W sh9JehtXKJ1Fv1zTXv8TpEjEtsZDAoqeM4iaw2EQVC3QkJSyncFId2baLu7pbkiBIb zm3OaCqc+cWQSaWzFelxsH/dzXhG6mNFmqfifJ8HVsBuDgjTL/AyI3i9UCCtnih7wv L9LQZLmUaQShpKLWzbMCs+K8hgM/N0DQkxedgq7exCT1fvl3/kvuZXGS4OgLYPEToU OgaF8V+VQHspQDHNXQ901RUbLTqhldZZ3+Ui3SEG8OfoRE4ubOp/XvHAmcedONvfy+ XgAD5H8zPUoIw== Received: by mail-ed1-f70.google.com with SMTP id y39-20020a50bb2a0000b02903bc05daccbaso10943315ede.5 for ; Tue, 10 Aug 2021 08:43:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=h7poAc99fpE4kDM7BQfH0qvw70AzDecsndkCSOp3cBM=; b=BaJtU/wKuJ2KfM13qRe8K3K0x89L9a/ndvDZX1v5IKu0GtdPQ5ZpqrasuJLh6L7Rhs dLi8fDpfAlT685B/9NKdLjK1C90VE7ZzLO+XgQ8hcNNeZTiP/4e8wBYClV8+Eld9+PpV APDL9K+vK52Y+a/QOQ9NyhVILdswGsck099M3kYIvO/kl7cg2/3UvGo8xxajGXol28m+ rzPUQDHTF1GFo3W7/duASPOmQJNZXWJzdI//fbp4SNyL+T7iJBS9WJ9LJdDrnQkLwi5W gj5PIG4DbdV/IC/CXgFgFq+6DH+2gTgW3jW+1bZSBo88vtjyQg69POb+qupqt8Y+Zu7+ BENQ== X-Gm-Message-State: AOAM530kbJlrnfoh56CADQN5Q9GmnhRpyKYh0skv7Y4xI2tAAdBOgI3N TzRXXby2WDhdvzFF1fTRaH+XOERN5oFye/SIqyZAKGS5cArmGpaZ18y6r7QId6AXTsMPU+5hyiw WhaSN5Zp2bCGPNh8iGaNat5pB X-Received: by 2002:aa7:c306:: with SMTP id l6mr5601380edq.383.1628610192889; Tue, 10 Aug 2021 08:43:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzubVJIcqfxGlexcVg5cHd9B1M0UGR35IXHQ85n/pnfNMmCOo6tcPdGLxh8N+2Bus5Ce0749Q== X-Received: by 2002:aa7:c306:: with SMTP id l6mr5601367edq.383.1628610192699; Tue, 10 Aug 2021 08:43:12 -0700 (PDT) Received: from Keschdeichel.fritz.box ([2001:67c:1560:8007::aac:c4ad]) by smtp.gmail.com with ESMTPSA id lk14sm7034740ejb.9.2021.08.10.08.43.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Aug 2021 08:43:12 -0700 (PDT) From: christian.ehrhardt@canonical.com To: Viacheslav Ovsiienko Cc: dpdk stable Date: Tue, 10 Aug 2021 17:39:34 +0200 Message-Id: <20210810154022.749358-54-christian.ehrhardt@canonical.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210810154022.749358-1-christian.ehrhardt@canonical.com> References: <20210810154022.749358-1-christian.ehrhardt@canonical.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'common/mlx5: fix Netlink receive message buffer size' has been queued to stable release 19.11.10 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 Sender: "stable" Hi, FYI, your patch has been queued to stable release 19.11.10 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 08/12/21. 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/cpaelzer/dpdk-stable-queue This queued commit can be viewed at: https://github.com/cpaelzer/dpdk-stable-queue/commit/6af6af1640a7cd555e22dea6f12f497b82bb0761 Thanks. Christian Ehrhardt --- >From 6af6af1640a7cd555e22dea6f12f497b82bb0761 Mon Sep 17 00:00:00 2001 From: Viacheslav Ovsiienko Date: Thu, 1 Jul 2021 10:31:33 +0300 Subject: [PATCH] common/mlx5: fix Netlink receive message buffer size [ upstream commit 32d1e4dbadba4bc3523d8b354458a4b979e5c2e6 ] If there are many VFs the Netlink message length sent by kernel in reply to RTM_GETLINK request can be large. We should query the size of message being received in advance and allocate the large enough buffer to handle these large messages. Fixes: ccdcba53a3f4 ("net/mlx5: use Netlink to add/remove MAC addresses") Signed-off-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5_nl.c | 69 ++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/drivers/net/mlx5/mlx5_nl.c b/drivers/net/mlx5/mlx5_nl.c index 668affb0b1..8d5478d9f5 100644 --- a/drivers/net/mlx5/mlx5_nl.c +++ b/drivers/net/mlx5/mlx5_nl.c @@ -128,8 +128,8 @@ int mlx5_nl_init(int protocol) { int fd; - int sndbuf_size = MLX5_SEND_BUF_SIZE; - int rcvbuf_size = MLX5_RECV_BUF_SIZE; + int buf_size; + socklen_t opt_size; struct sockaddr_nl local = { .nl_family = AF_NETLINK, }; @@ -140,16 +140,36 @@ mlx5_nl_init(int protocol) rte_errno = errno; return -rte_errno; } - ret = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sndbuf_size, sizeof(int)); + opt_size = sizeof(buf_size); + ret = getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buf_size, &opt_size); if (ret == -1) { rte_errno = errno; goto error; } - ret = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf_size, sizeof(int)); + DRV_LOG(DEBUG, "Netlink socket send buffer: %d", buf_size); + if (buf_size < MLX5_SEND_BUF_SIZE) { + ret = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, + &buf_size, sizeof(buf_size)); + if (ret == -1) { + rte_errno = errno; + goto error; + } + } + opt_size = sizeof(buf_size); + ret = getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buf_size, &opt_size); if (ret == -1) { rte_errno = errno; goto error; } + DRV_LOG(DEBUG, "Netlink socket recv buffer: %d", buf_size); + if (buf_size < MLX5_RECV_BUF_SIZE) { + ret = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, + &buf_size, sizeof(buf_size)); + if (ret == -1) { + rte_errno = errno; + goto error; + } + } ret = bind(fd, (struct sockaddr *)&local, sizeof(local)); if (ret == -1) { rte_errno = errno; @@ -271,11 +291,7 @@ mlx5_nl_recv(int nlsk_fd, uint32_t sn, int (*cb)(struct nlmsghdr *, void *arg), void *arg) { struct sockaddr_nl sa; - void *buf = malloc(MLX5_RECV_BUF_SIZE); - struct iovec iov = { - .iov_base = buf, - .iov_len = MLX5_RECV_BUF_SIZE, - }; + struct iovec iov; struct msghdr msg = { .msg_name = &sa, .msg_namelen = sizeof(sa), @@ -283,18 +299,43 @@ mlx5_nl_recv(int nlsk_fd, uint32_t sn, int (*cb)(struct nlmsghdr *, void *arg), /* One message at a time */ .msg_iovlen = 1, }; + void *buf = NULL; int multipart = 0; int ret = 0; - if (!buf) { - rte_errno = ENOMEM; - return -rte_errno; - } do { struct nlmsghdr *nh; - int recv_bytes = 0; + int recv_bytes; do { + /* Query length of incoming message. */ + iov.iov_base = NULL; + iov.iov_len = 0; + recv_bytes = recvmsg(nlsk_fd, &msg, + MSG_PEEK | MSG_TRUNC); + if (recv_bytes < 0) { + rte_errno = errno; + ret = -rte_errno; + goto exit; + } + if (recv_bytes == 0) { + rte_errno = ENODATA; + ret = -rte_errno; + goto exit; + } + /* Allocate buffer to fetch the message. */ + if (recv_bytes < MLX5_RECV_BUF_SIZE) + recv_bytes = MLX5_RECV_BUF_SIZE; + mlx5_free(buf); + buf = mlx5_malloc(0, recv_bytes, 0, SOCKET_ID_ANY); + if (!buf) { + rte_errno = ENOMEM; + ret = -rte_errno; + goto exit; + } + /* Fetch the message. */ + iov.iov_base = buf; + iov.iov_len = recv_bytes; recv_bytes = recvmsg(nlsk_fd, &msg, 0); if (recv_bytes == -1) { rte_errno = errno; -- 2.32.0 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2021-08-10 15:11:15.121954386 +0200 +++ 0054-common-mlx5-fix-Netlink-receive-message-buffer-size.patch 2021-08-10 15:11:13.038638243 +0200 @@ -1 +1 @@ -From 32d1e4dbadba4bc3523d8b354458a4b979e5c2e6 Mon Sep 17 00:00:00 2001 +From 6af6af1640a7cd555e22dea6f12f497b82bb0761 Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit 32d1e4dbadba4bc3523d8b354458a4b979e5c2e6 ] + @@ -12 +13,0 @@ -Cc: stable@dpdk.org @@ -16 +17 @@ - drivers/common/mlx5/linux/mlx5_nl.c | 69 +++++++++++++++++++++++------ + drivers/net/mlx5/mlx5_nl.c | 69 ++++++++++++++++++++++++++++++-------- @@ -19,5 +20,5 @@ -diff --git a/drivers/common/mlx5/linux/mlx5_nl.c b/drivers/common/mlx5/linux/mlx5_nl.c -index 3f1912d078..dc8dafd0a8 100644 ---- a/drivers/common/mlx5/linux/mlx5_nl.c -+++ b/drivers/common/mlx5/linux/mlx5_nl.c -@@ -189,8 +189,8 @@ int +diff --git a/drivers/net/mlx5/mlx5_nl.c b/drivers/net/mlx5/mlx5_nl.c +index 668affb0b1..8d5478d9f5 100644 +--- a/drivers/net/mlx5/mlx5_nl.c ++++ b/drivers/net/mlx5/mlx5_nl.c +@@ -128,8 +128,8 @@ int @@ -34 +35 @@ -@@ -201,16 +201,36 @@ mlx5_nl_init(int protocol) +@@ -140,16 +140,36 @@ mlx5_nl_init(int protocol) @@ -73 +74 @@ -@@ -332,11 +352,7 @@ mlx5_nl_recv(int nlsk_fd, uint32_t sn, int (*cb)(struct nlmsghdr *, void *arg), +@@ -271,11 +291,7 @@ mlx5_nl_recv(int nlsk_fd, uint32_t sn, int (*cb)(struct nlmsghdr *, void *arg), @@ -77 +78 @@ -- void *buf = mlx5_malloc(0, MLX5_RECV_BUF_SIZE, 0, SOCKET_ID_ANY); +- void *buf = malloc(MLX5_RECV_BUF_SIZE); @@ -86 +87 @@ -@@ -344,18 +360,43 @@ mlx5_nl_recv(int nlsk_fd, uint32_t sn, int (*cb)(struct nlmsghdr *, void *arg), +@@ -283,18 +299,43 @@ mlx5_nl_recv(int nlsk_fd, uint32_t sn, int (*cb)(struct nlmsghdr *, void *arg),