Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp172935imm; Thu, 26 Jul 2018 01:13:18 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdQoJOxcT9AADQcH2JgfqcLOW95GP83xSDqlFz/DwH9hLaJFeLuJ00OHLk4lbrkNR7fVlfa X-Received: by 2002:aa7:8307:: with SMTP id t7-v6mr1068092pfm.81.1532592798127; Thu, 26 Jul 2018 01:13:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532592798; cv=none; d=google.com; s=arc-20160816; b=MMrgm7Q38UzlZXFfyFYFZyZvB8s3X0ThQZcRt9/aW0EUkxBoRQjgfoNAavflcC9f+E xmAZtrRJLWHG2JzcBFbj2k691yIweSz9kiLznwVKhpPYuwKMonG7quHhx4AUshSRIWeP KSDnMJocRcw086lZJyjZ//rqpqPPYdfoKK0Y6FSdjr4H38WUG+aBoT6LvcGRPcFoecw+ sp+6FaGor69zowFWrMPRaUGnh+AP5hEkKW5HApPuFoK/WZ4W9mKFV02/yHtc4pUAAQHB 348ZU4rhsHZBgp4PCKbDps7bMs+1Djn7BNbwfIvjsPt6U+FuOACP47YBVRhi8I4FcaGz VidA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=0jnAMZxBu6XqikybTcHEVxVx4vloIV3TBgzYaJe4Ve0=; b=US1Qmx7DB9hF+y6STV5FGKenTg+78fp3SbwyB++Yo1flYp3txBvDRAJnIXwV1NaU5v Ixg5qtCfRL9n0IUMS23AeBt8/Mgu1ROEnRK1Ay+dEmq+JMqg1fhLWj1Qnad61F6pS6au JnY8QM3Xyof+t1+1Eh/WWdvG5Bhyo6rWBY3fQg+Dpz8GvMRJLCSiLrTopSlsCuKOM9UT xosE77B77OBSKe2x7Glc9aa4aR+2RMVgcHkps289rWVHMZM68nzJy++TkJX4cO7lFtIA x84EPivPU2jHGaA3cZJ82AwDWLTQ8vV1I++17WitLM0U02rDgwcb2teWg7PwAnPg+dqL 94HA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d16-v6si784687pfe.267.2018.07.26.01.13.02; Thu, 26 Jul 2018 01:13:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729085AbeGZJ1p (ORCPT + 99 others); Thu, 26 Jul 2018 05:27:45 -0400 Received: from mx2.suse.de ([195.135.220.15]:55030 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728816AbeGZJ1p (ORCPT ); Thu, 26 Jul 2018 05:27:45 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id CA557ACDB; Thu, 26 Jul 2018 08:12:01 +0000 (UTC) Date: Thu, 26 Jul 2018 10:12:00 +0200 From: Michal Hocko To: osalvador@techadventures.net Cc: akpm@linux-foundation.org, vbabka@suse.cz, pasha.tatashin@oracle.com, mgorman@techsingularity.net, aaron.lu@intel.com, iamjoonsoo.kim@lge.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, dan.j.williams@intel.com, Oscar Salvador Subject: Re: [PATCH v3 4/5] mm/page_alloc: Move initialization of node and zones to an own function Message-ID: <20180726081200.GY28386@dhcp22.suse.cz> References: <20180725220144.11531-1-osalvador@techadventures.net> <20180725220144.11531-5-osalvador@techadventures.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180725220144.11531-5-osalvador@techadventures.net> User-Agent: Mutt/1.10.0 (2018-05-17) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu 26-07-18 00:01:43, osalvador@techadventures.net wrote: > From: Oscar Salvador > > Currently, whenever a new node is created/re-used from the memhotplug path, > we call free_area_init_node()->free_area_init_core(). > But there is some code that we do not really need to run when we are coming > from such path. > > free_area_init_core() performs the following actions: > > 1) Initializes pgdat internals, such as spinlock, waitqueues and more. > 2) Account # nr_all_pages and nr_kernel_pages. These values are used later on > when creating hash tables. > 3) Account number of managed_pages per zone, substracting dma_reserved and memmap pages. > 4) Initializes some fields of the zone structure data > 5) Calls init_currently_empty_zone to initialize all the freelists > 6) Calls memmap_init to initialize all pages belonging to certain zone > > When called from memhotplug path, free_area_init_core() only performs actions #1 and #4. > > Action #2 is pointless as the zones do not have any pages since either the node was freed, > or we are re-using it, eitherway all zones belonging to this node should have 0 pages. > For the same reason, action #3 results always in manages_pages being 0. > > Action #5 and #6 are performed later on when onlining the pages: > online_pages()->move_pfn_range_to_zone()->init_currently_empty_zone() > online_pages()->move_pfn_range_to_zone()->memmap_init_zone() > > This patch moves the node/zone initializtion to their own function, so it allows us > to create a small version of free_area_init_core(next patch), where we only perform: > > 1) Initialization of pgdat internals, such as spinlock, waitqueues and more > 4) Initialization of some fields of the zone structure data > > This patch only introduces these two functions. OK, this looks definitely better. I will have to check that all the required state is initialized properly. Considering the above explanation I would simply fold the follow up patch into this one. It is not so large it would get hard to review and you would make it clear why the work is done. > +/* > + * Set up the zone data structures: > + * - mark all pages reserved > + * - mark all memory queues empty > + * - clear the memory bitmaps > + * > + * NOTE: pgdat should get zeroed by caller. > + * NOTE: this function is only called during early init. > + */ > +static void __paginginit free_area_init_core(struct pglist_data *pgdat) now that this function is called only from the early init code we can make it s@__paginginit@__init@ AFAICS. > +{ > + enum zone_type j; > + int nid = pgdat->node_id; > > + pgdat_init_internals(pgdat); > pgdat->per_cpu_nodestats = &boot_nodestats; > > for (j = 0; j < MAX_NR_ZONES; j++) { > @@ -6310,13 +6326,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat) > * when the bootmem allocator frees pages into the buddy system. > * And all highmem pages will be managed by the buddy system. > */ > - zone->managed_pages = freesize; > - zone_set_nid(zone, nid); > - zone->name = zone_names[j]; > - zone->zone_pgdat = pgdat; > - spin_lock_init(&zone->lock); > - zone_seqlock_init(zone); > - zone_pcp_init(zone); > + zone_init_internals(zone, j, nid, freesize); > > if (!size) > continue; > -- > 2.13.6 > -- Michal Hocko SUSE Labs