Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp622896pxv; Thu, 15 Jul 2021 11:47:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxtrsM6/8BcD0xjaHKdukVjcl1uznx1jciTmERcWtPeALBIyrIyhY3cMwk15GWpbGIa5+tL X-Received: by 2002:a6b:490d:: with SMTP id u13mr4292783iob.176.1626374865840; Thu, 15 Jul 2021 11:47:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626374865; cv=none; d=google.com; s=arc-20160816; b=ufAzqZFm1249iVEze2xU+oBuaz3twdOA6N1eAT8Hn/DMjYD4SQHTZhjXrs6HVUy1ax S6nYWAlfrDoKHlXQZjSeMtd/n8YuAdxPfgs7FvJQc+sJrr5VLLQZKZaboCEzhfRQz0+d 2nCvFgfcLvnWD+HJQevSpis5dY+d5lc1weS9VEKUBV0GaYsQMW/G0vx1nI7JUQwrg+sh a9cxbhZgVZ9JyCY70xgg8SoY65PfWcU9VDB0T0aGbsZAf0orYhE6i8urUPY7LNiF6Ynz tIrvUPv/9ayUWRDhq1Xc5g8NNEkqlbAG4EuleuX6+LYekmCwSWEEBKVEzLACz6kSg03D 9Wcg== 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=K3G8YHZJyZNae6GRYgPkVJl+Eu8erTsgbtlB+AlBX38=; b=jlkxoKQEfBoo+SUOqW23Z05OFzc5RrXiWNjfy7vsE2ov5zU+MWLkriSN4pyEG4WKBO S9/rHekyv8CNTj5Q5jgkt10fwUAD22ROm5kQtX2pkc4MoMwzyt7Eq4+QM2MKIMu5hHfq aNhhv130k5ucP3xWwfPpOeyE0SOpDguNnwH5Jt7A9Pc9JTC+HAtjOrmotaC8I/XQrcfc xt/wWcUxb+O+b8ppD65JPd216efYJ7Dosep2zVxFfyV0LzHjHXYrP6XaNIodxp0Bdfxy ZrN8kwXLjohhYHzDB0CwfQwmtB3jSeXhCJZ23mkpD9XjL4ZQ3QXe/27HHDJDkJruxGk0 1UmA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=llQZCCpj; 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 k18si4847983ilq.10.2021.07.15.11.47.33; Thu, 15 Jul 2021 11:47:45 -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=llQZCCpj; 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 S239668AbhGOSt4 (ORCPT + 99 others); Thu, 15 Jul 2021 14:49:56 -0400 Received: from mail.kernel.org ([198.145.29.99]:49824 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238643AbhGOSrn (ORCPT ); Thu, 15 Jul 2021 14:47:43 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id ABCBB613D3; Thu, 15 Jul 2021 18:44:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626374689; bh=Xh8zxHu7LFpPea9lmFpgKjXXfpGgPzqv7e2hWzzBjho=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=llQZCCpjKY0QB9fnCQxOKIC1NevVdBgO4r/YNIVTstJHSz1+9wA3TIZ7KGlVoJS65 Zn8kWcZ1GKpeDGl486Fi+8g4/YCERiNJpGMoA8SxVr9UlhzZLNvYd+secFN3YO7mHO Cf1Ggy6nGztyaWoHxaRtkwmIGuFgbGoo9Vghsl74= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ingo Molnar , Joel Fernandes , Paul Burton , "Steven Rostedt (VMware)" Subject: [PATCH 5.4 105/122] tracing: Simplify & fix saved_tgids logic Date: Thu, 15 Jul 2021 20:39:12 +0200 Message-Id: <20210715182519.845516367@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210715182448.393443551@linuxfoundation.org> References: <20210715182448.393443551@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: Paul Burton commit b81b3e959adb107cd5b36c7dc5ba1364bbd31eb2 upstream. 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. Link: https://lkml.kernel.org/r/20210630003406.4013668-1-paulburton@google.com Fixes: d914ba37d714 ("tracing: Add support for recording tgid of tasks") Cc: Ingo Molnar Cc: Joel Fernandes Cc: Signed-off-by: Paul Burton Signed-off-by: Steven Rostedt (VMware) Signed-off-by: Greg Kroah-Hartman --- kernel/trace/trace.c | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5013,37 +5013,20 @@ static const struct file_operations trac 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) @@ -5052,9 +5035,14 @@ static void saved_tgids_stop(struct seq_ 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; }