[dpdk-stable] patch 'common/mlx5: fix Netlink receive message buffer size' has been queued to stable release 19.11.10

Christian Ehrhardt christian.ehrhardt at canonical.com
Wed Aug 11 11:26:39 CEST 2021


On Tue, Aug 10, 2021 at 5:43 PM <christian.ehrhardt at canonical.com> wrote:
>
> Hi,
>
> FYI, your patch has been queued to stable release 19.11.10

Hi,
while applying cleanly your patch caused build time failures like:

/usr/bin/ld: drivers/libtmp_rte_pmd_mlx5.a.p/net_mlx5_mlx5_nl.c.o: in
function `mlx5_nl_recv.constprop.0':
mlx5_nl.c:(.text+0x504): undefined reference to `mlx5_free'
/usr/bin/ld: mlx5_nl.c:(.text+0x517): undefined reference to `mlx5_malloc'
/usr/bin/ld: drivers/libtmp_rte_pmd_mlx5.a.p/net_mlx5_mlx5_nl.c.o: in
function `mlx5_nl_mac_addr_sync':
mlx5_nl.c:(.text+0xfbb): undefined reference to `mlx5_free'
/usr/bin/ld: mlx5_nl.c:(.text+0xfcd): undefined reference to `mlx5_malloc'
/usr/bin/ld: drivers/libtmp_rte_pmd_mlx5.a.p/net_mlx5_mlx5_nl.c.o: in
function `mlx5_nl_ifindex':
mlx5_nl.c:(.text+0x1872): undefined reference to `mlx5_free'
/usr/bin/ld: mlx5_nl.c:(.text+0x1884): undefined reference to `mlx5_malloc'
/usr/bin/ld: mlx5_nl.c:(.text+0x1bd2): undefined reference to `mlx5_free'
/usr/bin/ld: mlx5_nl.c:(.text+0x1be4): undefined reference to `mlx5_malloc'
/usr/bin/ld: drivers/libtmp_rte_pmd_mlx5.a.p/net_mlx5_mlx5_nl.c.o: in
function `mlx5_nl_portnum':
mlx5_nl.c:(.text+0x1f6a): undefined reference to `mlx5_free'
/usr/bin/ld: mlx5_nl.c:(.text+0x1f7c): undefined reference to `mlx5_malloc'
/usr/bin/ld: drivers/libtmp_rte_pmd_mlx5.a.p/net_mlx5_mlx5_nl.c.o: in
function `mlx5_nl_switch_info':
mlx5_nl.c:(.text+0x2364): undefined reference to `mlx5_free'
/usr/bin/ld: mlx5_nl.c:(.text+0x2377): undefined reference to `mlx5_malloc'
collect2: error: ld returned 1 exit status

Therefore the patch will be de-qeueud from the stable branch that shall become
19.11.10.
Please consider having a look and providing a backport.

A backport should contain a reference to the DPDK main branch commit
in it's commit message in the following fashion:
    [ upstream commit <commit's dpdk main branch SHA-1 checksum> ]

For example:
    https://git.dpdk.org/dpdk-stable/commit/?h=18.11&id=d90e6ae6f936ecdc2fd3811ff9f26aec7f3c06eb

When sending the backported patch, please indicate the target branch in the
subject line, as we have multiple branches, for example:
    [PATCH 19.11] foo/bar: fix baz

With git format-patch, this can be achieved by appending the parameter:
    --subject-prefix='PATCH 19.11'

Send the backported patch to "stable at dpdk.org" but not "dev at dpdk.org".

FYI, branch 19.11 is located at tree:
   https://git.dpdk.org/dpdk-stable

Thanks in advance,
Chrtistian

> 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 <christian.ehrhardt at canonical.com>
>
> ---
> From 6af6af1640a7cd555e22dea6f12f497b82bb0761 Mon Sep 17 00:00:00 2001
> From: Viacheslav Ovsiienko <viacheslavo at nvidia.com>
> 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 <viacheslavo at nvidia.com>
> ---
>  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 at 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),



-- 
Christian Ehrhardt
Staff Engineer, Ubuntu Server
Canonical Ltd


More information about the stable mailing list