Historically due to the 16-byte length of TASK_COMM_LEN, the
users of 'tsk->comm' are restricted to use a fixed-size target
buffer also of TASK_COMM_LEN for 'memcpy()' like use-cases.
To fix the same, we now use a 64-byte TASK_COMM_EXT_LEN and
set the comm element inside 'task_struct' to the same length:
struct task_struct {
.....
char comm[TASK_COMM_EXT_LEN];
.....
};
where TASK_COMM_EXT_LEN is 64-bytes.
Now, in order to maintain existing ABI, we ensure that:
- Existing users of 'get_task_comm'/ 'set_task_comm' will get 'tsk->comm'
truncated to a maximum of 'TASK_COMM_LEN' (16-bytes) to maintain ABI,
- New / Modified users of 'get_task_comm'/ 'set_task_comm' will get
'tsk->comm' supported up to the maximum of 'TASK_COMM_EXT_LEN' (64-bytes).
Note, that the existing users have not been modified to migrate to
'TASK_COMM_EXT_LEN', in case they have hard-coded expectations of
dealing with only a 'TASK_COMM_LEN' long 'tsk->comm'.
Signed-off-by: Bhupesh <bhupesh@igalia.com>
---
include/linux/sched.h | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 8bbd03f1b978..b6abb759292c 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -317,6 +317,7 @@ struct user_event_mm;
*/
enum {
TASK_COMM_LEN = 16,
+ TASK_COMM_EXT_LEN = 64,
};
extern void sched_tick(void);
@@ -1159,7 +1160,7 @@ struct task_struct {
* - logic inside set_task_comm() will ensure it is always NUL-terminated and
* zero-padded
*/
- char comm[TASK_COMM_LEN];
+ char comm[TASK_COMM_EXT_LEN];
struct nameidata *nameidata;
@@ -1954,7 +1955,7 @@ extern void kick_process(struct task_struct *tsk);
extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec);
#define set_task_comm(tsk, from) ({ \
- BUILD_BUG_ON(sizeof(from) != TASK_COMM_LEN); \
+ BUILD_BUG_ON(sizeof(from) < TASK_COMM_LEN); \
__set_task_comm(tsk, from, false); \
})
@@ -1974,6 +1975,10 @@ extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec
#define get_task_comm(buf, tsk) ({ \
BUILD_BUG_ON(sizeof(buf) < TASK_COMM_LEN); \
strscpy_pad(buf, (tsk)->comm); \
+ if ((sizeof(buf)) == TASK_COMM_LEN) \
+ buf[TASK_COMM_LEN - 1] = '\0'; \
+ else \
+ buf[TASK_COMM_EXT_LEN - 1] = '\0'; \
buf; \
})
--
2.38.1
Hi Bhupesh,
kernel test robot noticed the following build warnings:
[auto build test WARNING on trace/for-next]
[also build test WARNING on tip/sched/core akpm-mm/mm-everything linus/master v6.16-rc7 next-20250725]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Bhupesh/exec-Remove-obsolete-comments/20250724-203927
base: https://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace for-next
patch link: https://lore.kernel.org/r/20250724123612.206110-4-bhupesh%40igalia.com
patch subject: [PATCH v6 3/3] include: Set tsk->comm length to 64 bytes
config: sparc64-randconfig-001-20250725 (https://download.01.org/0day-ci/archive/20250726/202507261841.Z2C9RmTJ-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250726/202507261841.Z2C9RmTJ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202507261841.Z2C9RmTJ-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/gpu/drm/nouveau/nouveau_chan.c: In function 'nouveau_channel_ctor':
>> drivers/gpu/drm/nouveau/nouveau_chan.c:336:51: warning: '%s' directive output may be truncated writing up to 63 bytes into a region of size 32 [-Wformat-truncation=]
snprintf(args->name, __member_size(args->name), "%s[%d]",
^~
drivers/gpu/drm/nouveau/nouveau_chan.c:336:2: note: 'snprintf' output between 4 and 77 bytes into a destination of size 32
snprintf(args->name, __member_size(args->name), "%s[%d]",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
current->comm, task_pid_nr(current));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
drivers/gpu/drm/nouveau/nouveau_drm.c: In function 'nouveau_drm_open':
>> drivers/gpu/drm/nouveau/nouveau_drm.c:1202:32: warning: '%s' directive output may be truncated writing up to 63 bytes into a region of size 32 [-Wformat-truncation=]
snprintf(name, sizeof(name), "%s[%d]",
^~
drivers/gpu/drm/nouveau/nouveau_drm.c:1202:2: note: 'snprintf' output between 4 and 77 bytes into a destination of size 32
snprintf(name, sizeof(name), "%s[%d]",
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
current->comm, pid_nr(rcu_dereference(fpriv->pid)));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vim +336 drivers/gpu/drm/nouveau/nouveau_chan.c
ebb945a94bba2c Ben Skeggs 2012-07-20 246
5b8a43aeb9cbf6 Marcin Slusarz 2012-08-19 247 static int
5cca41ac70e587 Ben Skeggs 2024-07-26 248 nouveau_channel_ctor(struct nouveau_cli *cli, bool priv, u64 runm,
06db7fded6dec8 Ben Skeggs 2022-06-01 249 struct nouveau_channel **pchan)
ebb945a94bba2c Ben Skeggs 2012-07-20 250 {
152be54224de18 Danilo Krummrich 2023-10-02 251 const struct nvif_mclass hosts[] = {
284ad706ad2f50 Ben Skeggs 2025-02-04 252 { BLACKWELL_CHANNEL_GPFIFO_B, 0 },
32cb1cc358ffed Ben Skeggs 2024-11-25 253 { BLACKWELL_CHANNEL_GPFIFO_A, 0 },
44f93b209e2afd Ben Skeggs 2024-11-25 254 { HOPPER_CHANNEL_GPFIFO_A, 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 255 { AMPERE_CHANNEL_GPFIFO_B, 0 },
7f4f35ea5b080e Ben Skeggs 2022-06-01 256 { AMPERE_CHANNEL_GPFIFO_A, 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 257 { TURING_CHANNEL_GPFIFO_A, 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 258 { VOLTA_CHANNEL_GPFIFO_A, 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 259 { PASCAL_CHANNEL_GPFIFO_A, 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 260 { MAXWELL_CHANNEL_GPFIFO_A, 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 261 { KEPLER_CHANNEL_GPFIFO_B, 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 262 { KEPLER_CHANNEL_GPFIFO_A, 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 263 { FERMI_CHANNEL_GPFIFO , 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 264 { G82_CHANNEL_GPFIFO , 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 265 { NV50_CHANNEL_GPFIFO , 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 266 { NV40_CHANNEL_DMA , 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 267 { NV17_CHANNEL_DMA , 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 268 { NV10_CHANNEL_DMA , 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 269 { NV03_CHANNEL_DMA , 0 },
06db7fded6dec8 Ben Skeggs 2022-06-01 270 {}
06db7fded6dec8 Ben Skeggs 2022-06-01 271 };
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 272 DEFINE_RAW_FLEX(struct nvif_chan_v0, args, name, TASK_COMM_LEN + 16);
5cca41ac70e587 Ben Skeggs 2024-07-26 273 struct nvif_device *device = &cli->device;
ebb945a94bba2c Ben Skeggs 2012-07-20 274 struct nouveau_channel *chan;
06db7fded6dec8 Ben Skeggs 2022-06-01 275 const u64 plength = 0x10000;
06db7fded6dec8 Ben Skeggs 2022-06-01 276 const u64 ioffset = plength;
06db7fded6dec8 Ben Skeggs 2022-06-01 277 const u64 ilength = 0x02000;
06db7fded6dec8 Ben Skeggs 2022-06-01 278 int cid, ret;
06db7fded6dec8 Ben Skeggs 2022-06-01 279 u64 size;
06db7fded6dec8 Ben Skeggs 2022-06-01 280
06db7fded6dec8 Ben Skeggs 2022-06-01 281 cid = nvif_mclass(&device->object, hosts);
06db7fded6dec8 Ben Skeggs 2022-06-01 282 if (cid < 0)
06db7fded6dec8 Ben Skeggs 2022-06-01 283 return cid;
06db7fded6dec8 Ben Skeggs 2022-06-01 284
06db7fded6dec8 Ben Skeggs 2022-06-01 285 if (hosts[cid].oclass < NV50_CHANNEL_GPFIFO)
06db7fded6dec8 Ben Skeggs 2022-06-01 286 size = plength;
06db7fded6dec8 Ben Skeggs 2022-06-01 287 else
06db7fded6dec8 Ben Skeggs 2022-06-01 288 size = ioffset + ilength;
ebb945a94bba2c Ben Skeggs 2012-07-20 289
ebb945a94bba2c Ben Skeggs 2012-07-20 290 /* allocate dma push buffer */
5cca41ac70e587 Ben Skeggs 2024-07-26 291 ret = nouveau_channel_prep(cli, size, &chan);
ebb945a94bba2c Ben Skeggs 2012-07-20 292 *pchan = chan;
ebb945a94bba2c Ben Skeggs 2012-07-20 293 if (ret)
ebb945a94bba2c Ben Skeggs 2012-07-20 294 return ret;
ebb945a94bba2c Ben Skeggs 2012-07-20 295
ebb945a94bba2c Ben Skeggs 2012-07-20 296 /* create channel object */
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 297 args->version = 0;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 298 args->namelen = __member_size(args->name);
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 299 args->runlist = __ffs64(runm);
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 300 args->runq = 0;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 301 args->priv = priv;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 302 args->devm = BIT(0);
06db7fded6dec8 Ben Skeggs 2022-06-01 303 if (hosts[cid].oclass < NV50_CHANNEL_GPFIFO) {
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 304 args->vmm = 0;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 305 args->ctxdma = nvif_handle(&chan->push.ctxdma);
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 306 args->offset = chan->push.addr;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 307 args->length = 0;
bbf8906b2cad17 Ben Skeggs 2014-08-10 308 } else {
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 309 args->vmm = nvif_handle(&chan->vmm->vmm.object);
06db7fded6dec8 Ben Skeggs 2022-06-01 310 if (hosts[cid].oclass < FERMI_CHANNEL_GPFIFO)
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 311 args->ctxdma = nvif_handle(&chan->push.ctxdma);
06db7fded6dec8 Ben Skeggs 2022-06-01 312 else
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 313 args->ctxdma = 0;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 314 args->offset = ioffset + chan->push.addr;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 315 args->length = ilength;
06db7fded6dec8 Ben Skeggs 2022-06-01 316 }
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 317 args->huserd = 0;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 318 args->ouserd = 0;
06db7fded6dec8 Ben Skeggs 2022-06-01 319
06db7fded6dec8 Ben Skeggs 2022-06-01 320 /* allocate userd */
06db7fded6dec8 Ben Skeggs 2022-06-01 321 if (hosts[cid].oclass >= VOLTA_CHANNEL_GPFIFO_A) {
06db7fded6dec8 Ben Skeggs 2022-06-01 322 ret = nvif_mem_ctor(&cli->mmu, "abi16ChanUSERD", NVIF_CLASS_MEM_GF100,
06db7fded6dec8 Ben Skeggs 2022-06-01 323 NVIF_MEM_VRAM | NVIF_MEM_COHERENT | NVIF_MEM_MAPPABLE,
06db7fded6dec8 Ben Skeggs 2022-06-01 324 0, PAGE_SIZE, NULL, 0, &chan->mem_userd);
06db7fded6dec8 Ben Skeggs 2022-06-01 325 if (ret)
ebb945a94bba2c Ben Skeggs 2012-07-20 326 return ret;
ebb945a94bba2c Ben Skeggs 2012-07-20 327
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 328 args->huserd = nvif_handle(&chan->mem_userd.object);
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 329 args->ouserd = 0;
ebb945a94bba2c Ben Skeggs 2012-07-20 330
06db7fded6dec8 Ben Skeggs 2022-06-01 331 chan->userd = &chan->mem_userd.object;
06db7fded6dec8 Ben Skeggs 2022-06-01 332 } else {
06db7fded6dec8 Ben Skeggs 2022-06-01 333 chan->userd = &chan->user;
06db7fded6dec8 Ben Skeggs 2022-06-01 334 }
ebb945a94bba2c Ben Skeggs 2012-07-20 335
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 @336 snprintf(args->name, __member_size(args->name), "%s[%d]",
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 337 current->comm, task_pid_nr(current));
ebb945a94bba2c Ben Skeggs 2012-07-20 338
06db7fded6dec8 Ben Skeggs 2022-06-01 339 ret = nvif_object_ctor(&device->object, "abi16ChanUser", 0, hosts[cid].oclass,
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 340 args, __struct_size(args), &chan->user);
06db7fded6dec8 Ben Skeggs 2022-06-01 341 if (ret) {
06db7fded6dec8 Ben Skeggs 2022-06-01 342 nouveau_channel_del(pchan);
ebb945a94bba2c Ben Skeggs 2012-07-20 343 return ret;
bbf8906b2cad17 Ben Skeggs 2014-08-10 344 }
ebb945a94bba2c Ben Skeggs 2012-07-20 345
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 346 chan->runlist = args->runlist;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 347 chan->chid = args->chid;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 348 chan->inst = args->inst;
e270b3665f8321 Gustavo A. R. Silva 2025-04-16 349 chan->token = args->token;
06db7fded6dec8 Ben Skeggs 2022-06-01 350 return 0;
ebb945a94bba2c Ben Skeggs 2012-07-20 351 }
ebb945a94bba2c Ben Skeggs 2012-07-20 352
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On Thu, Jul 24, 2025 at 06:06:12PM +0530, Bhupesh wrote:
> Historically due to the 16-byte length of TASK_COMM_LEN, the
> users of 'tsk->comm' are restricted to use a fixed-size target
> buffer also of TASK_COMM_LEN for 'memcpy()' like use-cases.
>
> To fix the same, we now use a 64-byte TASK_COMM_EXT_LEN and
> set the comm element inside 'task_struct' to the same length:
> struct task_struct {
> .....
> char comm[TASK_COMM_EXT_LEN];
> .....
> };
>
> where TASK_COMM_EXT_LEN is 64-bytes.
>
> Now, in order to maintain existing ABI, we ensure that:
>
> - Existing users of 'get_task_comm'/ 'set_task_comm' will get 'tsk->comm'
> truncated to a maximum of 'TASK_COMM_LEN' (16-bytes) to maintain ABI,
> - New / Modified users of 'get_task_comm'/ 'set_task_comm' will get
> 'tsk->comm' supported up to the maximum of 'TASK_COMM_EXT_LEN' (64-bytes).
>
> Note, that the existing users have not been modified to migrate to
> 'TASK_COMM_EXT_LEN', in case they have hard-coded expectations of
> dealing with only a 'TASK_COMM_LEN' long 'tsk->comm'.
>
> Signed-off-by: Bhupesh <bhupesh@igalia.com>
> ---
> include/linux/sched.h | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index 8bbd03f1b978..b6abb759292c 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -317,6 +317,7 @@ struct user_event_mm;
> */
> enum {
> TASK_COMM_LEN = 16,
> + TASK_COMM_EXT_LEN = 64,
> };
>
> extern void sched_tick(void);
> @@ -1159,7 +1160,7 @@ struct task_struct {
> * - logic inside set_task_comm() will ensure it is always NUL-terminated and
> * zero-padded
> */
> - char comm[TASK_COMM_LEN];
> + char comm[TASK_COMM_EXT_LEN];
>
> struct nameidata *nameidata;
>
> @@ -1954,7 +1955,7 @@ extern void kick_process(struct task_struct *tsk);
>
> extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec);
> #define set_task_comm(tsk, from) ({ \
> - BUILD_BUG_ON(sizeof(from) != TASK_COMM_LEN); \
> + BUILD_BUG_ON(sizeof(from) < TASK_COMM_LEN); \
> __set_task_comm(tsk, from, false); \
> })
>
> @@ -1974,6 +1975,10 @@ extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec
> #define get_task_comm(buf, tsk) ({ \
> BUILD_BUG_ON(sizeof(buf) < TASK_COMM_LEN); \
> strscpy_pad(buf, (tsk)->comm); \
> + if ((sizeof(buf)) == TASK_COMM_LEN) \
> + buf[TASK_COMM_LEN - 1] = '\0'; \
> + else \
> + buf[TASK_COMM_EXT_LEN - 1] = '\0'; \
strscpy_pad() will already make sure buf is NUL-terminated, so I don't
see why there is a need for explicit final byte termination? (And even
if we do need it, then it should just be buf[sizeof(buf) - 1] otherwise
using a buf that is < TASK_COMM_EXT_LEN but > TASK_COMM_LEN will have
a spurious NUL byte write beyond its buffer.)
--
Kees Cook
© 2016 - 2026 Red Hat, Inc.