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 0B452A0A0F for ; Thu, 1 Jul 2021 09:31:59 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ED335412AB; Thu, 1 Jul 2021 09:31:58 +0200 (CEST) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2082.outbound.protection.outlook.com [40.107.236.82]) by mails.dpdk.org (Postfix) with ESMTP id 158E640040; Thu, 1 Jul 2021 09:31:56 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mGl90ULrS7+VeLsiPRA/hsfIzebfa4m+Mgq/edxo/0K/q81aSc3eyFhiwuGGN4SQjzWx5pwDMNMIP0du87XZt/ge9gkuhCEl1LdbEc4e846PnrhGM6T7B16pf1cxXAf27BWwHCT/Jtpj7qQ4Gw7Bneeu99vkVEkxB4qeZzB/sFR2j58Z3pWjmt0wZUfNnyNK7Irng55u7z7a3P4K32hmeyYHk1h37T4UnEKPMyXdZ27NxFQ+M9HgBeHdvuNKkxtwLabgFp04hRLW8AlCHtK9Ik6kiZQtWZH4rePTfwfWRolZKE0k0WZMMap8adukgc2SsX9+nEPzdgyQWNj4F81kKA== 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-SenderADCheck; bh=kG2L7V1DR57y1g2w+VH2JKzvBrHHlArrbtD3FKIXXVU=; b=fpASuhJdCgp+u2zI6lSmdVPCw6yz2jYZNnl/vKvMCGrFMkkJNSU4+BCYCDMBRwyUqyv0TYKKAxlESrPfj7QoYlQVRbDpQ2n8V2YjEtklNo6ccF0AY2d/aNUWgFV6Ivfpw5Vp8vhQgmdhKnuIJ5zvdl/x5YKJgpkV72a9XRRnQ+r6tTUaGhXoGkhlJb5q9VRfJGll9bThimCVL3k/DoZ6m55/tGQQHLv1No6tg4zJt43EIQ/BpraoTMYhL1/IbK6OIiASZ+TfYwApJY4eAaL+XxYRPpjOA/Oz5PHdq59HVwHKLvPg67uKjh0FPns8qUuuV7U/GzMCtx4fv+xNnyvdeQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.34) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=none sp=none 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=kG2L7V1DR57y1g2w+VH2JKzvBrHHlArrbtD3FKIXXVU=; b=pPAq8/RjGasEc9QKU8Yxo2ynbil6cYq1MRxGmV7gNUWmYrB75+lFP525ARclDDY9L9z5QEAlRjSRWpdmSoqJ3mOHQCYW/9PK5qC1AWRKXAIGYpGONECQQlZBMZLNDhS+juhK4FKHm0cBtta6NKWdNDGmP3qIvHPweZTCnaAbErRmHCODhgKZN7FEfdrPV3dlRP8gLKqIS+is8p0MmK0V37P9qxnDXiZEi5Mox7GLkuYKNFjI1Ed49s2QDdZi47r92rHKP1o+ubV9vMyf2fqEbyQ1OHVHJOg7KUd65w9DZ0PnnFzSIqSXtWxyN5Um21sPClKhOcm33W1REYvxPCqvKQ== Received: from BN6PR2001CA0030.namprd20.prod.outlook.com (2603:10b6:405:16::16) by DM4PR12MB5360.namprd12.prod.outlook.com (2603:10b6:5:39f::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.19; Thu, 1 Jul 2021 07:31:54 +0000 Received: from BN8NAM11FT036.eop-nam11.prod.protection.outlook.com (2603:10b6:405:16:cafe::1) by BN6PR2001CA0030.outlook.office365.com (2603:10b6:405:16::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4287.22 via Frontend Transport; Thu, 1 Jul 2021 07:31:54 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.34) smtp.mailfrom=nvidia.com; dpdk.org; dkim=none (message not signed) header.d=none;dpdk.org; dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.112.34 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.34; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.34) by BN8NAM11FT036.mail.protection.outlook.com (10.13.177.168) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4287.22 via Frontend Transport; Thu, 1 Jul 2021 07:31:54 +0000 Received: from nvidia.com (172.20.187.6) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 1 Jul 2021 07:31:51 +0000 From: Viacheslav Ovsiienko To: CC: , , , Date: Thu, 1 Jul 2021 10:31:33 +0300 Message-ID: <20210701073133.23488-1-viacheslavo@nvidia.com> X-Mailer: git-send-email 2.18.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [172.20.187.6] X-ClientProxiedBy: HQMAIL101.nvidia.com (172.20.187.10) To HQMAIL107.nvidia.com (172.20.187.13) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b452c328-9b00-4140-b4b8-08d93c624cd4 X-MS-TrafficTypeDiagnostic: DM4PR12MB5360: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: tJQqcEgmHtBb1b0TMgCbrkZAlRcCb7s0ZGV6OGhEjNm34Gj91SbQexx/ZGsG3IfjSX/GwQPq+SgJpqFsMydDO/OkoCNOTeov9KrxhmBfScUBk59cN+Kk3qOWzXPxLOvai2hAw3hJGYcOCTpr8CIyMHHJD3UpHxHk4Y88KlfnePOzJHwmoEMGToKxpLqiSz+7vswULJKLgO3IZRvUateF4OMQ1l7lHcqhJOvaXbswP5LTymKfND3VRtSJ5ZyqWEeyh7tVMIrEHNO2nri2uzFTHmHn2bLPsgEUCMznTa7YjTORtCkzKUSuXhyT3GcJe89+INy+ndSDm3TBFO6aAG3R8IXcgyKvAaYSjaiByNv3adO7yeLFz78KHpzPTvmavv7+3xTGFrbwWNkcDndVslzTYRUiJr03bMlOV42UPAtFvuzM1AmiXYMpmges6QFDR9e4dya6YrReuhboCOOd5BiuGw9wS5X0kfBH0OihK7giXnwaAkwIhcjDW3UHjawUSCK1Q/i3Dz3DVebM2a1Dnu2f9N+yABfZS2ZFaEXVByHsfwWLRYG0A1TpiZ8JttHco4TDps2qiOlL29SzHiVymB08cHzpgd3DkFT60NG0o369+c8EZ6Ork0OSpA8o2JrdKaaQoI12RchqEox54ryL6WWXFFLU/ZSAdD7HjxBKdvKQ3ETBazlkrmg1zlhesCDVtBr3dCUXsEmSE3CLSdshZ4kW0gR5tMS4AIqyAihRqD+8ZPs= X-Forefront-Antispam-Report: CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE; SFS:(4636009)(376002)(346002)(396003)(136003)(39860400002)(36840700001)(46966006)(426003)(70206006)(5660300002)(7696005)(6286002)(8676002)(70586007)(8936002)(4326008)(336012)(55016002)(26005)(16526019)(450100002)(186003)(82740400003)(36860700001)(6916009)(82310400003)(2906002)(478600001)(47076005)(83380400001)(7636003)(6666004)(43170500006)(54906003)(316002)(36756003)(356005)(1076003)(86362001)(2616005)(15650500001); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2021 07:31:54.1406 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b452c328-9b00-4140-b4b8-08d93c624cd4 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT036.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB5360 Subject: [dpdk-stable] [PATCH] common/mlx5: fix Netlink receive message buffer size 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" 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") Cc: stable@dpdk.org Signed-off-by: Viacheslav Ovsiienko --- drivers/common/mlx5/linux/mlx5_nl.c | 69 +++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 14 deletions(-) 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 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, }; @@ -201,16 +201,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; @@ -332,11 +352,7 @@ mlx5_nl_recv(int nlsk_fd, uint32_t sn, int (*cb)(struct nlmsghdr *, void *arg), void *arg) { struct sockaddr_nl sa; - void *buf = mlx5_malloc(0, MLX5_RECV_BUF_SIZE, 0, SOCKET_ID_ANY); - 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), @@ -344,18 +360,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.18.1