From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2047BF9E8 for ; Mon, 9 Mar 2026 00:42:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.16 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773016943; cv=fail; b=tFuxtAOjX4Yud18kQ5fXbxn3lNM3ooRrXpVLcDBtE7K2E9JVDz3cbUGh8JN4jQSX/pemxVbJDMDVnaVsdzNj3P6u/XacNWB3aAqE2Sbvf6kKH98KkuSxwd80bnYvS3WF0GtAaRjZ1jwpTQwrdFMoQlZOXHGb/U3R2yEj7laQkv0= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773016943; c=relaxed/simple; bh=zi4p9BuaCKJsmdld/i5p6U1g4yDUxV7jBOr3wObEtyI=; h=Message-ID:Date:Subject:From:To:CC:References:In-Reply-To: Content-Type:MIME-Version; b=UbgV5UWx0quhR86unkfvY/brTSb5Z/UjslTyY5d1gJVHhSXOVr8k8WcwtdyL6+ptFLdx/fh9FpnuVsX+ecQcRV3txbjPN52/SnuLPRSFA6btBHrvneB7bZodgnvTpkeM17VW2xWQLvVBJuzq8sIFzPntKsCQzINYfilYYD/MH9Y= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=LB62AMuF; arc=fail smtp.client-ip=192.198.163.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="LB62AMuF" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1773016940; x=1804552940; h=message-id:date:subject:from:to:cc:references: in-reply-to:content-transfer-encoding:mime-version; bh=zi4p9BuaCKJsmdld/i5p6U1g4yDUxV7jBOr3wObEtyI=; b=LB62AMuFoin+NX4r8hH62UlRBLsZswID39AS8AdGhAj+4VKVVyZPIfRf hcYGBRJMmNa9kN0lpwbN5M0thDwawOYjMpNcKcOAKeR4Ov0+i0JPewVra kIwu7z4KfCU0Ke1NVjHZhtKAgRMTJFvle5NRy5XrREj84j1X4JDzgL+nA s+Sd0UksFIFUmZd7P8ZGxfoOQrQe8akcu9q8kbI2MTBFwJ13qGKq8Jyga 71+Eimyq6c8ZEVMdTocFCvsd8VBXEkM45f7L84CWTWb48f9BN8AIQj/CF DzFY4rPdaYpZ2ZoSpH8jdfXNxJ40ZXzDt0OBRyJBlHSq5HMo2YOWm1XSM A==; X-CSE-ConnectionGUID: G4IJAfM2T42SJVtfoKS2ZA== X-CSE-MsgGUID: uKe+VZqSSsmBP83zqogeyg== X-IronPort-AV: E=McAfee;i="6800,10657,11723"; a="61609221" X-IronPort-AV: E=Sophos;i="6.23,109,1770624000"; d="scan'208";a="61609221" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa110.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Mar 2026 17:42:19 -0700 X-CSE-ConnectionGUID: hM9sMTHlQy6k9VzTH5HvuQ== X-CSE-MsgGUID: MUDHD9SGR6G6nTqmg4ZJiw== X-ExtLoop1: 1 Received: from orsmsx901.amr.corp.intel.com ([10.22.229.23]) by fmviesa003.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Mar 2026 17:42:19 -0700 Received: from ORSMSX903.amr.corp.intel.com (10.22.229.25) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Sun, 8 Mar 2026 17:42:18 -0700 Received: from ORSEDG902.ED.cps.intel.com (10.7.248.12) by ORSMSX903.amr.corp.intel.com (10.22.229.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37 via Frontend Transport; Sun, 8 Mar 2026 17:42:18 -0700 Received: from BN1PR04CU002.outbound.protection.outlook.com (52.101.56.26) by edgegateway.intel.com (134.134.137.112) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Sun, 8 Mar 2026 17:42:17 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=l3niEbKoNXy0pfSUUojVfumzpBdD5bz1m+3yrtgV7dVfUpLJHRPNvmV/ctB67BlTplLdHwvxR4dJ3gxMblE7QAyI2Kh2ntlYUAN8kz+t9nVLPhUVMvp1OfBxfcqRhhkw6ZWXLYpH4GsoAWj/f5Mt5SmGtzKIJjHheWP9gR+E2+UQSnOdYKTd/L9nbqbXmbsRdtnAUWdVqcKockY345CEb1nTliu5LMah2UDDZvdda3o0m0momT0Uq2k72yoWQ2EFiyxX4qHzCDFklcUfWfXcO2H4eICqSG/rLdXYel+19txnUPTuEcvlASS3yait726m2zWXjL5In40j/KElOB8rhQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=aUj3H4MV7IiJRHIs64G/Ez4oBUvC+hi+0I9mlWF52DA=; b=mlPn7hvWmgXBJduRWkB3ymaq8/2iwP2BKwl7KCBWbN6EqUYxvsNMK7Xo2xkWxjNdDaLQ7n+ToedWq+KyQ3X3G22YEEA4vlD0MosNTd11ttqzVOUVnrKE6PzpLQggJNBuKy3kLuQu17VHVIMksB6AocJqC8R/txXahZwPfryq0lDV2WM2OvY7wtO/P8RAzhRrPITQ/I4kEo+xAnYx9exwReBUSpuhGL6ziyhQOGHIAYKAY1r4/c7kKsE7oVPMb018pUOjOdjPJkAhdflsRzI7kVyRW/f728cFpgx/6r9Sr45Jw8YlZupx6VBUVyvXLy3dhGMVGDwnwnsV+utlA2y5Vg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from MW4PR11MB8289.namprd11.prod.outlook.com (2603:10b6:303:1e8::9) by DS4PPF6915D992B.namprd11.prod.outlook.com (2603:10b6:f:fc02::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.19; Mon, 9 Mar 2026 00:42:15 +0000 Received: from MW4PR11MB8289.namprd11.prod.outlook.com ([fe80::e4be:8608:3d70:c1a1]) by MW4PR11MB8289.namprd11.prod.outlook.com ([fe80::e4be:8608:3d70:c1a1%6]) with mapi id 15.20.9700.009; Mon, 9 Mar 2026 00:42:14 +0000 Message-ID: <24ef67e7-6f0f-4544-a50c-90c4de368c40@intel.com> Date: Mon, 9 Mar 2026 08:42:06 +0800 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v9 2/2] mm/memory hotplug/unplug: Optimize zone->contiguous update when changes pfn range From: "Li, Tianyou" To: "David Hildenbrand (Arm)" , Mike Rapoport CC: Oscar Salvador , Wei Yang , Michal Hocko , , Yong Hu , Nanhai Zou , Yuan Liu , Tim Chen , Qiuxu Zhuo , Yu C Chen , Pan Deng , Chen Zhang , References: <20260130163756.2674225-1-tianyou.li@intel.com> <20260130163756.2674225-3-tianyou.li@intel.com> <3cb317fa-abe0-4946-9f00-da00bade2def@kernel.org> <6ea2dbce-c919-49d6-b2cb-255a565a94e0@kernel.org> <2cb55d76-4da7-4ebe-b23b-0abbc4d963f3@kernel.org> Content-Language: en-US In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: SI1PR02CA0040.apcprd02.prod.outlook.com (2603:1096:4:1f6::7) To MW4PR11MB8289.namprd11.prod.outlook.com (2603:10b6:303:1e8::9) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MW4PR11MB8289:EE_|DS4PPF6915D992B:EE_ X-MS-Office365-Filtering-Correlation-Id: f2c85cd1-09fd-477e-531a-08de7d74b550 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: jxwCFM0/3ejBGtAcKOf6ANgMt9o9qxOvaS3bqKhiZAtqAd7g+46IrUHUQkn7e7SMdqjhE0/nueLT6UJKd8lTdQnQTWcJH1GC6p5rEy+kOm8jSWQexb5AOrGCYtlHK8+tO05BhtQ8lZbVe4nM7cnj+U8z001bkyxODGcQ7BdGoSr+Lk6NmQadBRHscLCunFo52ym4Mxd05A/CEqMjtj74jt6l2d88XO9R/Y7VtVsSO/H6J8gcM8rLQgg0OQi6xlbYE7imIFGD1flXfBlb6i7wczkFVZ7Hm9nx2fEgnrFu3AggGTKr0gvFPk9LUf5GBqsVKh4PQrpDABnkCf68xk6rSDh2UgnGfoK4VM843/OKAzmHKGV3b6J40Utuum7WVYacR7O4KJuUPFUbNq3AVOGNKtDlOd6gtZdkhHoymY3CHxhEvfD/bS8B4/J59B7mCjLWXTBv4IcZrYZJ3eCY2HkTpXBi3JX3nIgUO45FzvMr0lZjnid4SMngN3koZ6OnLCRHTT21cfJJdcFx+NNxirfr+t6mHJtV4aLb5RR8tGXt7hFQIt1DPFNbT1ayYLnaCz1HjXDnJ/tzHZrm1fGljjzFp6yGyfwPx9Jm3SVpRiAzq6D9i7ZgSN0sRO42yXS5wKxUF/0ju1LO3eKQxSBJ8IdzD1R89yagCdshedg9B/ogBRHTOKP1QcMC8JDHmNG37hgsJnVY6Wl3Xru86/whDkeW4A8xQlpfHFd+MSxcY69j+YQ= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW4PR11MB8289.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?K3JsQVRsYktCR2kxR0FldHVjYVJqWjJNakNBcjZneVZjNVl6NG1yRXNOb2dm?= =?utf-8?B?YURvTTAvTzQzSVNmNWg3a2NmZmZVMHVDSngvamc5U0hicFAxQ0MwQ0dzd2l3?= =?utf-8?B?bWJJWUgvckEyRW1sWVF0ak9FKzhBZnJJa3pWU0dUcmtQNUp5R3ZqVUN1cmc0?= =?utf-8?B?aFk4bzIyWm4wQlpRVVZFekx0UTZoUlIrRjB4KzRSNkZqZDhRcGdLeVJXWVJr?= =?utf-8?B?QnZXNFNKdGFEdXUxbGxMejE1ZE00UDFOdUhKOEJpeDZZeTNvd3pkMFpJMDFZ?= =?utf-8?B?Mm0yS0dhZkZnTUs1VFg5TElWdXJkbTZIVjN6aGkrdmJYaElHMHVsK0haU0Zs?= =?utf-8?B?U3BJYTFrdEN4eE9SMmY5SjFMNUtML3l6QTNoRnU3KzVIMExFaUpQVUVBMElY?= =?utf-8?B?bUFBMEF6K0VuQTFuR2FNZ1QrVndHWER6U0M4U0poaTFNYzl2eTMyZXBsWnJR?= =?utf-8?B?S0xyQTFROTY4c3F5V1NzQnlRS1RKUlZKZW84aUZBU0lYYkkybDhjRER3TWNJ?= =?utf-8?B?NEZIMksyWHZsZXRlNUF1dkRLM0VQYnhTSCtxOWlmZzAxcXhURyt4U01IT2Ns?= =?utf-8?B?Qm5LdHVDWG1xbG0yeVdJUmp0dmRzUjJtek1sT1R2a0ttWnp4WWJveXA5cG5Z?= =?utf-8?B?UUVSMjhrc2I3VHMzZUszNGRVbjczbk1CWlN0dVRqY0dURHVkTTA0Y2t2OEJh?= =?utf-8?B?TzRsRDUrcFlsaVhDTndIQWVSNE43Nk52Tmp0WHdvRllqYy9XTER5RDFzMjE3?= =?utf-8?B?Q0Uwak1xSVBSbVkvMzFxZ0ZHSWZScFV2Qm9zbC9BTTZYZkk0UUJCMks4c1g5?= =?utf-8?B?RVhiSWNyTkJCZElpdFphSmxsbVNGY2s1ZXdlNWZwRGt1OXNJK2RZaFUyYnBE?= =?utf-8?B?YVhTM3ZRZ3ZQSkVEK3IvMXVpUDlNbkdDdVN0YVkyV013K1ZkUm1wK0NwTnlq?= =?utf-8?B?RGlENFo3NlQzOXMwRWdodlpyUnZzSlJHQzdIUTM1V05VV3RsQ09WMU52WnZH?= =?utf-8?B?a0tTYTlKelVHVHdHbzU0YTBPb1ZhZ0crTXpvcytranNCWHJqZ09TdmMwelVW?= =?utf-8?B?czMyUUg1WTk3OE96eUNBd0pZZkRSRGVtZFVNK0FiTzRzNHgzT2JZUWZHT01u?= =?utf-8?B?RWpIVlpsS3RlSEtBVm1jay9VTExLMEVRNTlpVkVELzNqa0liRVBpOTRJQnZJ?= =?utf-8?B?ak1QUmxuRlJQbzlhektUTUFBaDQ2N3hoVk5BTGZSZXpqTEJtQ3kzTWoyOUxH?= =?utf-8?B?VEI0NVFVQ3YvKzVlM1lQSTIxcW1ZNFB4NEQ0dEtMSWQ5UjdNYXJEMVg0VFVj?= =?utf-8?B?OUJSN0lEb05nWUJRb3FUTDArMnF4YkdhZ0VVRDRLT2FHQ3dNYm1xQ1FMSzha?= =?utf-8?B?RUVGcmRNdFdnR3dmNkJsZHV1UHBOYXM0U0p6ZU1LUHJTTEdpUjVrTkxiU2Zt?= =?utf-8?B?V0ZRQUxZejlYVml4Zy8wcXk0d0cwdkVPckhaVldLL2RaYy9PUHFIWUxoRllF?= =?utf-8?B?WGxmMXRiVFQ5S05GNHBCL1lQUWRFQS9wckYwUVRxWUkvUVZVeE9aaTRsSVZV?= =?utf-8?B?UzZQZGZVR1BJc25EeVkwMHArUmE2OWs4MmZINWVuTGZQT3VXbnJBMm9mSkZH?= =?utf-8?B?TlpxYzhQQmg3amZnZHdjTTJMSWdNaE5jM29jdTQ3bUFPVnl4MUZkOGh4L0Fa?= =?utf-8?B?aXg4bXYzbXVKMkJsTnFOVUhOcGM3VnAvbVlITlExUmVGeDVvc0VtU09VVDRK?= =?utf-8?B?UUp2SjNqZUpna3VmOU04NlZFdDdXSnZ0V2VYR09uM2dnVHArWGk5T2kxczVD?= =?utf-8?B?OEszM3hNaFBmQkZVZW5PNTFnSXl3OCtCUi9mVldFaC9WbVpsMVFFaHgzN3Vx?= =?utf-8?B?OFRlVXRia1c2LzFIakZLT2ZDM1Q4QTFPQmNnRk44QWw2MFpaZXdONEsraUdn?= =?utf-8?B?OS9mU3l3anlzdjQvdVpmUFhSeE5ndzM2dHJsdlhXRi9SaURLeGhRTTNoOUx4?= =?utf-8?B?QmtVL0FlYUFsL3FCSVo3czJRcXYzODRRQ25ZZVV4b0pHaWlRZ3gxTW1tdDND?= =?utf-8?B?dXIwM1V3ak41cG1ZbE5vTUxISXRjQ3lBazZqd0ZWQXc4WUpza2RoaG5kcnls?= =?utf-8?B?NTg0eURlZWIyVzRNMlVvdGlXTzY2YUJkQytWeW96Y2FsL3ZrY0pKMGRvZ29V?= =?utf-8?B?Y0ordDAyT1lSZ2wvcG5lVitpakF0YWIwcC9LRkU4SSszSWp3ZjhyaEJ6Qllz?= =?utf-8?B?UHluZkRGcmR0Y2tuVm1rVDlyRTE4T1d4ZUM3dkw3czBZdkx1V0RXV1gxdnRO?= =?utf-8?B?d0lTU1ViSWZWQWY5NWRHM3lXRmxRMDRkY1VnNlh3UTF3MXRwWjdFQT09?= X-MS-Exchange-CrossTenant-Network-Message-Id: f2c85cd1-09fd-477e-531a-08de7d74b550 X-MS-Exchange-CrossTenant-AuthSource: MW4PR11MB8289.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Mar 2026 00:42:14.8829 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: iuGsiDYmeMYOC+J+OQAhsJUCQGp6VDE2/DsxpNRHe4rZ+x7t2CV2A9oUO+5HolvyWg/yfKOdkMx7MW9yAa1KQw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS4PPF6915D992B X-OriginatorOrg: intel.com Hi David, Mike & Other maintainers, Just a quick update: Yuan and I created a new patch based on David and Mike's code, updated the documentation as well, performed the performance test, double check all the references etc. We observed a slightly performance regression, not sure it was caused by the environment configuration or we triggered some unexpected behavior. We might need a bit more time to investigate. Will send out the patch soon once we have confirmed data for the performance regression. Thanks. Regards, Tianyou On 2/24/2026 3:15 PM, Li, Tianyou wrote: > > On 2/11/2026 8:19 PM, David Hildenbrand (Arm) wrote: >>>>        * >>>> +     * online_pages is pages within the zone that have an online >>>> memmap. >>>> +     * online_pages include present pages and memory holes that >>>> have a >>>> +     * memmap. When spanned_pages == online_pages, pfn_to_page() >>>> can be >>>> +     * performed without further checks on any pfn within the zone >>>> span. >>> >>> Maybe pages_with_memmap? It would stand off from managed, spanned and >>> present, but it's clearer than online IMHO. >> >> offline pages also have a memmap, but that should not be touched as >> it might contain garbage. So it's a bit more tricky :) >> >>> >>>> +     * >>>>        * So present_pages may be used by memory hotplug or memory >>>> power >>>>        * management logic to figure out unmanaged pages by checking >>>>        * (present_pages - managed_pages). And managed_pages should >>>> be used >>>> @@ -967,6 +972,7 @@ struct zone { >>>>       atomic_long_t        managed_pages; >>>>       unsigned long        spanned_pages; >>>>       unsigned long        present_pages; >>>> +    unsigned long        online_pages; >>>>   #if defined(CONFIG_MEMORY_HOTPLUG) >>>>       unsigned long        present_early_pages; >>>>   #endif >>>> @@ -1051,8 +1057,6 @@ struct zone { >>>>       bool            compact_blockskip_flush; >>>>   #endif >>>> -    bool            contiguous; >>>> - >>>>       CACHELINE_PADDING(_pad3_); >>>>       /* Zone statistics */ >>>>       atomic_long_t        vm_stat[NR_VM_ZONE_STAT_ITEMS]; >>>> @@ -1124,6 +1128,23 @@ static inline bool zone_spans_pfn(const >>>> struct zone *zone, unsigned long pfn) >>>>       return zone->zone_start_pfn <= pfn && pfn < zone_end_pfn(zone); >>>>   } >>>> +/** >>>> + * zone_is_contiguous - test whether a zone is contiguous >>>> + * @zone: the zone to test. >>>> + * >>>> + * In a contiguous zone, it is valid to call pfn_to_page() on any >>>> pfn in the >>>> + * spanned zone without requiting pfn_valid() or >>>> pfn_to_online_page() checks. >>>> + * >>>> + * Returns: true if contiguous, otherwise false. >>>> + */ >>>> +static inline bool zone_is_contiguous(const struct zone *zone) >>>> +{ >>>> +    return READ_ONCE(zone->spanned_pages) == >>>> READ_ONCE(zone->online_pages); >>>> +} >>>> + >>>>   static inline bool zone_is_initialized(const struct zone *zone) >>>>   { >>>>       return zone->initialized; >>>> diff --git a/mm/internal.h b/mm/internal.h >>>> index f35dbcf99a86..6062f9b8ee62 100644 >>>> --- a/mm/internal.h >>>> +++ b/mm/internal.h >>>> @@ -716,21 +716,15 @@ extern struct page >>>> *__pageblock_pfn_to_page(unsigned long start_pfn, >>>>   static inline struct page *pageblock_pfn_to_page(unsigned long >>>> start_pfn, >>>>                   unsigned long end_pfn, struct zone *zone) >>>>   { >>>> -    if (zone->contiguous) >>>> +    if (zone_is_contiguous(zone)) >>>>           return pfn_to_page(start_pfn); >>>>       return __pageblock_pfn_to_page(start_pfn, end_pfn, zone); >>>>   } >>>> -void set_zone_contiguous(struct zone *zone); >>>>   bool pfn_range_intersects_zones(int nid, unsigned long start_pfn, >>>>                  unsigned long nr_pages); >>>> -static inline void clear_zone_contiguous(struct zone *zone) >>>> -{ >>>> -    zone->contiguous = false; >>>> -} >>>> - >>>>   extern int __isolate_free_page(struct page *page, unsigned int >>>> order); >>>>   extern void __putback_isolated_page(struct page *page, unsigned >>>> int order, >>>>                       int mt); >>>> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c >>>> index a63ec679d861..76496c1039a9 100644 >>>> --- a/mm/memory_hotplug.c >>>> +++ b/mm/memory_hotplug.c >>>> @@ -492,11 +492,11 @@ static void shrink_zone_span(struct zone >>>> *zone, unsigned long start_pfn, >>>>           pfn = find_smallest_section_pfn(nid, zone, end_pfn, >>>>                           zone_end_pfn(zone)); >>>>           if (pfn) { >>>> -            zone->spanned_pages = zone_end_pfn(zone) - pfn; >>>> +            WRITE_ONCE(zone->spanned_pages, zone_end_pfn(zone) - >>>> pfn); >>>>               zone->zone_start_pfn = pfn; >>>>           } else { >>>>               zone->zone_start_pfn = 0; >>>> -            zone->spanned_pages = 0; >>>> +            WRITE_ONCE(zone->spanned_pages, 0); >>>>           } >>>>       } else if (zone_end_pfn(zone) == end_pfn) { >>>>           /* >>>> @@ -508,10 +508,10 @@ static void shrink_zone_span(struct zone >>>> *zone, unsigned long start_pfn, >>>>           pfn = find_biggest_section_pfn(nid, zone, >>>> zone->zone_start_pfn, >>>>                              start_pfn); >>>>           if (pfn) >>>> -            zone->spanned_pages = pfn - zone->zone_start_pfn + 1; >>>> +            WRITE_ONCE(zone->spanned_pages, pfn - >>>> zone->zone_start_pfn + 1); >>>>           else { >>>>               zone->zone_start_pfn = 0; >>>> -            zone->spanned_pages = 0; >>>> +            WRITE_ONCE(zone->spanned_pages, 0); >>>>           } >>>>       } >>>>   } >>>> @@ -565,18 +565,13 @@ void remove_pfn_range_from_zone(struct zone >>>> *zone, >>>>       /* >>>>        * Zone shrinking code cannot properly deal with ZONE_DEVICE. So >>>> -     * we will not try to shrink the zones - which is okay as >>>> -     * set_zone_contiguous() cannot deal with ZONE_DEVICE either way. >>>> +     * we will not try to shrink the zones. >>>>        */ >>>>       if (zone_is_zone_device(zone)) >>>>           return; >>>> -    clear_zone_contiguous(zone); >>>> - >>>>       shrink_zone_span(zone, start_pfn, start_pfn + nr_pages); >>>>       update_pgdat_span(pgdat); >>>> - >>>> -    set_zone_contiguous(zone); >>>>   } >>>>   /** >>>> @@ -753,8 +748,6 @@ void move_pfn_range_to_zone(struct zone *zone, >>>> unsigned long start_pfn, >>>>       struct pglist_data *pgdat = zone->zone_pgdat; >>>>       int nid = pgdat->node_id; >>>> -    clear_zone_contiguous(zone); >>>> - >>>>       if (zone_is_empty(zone)) >>>>           init_currently_empty_zone(zone, start_pfn, nr_pages); >>>>       resize_zone_range(zone, start_pfn, nr_pages); >>>> @@ -782,8 +775,6 @@ void move_pfn_range_to_zone(struct zone *zone, >>>> unsigned long start_pfn, >>>>       memmap_init_range(nr_pages, nid, zone_idx(zone), start_pfn, 0, >>>>                MEMINIT_HOTPLUG, altmap, migratetype, >>>>                isolate_pageblock); >>>> - >>>> -    set_zone_contiguous(zone); >>>>   } >>>>   struct auto_movable_stats { >>>> @@ -1079,6 +1070,7 @@ void adjust_present_page_count(struct page >>>> *page, struct memory_group *group, >>>>       if (early_section(__pfn_to_section(page_to_pfn(page)))) >>>>           zone->present_early_pages += nr_pages; >>>>       zone->present_pages += nr_pages; >>>> +    WRITE_ONCE(zone->online_pages, zone->online_pages + nr_pages); >>>>       zone->zone_pgdat->node_present_pages += nr_pages; >>>>       if (group && movable) >>>> diff --git a/mm/mm_init.c b/mm/mm_init.c >>>> index 2a809cd8e7fa..e33caa6fb6fc 100644 >>>> --- a/mm/mm_init.c >>>> +++ b/mm/mm_init.c >>>> @@ -2263,9 +2263,10 @@ void __init init_cma_pageblock(struct page >>>> *page) >>>>   } >>>>   #endif >>>> -void set_zone_contiguous(struct zone *zone) >>>> +static void calc_online_pages(struct zone *zone) >>>>   { >>>>       unsigned long block_start_pfn = zone->zone_start_pfn; >>>> +    unsigned long online_pages = 0; >>>>       unsigned long block_end_pfn; >>>>       block_end_pfn = pageblock_end_pfn(block_start_pfn); >>>> @@ -2277,12 +2278,11 @@ void set_zone_contiguous(struct zone *zone) >>>>           if (!__pageblock_pfn_to_page(block_start_pfn, >>>>                            block_end_pfn, zone)) >>>> -            return; >>>> +            continue; >>>>           cond_resched(); >>>> +        online_pages += block_end_pfn - block_start_pfn; >>> >>> I think we can completely get rid of this with something like this >>> untested >>> patch to calculate zone->online_pages for coldplug: >>> >>> diff --git a/mm/mm_init.c b/mm/mm_init.c >>> index e33caa6fb6fc..ff2f75e7b49f 100644 >>> --- a/mm/mm_init.c >>> +++ b/mm/mm_init.c >>> @@ -845,9 +845,9 @@ overlap_memmap_init(unsigned long zone, unsigned >>> long *pfn) >>>    *   zone/node above the hole except for the trailing pages in the >>> last >>>    *   section that will be appended to the zone/node below. >>>    */ >>> -static void __init init_unavailable_range(unsigned long spfn, >>> -                      unsigned long epfn, >>> -                      int zone, int node) >>> +static u64 __init init_unavailable_range(unsigned long spfn, >>> +                     unsigned long epfn, >>> +                     int zone, int node) >>>   { >>>       unsigned long pfn; >>>       u64 pgcnt = 0; >>> @@ -861,6 +861,8 @@ static void __init >>> init_unavailable_range(unsigned long spfn, >>>       if (pgcnt) >>>           pr_info("On node %d, zone %s: %lld pages in unavailable >>> ranges\n", >>>               node, zone_names[zone], pgcnt); >>> + >>> +    return pgcnt; >>>   } >>>     /* >>> @@ -959,9 +961,10 @@ static void __init >>> memmap_init_zone_range(struct zone *zone, >>>       memmap_init_range(end_pfn - start_pfn, nid, zone_id, start_pfn, >>>                 zone_end_pfn, MEMINIT_EARLY, NULL, MIGRATE_MOVABLE, >>>                 false); >>> +    zone->online_pages += (end_pfn - start_pfn); >>>         if (*hole_pfn < start_pfn) >>> -        init_unavailable_range(*hole_pfn, start_pfn, zone_id, nid); >>> +        zone->online_pages += init_unavailable_range(*hole_pfn, >>> start_pfn, zone_id, nid); >>>         *hole_pfn = end_pfn; >>>   } >>> >> >> Looking at set_zone_contiguous(), __pageblock_pfn_to_page() takes >> care of a weird case where the end of a zone falls into the middle of >> a pageblock. >> >> I am not even sure if that is possible, but we could handle that >> easily in pageblock_pfn_to_page() by checking the requested range >> against the zone spanned range. >> >> Then the semantics "zone->online_pages" would be less weird and more >> closely resemble "pages with online memmap". >> >> init_unavailable_range() might indeed do the trick! >> >> @Tianyou, can you explore that direction? I know, your PTO is coming up. >> > > Hi David, > > Sorry for the late response, just come back from CNY holiday. I am > willing to explore the new direction. Will sync with Yuan in a day or > two to confirm the overall implementation and testing plan. Thanks in > advance for your time to review the new patch set once ready. > > Regards, > > Tianyou > > > >