Currently tgid_map is sized at PID_MAX_DEFAULT entries, which means that on systems where pid_max is configured higher than PID_MAX_DEFAULT the ftrace record-tgid option doesn't work so well. Any tasks with PIDs higher than PID_MAX_DEFAULT are simply not recorded in tgid_map, and don't show up in the saved_tgids file. In particular since systemd v243 & above configure pid_max to its highest possible 1<<22 value by default on 64 bit systems this renders the record-tgids option of little use. Increase the size of tgid_map to PID_MAX_LIMIT instead, allowing it to cover the full range of PIDs up to the maximum value of pid_max. On 64 bit systems this will increase the size of tgid_map from 256KiB to 16MiB. Whilst this 64x increase in memory overhead sounds significant 64 bit systems are presumably best placed to accommodate it, and since tgid_map is only allocated when the record-tgid option is actually used presumably the user would rather it spends sufficient memory to actually record the tgids they expect. The size of tgid_map will also increase for CONFIG_BASE_SMALL=y configurations, but these seem unlikely to be systems upon which people are running ftrace with record-tgid anyway. Signed-off-by: Paul Burton <paulburton@xxxxxxxxxx> Fixes: d914ba37d714 ("tracing: Add support for recording tgid of tasks") Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Joel Fernandes <joelaf@xxxxxxxxxx> Cc: <stable@xxxxxxxxxxxxxxx> --- kernel/trace/trace.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 9570667310bcc..c893c0c2754f8 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -2460,7 +2460,7 @@ void trace_find_cmdline(int pid, char comm[]) int trace_find_tgid(int pid) { - if (unlikely(!tgid_map || !pid || pid > PID_MAX_DEFAULT)) + if (unlikely(!tgid_map || !pid || pid > PID_MAX_LIMIT)) return 0; return tgid_map[pid]; @@ -2472,7 +2472,7 @@ static int trace_save_tgid(struct task_struct *tsk) if (!tsk->pid) return 1; - if (unlikely(!tgid_map || tsk->pid > PID_MAX_DEFAULT)) + if (unlikely(!tgid_map || tsk->pid > PID_MAX_LIMIT)) return 0; tgid_map[tsk->pid] = tsk->tgid; @@ -5194,7 +5194,7 @@ int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled) if (mask == TRACE_ITER_RECORD_TGID) { if (!tgid_map) - tgid_map = kvcalloc(PID_MAX_DEFAULT + 1, + tgid_map = kvcalloc(PID_MAX_LIMIT + 1, sizeof(*tgid_map), GFP_KERNEL); if (!tgid_map) { @@ -5610,7 +5610,7 @@ static void *saved_tgids_next(struct seq_file *m, void *v, loff_t *pos) { int pid = ++(*pos); - if (pid > PID_MAX_DEFAULT) + if (pid > PID_MAX_LIMIT) return NULL; return &tgid_map[pid]; @@ -5618,7 +5618,7 @@ static void *saved_tgids_next(struct seq_file *m, void *v, loff_t *pos) static void *saved_tgids_start(struct seq_file *m, loff_t *pos) { - if (!tgid_map || *pos > PID_MAX_DEFAULT) + if (!tgid_map || *pos > PID_MAX_LIMIT) return NULL; return &tgid_map[*pos]; -- 2.32.0.93.g670b81a890-goog