]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 May 2026 12:06:56 +0000 (14:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 May 2026 12:06:56 +0000 (14:06 +0200)
added patches:
tools-accounting-handle-truncated-taskstats-netlink-messages.patch

queue-6.1/series
queue-6.1/tools-accounting-handle-truncated-taskstats-netlink-messages.patch [new file with mode: 0644]

index 03346b56e951f2d6d1688f8c0e1cc2581fc93df5..4fb35c594f9780d84659bdee3897c7f9b33d1b89 100644 (file)
@@ -210,3 +210,4 @@ alsa-caiaq-fix-control_put-result-and-cache-rollback.patch
 alsa-caiaq-handle-probe-errors-properly.patch
 alsa-6fire-fix-input-volume-change-detection.patch
 iio-adc-ad7768-1-fix-one-shot-mode-data-acquisition.patch
+tools-accounting-handle-truncated-taskstats-netlink-messages.patch
diff --git a/queue-6.1/tools-accounting-handle-truncated-taskstats-netlink-messages.patch b/queue-6.1/tools-accounting-handle-truncated-taskstats-netlink-messages.patch
new file mode 100644 (file)
index 0000000..a5658a9
--- /dev/null
@@ -0,0 +1,181 @@
+From cc82b3dcc6a8fa259fbda12ab00d6fc00908a49e Mon Sep 17 00:00:00 2001
+From: Yiyang Chen <cyyzero16@gmail.com>
+Date: Mon, 30 Mar 2026 03:00:41 +0800
+Subject: tools/accounting: handle truncated taskstats netlink messages
+
+From: Yiyang Chen <cyyzero16@gmail.com>
+
+commit cc82b3dcc6a8fa259fbda12ab00d6fc00908a49e upstream.
+
+procacct and getdelays use a fixed receive buffer for taskstats generic
+netlink messages.  A multi-threaded process exit can emit a single
+PID+TGID notification large enough to exceed that buffer on newer kernels.
+
+Switch to recvmsg() so MSG_TRUNC is detected explicitly, increase the
+message buffer size, and report truncated datagrams clearly instead of
+misparsing them as fatal netlink errors.
+
+Also print the taskstats version in debug output to make version
+mismatches easier to diagnose while inspecting taskstats traffic.
+
+Link: https://lkml.kernel.org/r/520308bb4cbbaf8dc2c7296b5f60f11e12fb30a5.1774810498.git.cyyzero16@gmail.com
+Signed-off-by: Yiyang Chen <cyyzero16@gmail.com>
+Cc: Balbir Singh <bsingharora@gmail.com>
+Cc: Dr. Thomas Orgis <thomas.orgis@uni-hamburg.de>
+Cc: Fan Yu <fan.yu9@zte.com.cn>
+Cc: Wang Yaxin <wang.yaxin@zte.com.cn>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/accounting/getdelays.c |   41 +++++++++++++++++++++++++++++++++++++----
+ tools/accounting/procacct.c  |   40 ++++++++++++++++++++++++++++++++++++----
+ 2 files changed, 73 insertions(+), 8 deletions(-)
+
+--- a/tools/accounting/getdelays.c
++++ b/tools/accounting/getdelays.c
+@@ -59,7 +59,7 @@ int print_task_context_switch_counts;
+       }
+ /* Maximum size of response requested or message sent */
+-#define MAX_MSG_SIZE  1024
++#define MAX_MSG_SIZE  2048
+ /* Maximum number of cpus expected to be specified in a cpumask */
+ #define MAX_CPUS      32
+@@ -114,6 +114,32 @@ error:
+       return -1;
+ }
++static int recv_taskstats_msg(int sd, struct msgtemplate *msg)
++{
++      struct sockaddr_nl nladdr;
++      struct iovec iov = {
++              .iov_base = msg,
++              .iov_len = sizeof(*msg),
++      };
++      struct msghdr hdr = {
++              .msg_name = &nladdr,
++              .msg_namelen = sizeof(nladdr),
++              .msg_iov = &iov,
++              .msg_iovlen = 1,
++      };
++      int ret;
++
++      ret = recvmsg(sd, &hdr, 0);
++      if (ret < 0)
++              return -1;
++      if (hdr.msg_flags & MSG_TRUNC) {
++              errno = EMSGSIZE;
++              return -1;
++      }
++
++      return ret;
++}
++
+ static int send_cmd(int sd, __u16 nlmsg_type, __u32 nlmsg_pid,
+            __u8 genl_cmd, __u16 nla_type,
+@@ -459,12 +485,16 @@ int main(int argc, char *argv[])
+       }
+       do {
+-              rep_len = recv(nl_sd, &msg, sizeof(msg), 0);
++              rep_len = recv_taskstats_msg(nl_sd, &msg);
+               PRINTF("received %d bytes\n", rep_len);
+               if (rep_len < 0) {
+-                      fprintf(stderr, "nonfatal reply error: errno %d\n",
+-                              errno);
++                      if (errno == EMSGSIZE)
++                              fprintf(stderr,
++                                      "dropped truncated taskstats netlink message, please increase MAX_MSG_SIZE\n");
++                      else
++                              fprintf(stderr, "nonfatal reply error: errno %d\n",
++                                      errno);
+                       continue;
+               }
+               if (msg.n.nlmsg_type == NLMSG_ERROR ||
+@@ -506,6 +536,9 @@ int main(int argc, char *argv[])
+                                                       printf("TGID\t%d\n", rtid);
+                                               break;
+                                       case TASKSTATS_TYPE_STATS:
++                                              PRINTF("version %u\n",
++                                                     ((struct taskstats *)
++                                                      NLA_DATA(na))->version);
+                                               if (print_delays)
+                                                       print_delayacct((struct taskstats *) NLA_DATA(na));
+                                               if (print_io_accounting)
+--- a/tools/accounting/procacct.c
++++ b/tools/accounting/procacct.c
+@@ -71,7 +71,7 @@ int print_task_context_switch_counts;
+       }
+ /* Maximum size of response requested or message sent */
+-#define MAX_MSG_SIZE  1024
++#define MAX_MSG_SIZE  2048
+ /* Maximum number of cpus expected to be specified in a cpumask */
+ #define MAX_CPUS      32
+@@ -121,6 +121,32 @@ error:
+       return -1;
+ }
++static int recv_taskstats_msg(int sd, struct msgtemplate *msg)
++{
++      struct sockaddr_nl nladdr;
++      struct iovec iov = {
++              .iov_base = msg,
++              .iov_len = sizeof(*msg),
++      };
++      struct msghdr hdr = {
++              .msg_name = &nladdr,
++              .msg_namelen = sizeof(nladdr),
++              .msg_iov = &iov,
++              .msg_iovlen = 1,
++      };
++      int ret;
++
++      ret = recvmsg(sd, &hdr, 0);
++      if (ret < 0)
++              return -1;
++      if (hdr.msg_flags & MSG_TRUNC) {
++              errno = EMSGSIZE;
++              return -1;
++      }
++
++      return ret;
++}
++
+ static int send_cmd(int sd, __u16 nlmsg_type, __u32 nlmsg_pid,
+            __u8 genl_cmd, __u16 nla_type,
+@@ -239,6 +265,8 @@ void handle_aggr(int mother, struct nlat
+                       PRINTF("TGID\t%d\n", rtid);
+                       break;
+               case TASKSTATS_TYPE_STATS:
++                      PRINTF("version %u\n",
++                             ((struct taskstats *)NLA_DATA(na))->version);
+                       if (mother == TASKSTATS_TYPE_AGGR_PID)
+                               print_procacct((struct taskstats *) NLA_DATA(na));
+                       if (fd) {
+@@ -353,12 +381,16 @@ int main(int argc, char *argv[])
+       }
+       do {
+-              rep_len = recv(nl_sd, &msg, sizeof(msg), 0);
++              rep_len = recv_taskstats_msg(nl_sd, &msg);
+               PRINTF("received %d bytes\n", rep_len);
+               if (rep_len < 0) {
+-                      fprintf(stderr, "nonfatal reply error: errno %d\n",
+-                              errno);
++                      if (errno == EMSGSIZE)
++                              fprintf(stderr,
++                                      "dropped truncated taskstats netlink message, please increase MAX_MSG_SIZE\n");
++                      else
++                              fprintf(stderr, "nonfatal reply error: errno %d\n",
++                                      errno);
+                       continue;
+               }
+               if (msg.n.nlmsg_type == NLMSG_ERROR ||