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=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 07319C5ACD8 for ; Wed, 18 Mar 2020 10:03:05 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id BFF1120768 for ; Wed, 18 Mar 2020 10:03:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BFF1120768 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 6869F6B0074; Wed, 18 Mar 2020 06:03:04 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6373F6B0075; Wed, 18 Mar 2020 06:03:04 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 525576B0078; Wed, 18 Mar 2020 06:03:04 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0026.hostedemail.com [216.40.44.26]) by kanga.kvack.org (Postfix) with ESMTP id 36A286B0074 for ; Wed, 18 Mar 2020 06:03:04 -0400 (EDT) Received: from smtpin01.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id E555237F1 for ; Wed, 18 Mar 2020 10:03:03 +0000 (UTC) X-FDA: 76608044646.01.oil93_7205a9790820d X-HE-Tag: oil93_7205a9790820d X-Filterd-Recvd-Size: 4776 Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by imf42.hostedemail.com (Postfix) with ESMTP for ; Wed, 18 Mar 2020 10:03:03 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 7734EAC6B; Wed, 18 Mar 2020 10:02:58 +0000 (UTC) Date: Wed, 18 Mar 2020 11:02:56 +0100 From: Michal Hocko To: Srikar Dronamraju Cc: Andrew Morton , linux-mm@kvack.org, Mel Gorman , Michael Ellerman , Sachin Sant , Christopher Lameter , linuxppc-dev@lists.ozlabs.org, Joonsoo Kim , Kirill Tkhai , Vlastimil Babka , Bharata B Rao , Nathan Lynch Subject: Re: [PATCH v2 1/4] mm: Check for node_online in node_present_pages Message-ID: <20200318100256.GH21362@dhcp22.suse.cz> References: <20200318072810.9735-1-srikar@linux.vnet.ibm.com> <20200318072810.9735-2-srikar@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200318072810.9735-2-srikar@linux.vnet.ibm.com> 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: On Wed 18-03-20 12:58:07, Srikar Dronamraju wrote: > Calling a kmalloc_node on a possible node which is not yet onlined can > lead to panic. Currently node_present_pages() doesn't verify the node is > online before accessing the pgdat for the node. However pgdat struct may > not be available resulting in a crash. > > NIP [c0000000003d55f4] ___slab_alloc+0x1f4/0x760 > LR [c0000000003d5b94] __slab_alloc+0x34/0x60 > Call Trace: > [c0000008b3783960] [c0000000003d5734] ___slab_alloc+0x334/0x760 (unreliable) > [c0000008b3783a40] [c0000000003d5b94] __slab_alloc+0x34/0x60 > [c0000008b3783a70] [c0000000003d6fa0] __kmalloc_node+0x110/0x490 > [c0000008b3783af0] [c0000000003443d8] kvmalloc_node+0x58/0x110 > [c0000008b3783b30] [c0000000003fee38] mem_cgroup_css_online+0x108/0x270 > [c0000008b3783b90] [c000000000235aa8] online_css+0x48/0xd0 > [c0000008b3783bc0] [c00000000023eaec] cgroup_apply_control_enable+0x2ec/0x4d0 > [c0000008b3783ca0] [c000000000242318] cgroup_mkdir+0x228/0x5f0 > [c0000008b3783d10] [c00000000051e170] kernfs_iop_mkdir+0x90/0xf0 > [c0000008b3783d50] [c00000000043dc00] vfs_mkdir+0x110/0x230 > [c0000008b3783da0] [c000000000441c90] do_mkdirat+0xb0/0x1a0 > [c0000008b3783e20] [c00000000000b278] system_call+0x5c/0x68 > > Fix this by verifying the node is online before accessing the pgdat > structure. Fix the same for node_spanned_pages() too. > > Cc: Andrew Morton > Cc: linux-mm@kvack.org > Cc: Mel Gorman > Cc: Michael Ellerman > Cc: Sachin Sant > Cc: Michal Hocko > Cc: Christopher Lameter > Cc: linuxppc-dev@lists.ozlabs.org > Cc: Joonsoo Kim > Cc: Kirill Tkhai > Cc: Vlastimil Babka > Cc: Srikar Dronamraju > Cc: Bharata B Rao > Cc: Nathan Lynch > > Reported-by: Sachin Sant > Tested-by: Sachin Sant > Signed-off-by: Srikar Dronamraju > --- > include/linux/mmzone.h | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index f3f264826423..88078a3b95e5 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -756,8 +756,10 @@ typedef struct pglist_data { > atomic_long_t vm_stat[NR_VM_NODE_STAT_ITEMS]; > } pg_data_t; > > -#define node_present_pages(nid) (NODE_DATA(nid)->node_present_pages) > -#define node_spanned_pages(nid) (NODE_DATA(nid)->node_spanned_pages) > +#define node_present_pages(nid) \ > + (node_online(nid) ? NODE_DATA(nid)->node_present_pages : 0) > +#define node_spanned_pages(nid) \ > + (node_online(nid) ? NODE_DATA(nid)->node_spanned_pages : 0) I believe this is a wrong approach. We really do not want to special case all the places which require NODE_DATA. Can we please go and allocate pgdat for all possible nodes? The current state of memory less hacks subtle bugs poping up here and there just prove that we should have done that from the very begining IMHO. > #ifdef CONFIG_FLAT_NODE_MEM_MAP > #define pgdat_page_nr(pgdat, pagenr) ((pgdat)->node_mem_map + (pagenr)) > #else > -- > 2.18.1 -- Michal Hocko SUSE Labs