将TASK_COMM_LEN Linux内核限制增加到pthread_setname_np

时间:2018-02-10 08:02:47

标签: c linux kernel pthreads

出于调试目的,我使用pthread_setname_np(3)pthread_getname_np。传递给它们的名称受TASK_COMM_LEN(请参阅this)的限制,#define - d为Linux内核的16个字节in include/linux/sched.h。我想稍微提高pthread_setname_np的限制,例如到24岁,这主要是为了方便(这对我来说不是什么大问题。)

(这仅用于调试目的和方便,我不愿意花费超过一个小时的工作量;我可以管理不增加TASK_COMM_LEN,我有足够的RAM - 32 Gbytes - 因此每个进程损坏一个额外的4K页面对我来说不是问题)

我正在今天(2018年2月10日)在Debian / Sid / x86-64上编译最新稳定的Linux kernel,4.15.2。 FWIW,我的gcc是版本7.3.0

我刚刚将第167行include/linux/sched.h更改为

 #define TASK_COMM_LEN          24 /*was 16*/

使用make deb-pkg编译该内核时出现错误:

  CC      drivers/connector/cn_proc.o
In file included from ./include/linux/kernel.h:10:0,
                 from drivers/connector/cn_proc.c:25:
drivers/connector/cn_proc.c: In function ‘proc_comm_connector’:
./include/linux/compiler.h:324:38: error: call to ‘__compiletime_assert_240’ declared with attribute error: BUILD_BUG_ON failed: sizeof(ev->event_data.comm.comm) != TASK_COMM_LEN
  _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
                                      ^
./include/linux/compiler.h:304:4: note: in definition of macro ‘__compiletime_assert’
    prefix ## suffix();    \
    ^~~~~~
./include/linux/compiler.h:324:2: note: in expansion of macro ‘_compiletime_assert’
  _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
  ^~~~~~~~~~~~~~~~~~~
./include/linux/build_bug.h:47:37: note: in expansion of macro ‘compiletime_assert’
 #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                     ^~~~~~~~~~~~~~~~~~
./include/linux/build_bug.h:71:2: note: in expansion of macro ‘BUILD_BUG_ON_MSG’
  BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
  ^~~~~~~~~~~~~~~~
./include/linux/sched.h:1497:2: note: in expansion of macro ‘BUILD_BUG_ON’
  BUILD_BUG_ON(sizeof(buf) != TASK_COMM_LEN); \
  ^~~~~~~~~~~~
drivers/connector/cn_proc.c:240:2: note: in expansion of macro ‘get_task_comm’
  get_task_comm(ev->event_data.comm.comm, task);
  ^~~~~~~~~~~~~
scripts/Makefile.build:316: recipe for target 'drivers/connector/cn_proc.o' failed
make[4]: *** [drivers/connector/cn_proc.o] Error 1
scripts/Makefile.build:575: recipe for target 'drivers/connector' failed
make[3]: *** [drivers/connector] Error 2
Makefile:1018: recipe for target 'drivers' failed
make[2]: *** [drivers] Error 2
scripts/package/Makefile:86: recipe for target 'deb-pkg' failed
make[1]: *** [deb-pkg] Error 2
Makefile:1345: recipe for target 'deb-pkg' failed
make: *** [deb-pkg] Error 2

要解决这个问题的快速而肮脏的解决方案吗?

(我可以使用TASK_COMM_LEN的旧16字节限制进行管理;这只是为了方便我想提高它。)

换句话说,为什么我必须在一个地方更改线程名称的大小?我不确定是想以某种模糊的方式破坏内核调度程序....

1 个答案:

答案 0 :(得分:1)

有问题的缓冲区(event_data.comm.comm中的struct proc_event)是用户空间API和ABI(通过netlink套接字与netlink系列NETLINK_CONNECTOR发送的消息)的一部分。这就是为什么它明确指定缓冲区大小为16 - TASK_COMM_LEN在用户空间API头文件中不可用,并且event_data中缓冲区的大小无论如何都不能改变,因为它是ABI的一部分

您可以尝试在内核配置中禁用“连接器”驱动程序 - 它位于“设备驱动程序”菜单中,名称为“连接器 - 统一用户空间< - >内核空间接头“。这是提供NETLINK_CONNECTOR netlink系列的驱动程序,如果您没有依赖该功能的任何用户空间代码,则不需要此驱动程序。这将阻止此特定代码导致您出现问题。

但是,您也可能在其他地方找到类似的ABI问题。