From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.18]) (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 E1F5130DEC0 for ; Fri, 12 Dec 2025 05:27:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=192.198.163.18 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765517276; cv=fail; b=l+tgT6/7j/uMyTtcssFmeo4yKBq0XwmsJD5apQ80uTibP8YueoB2OJKBuKbTJ/SV6rZL7t9hTTcDyMIIOmLbfRvjYwNknvFybYpp9sMbpGDTwspT2BEZ9+3qKTjmEwo997IqUCFf6H7yg+Fnzfk8OZp9iRyGHCcMsvkT0/X93Ok= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765517276; c=relaxed/simple; bh=ca4cAp65YC4JDglaXVd3uq5EagqA4/2GBBwca9w4yDc=; h=Message-ID:Date:Subject:To:CC:References:From:In-Reply-To: Content-Type:MIME-Version; b=m5XicL6uWnQXob3ifPt9aU5MJaFU5z+UKXp5Fe7x2Y/LkOws9LMueEEliTi5EfL/+SeUi1B1eYlTyQw5WWS7TOjxPzWtXuFfvx0LgLdlBiyXBvK9XjcgvTUc1ypyFb4T+ehz1ZjZYqIRp0hoQmzHQXz9zzITCF4HfQ3pfmsVZfI= 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=fWhssGR7; arc=fail smtp.client-ip=192.198.163.18 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="fWhssGR7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1765517274; x=1797053274; h=message-id:date:subject:to:cc:references:from: in-reply-to:content-transfer-encoding:mime-version; bh=ca4cAp65YC4JDglaXVd3uq5EagqA4/2GBBwca9w4yDc=; b=fWhssGR7LZZuQFbLoXbiD9CdWECBbMbFd98LSKuCwL9OQQGs2C2Az2sj Mj0NhqnGuOY7nSmxjV2x17NjfBnpikG49+sgHterS1cJpI1vs9AP+qHph Tpv97YAAcpODcb6UPG6ABa913dtUCiT7LVqGGDKwBIQkEaf5wDi3Jpint imourKx7ttWtjAu+Wz29zRaMWXNGDdNOglNQpltc1isw6dXDps6zyonbQ rd5jiZXcMVmOy6gqWgVx8jXTs7BbETH4/Pj/st+aqL7GAj0mJxfp2IxcI OOPy8/vQxsIh23lP8cO9DWdvzbf0umv8SPdr117I0HnggktN2T33GIUYP Q==; X-CSE-ConnectionGUID: dhr3oMEeRgKCBAcJpxnA8A== X-CSE-MsgGUID: 6HIfI/p7RgKFUqmZ12Jc6Q== X-IronPort-AV: E=McAfee;i="6800,10657,11639"; a="66687955" X-IronPort-AV: E=Sophos;i="6.21,141,1763452800"; d="scan'208";a="66687955" Received: from fmviesa006.fm.intel.com ([10.60.135.146]) by fmvoesa112.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Dec 2025 21:27:52 -0800 X-CSE-ConnectionGUID: ib6gGjYDSfOOOhpqrop69A== X-CSE-MsgGUID: OVjqGNG2Th+IObuLvVIAng== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,141,1763452800"; d="scan'208";a="196898401" Received: from fmsmsx903.amr.corp.intel.com ([10.18.126.92]) by fmviesa006.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Dec 2025 21:27:52 -0800 Received: from FMSMSX901.amr.corp.intel.com (10.18.126.90) by fmsmsx903.amr.corp.intel.com (10.18.126.92) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Thu, 11 Dec 2025 21:27:51 -0800 Received: from fmsedg903.ED.cps.intel.com (10.1.192.145) by FMSMSX901.amr.corp.intel.com (10.18.126.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29 via Frontend Transport; Thu, 11 Dec 2025 21:27:51 -0800 Received: from BL0PR03CU003.outbound.protection.outlook.com (52.101.53.14) by edgegateway.intel.com (192.55.55.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Thu, 11 Dec 2025 21:27:51 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=cSlFdbBgb3aALxwnNu+XwcCM/x7U7z2jl2rvL7UkpWKYJ2m7ISNPTWjDv842PBC68ErgCdVyvJY08sZoX73AS/EVdLALXDZDwYKmctTurEmBdNTJSO+C847utJwDi+5peOLfoacyzK1S3chAcVl65rVK3sJrVWIDfwwwp1rqw5QiQdQih+u3cj4FSBdZ3J/H71pd9QSKlx0Mn4Q3yxTAyix/y7MHecUOK47dMlN7AOxb/IEBtTaFrc/I37BbV6nFElfPXA1Px+caelGLZQb/S0VkPTOVaXhNA3zS+Kvi1IXMs7fZnz9Q8jUcupuq4VIlL8lu6nzLgYoVGYtwV8C32w== 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=Hm+r/DnLJakxPacAqQScagRz2NkiVebcEelDUmfDaLQ=; b=h82IaDh1xzGsCOM4Bo2mI0hJDvRDSvEt7xwrsAQK3xhIBw3ssViBXk4ohvDdS9tqvvx+sergyVVej1OmdTbI4es0FhN7HXsu3vUK9LZtpKd2gqayiCRFYw5mKiGwuO3hz85I6DlC4ouDVEGrt3fIRav4QxAt+A+p8Nm3bMyM8BVJvAXV2vwkzd/3KRVGDajbtlTmenYmt7hRdlhhOrvHpM5HaEZPs1OrjSw70wfQW62RZ/ZgBnxtRVEq9JKxgKDXEPaAwFImsKiKDy84NO80GmCw1Y8orANJHCtnrbbvu0XGGkgK5iK18iHuqf/JwqWDLSSXUc6OIeGAaQwCrDG53w== 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 SN7PR11MB8281.namprd11.prod.outlook.com (2603:10b6:806:26b::20) by IA1PR11MB7811.namprd11.prod.outlook.com (2603:10b6:208:3f9::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.10; Fri, 12 Dec 2025 05:27:43 +0000 Received: from SN7PR11MB8281.namprd11.prod.outlook.com ([fe80::e4c6:587d:ede3:2f85]) by SN7PR11MB8281.namprd11.prod.outlook.com ([fe80::e4c6:587d:ede3:2f85%7]) with mapi id 15.20.9412.005; Fri, 12 Dec 2025 05:27:42 +0000 Message-ID: <4a81dd12-1bba-4a89-821b-7a12edc02e04@intel.com> Date: Fri, 12 Dec 2025 13:27:33 +0800 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v5 1/2] mm/memory hotplug/unplug: Optimize zone->contiguous update when changes pfn range To: Oscar Salvador CC: David Hildenbrand , Mike Rapoport , "Wei Yang" , , Yong Hu , Nanhai Zou , Yuan Liu , Tim Chen , Qiuxu Zhuo , Yu C Chen , Pan Deng , Chen Zhang , References: <20251208152544.1150732-1-tianyou.li@intel.com> <20251208152544.1150732-2-tianyou.li@intel.com> Content-Language: en-US From: "Li, Tianyou" In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: TPYP295CA0042.TWNP295.PROD.OUTLOOK.COM (2603:1096:7d0:7::20) 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: SN7PR11MB8281:EE_|IA1PR11MB7811:EE_ X-MS-Office365-Filtering-Correlation-Id: ffd4ac1f-3f9a-4779-be64-08de393f2af7 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: =?utf-8?B?L3VhODFCNGdlSmxVWWJMN3I3SVJHdWpnWVM1eklaUmRvYlhNUGZuZ1ZZdldt?= =?utf-8?B?dWJpYnM3WlkrTHBFMUtpZVU3SVVsSVBRNVdiTm5zbVo2ZzIzbFJka21ZTWhB?= =?utf-8?B?b2ljWVJjRTZYSlVEeU5WUnpZSS82RkthTEJvT1RvYVBFT1JlK2s4S29CVXpk?= =?utf-8?B?ZlBUYUFsaXovUDdWYnh3c1hCOHc4T3pCbXFSWVBESGVLc1E5M2NGS2ZaUU5j?= =?utf-8?B?eWU1ajJqTmJsNy91OUFnWElhMFgxZ3NMTC9mS1htVmVseDFXanVTcUp0TCtk?= =?utf-8?B?K293djllUEhzNXFaS3lVSnkyTlNxMHFvZDNWdmJjdEhTQjloTG5YQmJvK0tw?= =?utf-8?B?bjFEQVEvcDFXaTFBZkQzWWxvQjNSelU5cWEyeWtOVmtFWm1WUTN4SE56MzRH?= =?utf-8?B?MHoyVVpaekZvL3BaZ0tSOEZWWm9ET1ZxMkNoa3pDUkJiMzFhZDZOY1F5SlFO?= =?utf-8?B?dmE0bWpPN2phQ3hWdmRrYzBHWEN4SndqUDJuTll4a0FlaDZCSkNwZFRFOHFF?= =?utf-8?B?ckU1Y2FWcHJUUWRFRkhFbkdGNk1sdHRsekgvbVdEcU1nSnZMT0ZWL3EyREFQ?= =?utf-8?B?NHJHVEF0Q3ZteHByQzdJK3dYVU10MnNNRU54bUwzUGlBMXkzZlVvQStPZW5o?= =?utf-8?B?TXZDK1BkcEF5Y2hGc1RLeWdJYUwwNGV0U0kyUWg0Nkg0Y2VqNSswQURrbEo1?= =?utf-8?B?N0ZMN3hrUDh2cVpnQ3RScjlSM0NUSDZ6T1JGM3lsVm1SbGhnbmFHVjlyaEJP?= =?utf-8?B?U0JXck1tOTkvaTNUK0RkRGJ0Y2tsVVRucm42RG4rWGR0Vmtja2JaWHJDQUZN?= =?utf-8?B?S2dueVFjNGNOU2NNQ29RdVN4bmJ3N2JLZGI3TXRCMHhrcGNZdytYd0hvNnhs?= =?utf-8?B?RnVYd083N0NiRDJHVDArTUpEMzVUWWR4cHFCYXhjanlOZ0xOdk9zM0Y1cnhM?= =?utf-8?B?ZkJJaFdkdUh3TDdycHZURlk0dVkxd0lTR0pZVUlsdjI1V1RDQklDSHBmOGRC?= =?utf-8?B?bU9rYTE4ZVE3czdTOS9VTVo4R2YrUnQrbkt3L1NrK2ZTZHFpcTJYQkY3aXps?= =?utf-8?B?U0pxa2M1b1M5Uyt6eUxGNTZoNXhGZkVaWittRUdIeUF1WTRUSHNjM3ppS3kr?= =?utf-8?B?NmRaQVFsbGtmVWNYQ0dsNTlFS1lBaENhYUNiSi8veXVJQXhmR2tBUEJ3NG1C?= =?utf-8?B?NFNyT3o4TFVpVG4zZ2ZGZ1pBYlVxOWIzNkJSdXljQnVlSmlGRDVMR0xYVFV2?= =?utf-8?B?NHhqbHV4amhRaGRpWmJiNEJUWlQxWEt6NUVXOU8xTlhCQ3N1QVJlQm1qdUZo?= =?utf-8?B?SHI5eDJRdEl3bFl5SDc5RGRNV1gzM2MwWHA1Z2FhOWtlenpYMWE0TDVLMHVp?= =?utf-8?B?Y25lZ1pEcjhkNnhIcENWTllBRzVONGNGcXZUd0NEaVFqUDlGL3NFaGIwL1Vu?= =?utf-8?B?azY0dmsxcVZCWW1OSlUya3prRTBlYTNaUDVuKyt1U2pqc0hPZHBKMnFJSnQ2?= =?utf-8?B?SHlHQ2F2Z3lEb21PbDJJVEQyZW5CYkQxb1VLYXRSRS8ycEN0WTBCbkU5YkNu?= =?utf-8?B?MUtNWjE2b2pVaHdDS0F6WVVBMzVDckFGY004SFNDaThyS0t2V05xWVlNRmdD?= =?utf-8?B?RFJYa2FFUml4MjZQcHpxdXh1LzV2RUdhZ2ovTFlUMGs5NlAyTTUxc1R5L0lh?= =?utf-8?B?R1c5dEpWSDlsNW9oSHBwNUY0VitEcWZOdTBwT1h4Z0FJYTFtMk9DbHM5UEgw?= =?utf-8?B?MFFaME1aaTdRdGtUUnk2aU5lTkdvWnU5VTU1SHNnaEdLdzRTYStCTGhkR0dW?= =?utf-8?B?MXgwN1Zka2JzRVZqT2N3WGtOUjVmWkJLYjJNTGxadUJLWWhNOTJ0UWkrQm9z?= =?utf-8?B?a2tnUmFpZkpIT3dNV2lGOWpVVitYUWZGczZxZmNmNEZySWlaeFNsRFlHam1x?= =?utf-8?Q?/VFcZw+6qIPNu+lEPyo8O0kvK10kk810?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR11MB8281.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?Sm5pRUV1RVFpNzZNcGF6NElQSGJEczh4SzFoYW5sdGpzcFh1VEV1TzNyeFdV?= =?utf-8?B?aDArQk9uUDVWTHdoUUJpNSsyVnk1QUZzNFVoOHljVjlFUEtmU08xUkVxN1Nt?= =?utf-8?B?WllPNmdsYlV2MlZIK2pBaTZKcXpRS1JheXRkeGV6aHZHMGpUTWFabVNzVnp6?= =?utf-8?B?azd4MTRJWkQwTU9JbG5hR25HcE1rY1BOdkpIM3ozRFRnVUhRK2lTeXh1alpV?= =?utf-8?B?S0NCMURWdDAxbmNmblBpcysyWHhCSTF5QVlPa1JYMTZiR01SS2YrK2dMZ0tJ?= =?utf-8?B?d1V4eE14bHorbWNRSisrLzhVOW5qTFBtcDNnVE1seDhPODYwQkFqMXQvNEdu?= =?utf-8?B?OWJLcWFNQU5LaGNoaS9udzJGdkMxbDQ4Umw3dnJ4WEpkOGppUzVQMkg2a1Uv?= =?utf-8?B?b3dvYWM2MUFMYkJtUDlORkhjeTFrSDIzQUU5YWxBMWdmSU5VQ2xic0V2elBl?= =?utf-8?B?d0lRa2xRRDRWS01mdlBKYk8xL2FDU09VNmtiZjhRcEJMUW85S04xdG9JK1lQ?= =?utf-8?B?WjJPM1BadVI3a0xNMUZuYU45SGJZYUhTTUt3Ym9wdFJJTXM2SkFzNkRiejRt?= =?utf-8?B?OXJucC8rNHR4VXVpNlJvcEw2UTQzNUtvVW5zdUR6ZXdmK00vYlgwZ0J4QXRP?= =?utf-8?B?RDJNSW83VUFma21TMEo5NkJiMEsvaHhrektIYWQzQmtQbVAydVg5bFRxQUV4?= =?utf-8?B?dVhZMTBsZmhhZmY0NEQ0Qm5GTTc4OHJVcHZ1dWkzeE9QRldrL1g1eDdSU05R?= =?utf-8?B?TnAzNGhjTUZBSlU4M0pTRHRFQ0IvbnIrNVpsanROdXA4Q2lkSGp2SDdGUWNu?= =?utf-8?B?bWhRUVN3d2RNYUtRYWYxVVE1VU5KRVNHOW4xelQxU0tZRU1GWWVZUHpvcUpR?= =?utf-8?B?Q3BOeHF2QTJMa3BrblNCOG1McndjK3BPNmc5ckE2clY5NzdJOC94dklYa0x4?= =?utf-8?B?dDBteU8wQWZLU1pSU3hhUUhWWCtJSmpVMkhIUk9uSWVoNWtZckpPOEFNSUdp?= =?utf-8?B?WEQ3cHNFTlpWS0h4ZTJFMzg5SkZSMXAwMEUvQlBCRW45MUpmUndCeTFQY2Zm?= =?utf-8?B?anF0SlVCYTRwNFA3WUdQYncrOXZ2WDYzZmFyRnRkMTlBYWZXNUx4Y3hxY1Rw?= =?utf-8?B?Q3R6Z3VnK3lUVXNLSmJrZG91NFI5RXBXbWhRci9PdlVyc25zTUNHeVlxWEdl?= =?utf-8?B?eHFvbmVqK2pJRkRjek93TGw1dVBWcEVRQmxrb2hiOVpoQW5jQmcvamNCdWpj?= =?utf-8?B?eDJ6cFNueWFMblNPWjY0NGVmakVUOEhvc3pnZFczZE5BczFpLzRzR2tpSnZt?= =?utf-8?B?ejhYKzMrNjY3V3hrWlkzMnpWQ2NUKzY1TTl2d1lmZjZoeWZBNzVQWXc5S0tD?= =?utf-8?B?amdQT2xFdzM4ZWlQazZPYm1IS1RmSHlabjJrbVg4cFUwdUlIUFoveGFYQW9q?= =?utf-8?B?bFVXaTRaOC91TWJjZDhTdENyZFNuRUZDUW9HYmVVcmhlbUFmKytQU25lRXpu?= =?utf-8?B?TjdaQ3pPc0JHa2ZVK2QrL09BYTVsWGJ6RE54cFdTZUhDNCtQUGZHcFRYQk9x?= =?utf-8?B?T3pYc21MWFZYWlpxb2MrRkNjYzBvREdqZnJwQ2VTUk81NTF0eXRNSnRsaE15?= =?utf-8?B?QWhjRlRSV28yTFVUVmFYQS9HNys1VTc3RW0rSVJUa2lDKzhJK3poT3NUaFFX?= =?utf-8?B?OUFqUlhKbnplalZhMnlEU2I4YlE4d09OUGEzSWo4MW9WM01KMy8vdDFTYVpr?= =?utf-8?B?U2hLN1FJR29keWNtSzQ1QVpIYzQ5MktJNkI2ZmRXNVZrRkEvaElWSU9HZ3Vx?= =?utf-8?B?amlQbW9CS1FQbmNSVmE5WnNDVHBnSnA2Qk9BT096UzkvMHNqYURCeVg0U1ZC?= =?utf-8?B?OUlDbTg2VVo3Z0dIeHhDSU9HL2lzS0FlVTZZa0RyNFhCMGFMMjcyeXRBNjJW?= =?utf-8?B?SE1IUU51dDNTODQ0Tm5CSlg3VkhTZ2c0SzNWVDhiT0ZMdWc5Y2hOVFd4cWhI?= =?utf-8?B?V3JjVGhVUXJPMmVUR3JvbnhpakV4UTdqRnFsR2RUaUdXcmZQc25KOXNuUVRX?= =?utf-8?B?a0lxQUUrWVNUaWs2R0JDQVpkNk1EU0t4c0I5TjZGWEl1SXY4NFIvdFYvVTh3?= =?utf-8?Q?c3VZIKxYIrH9ePUgbn89wUSip?= X-MS-Exchange-CrossTenant-Network-Message-Id: ffd4ac1f-3f9a-4779-be64-08de393f2af7 X-MS-Exchange-CrossTenant-AuthSource: MW4PR11MB8289.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2025 05:27:42.6524 (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: C1+dgU1cXTfxV4hEhIIIBzFF7wHKcqzlnj8KU28zWyyZTMZ3fSpIYY+c6Ju6MqIjTW8qH72FCs0R6/n+K2niJQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR11MB7811 X-OriginatorOrg: intel.com On 12/11/2025 1:07 PM, Oscar Salvador wrote: > On Mon, Dec 08, 2025 at 11:25:43PM +0800, Tianyou Li wrote: >> When invoke move_pfn_range_to_zone or remove_pfn_range_from_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 | >> | +------+---------------+--------------+----------------+ >> | Plug Memory | 256G | 10s | 2s | 80% | >> | +------+---------------+--------------+----------------+ >> | | 512G | 33s | 6s | 81% | >> +----------------+------+---------------+--------------+----------------+ >> >> +----------------+------+---------------+--------------+----------------+ >> | | Size | Time (before) | Time (after) | Time Reduction | >> | +------+---------------+--------------+----------------+ >> | Unplug Memory | 256G | 10s | 2s | 80% | >> | +------+---------------+--------------+----------------+ >> | | 512G | 34s | 6s | 82% | >> +----------------+------+---------------+--------------+----------------+ >> >> [1] Qemu commands to hotplug 256G/512G memory for a VM: >> object_add memory-backend-ram,id=hotmem0,size=256G/512G,share=on >> device_add virtio-mem-pci,id=vmem1,memdev=hotmem0,bus=port1 >> qom-set vmem1 requested-size 256G/512G (Plug Memory) >> qom-set vmem1 requested-size 0G (Unplug Memory) >> >> [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 > Overall this looks good to me, thanks Tianyou Li for working on this. > Just some minor comments below: Very appreciated Oscar for your time to review the patch! Yuan and I will work on the patch v6 to address all your comments/suggestions. We will test the patch v6 across the weekend. If any other comments during those days, we will need more days probably. Thanks. >> --- >> mm/internal.h | 8 +++++- >> mm/memory_hotplug.c | 64 ++++++++++++++++++++++++++++++++++++++++++--- >> mm/mm_init.c | 13 +++++++-- >> 3 files changed, 79 insertions(+), 6 deletions(-) >> >> diff --git a/mm/internal.h b/mm/internal.h >> index 1561fc2ff5b8..1b5bba6526d4 100644 >> --- a/mm/internal.h >> +++ b/mm/internal.h >> @@ -730,7 +730,13 @@ static inline struct page *pageblock_pfn_to_page(unsigned long start_pfn, >> return __pageblock_pfn_to_page(start_pfn, end_pfn, zone); >> } >> >> -void set_zone_contiguous(struct zone *zone); >> +enum zone_contig_state { >> + ZONE_CONTIG_YES, >> + ZONE_CONTIG_NO, >> + ZONE_CONTIG_MAYBE, >> +}; >> + >> +void set_zone_contiguous(struct zone *zone, enum zone_contig_state state); >> bool pfn_range_intersects_zones(int nid, unsigned long start_pfn, >> unsigned long nr_pages); >> >> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c >> index 0be83039c3b5..d711f6e2c87f 100644 >> --- a/mm/memory_hotplug.c >> +++ b/mm/memory_hotplug.c >> @@ -544,6 +544,28 @@ static void update_pgdat_span(struct pglist_data *pgdat) >> pgdat->node_spanned_pages = node_end_pfn - node_start_pfn; >> } >> >> +static enum zone_contig_state __meminit zone_contig_state_after_shrinking( >> + struct zone *zone, unsigned long start_pfn, unsigned long nr_pages) > Why do we need the __meminit? These functions are only used from memory-hotplug > code so we should not need it? Got it. Will remove the __meminit in patch v6. >> +{ >> + const unsigned long end_pfn = start_pfn + nr_pages; >> + >> + /* >> + * If the removed pfn range inside the original zone span, the contiguous >> + * property is surely false. >> + */ >> + if (start_pfn > zone->zone_start_pfn && end_pfn < zone_end_pfn(zone)) >> + return ZONE_CONTIG_NO; >> + >> + /* If the removed pfn range is at the beginning or end of the >> + * original zone span, the contiguous property is preserved when >> + * the original zone is contiguous. >> + */ >> + if (start_pfn == zone->zone_start_pfn || end_pfn == zone_end_pfn(zone)) >> + return zone->contiguous ? ZONE_CONTIG_YES : ZONE_CONTIG_MAYBE; >> + >> + return ZONE_CONTIG_MAYBE; >> +} >> + >> void remove_pfn_range_from_zone(struct zone *zone, >> unsigned long start_pfn, >> unsigned long nr_pages) >> @@ -551,6 +573,7 @@ void remove_pfn_range_from_zone(struct zone *zone, >> const unsigned long end_pfn = start_pfn + nr_pages; >> struct pglist_data *pgdat = zone->zone_pgdat; >> unsigned long pfn, cur_nr_pages; >> + enum zone_contig_state contiguous_state = ZONE_CONTIG_MAYBE; > I think that new_contiguous_state is clearer, but I do not have a strong > opinion here. Will do in the patch v6. >> /* Poison struct pages because they are now uninitialized again. */ >> for (pfn = start_pfn; pfn < end_pfn; pfn += cur_nr_pages) { >> @@ -571,12 +594,13 @@ void remove_pfn_range_from_zone(struct zone *zone, >> if (zone_is_zone_device(zone)) >> return; >> >> + contiguous_state = zone_contig_state_after_shrinking(zone, start_pfn, nr_pages); >> clear_zone_contiguous(zone); >> >> shrink_zone_span(zone, start_pfn, start_pfn + nr_pages); >> update_pgdat_span(pgdat); >> >> - set_zone_contiguous(zone); >> + set_zone_contiguous(zone, contiguous_state); >> } >> > ... >> @@ -752,7 +809,8 @@ 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; >> - >> + const enum zone_contig_state contiguous_state = >> + zone_contig_state_after_growing(zone, start_pfn, nr_pages); > Same comment from remove_pfn_range_from_zone. Will do in the patch v6. >> clear_zone_contiguous(zone); >> >> if (zone_is_empty(zone)) >> @@ -783,7 +841,7 @@ void move_pfn_range_to_zone(struct zone *zone, unsigned long start_pfn, >> MEMINIT_HOTPLUG, altmap, migratetype, >> isolate_pageblock); >> >> - set_zone_contiguous(zone); >> + set_zone_contiguous(zone, contiguous_state); >> } >> >> struct auto_movable_stats { >> diff --git a/mm/mm_init.c b/mm/mm_init.c >> index 7712d887b696..e296bd9fac9e 100644 >> --- a/mm/mm_init.c >> +++ b/mm/mm_init.c >> @@ -2263,11 +2263,19 @@ void __init init_cma_pageblock(struct page *page) >> } >> #endif >> >> -void set_zone_contiguous(struct zone *zone) >> +void set_zone_contiguous(struct zone *zone, enum zone_contig_state state) >> { >> unsigned long block_start_pfn = zone->zone_start_pfn; >> unsigned long block_end_pfn; >> >> + if (state == ZONE_CONTIG_YES) { >> + zone->contiguous = true; >> + return; >> + } >> + >> + if (state == ZONE_CONTIG_NO) >> + return; >> + >> block_end_pfn = pageblock_end_pfn(block_start_pfn); >> for (; block_start_pfn < zone_end_pfn(zone); >> block_start_pfn = block_end_pfn, >> @@ -2283,6 +2291,7 @@ void set_zone_contiguous(struct zone *zone) >> >> /* We confirm that there is no hole */ >> zone->contiguous = true; >> + > Not needed? My mistake, thanks. Will do in the patch v6. Regards, Tianyou >> } > >