Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp1568992pxa; Thu, 20 Aug 2020 14:57:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzCZ2tqdo3wcTycWOppP2Ur+Ebli2Ql1dPENS5VTBMPzPaLIHzPM5XJ+B3eZFmnWTP79jKK X-Received: by 2002:a05:6402:456:: with SMTP id p22mr599207edw.177.1597960673313; Thu, 20 Aug 2020 14:57:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597960673; cv=none; d=google.com; s=arc-20160816; b=1EOs2ByCgiqFB6hg6GjjP+jgJVJqmiUKIYU3qUsoGkbyIeHCx6Oaw4LC0mlY1k0P3P HSm24EGH2tBewjvcn73pJe3SxNbWFO5Zv5CsJrljCaP97xptEYGQIhvwT6Ez61v38rqC kv+ocH0CRQTDVnHqkxLxnbPAx4wBAJ63ZqcxfC8vH4FDsmgWiiH6iG+856k4Gd1sJpUZ UjDHCSG3gfsfr1k3kSCxd0Hm182uVCXNOwRlMhdbKb2vS0xfGfxq+nm64lQEAI78bybV BuZQ0grW3APycDqwwkILDMhItUsLfPQRhS7Esf/nmjf6d8Uehhm5dd9aqQKVzQvcCD7J petQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=lZy+N87iKQwCWyGtKIX1MIMQ3bmhs7+wIvq7JPqCybE=; b=w5iOtP9s+vKCcclUqiwB05H9vpAfidM1myszPyrZoh4Pgk+cGpQz58Z8RxA3VesP7T iQJRmME9VwKLgChEkfrlwK/ZsJbtDQICWNRCJW0lQgdgzzFUIcIBbITyP2i2Hb5rTJiX T6xu23HxxLBD36uGyL/dW7fCbD8hHIW+heh+z4STLQgbf6oIGSTSlHwXsDmM0fvbKxjT XTcjbuKx1juF9ipcEkJbAxUAeruWqltSBKbvnoFmhlTf01tTjA23fBLXquPp0lORL6XA YtRs5DQC/xsDurl0geQk5u7y5ZBm9yHh2CCmyvogvNs1Fmb9Hfj2yGgTRgLePYnVrhDZ 8R9Q== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dp16si3304360ejc.17.2020.08.20.14.57.30; Thu, 20 Aug 2020 14:57:53 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728532AbgHTUyu (ORCPT + 99 others); Thu, 20 Aug 2020 16:54:50 -0400 Received: from mx2.suse.de ([195.135.220.15]:42190 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725820AbgHTUyt (ORCPT ); Thu, 20 Aug 2020 16:54:49 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 636AAACB5; Thu, 20 Aug 2020 20:55:15 +0000 (UTC) From: Davidlohr Bueso To: akpm@linux-foundation.org Cc: catalin.marinas@arm.com, oleg@redhat.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, dave@stgolabs.net, Davidlohr Bueso Subject: [PATCH] mm/kmemleak: rely on rcu for task stack scanning Date: Thu, 20 Aug 2020 13:39:02 -0700 Message-Id: <20200820203902.11308-1-dave@stgolabs.net> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org kmemleak_scan() currently relies on the big tasklist_lock hammer to stabilize iterating through the tasklist. Instead, this patch proposes simply using rcu along with the rcu-safe for_each_process_thread flavor (without changing scan semantics), which doesn't make use of next_thread/p->thread_group and thus cannot race with exit. Furthermore, any races with fork() and not seeing the new child should be benign as it's not running yet and can also be detected by the next scan. Signed-off-by: Davidlohr Bueso --- mm/kmemleak.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 5e252d91eb14..c0014d3b91c1 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1471,15 +1471,15 @@ static void kmemleak_scan(void) if (kmemleak_stack_scan) { struct task_struct *p, *g; - read_lock(&tasklist_lock); - do_each_thread(g, p) { + rcu_read_lock(); + for_each_process_thread(g, p) { void *stack = try_get_task_stack(p); if (stack) { scan_block(stack, stack + THREAD_SIZE, NULL); put_task_stack(p); } - } while_each_thread(g, p); - read_unlock(&tasklist_lock); + } + rcu_read_unlock(); } /* -- 2.26.2