Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2468136pxj; Mon, 10 May 2021 03:50:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz9gDFPw6aSg+mMs6IwKE3B+p2FQiHQYtok9SCnz6syD0JDbQiP2eWNNOBpijt2+G7urv7a X-Received: by 2002:a05:6e02:1c89:: with SMTP id w9mr11725981ill.123.1620643817827; Mon, 10 May 2021 03:50:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620643817; cv=none; d=google.com; s=arc-20160816; b=rPirw7gHJJVVuAFA3F+XZx6Mupoy+frkifinBBXdw2M7w3I86wOfMlyA3/gK4G+Fxm T5aCVZyCLOBf5gi3iABFWVjeHf/BIzm1FaKuRlKsm0NJRCvrgz+F2D/ewqUc6KuSu/Ag RI+6OvwQ8ctECqgVqBmDGFL+yUlw55uBmg02Vh4R+IkrDSzqJ2hdf10q5FVKwAtRjScD 8AQlDv2ejSfo75lsRjoe9cJ1r+NE0BcDE30Odi2zdFUCt4oa5cIvmoIHMDpkL2MoG0JX LcwSbkEtW/lDtzFsaQp/gHNgMd47SY6AGxyxCQMrorGBXF8eMbL+qSXEynu3jqe7qXpk RLZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=hyZPWXnRWDoMkwQMH7GFHKHWjxYc6yEP1uxMjPnLdL4=; b=nkJ+F3DUVR+AhB/a/KVvXPV0wtxhY/UhntkTzjZOsukyPogIT2iwYC6Lb+Rw13jkvp 3tTqogMnGQhQfCsPDMXyLSeMqAftVJ77Z3ZefUKO5XzJK8OwgXFkcqgUhSBsnrEVGazK Lxre42rTKSsGs2mbHT2Ok0N5S3L/c0saZdfiQMrX4H8u/akcGJFrqTaNGcJmQfPt4n/7 QrwViUgEqhZNC6c9bOQDHl3CsiWyc5+MniQobjUC77W7MuJ5StMmrainBxeywuRGgN6W VFeLDwQURWDQ6MsokAov54WSMwKchyQtPThA/YNCdoc17hMTl+S6d/JDG9F44RAeqFTP Ph2w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=qaPLUTSq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a14si15461153iol.90.2021.05.10.03.50.05; Mon, 10 May 2021 03:50:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=qaPLUTSq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232082AbhEJKsO (ORCPT + 99 others); Mon, 10 May 2021 06:48:14 -0400 Received: from mail.kernel.org ([198.145.29.99]:48872 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232717AbhEJKj7 (ORCPT ); Mon, 10 May 2021 06:39:59 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id DFB5F6195A; Mon, 10 May 2021 10:30:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620642647; bh=CTb6iTCT0GsTsnCWC47JQz+USxBs5JY83DfDDImUdlA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qaPLUTSqaRUuOjp4Gzq30IKRfsRKJJKPqgPyRvSJbv+80STZq2JLcqN5Wtphvh5ej idayYNOFfrxPXVqV42JGHZDRIDmXHSd656xW2Z0tUri/2CgeQTCGmaFJ1lVjm8yQZM 6O8LyBMiP5jKFys2uJunS7gPjcJ283QnBnrCbJG0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "Steven Rostedt (VMware)" Subject: [PATCH 5.4 179/184] tracing: Map all PIDs to command lines Date: Mon, 10 May 2021 12:21:13 +0200 Message-Id: <20210510101955.981777713@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510101950.200777181@linuxfoundation.org> References: <20210510101950.200777181@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Steven Rostedt (VMware) commit 785e3c0a3a870e72dc530856136ab4c8dd207128 upstream. The default max PID is set by PID_MAX_DEFAULT, and the tracing infrastructure uses this number to map PIDs to the comm names of the tasks, such output of the trace can show names from the recorded PIDs in the ring buffer. This mapping is also exported to user space via the "saved_cmdlines" file in the tracefs directory. But currently the mapping expects the PIDs to be less than PID_MAX_DEFAULT, which is the default maximum and not the real maximum. Recently, systemd will increases the maximum value of a PID on the system, and when tasks are traced that have a PID higher than PID_MAX_DEFAULT, its comm is not recorded. This leads to the entire trace to have "<...>" as the comm name, which is pretty useless. Instead, keep the array mapping the size of PID_MAX_DEFAULT, but instead of just mapping the index to the comm, map a mask of the PID (PID_MAX_DEFAULT - 1) to the comm, and find the full PID from the map_cmdline_to_pid array (that already exists). This bug goes back to the beginning of ftrace, but hasn't been an issue until user space started increasing the maximum value of PIDs. Link: https://lkml.kernel.org/r/20210427113207.3c601884@gandalf.local.home Cc: stable@vger.kernel.org Fixes: bc0c38d139ec7 ("ftrace: latency tracer infrastructure") Signed-off-by: Steven Rostedt (VMware) Signed-off-by: Greg Kroah-Hartman --- kernel/trace/trace.c | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -2140,14 +2140,13 @@ static void tracing_stop_tr(struct trace static int trace_save_cmdline(struct task_struct *tsk) { - unsigned pid, idx; + unsigned tpid, idx; /* treat recording of idle task as a success */ if (!tsk->pid) return 1; - if (unlikely(tsk->pid > PID_MAX_DEFAULT)) - return 0; + tpid = tsk->pid & (PID_MAX_DEFAULT - 1); /* * It's not the end of the world if we don't get @@ -2158,26 +2157,15 @@ static int trace_save_cmdline(struct tas if (!arch_spin_trylock(&trace_cmdline_lock)) return 0; - idx = savedcmd->map_pid_to_cmdline[tsk->pid]; + idx = savedcmd->map_pid_to_cmdline[tpid]; if (idx == NO_CMDLINE_MAP) { idx = (savedcmd->cmdline_idx + 1) % savedcmd->cmdline_num; - /* - * Check whether the cmdline buffer at idx has a pid - * mapped. We are going to overwrite that entry so we - * need to clear the map_pid_to_cmdline. Otherwise we - * would read the new comm for the old pid. - */ - pid = savedcmd->map_cmdline_to_pid[idx]; - if (pid != NO_CMDLINE_MAP) - savedcmd->map_pid_to_cmdline[pid] = NO_CMDLINE_MAP; - - savedcmd->map_cmdline_to_pid[idx] = tsk->pid; - savedcmd->map_pid_to_cmdline[tsk->pid] = idx; - + savedcmd->map_pid_to_cmdline[tpid] = idx; savedcmd->cmdline_idx = idx; } + savedcmd->map_cmdline_to_pid[idx] = tsk->pid; set_cmdline(idx, tsk->comm); arch_spin_unlock(&trace_cmdline_lock); @@ -2188,6 +2176,7 @@ static int trace_save_cmdline(struct tas static void __trace_find_cmdline(int pid, char comm[]) { unsigned map; + int tpid; if (!pid) { strcpy(comm, ""); @@ -2199,16 +2188,16 @@ static void __trace_find_cmdline(int pid return; } - if (pid > PID_MAX_DEFAULT) { - strcpy(comm, "<...>"); - return; + tpid = pid & (PID_MAX_DEFAULT - 1); + map = savedcmd->map_pid_to_cmdline[tpid]; + if (map != NO_CMDLINE_MAP) { + tpid = savedcmd->map_cmdline_to_pid[map]; + if (tpid == pid) { + strlcpy(comm, get_saved_cmdlines(map), TASK_COMM_LEN); + return; + } } - - map = savedcmd->map_pid_to_cmdline[pid]; - if (map != NO_CMDLINE_MAP) - strlcpy(comm, get_saved_cmdlines(map), TASK_COMM_LEN); - else - strcpy(comm, "<...>"); + strcpy(comm, "<...>"); } void trace_find_cmdline(int pid, char comm[])