From patchwork Wed Jun 30 00:34:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Burton X-Patchwork-Id: 469083 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AFCD8C11F67 for ; Wed, 30 Jun 2021 00:34:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8003561D58 for ; Wed, 30 Jun 2021 00:34:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235599AbhF3Agq (ORCPT ); Tue, 29 Jun 2021 20:36:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38754 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235456AbhF3Agp (ORCPT ); Tue, 29 Jun 2021 20:36:45 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C475EC061760 for ; Tue, 29 Jun 2021 17:34:15 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id a4-20020a25f5040000b029054df41d5cceso1463969ybe.18 for ; Tue, 29 Jun 2021 17:34:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=EzPaScwUubSRz3YLFbBEVgjUC7R/UR9eloiiDUGtRi8=; b=S7TBI94l8clCQeeMdulVExy1SHCtXED/se2J7cXW8DTJw3IjXqOONlGpcBBmm7A22C 9JhxRAaNd/zMIuqrKYXtsvQaaZuqrUJo0zss1vuHOhOPsfOjIFEY1GDUt2Zz4wYICZtx SRUOpynmq8TRlIIaGQQ50N+LwXLr0kzvK6fgGnIF0RDbGS78o20Rh4FeBoE9lGk0P6dh AwI7gfEN+YccAuRwWvtKJch8kbjgC7Hy7u3WmT+s9HiH6wSvZzUTt7ZjzZ9AawiPW4Fi AIe153llj61l9qAVffmfBGpCD5ThlvE2lOfbZ4S8SJ+LFcXd0+vMl9QLj9q6CBhsxSZq hsYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=EzPaScwUubSRz3YLFbBEVgjUC7R/UR9eloiiDUGtRi8=; b=jBBaXDTe5gOnMcVijEh+MYpJW0+mIb7BGZXndaLR+rWqvmojngu3zg1plPHNpJXVJ0 Z91ReOphk4F1eva3D2JkUYHdFGyTpd9KXuzi/bXmFJ7MySEkXg9C/DnuzfN4XiLEvuz1 ML8FFUJkwu/iXcdcyDS9Xg9rRVuh4rmrVQnPCVEnd1Vwz+QykcG2OwskcLLFJLl/bkfd ihcTduEiAFvgJ2+xu/lULH63+2kI34WQj1P6L+gec8fSJC78pEXlrs7F2HeLoxOd0cKR mqDSnNpnmjOhYYl6JaZdtg+gRcXXphpSppXjYGIpXjhK0QxGOcHrQxo9STKqtvSMVcW7 JO2g== X-Gm-Message-State: AOAM533FG45oGBQqlst4IgpzaO0f5hsc3F5n1/9Dv7GL/82HLAtUuW2J Zv8sPunKmC+kubz+9Nd0Z6NcAu/0VK81/Khx X-Google-Smtp-Source: ABdhPJy1LGw05qpeX8ewnRHiyyf0hr4XcIzghqPtvXNpWiMPvxggz/lEW3Pi1FGfi9LCUdSRGuw8ULSLyUvlJMj2 X-Received: from paulburton.mtv.corp.google.com ([2620:15c:280:201:1517:9bca:ad4d:3b49]) (user=paulburton job=sendgmr) by 2002:a25:dac9:: with SMTP id n192mr25469824ybf.37.1625013255034; Tue, 29 Jun 2021 17:34:15 -0700 (PDT) Date: Tue, 29 Jun 2021 17:34:05 -0700 Message-Id: <20210630003406.4013668-1-paulburton@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.32.0.93.g670b81a890-goog Subject: [PATCH 1/2] tracing: Simplify & fix saved_tgids logic From: Paul Burton To: linux-kernel@vger.kernel.org Cc: Paul Burton , Steven Rostedt , Ingo Molnar , Joel Fernandes , stable@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org The tgid_map array records a mapping from pid to tgid, where the index of an entry within the array is the pid & the value stored at that index is the tgid. The saved_tgids_next() function iterates over pointers into the tgid_map array & dereferences the pointers which results in the tgid, but then it passes that dereferenced value to trace_find_tgid() which treats it as a pid & does a further lookup within the tgid_map array. It seems likely that the intent here was to skip over entries in tgid_map for which the recorded tgid is zero, but instead we end up skipping over entries for which the thread group leader hasn't yet had its own tgid recorded in tgid_map. A minimal fix would be to remove the call to trace_find_tgid, turning: if (trace_find_tgid(*ptr)) into: if (*ptr) ..but it seems like this logic can be much simpler if we simply let seq_read() iterate over the whole tgid_map array & filter out empty entries by returning SEQ_SKIP from saved_tgids_show(). Here we take that approach, removing the incorrect logic here entirely. Signed-off-by: Paul Burton Fixes: d914ba37d714 ("tracing: Add support for recording tgid of tasks") Cc: Steven Rostedt Cc: Ingo Molnar Cc: Joel Fernandes Cc: Reviewed-by: Joel Fernandes (Google) Reviewed-by: Joel Fernandes (Google) --- kernel/trace/trace.c | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) base-commit: 62fb9874f5da54fdb243003b386128037319b219 diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index d23a09d3eb37b..9570667310bcc 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5608,37 +5608,20 @@ static const struct file_operations tracing_readme_fops = { static void *saved_tgids_next(struct seq_file *m, void *v, loff_t *pos) { - int *ptr = v; + int pid = ++(*pos); - if (*pos || m->count) - ptr++; - - (*pos)++; - - for (; ptr <= &tgid_map[PID_MAX_DEFAULT]; ptr++) { - if (trace_find_tgid(*ptr)) - return ptr; - } + if (pid > PID_MAX_DEFAULT) + return NULL; - return NULL; + return &tgid_map[pid]; } static void *saved_tgids_start(struct seq_file *m, loff_t *pos) { - void *v; - loff_t l = 0; - - if (!tgid_map) + if (!tgid_map || *pos > PID_MAX_DEFAULT) return NULL; - v = &tgid_map[0]; - while (l <= *pos) { - v = saved_tgids_next(m, v, &l); - if (!v) - return NULL; - } - - return v; + return &tgid_map[*pos]; } static void saved_tgids_stop(struct seq_file *m, void *v) @@ -5647,9 +5630,14 @@ static void saved_tgids_stop(struct seq_file *m, void *v) static int saved_tgids_show(struct seq_file *m, void *v) { - int pid = (int *)v - tgid_map; + int *entry = (int *)v; + int pid = entry - tgid_map; + int tgid = *entry; + + if (tgid == 0) + return SEQ_SKIP; - seq_printf(m, "%d %d\n", pid, trace_find_tgid(pid)); + seq_printf(m, "%d %d\n", pid, tgid); return 0; } From patchwork Wed Jun 30 00:34:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Burton X-Patchwork-Id: 469498 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CE82CC11F67 for ; Wed, 30 Jun 2021 00:34:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AF9D761CF7 for ; Wed, 30 Jun 2021 00:34:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235642AbhF3Agu (ORCPT ); Tue, 29 Jun 2021 20:36:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38772 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235594AbhF3Agt (ORCPT ); Tue, 29 Jun 2021 20:36:49 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C0F97C061760 for ; Tue, 29 Jun 2021 17:34:21 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id 5-20020ad45b850000b02902986d9b7d2fso193612qvp.15 for ; Tue, 29 Jun 2021 17:34:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=2XuTKmc5MiUcD3IttpZN1adwmf1E7UnKBnnfEh9asIE=; b=S4++qrlNREHISaDmUEHXPnvjr5JNiG3QxU1bd+U22BonKWasfFWISE4WFqMwbiGsro 6FV0Vigj6cEo/YqiKaKGHFuTi5/GP3dFtgMn8pensTVybHIYMx5SCT98p5ax0lbpG6Lv NLmuLCLzBfMKL7t9zvocmdamq68VheY3xHWzI21GwZdQb99+LfuVabJayksQua8TW3Cd 14UhcfOX2pvTuJ3r3FkM1pLZhRd6msii8QkXPNiy6ONLo0oq9zoDuChUl1OwHfr6QVgY mHG2dkeQUKtw6xd8Vd1/hGT5WHOVtb5J89HVi2MDGVsZJw4iByvzvejICUUp+Gki6hg/ FX0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=2XuTKmc5MiUcD3IttpZN1adwmf1E7UnKBnnfEh9asIE=; b=Urw/EeI+PGeXBJFbqmk+RY8dS9BbR1mPon2uHopfwqeD9Ld0lJg6r9oefGpxKaHr+Y vt1HBHiRZrUWjYOWEQdyxS9gV5NCL9uaFcosocwO1gtcY0zbydjx6XArXI5pFiPZbDJG 17x9GUgrbTO/3jxZEbbmW2gDQpxXRq5f1caDjJ8fVCm7sRaAxXnLMj9Pe+7YZHJa14FI Yq3KWXF/Z89+ZXc+sIgxeiAMN0XxN+aJM518vXhlUcoWWR8QVEuwHNGFYj99uKAY88up 5uu0aPggtzsZe8pqGk/KrHMwqkQfcYIq/fI+DmZMUGcmeFazt6PbIo7SPnnr6qMiP2sm Pxlw== X-Gm-Message-State: AOAM5305xiJZj2iHK83ROEMlfg83I+FT8Owg12dyXLY5w06hJ7GL7wxs sqIccJnqy6wpUibLONOQmw3R/aqvao56OeR8 X-Google-Smtp-Source: ABdhPJxYfIl/RsKi8Q1Y3mmzLWSHsPkK3ATLJmVUt286PIPfoCoSEuWaEF6ttquZPkAXgO/wXL2J9ADhN52OnMoR X-Received: from paulburton.mtv.corp.google.com ([2620:15c:280:201:1517:9bca:ad4d:3b49]) (user=paulburton job=sendgmr) by 2002:a0c:f885:: with SMTP id u5mr34153484qvn.28.1625013260689; Tue, 29 Jun 2021 17:34:20 -0700 (PDT) Date: Tue, 29 Jun 2021 17:34:06 -0700 In-Reply-To: <20210630003406.4013668-1-paulburton@google.com> Message-Id: <20210630003406.4013668-2-paulburton@google.com> Mime-Version: 1.0 References: <20210630003406.4013668-1-paulburton@google.com> X-Mailer: git-send-email 2.32.0.93.g670b81a890-goog Subject: [PATCH 2/2] tracing: Resize tgid_map to PID_MAX_LIMIT, not PID_MAX_DEFAULT From: Paul Burton To: linux-kernel@vger.kernel.org Cc: Paul Burton , Steven Rostedt , Ingo Molnar , Joel Fernandes , stable@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org 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 Fixes: d914ba37d714 ("tracing: Add support for recording tgid of tasks") Cc: Steven Rostedt Cc: Ingo Molnar Cc: Joel Fernandes Cc: --- 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];