From mboxrd@z Thu Jan 1 00:00:00 1970 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=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT 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 D0A46ECE58D for ; Mon, 7 Oct 2019 09:18:40 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 948A821655 for ; Mon, 7 Oct 2019 09:18:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 948A821655 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 40D528E0006; Mon, 7 Oct 2019 05:18:37 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 38E528E0008; Mon, 7 Oct 2019 05:18:37 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 205108E0006; Mon, 7 Oct 2019 05:18:37 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id E183A8E0007 for ; Mon, 7 Oct 2019 05:18:36 -0400 (EDT) Received: from smtpin02.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with SMTP id 7A5FB87D2 for ; Mon, 7 Oct 2019 09:18:36 +0000 (UTC) X-FDA: 76016438232.02.salt04_854de0fec0158 X-HE-Tag: salt04_854de0fec0158 X-Filterd-Recvd-Size: 6148 Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) by imf31.hostedemail.com (Postfix) with ESMTP for ; Mon, 7 Oct 2019 09:18:35 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 41809AE5E; Mon, 7 Oct 2019 09:18:34 +0000 (UTC) From: Vlastimil Babka To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, Qian Cai , "Kirill A. Shutemov" , Matthew Wilcox , Mel Gorman , Michal Hocko , Vlastimil Babka , Dmitry Vyukov , Walter Wu , Andrey Ryabinin Subject: [PATCH v3 2/3] mm, page_owner: decouple freeing stack trace from debug_pagealloc Date: Mon, 7 Oct 2019 11:18:07 +0200 Message-Id: <20191007091808.7096-3-vbabka@suse.cz> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191007091808.7096-1-vbabka@suse.cz> References: <20191007091808.7096-1-vbabka@suse.cz> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The commit 8974558f49a6 ("mm, page_owner, debug_pagealloc: save and dump freeing stack trace") enhanced page_owner to also store freeing stack tra= ce, when debug_pagealloc is also enabled. KASAN would also like to do this [1= ] to improve error reports to debug e.g. UAF issues. Kirill has suggested that= the freeing stack trace saving should be also possible to be enabled separate= ly from KASAN or debug_pagealloc, i.e. with an extra boot option. Qian argue= d that we have enough options already, and avoiding the extra overhead is not wo= rth the complications in the case of a debugging option. Kirill noted that th= e extra stack handle in struct page_owner requires 0.1% of memory. This patch therefore enables free stack saving whenever page_owner is ena= bled, regardless of whether debug_pagealloc or KASAN is also enabled. KASAN ker= nels booted with page_owner=3Don will thus benefit from the improved error rep= orts. [1] https://bugzilla.kernel.org/show_bug.cgi?id=3D203967 Suggested-by: Dmitry Vyukov Suggested-by: Walter Wu Suggested-by: Andrey Ryabinin Suggested-by: Kirill A. Shutemov Suggested-by: Qian Cai Signed-off-by: Vlastimil Babka --- Documentation/dev-tools/kasan.rst | 3 +++ mm/page_owner.c | 28 +++++++--------------------- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/Documentation/dev-tools/kasan.rst b/Documentation/dev-tools/= kasan.rst index b72d07d70239..525296121d89 100644 --- a/Documentation/dev-tools/kasan.rst +++ b/Documentation/dev-tools/kasan.rst @@ -41,6 +41,9 @@ smaller binary while the latter is 1.1 - 2 times faster= . Both KASAN modes work with both SLUB and SLAB memory allocators. For better bug detection and nicer reporting, enable CONFIG_STACKTRACE. =20 +To augment reports with last allocation and freeing stack of the physica= l page, +it is recommended to enable also CONFIG_PAGE_OWNER and boot with page_ow= ner=3Don. + To disable instrumentation for specific files or directories, add a line similar to the following to the respective kernel Makefile: =20 diff --git a/mm/page_owner.c b/mm/page_owner.c index d3cf5d336ccf..de1916ac3e24 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c @@ -24,12 +24,10 @@ struct page_owner { short last_migrate_reason; gfp_t gfp_mask; depot_stack_handle_t handle; -#ifdef CONFIG_DEBUG_PAGEALLOC depot_stack_handle_t free_handle; -#endif }; =20 -static bool page_owner_disabled =3D true; +static bool page_owner_enabled =3D false; DEFINE_STATIC_KEY_FALSE(page_owner_inited); =20 static depot_stack_handle_t dummy_handle; @@ -44,7 +42,7 @@ static int __init early_page_owner_param(char *buf) return -EINVAL; =20 if (strcmp(buf, "on") =3D=3D 0) - page_owner_disabled =3D false; + page_owner_enabled =3D true; =20 return 0; } @@ -52,10 +50,7 @@ early_param("page_owner", early_page_owner_param); =20 static bool need_page_owner(void) { - if (page_owner_disabled) - return false; - - return true; + return page_owner_enabled; } =20 static __always_inline depot_stack_handle_t create_dummy_stack(void) @@ -84,7 +79,7 @@ static noinline void register_early_stack(void) =20 static void init_page_owner(void) { - if (page_owner_disabled) + if (!page_owner_enabled) return; =20 register_dummy_stack(); @@ -148,25 +143,18 @@ void __reset_page_owner(struct page *page, unsigned= int order) { int i; struct page_ext *page_ext; -#ifdef CONFIG_DEBUG_PAGEALLOC depot_stack_handle_t handle =3D 0; struct page_owner *page_owner; =20 - if (debug_pagealloc_enabled()) - handle =3D save_stack(GFP_NOWAIT | __GFP_NOWARN); -#endif + handle =3D save_stack(GFP_NOWAIT | __GFP_NOWARN); =20 page_ext =3D lookup_page_ext(page); if (unlikely(!page_ext)) return; for (i =3D 0; i < (1 << order); i++) { __clear_bit(PAGE_EXT_OWNER_ACTIVE, &page_ext->flags); -#ifdef CONFIG_DEBUG_PAGEALLOC - if (debug_pagealloc_enabled()) { - page_owner =3D get_page_owner(page_ext); - page_owner->free_handle =3D handle; - } -#endif + page_owner =3D get_page_owner(page_ext); + page_owner->free_handle =3D handle; page_ext =3D page_ext_next(page_ext); } } @@ -450,7 +438,6 @@ void __dump_page_owner(struct page *page) stack_trace_print(entries, nr_entries, 0); } =20 -#ifdef CONFIG_DEBUG_PAGEALLOC handle =3D READ_ONCE(page_owner->free_handle); if (!handle) { pr_alert("page_owner free stack trace missing\n"); @@ -459,7 +446,6 @@ void __dump_page_owner(struct page *page) pr_alert("page last free stack trace:\n"); stack_trace_print(entries, nr_entries, 0); } -#endif =20 if (page_owner->last_migrate_reason !=3D -1) pr_alert("page has been migrated, last migrate reason: %s\n", --=20 2.23.0