From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.11]) (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 D8D5C79CD for ; Fri, 28 Nov 2025 15:17:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=198.175.65.11 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764343049; cv=fail; b=bez0lPEQjfhTBuaAwYWe0mu1H5Y1ETwNQUdKnKQmIeHLDrsgYt6PfkuoM6jB54v3OcaXeFvTHXAOURSqyXlftB8IB8VJ8cUgKEmnT8vuYM5DOEpMoipxe5oDDw4/3usLRTBQIlW1cHaVytLEpxfwDDp4F0KR9uICn6RErGUPoLY= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764343049; c=relaxed/simple; bh=KV/TZbEP7DrGxaFNnOF0rBlW9N2ea40s9OsWwA6T6IQ=; h=Message-ID:Date:Subject:To:CC:References:From:In-Reply-To: Content-Type:MIME-Version; b=qWEDF9c4HigMNDAjKxiUZH3hG7c77bROVkFc2lxlHBTqc2PuO89aTjJ45I2ZTy01D6rRqbDMZt+dycP5P8DvYr11ljKjMe0NLe/y54tFPNH1DK8+7BqVuTf6NR1mF4ov8uE6FAmlzYSKFCVfWWvk1ugptaIuBULpVQYb8WCXIb4= 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=IYYYqpXv; arc=fail smtp.client-ip=198.175.65.11 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="IYYYqpXv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1764343048; x=1795879048; h=message-id:date:subject:to:cc:references:from: in-reply-to:content-transfer-encoding:mime-version; bh=KV/TZbEP7DrGxaFNnOF0rBlW9N2ea40s9OsWwA6T6IQ=; b=IYYYqpXvIsfxy93Z5AViE6xjMTG8sUiyZ69iPbB9gTEGPJbKbMPbzsb9 VruMOhRgywdnlwCfZ5rSJT6wl5CrvKf/A0Lj9+Q/GS8TPtdYAYMVv5XGF cvPyClKW8iawy7AxoNq9FyTbUVRZJeRZr9hmW1rI+hwmPrMwHVMnDT781 tSiKPbkHixzIo4hS2BORM5BWw6AYyLzETcGRiH031ySRnjlXlg24pzhDn pH7GkUpA8z9X4Lcm6Iquay9mJdN2F4Tob/R/ivVO8bAsAIKnGiBCtmHyc YOcMWoPamqwo1xA5D4H11UWQBMMOwDCH74Bmd5utNXo0UEIJ3odlAVAoq A==; X-CSE-ConnectionGUID: yd7spDyISui1XgkLnr18Jw== X-CSE-MsgGUID: cYAdKkMeRyOcwjRAfGI7Zg== X-IronPort-AV: E=McAfee;i="6800,10657,11626"; a="76699978" X-IronPort-AV: E=Sophos;i="6.20,234,1758610800"; d="scan'208";a="76699978" Received: from fmviesa006.fm.intel.com ([10.60.135.146]) by orvoesa103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Nov 2025 07:17:27 -0800 X-CSE-ConnectionGUID: ANiepkXKRuyE2up45JzQwA== X-CSE-MsgGUID: PvlkIGGtQGKj5zTEjCv9pg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.20,234,1758610800"; d="scan'208";a="193375797" Received: from orsmsx903.amr.corp.intel.com ([10.22.229.25]) by fmviesa006.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Nov 2025 07:17:26 -0800 Received: from ORSMSX901.amr.corp.intel.com (10.22.229.23) 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.29; Fri, 28 Nov 2025 07:17:25 -0800 Received: from ORSEDG901.ED.cps.intel.com (10.7.248.11) 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.29 via Frontend Transport; Fri, 28 Nov 2025 07:17:25 -0800 Received: from CH4PR04CU002.outbound.protection.outlook.com (40.107.201.30) by edgegateway.intel.com (134.134.137.111) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Fri, 28 Nov 2025 07:17:25 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O9H+1zgNURxvnemniuoMOsggvWeWB5J2ClB3hj6Ov5k9gvPWNJQAuDJUXQGYiYn/MDDszrLRaqf5LOYfiXmF7CAUggnydgQCA0VAFA7Vx+3gBDnzw3iBZKOCNXj08mGO545SHhEd19GVoVzq2bIY/M7rz5JMlFfns92Ko6u6ojiE0gcIhHjn1aWHNrccgaaWwdgu570tIgznNBg30+6XgZ6i3b4Fu6ArFLllxX5HfjnEKUhPhwxpxdqUn4txXciG8ktR/afjWainRn6p2SXkQ6KwG6HqDRF2ehsRhM6Gz6Gg4j6081zSMxx+SfMUUwCH1D4tDsRH6vDEm6EjFh9DXw== 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=FuU2Lpe+xcWbT7m4g/c87+hsgJjecCzp67+Y9yOMoTE=; b=rkXC7h7HKC9TmQesDxUNwkNTbfbzmsi65B3NL5krUfjpXwtQ8Xs7kRNuajykLSfRi6d+4EJotq9Bcs5Zz0/uG1BA7ymZpFqSI9hNBHBytUd3q+HNQ/fM1wCCs5SaFDTueNFWOV5QYTs6SpeEKEdg6BUrLz9isLvvsIk74CUggz6PGXBNamDHlxbq1YcaHxBRIMxjBmm6krfTDgjpvlrOaUsP4ejD4AgnQBfh4yTP0tDPjfAZSwW+ARi4RvHNcOLX7YzpUNPWr8f5PXZ2hevC+enqtUBTJcKSRsQUeoNXt0s3PcCdocmJDov9gjtJuNzwnOmODnlW8uyDovG6ogqshA== 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 DS0PR11MB7926.namprd11.prod.outlook.com (2603:10b6:8:f9::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Fri, 28 Nov 2025 15:17:23 +0000 Received: from MW4PR11MB8289.namprd11.prod.outlook.com ([fe80::d626:a4f8:c029:5022]) by MW4PR11MB8289.namprd11.prod.outlook.com ([fe80::d626:a4f8:c029:5022%6]) with mapi id 15.20.9366.012; Fri, 28 Nov 2025 15:17:23 +0000 Message-ID: <9b6e39ae-c317-4433-8171-0927bce3acad@intel.com> Date: Fri, 28 Nov 2025 23:17:14 +0800 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3] mm/memory hotplug/unplug: Optimize zone->contiguous update when move pfn range To: "David Hildenbrand (Red Hat)" , Oscar Salvador , Mike Rapoport , Wei Yang CC: , Yong Hu , Nanhai Zou , Yuan Liu , Tim Chen , Qiuxu Zhuo , Yu C Chen , Pan Deng , Chen Zhang , References: <20251119114252.oykrczprf3ecd7ak@master> <20251119140657.3845818-1-tianyou.li@intel.com> <872562fa-5dd7-4cc9-82ab-5b7c09ee8fe3@kernel.org> Content-Language: en-US From: "Li, Tianyou" In-Reply-To: <872562fa-5dd7-4cc9-82ab-5b7c09ee8fe3@kernel.org> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: SG2P153CA0013.APCP153.PROD.OUTLOOK.COM (2603:1096::23) 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_|DS0PR11MB7926:EE_ X-MS-Office365-Filtering-Correlation-Id: d01205f7-f98b-4b38-c389-08de2e913b37 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?utf-8?B?N2hJbXlQTW9EdVh2dUhsajJ0WmNVS0p1L2dMM0F4SlZrSVYya01aK3pWRTFJ?= =?utf-8?B?dWdIRk1YVEJlMGlGQVBYck9QMlN5MFBEWXJNekZsR0dzdTh6Tm5iMmJuaHN4?= =?utf-8?B?WmVSbWgvTFgxYUhwOG9EKzNnWHhGZ0dKRGVXMVp4THNsSHVGSnJyYXB0ZVJE?= =?utf-8?B?eVIwOTByQURBYjI0Z2RWM2pROVpRRFRlSUliMnZ6OUpmQmtZZXRWc2pJbUN6?= =?utf-8?B?VUE2bk0vKzNGMjlacG5tU2Y0akNlS01KNUFSeUh3V3lyZ1ZyZUIvNTBiTmls?= =?utf-8?B?K01VSmdiaW1hejRodmNpakhPN205NHR4b0srOE9zRU5GVUpvWnY3cU55bk5P?= =?utf-8?B?VFlTZkF3cGRyRGFVMVFrcXNKaExSNlBwUnNjMDNXRlkxT1lNVit5NlRoUmRZ?= =?utf-8?B?OXp3bFJudnppa1VGb3VWYnZlNk4wZ1ovdGJzWmdqUkxEV3QxV1hwMEJsS29V?= =?utf-8?B?MHRaZnZZVUFsK0xQMmw0OXNOZjJ4TVlucFNHamxrL0NSd2ZhalJnQ3ljTVFL?= =?utf-8?B?Tk1mODB3a3JJS0VmdjFpenluaDBGbFdBVU9YNm1ZalYxZlJmV0hnZHBlVzB0?= =?utf-8?B?ekcwbmVpMmlucEk0Q2VLSkNIL3dOSFpMM2VVRlNHa0ttTEE2eDg2eWFzbGlD?= =?utf-8?B?djZUZ24wcGk5WlFCbzJBaks2NWdvemtCVmFSMFZUV0U2ZVJzTnIwQXBXTnRQ?= =?utf-8?B?cSttNWVQWnROeXUwc1RzVUt1dFlzaEIwUm1CNE9JbkNBRm9LLzhNc1NwYXR5?= =?utf-8?B?VUVaSTNIY3pIOGxqbitLQlFyOTlWU0FRY1JDcDhVRk5VNnZMcmI0WGQ4Q1lQ?= =?utf-8?B?TksvWml5dmhaajlCSEdCQkNxbWw1OE1wZTdsR1hIVnMrL3VHVjBEZTVrWmNM?= =?utf-8?B?dW1vQXFOQXlxOGQxa09lRWdhTktkMDNmcDRTMmFxQVRtalBKdFM5MWhpSUtZ?= =?utf-8?B?WC8zdEFIRFF3Mzh1NHVTOUNEK0ZSbVB6a25mVDNPdlNGNmpndStGeVBPSEZV?= =?utf-8?B?OHpNMUl4ekFyM3NYbFA5bmVBOE5MdnFPcE5uRHR0VkQzd3J2a0JsTVdFeFdV?= =?utf-8?B?OWFsdm9EbVhRU2szQXNzZkF4ai9Ec3VjK0VCV0czUjU1ampvT21kR0V1UXVn?= =?utf-8?B?YzdmempRU1BZVjBYTyswaEZQVHRYMk5BSng2SmFvQ2hoNWdRVGNMNThicHN5?= =?utf-8?B?cmdTdG1HTlhBZGVSTUtMMHI5NjlVR0FURk1ESkFmR3AzTldsclZRUjdVZFh0?= =?utf-8?B?VHRBTHBVWEFYQWNTOHd6TTJFOW5TU29STHZjZ3Zkci9yd1pTOGMwdnF1ZHVm?= =?utf-8?B?c3ZXcnpLNmllZEwyRjkwa29uREEvdVVRWGJrOWdRQUFlc2FmUUx4U2pISVhz?= =?utf-8?B?ZmFYUFAxYXF1WCszV1RwNGZFZXMvWlBPbTRkSUVKRWpiTzlDaDU3WkdhTDlR?= =?utf-8?B?c0xGOEZJbVIrOUpMVmJtY0NPYWZtMC9xNjAzN2ExeWpiV092STlnVDQ3S3dQ?= =?utf-8?B?THNBcFFUdTJPQkkxVFMxU0JDbmFaVmppTVcreTNBc0xzNVMzVXFoNGM4Tkp5?= =?utf-8?B?QlFobGtBVVNQNHdyQkNISW9IZ09FVGsybTZCZXNxUXI0ZzZHeU9NSXk2alhn?= =?utf-8?B?RkVieWZ5b3hEcWduMmFZUzd6NzNlaiszM2dUbzBCbGlBUnRSL2Y1dVNCZjZw?= =?utf-8?B?TkJWd0NkYmFrOTdJWGZCUTFmNGNWZkhKbHVDMEQ0VFh3MG9oTFZZZTA5NGpL?= =?utf-8?B?RTV3UURMOHdHUFVmWGtGQVVxcC9tQkgzNnBMTVZWTCtjL3E4dS9iL0s5VGRk?= =?utf-8?B?eUlHVU5jS2hUdWtueC9mYjIvbmpUUVBwUndBa1phM01SajM1L0hWbjZ4MEg2?= =?utf-8?B?bGtTeGdBeG1ZbDBZd09ZRTROSHlhMU9SV3RXd1BFdzcycDZaSlMyYkU2NER5?= =?utf-8?Q?Fnlcx0SgAwlvArMmJvO81uhQKxFJQUgr?= 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)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NmswalFMUEdwVVE5aGNHenJ0OVlrUkdpdlZienBqRmpzSHJ1aWQzdUdYc0JD?= =?utf-8?B?Q0FvODB6RmhOT2lsbHlaSmE2eDZwc0xHckRGcENramZaSUNPM09NZXVldHpT?= =?utf-8?B?a1JSZGJGRXMySDY4ZjJRcEx2clNOU0c1eVJaTzlDalZlQXNWSHN6M1QxbUxE?= =?utf-8?B?OFZPUCtOSmNvcVJpVG9uTlk4cHFVRkk2dzRtQUY2OFpZWHZ5YzJRRFJnUnhv?= =?utf-8?B?dlUvbHBvbjBYZ3RycEU5Mk5iWWxUOXlqRytFL2syYy9jVVlmbk5sbjBoeWVQ?= =?utf-8?B?b1I4cEE4ZlFyMlc4cEorYkMva3I1d2hJNmRtWm55MVhuSytSZlhSYWZyYUR3?= =?utf-8?B?SGJ3amVuc3AzcmhYa0pZa0pYTjdyUUNLdy9ORWNHMzIwNVpCUzRKbCs2TGQ0?= =?utf-8?B?WW16M2VoVGwra1JvUzJsTWl6UVZjQnlRU1prOExhNmNabzZQSEtGb2ROWE1u?= =?utf-8?B?UmM1aEJNSW1xaGV1MXdNak5mZHorZnNmTUNXU3o3dW83L2pPay9GZ2ZDd2hJ?= =?utf-8?B?WjRPeUVoelBXaDJiWEZCTlNHMmd5YnlGb2RpYUFUSFp2V1IrWm1NdUplT1RC?= =?utf-8?B?NXkydEtXd1RqWVNZajVHak9PRm9FdDR1V2JoMGo5V0FTYjE3Z0kyTEpWaitt?= =?utf-8?B?SklyRFZ5ekZMbzEvZWFVcGNEN1ZVODFEaG5qdDhOalBlS1RqQXVWWlY2Njc0?= =?utf-8?B?MXliTExxM3JlZGJTRFFQenNwV1JHbTErSythaUZvRHBFbjBpZUVBMElCWDU5?= =?utf-8?B?dHFiZUI0L0NjUzltZ0lPUzUzb1BvNVNFRS9Ub0RseEtqL1BXeURpOTFRTmRl?= =?utf-8?B?UHhXbGJlZWpKdjA5a1ZnNVphTmJ4aWh6M0hPTlJJZWdjbGVBUzIxU1NIWmxK?= =?utf-8?B?VFRxR1NabDRJZm80UHZ0di9LWThwODVyblF2WnNwak0rZTVORUNET0NkN3R0?= =?utf-8?B?aUlvOFk1WVFSby9PRXN2R1pFVC9WcDhxeklaMk5aeUpidEtRZHFac1lhVHdS?= =?utf-8?B?WnY1M2pRaEc1bXZ3aUpPeHBsckFhWDhBUjJoOGt2eHpHcXNIblhPR2M5VmJH?= =?utf-8?B?b09Ea3JIUHRkekJBdGxMdXhteVhrMGQ5UVJTU1Vkbk9XWG9NbWtpVXg4Y0tN?= =?utf-8?B?OGxoOXRZUytiR1BDYit1azMwemxiYkc5cTRzSnRiby8vOEJ4R1hRQ3RrUHF1?= =?utf-8?B?bGNKeUxTT2dtS3Y3MkZjaHNta3FpNTRwK1dhb1l4SlBaV0s5eUpWektPSGll?= =?utf-8?B?QXBxcG91T2hZZmtLUm5KNnYzT01oRUF1RjRzRStBbDNQc1BGVEdLamlNR21Y?= =?utf-8?B?NlBmeVU2TWdNcXh0cUpqaUJlRG5VYWhrb1dyd2dZa1RCUTIrays2U0NWcmJW?= =?utf-8?B?WWhkRzBzd3hINU8yR3pTYTJnRGM5dk9HWlVMV21pck5JQXBlVytpNU41VG1Q?= =?utf-8?B?cFpoMitIMWhGVm9lT3k2VXBCRzZudk90TUJHNHdCelpDVlNJeFpwT1BKc1B0?= =?utf-8?B?N002MGxudDZrc2ZvK1FkTlNPd2lpUk5HbFczUkErOWV6a281TENYb1Q3NFNj?= =?utf-8?B?ZTdOZE83UGhrdGZGN1pzWHRWc2lXYnlLWEp3WjIxTDRXeWNVTjZ3cktFM08v?= =?utf-8?B?QUcyOEJzU1NPenFsdytVdUJ3OWVjNDZhN1grdXJMMS81WkFRbHIzekQwWmxN?= =?utf-8?B?b0pZOFVQM0lOQ1hmQWdROGdRTmpiaGh0cm9uOUJKWjl5VGlnTEpnT1kvTDk0?= =?utf-8?B?amgyQ09tVGx3ckhQaFB6TmREUjhvVHRwbVY5THlHcFluMkR4WlcwK1I0NlhG?= =?utf-8?B?YjczZTNycHBFTmJmbS9hRHRUS1M2SzNsRzJybnlwazE3SUo4a3AxUVkxM1Bx?= =?utf-8?B?MElFT3pZVStvdE1nWnBJck8zQjFuS3VzanhjcTJFU0ZrNCt2a3lxYnNaT2d4?= =?utf-8?B?S2F0MmVGSjNOKzNnTm9idWhUVVhpRUxWRVl3UFZjNzlOaGJQcnRWbytpU05R?= =?utf-8?B?MU80Q0wzZXAweWYySS9jYjd4ZTAzdUwxaUs4UVlMY2tHbC9pb2pJd2M0Q0Iy?= =?utf-8?B?bDQxdUZjQUZoWFVwNHEyT2ZJUkVMMEhNdXZBd1daWi93d1lnV3paZGZlRkE5?= =?utf-8?Q?MtvQYY7aluJEgu/WexKD6kw7c?= X-MS-Exchange-CrossTenant-Network-Message-Id: d01205f7-f98b-4b38-c389-08de2e913b37 X-MS-Exchange-CrossTenant-AuthSource: MW4PR11MB8289.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Nov 2025 15:17:23.4504 (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: oFherE64TM/vUZ91ENjqipdHW0wkKa38gsY7xDoVtf4ZmF8LZ7hg4V950qjJWLd1jyHcWt5ESAQualq/2uXcwg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR11MB7926 X-OriginatorOrg: intel.com Thanks for your review David. On 11/28/2025 8:01 PM, David Hildenbrand (Red Hat) wrote: > On 11/19/25 15:06, Tianyou Li wrote: >> When invoke move_pfn_range_to_zone, it will update the >> zone->contiguous by >> checking the new zone's pfn range from the beginning to the end, >> regardless >> the previous state of the old zone. When the zone's pfn range is >> large, the >> cost of traversing the pfn range to update the zone->contiguous could be >> significant. >> >> Add fast paths to quickly detect cases where zone is definitely not >> contiguous without scanning the new zone. The cases are: when the new >> range >> did not overlap with previous range, the contiguous should be false; >> if the >> new range adjacent with the previous range, just need to check the new >> range; if the new added pages could not fill the hole of previous >> zone, the >> contiguous should be false. >> >> The following test cases of memory hotplug for a VM [1], tested in the >> environment [2], show that this optimization can significantly reduce >> the >> memory hotplug time [3]. >> >> +----------------+------+---------------+--------------+----------------+ >> >> |                | Size | Time (before) | Time (after) | Time >> Reduction | >> | +------+---------------+--------------+----------------+ >> | Memory Hotplug | 256G |      10s      |      2s      | 80%      | >> | +------+---------------+--------------+----------------+ >> |                | 512G |      33s      |      6s      | 81%      | >> +----------------+------+---------------+--------------+----------------+ >> >> >> [1] Qemu commands to hotplug 512G memory for a VM: >>      object_add memory-backend-ram,id=hotmem0,size=512G,share=on >>      device_add virtio-mem-pci,id=vmem1,memdev=hotmem0,bus=port1 >>      qom-set vmem1 requested-size 512G >> >> [2] Hardware     : Intel Icelake server >>      Guest Kernel : v6.18-rc2 >>      Qemu         : v9.0.0 >> >>      Launch VM    : >>      qemu-system-x86_64 -accel kvm -cpu host \ >>      -drive file=./Centos10_cloud.qcow2,format=qcow2,if=virtio \ >>      -drive file=./seed.img,format=raw,if=virtio \ >>      -smp 3,cores=3,threads=1,sockets=1,maxcpus=3 \ >>      -m 2G,slots=10,maxmem=2052472M \ >>      -device >> pcie-root-port,id=port1,bus=pcie.0,slot=1,multifunction=on \ >>      -device pcie-root-port,id=port2,bus=pcie.0,slot=2 \ >>      -nographic -machine q35 \ >>      -nic user,hostfwd=tcp::3000-:22 >> >>      Guest kernel auto-onlines newly added memory blocks: >>      echo online > /sys/devices/system/memory/auto_online_blocks >> >> [3] The time from typing the QEMU commands in [1] to when the output of >>      'grep MemTotal /proc/meminfo' on Guest reflects that all hotplugged >>      memory is recognized. >> >> Reported-by: Nanhai Zou >> Reported-by: Chen Zhang >> Tested-by: Yuan Liu >> Reviewed-by: Tim Chen >> Reviewed-by: Qiuxu Zhuo >> Reviewed-by: Yu C Chen >> Reviewed-by: Pan Deng >> Reviewed-by: Nanhai Zou >> Reviewed-by: Yuan Liu >> Signed-off-by: Tianyou Li >> --- >>   mm/memory_hotplug.c | 51 ++++++++++++++++++++++++++++++++++++++++++--- >>   1 file changed, 48 insertions(+), 3 deletions(-) >> >> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c >> index 0be83039c3b5..aed1827a2778 100644 >> --- a/mm/memory_hotplug.c >> +++ b/mm/memory_hotplug.c >> @@ -723,6 +723,51 @@ static void __meminit resize_pgdat_range(struct >> pglist_data *pgdat, unsigned lon >>     } >>   +static bool __meminit check_zone_contiguous_fast(struct zone *zone, >> +            unsigned long start_pfn, unsigned long nr_pages) >> +{ >> +    const unsigned long end_pfn = start_pfn + nr_pages; >> + >> +    /* >> +     * Given the moved pfn range's contiguous property is always true, >> +     * under the conditional of empty zone, the contiguous property >> should >> +     * be true. >> +     */ >> +    if (zone_is_empty(zone)) { >> +        zone->contiguous = true; >> +        return true; >> +    } >> + >> +    /* >> +     * If the moved pfn range does not intersect with the original >> zone span, >> +     * the contiguous property is surely false. >> +     */ >> +    if (end_pfn < zone->zone_start_pfn || start_pfn > >> zone_end_pfn(zone)) { >> +        zone->contiguous = false; >> +        return true; >> +    } >> + >> +    /* >> +     * If the moved pfn range is adjacent to the original zone span, >> given >> +     * the moved pfn range's contiguous property is always true, the >> zone's >> +     * contiguous property inherited from the original value. >> +     */ >> +    if (end_pfn == zone->zone_start_pfn || start_pfn == >> zone_end_pfn(zone)) >> +        return true; >> + >> +    /* >> +     * If the original zone's hole larger than the moved pages in >> the range, >> +     * the contiguous property is surely false. >> +     */ >> +    if (nr_pages < (zone->spanned_pages - zone->present_pages)) { >> +        zone->contiguous = false; >> +        return true; >> +    } >> + >> +    clear_zone_contiguous(zone); >> +    return false; >> +} >> + >>   #ifdef CONFIG_ZONE_DEVICE >>   static void section_taint_zone_device(unsigned long pfn) >>   { >> @@ -752,8 +797,7 @@ 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); >> +    const bool fast_path = check_zone_contiguous_fast(zone, >> start_pfn, nr_pages); >>         if (zone_is_empty(zone)) >>           init_currently_empty_zone(zone, start_pfn, nr_pages); >> @@ -783,7 +827,8 @@ void move_pfn_range_to_zone(struct zone *zone, >> unsigned long start_pfn, >>                MEMINIT_HOTPLUG, altmap, migratetype, >>                isolate_pageblock); >>   -    set_zone_contiguous(zone); >> +    if (!fast_path) >> +        set_zone_contiguous(zone); >>   } >>     struct auto_movable_stats { > > Agreed with Mike that we should keep clearing+resetting the bit. Got it. Worked with Yuan Liu to understand the risk that if set the zone->contiguous before the pfn range fully initialized. It seems pageblock_pfn_to_page code path could be affect thus potentially it is not safe. > Also, I don't particularly enjoy the "fast_path" terminology. Probably we > want in the end something high-level like: > > > bool definetly_contig; > > definetly_contig = clear_zone_contiguous_for_growing(zone, start_pfn, > nr_pages); > > ... > > set_zone_contiguous(zone, definetly_contig); > > > We could do something similar on the removal path then, where the zone > will for sure stay contiguous if we are removing the first/last part. > > > bool definetly_contig; > > stays_contiguous = clear_zone_contiguous_for_shrinking(zone, > start_pfn, nr_pages); > > ... > > set_zone_contiguous(zone, definetly_contig); > > > > If we can come up for a better name for definetly_contig that would be > nice. > Instead of a bool value, could the clear_zone_contiguous_for_growing and clear_zone_contiguous_for_shrinking return a enum value to indicate one of the three states: 1. DEFINITELY_CONTIGUOUS; 2. DEFINITELY_NOT_CONTIGUOUS; 3. UNDETERMINED_CONTIGUOUS? The set_zone_contiguous took the state and skip the contiguous check if  DEFINITELY_CONTIGUOUS or DEFINITELY_NOT_CONTIGUOUS. Regards, Tianyou