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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 79E24C0219D for ; Thu, 13 Feb 2025 15:34:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F40A96B0082; Thu, 13 Feb 2025 10:34:17 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id EC9476B0083; Thu, 13 Feb 2025 10:34:17 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CCD8C6B0088; Thu, 13 Feb 2025 10:34:17 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id A58766B0082 for ; Thu, 13 Feb 2025 10:34:17 -0500 (EST) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 558634B78E for ; Thu, 13 Feb 2025 15:34:17 +0000 (UTC) X-FDA: 83115317754.17.5BC75AD Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2067.outbound.protection.outlook.com [40.107.237.67]) by imf23.hostedemail.com (Postfix) with ESMTP id 50B1E140007 for ; Thu, 13 Feb 2025 15:34:14 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=TP62ZjfW; spf=pass (imf23.hostedemail.com: domain of ziy@nvidia.com designates 40.107.237.67 as permitted sender) smtp.mailfrom=ziy@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1739460854; a=rsa-sha256; cv=pass; b=GBmm24wOR5GySBz55/NcfyxcOZBm1V20yslG3IjlCcqd9bMEnipBnu49Foj0n1b6JNCW++ EyD0rdenYUBMlkZdY/h5APn3FnrFMCpVv1jFloB11JTKRwICY5w/74P/rKVp49NQyaxYMl x+KDLPAf/3RFQpUJhBe4IaMTqhac/sE= ARC-Authentication-Results: i=2; imf23.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=TP62ZjfW; spf=pass (imf23.hostedemail.com: domain of ziy@nvidia.com designates 40.107.237.67 as permitted sender) smtp.mailfrom=ziy@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739460854; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=V0sFo1zJRjYXHferFdN4nFbPxL2f5toQZuDV0R4ddWw=; b=JWsEIZ602Rhtmh3krYiWB6EQMYq0CbcqNFtZyDrH/TWSzS6BZ2+DZ+EK9TsYSqHMWnC0J/ EeetRTJwrzS00iojvSfOmYmEczMqtcil+OUXvfND2xIBhiUXwfw5kzi8Boy3ZP3y5OivOy A54DZtxRytC4ShoElQaiwljuSaydPrg= ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NjkXCI818KAxfzne2rGgHNk2Qw6xjRBarUJpwIVgpPgOI4k1NR9xFbt/3SjOhffbqAfKoPWmPYsQ+e01vM+s5KRGUSlgQ7FVVXA6byg/CrxzxhL+gxAN6amTS0wqeiKFIcmJPWE2+kJWURSR7WZV8lVJEXEqPrTNl8P1iVwmUkj8XA0fWmRnB5ByL+cSKSy7L2B+rJ6J/3C889DG7O1SRTyH+pDvNio5VADAhuCKM72Uac+WLWP8A9dUraDBzz/LLRkx/4V2Fl79QsMKNRv24pWkIUc5ZkSwIhd4MwQN8ipPkrGDOdNsgaUSIgScbgNWM3wVEK9cnPGX70MQKLqc1g== 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=V0sFo1zJRjYXHferFdN4nFbPxL2f5toQZuDV0R4ddWw=; b=wc+Yt8mwO5wAoUD1YkwtCzPcP9JkyNUrCpohVIT00ugl2TJ4gaBf4VjXPJfOM11qrd0bbBCDlZw3zlIg2rxYbujaF64HN1gi6QjrdSMCfb8Xjj0qGskkbwFeS9Pi2A42bgwsErEzbNfQI+Gedig+e1XCjOrAsVfYGEaxUepct2zfoCJlq5vyyxN1vjMXoiaqWlzx3/xp87XYMAjBadfMWp/0f4zxsfAbSDoicUEvCC6jau+vUWFkV4IM7UcNP498gsCKiezhdY8d0uAHDWSdpO8VP8qyoXFVETcaikpHiV+JVwkMOBs3L9ythOf/hgtSbJkd6RZmJOpv9EeziJkDEg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=V0sFo1zJRjYXHferFdN4nFbPxL2f5toQZuDV0R4ddWw=; b=TP62ZjfWZXuJVqSL/dNDFw0cDXkZrFEglgZsSB6aeKpIfpccar3ifyKbGjNFy2UJSja5qrRWhOOtwPUKFCmNQ9Zi2ctHnl1ulEdUqOxnQzHjdKzEnZ2mNjgkZ7aD3wA6w7BYXOu2o06Qa9fJj/EWiNNvV7GH7xgk8FBGWUZywbjs1ZmoKp5QRF22AR5BXl2heqzuxS//D+ziD+g4aPjW8fGVQwJjRaK1JlfXNerVW6VfN522U9C/tdYF0sDlt19bWeqcwWJky+AwCtbE1CmyO+iLmA/3C7ZTSycMgiaUco2aHISLDweAZBDPstnSWHaJa8wSorQyaqdnt3LnI/Nvpw== Received: from DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) by SN7PR12MB7252.namprd12.prod.outlook.com (2603:10b6:806:2ac::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8422.18; Thu, 13 Feb 2025 15:34:08 +0000 Received: from DS7PR12MB9473.namprd12.prod.outlook.com ([fe80::5189:ecec:d84a:133a]) by DS7PR12MB9473.namprd12.prod.outlook.com ([fe80::5189:ecec:d84a:133a%5]) with mapi id 15.20.8445.013; Thu, 13 Feb 2025 15:34:08 +0000 From: Zi Yan To: Byungchul Park Cc: linux-mm@kvack.org, David Rientjes , Shivank Garg , Aneesh Kumar , David Hildenbrand , John Hubbard , Kirill Shutemov , Matthew Wilcox , Mel Gorman , "Rao, Bharata Bhasker" , Rik van Riel , RaghavendraKT , Wei Xu , Suyeon Lee , Lei Chen , "Shukla, Santosh" , "Grimm, Jon" , sj@kernel.org, shy828301@gmail.com, Liam Howlett , Gregory Price , "Huang, Ying" , kernel_team@skhynix.com Subject: Re: [RFC PATCH 4/5] mm/migrate: introduce multi-threaded page copy routine Date: Thu, 13 Feb 2025 10:34:05 -0500 X-Mailer: MailMate (2.0r6222) Message-ID: In-Reply-To: <20250213124401.GA29526@system.software.com> References: <20250103172419.4148674-1-ziy@nvidia.com> <20250103172419.4148674-5-ziy@nvidia.com> <20250213124401.GA29526@system.software.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR02CA0002.namprd02.prod.outlook.com (2603:10b6:208:fc::15) To DS7PR12MB9473.namprd12.prod.outlook.com (2603:10b6:8:252::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS7PR12MB9473:EE_|SN7PR12MB7252:EE_ X-MS-Office365-Filtering-Correlation-Id: d08961f6-028b-46ac-cf1a-08dd4c43db19 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|366016; X-Microsoft-Antispam-Message-Info: =?utf-8?B?Zkx2a0F4SW9YWEVxM0VNRE9SWjYvRnlQNTFrTDNTQTE0Qms4aVVjMHlzTWxl?= =?utf-8?B?YWo3c054eU93UUxJSjVCalE1Zkt3QnZqTHRPTGxSZGhjWEVHQ3l2cGJOU3Jr?= =?utf-8?B?ZVdvV1NsRkN3T2ZpZ24zdTdRS1lJS1daaEJNZmhZdk9tczBjYytFNktSVUlW?= =?utf-8?B?a3ZtYXZCdVhST3NMbGQ5cHdGZGFkbEJlT2pKbG9sV3hWdThNUmVjNnN6V0lh?= =?utf-8?B?eVQyc1cxOVpEUCtrSmZCeUxYT3cxTE01TWFRQVhjNlA5U1U4NWlDbUNPVE9h?= =?utf-8?B?cHlwcUd3cHptaFRIb0lKRUxrQlRmeFZmOC9LR3lUZE8xNUFjOVNWMDBRQVJZ?= =?utf-8?B?U1FsTDQxWDJhMzNhMUNCRWZSaDVFbkJ2K2d2TUN5aUZLZmpNNFZVV29PRFNr?= =?utf-8?B?NG9uYmFyMXArVXNsRks1U21idWljWDhybXhUN0luWkRrb2ZsWXJGOS9CTTVr?= =?utf-8?B?bStwWVBvMm5BdVFjbkt0TVM1UVVMZXl6WDFCN0F3empqMSt2aWdlaU5GK0I1?= =?utf-8?B?OGEyQllKa1J5a0RublNuem1JNFgvb3JHV1FHRi9NcXo5cTJCY1NvUjBMRUJ4?= =?utf-8?B?bTdzOEtybXl4SDRSeW82eGFsMmlRNUdCVFVwa1N2U0haeWtSZHJEaTNJeS9H?= =?utf-8?B?cmo3RlVSUFlnYVE4a2pOV0hUVkJqSzRHVzBmdEdUSEZSS3hMMS8xSDhHWkJr?= =?utf-8?B?WllKNUpka3AwazE4VC9sckRJU3lhamY1Yy9ZODErU1NnM3pMRUhybndFYzRN?= =?utf-8?B?d1QyRGZxeDhjbi8vQzhRcUNlYjdDNEJWeDV5aDI1OTNNUXVJTzVKRWxaZEVU?= =?utf-8?B?ZzkwSi9tZDk2djZubGxaekdSd1AxYnJtZy9yZkVqQTBhNUhIVEo4QjNZVFBT?= =?utf-8?B?OHZkQ3dJREs0V3hCY2Q3VUZ6M3ZPSnhibHJQUk9QQ1ZVMFhyVjc5QUw3V1Vl?= =?utf-8?B?QkRSdUNjajg0Y0ZYK0M2OUJhNTFDcHZXV3p3azNZWUFUd1pQM0RrRi9PdG5u?= =?utf-8?B?SU1uQ0lLQXFhdkVnd0R6T0xMK3dGNVlRVGFCTHlLTU1sSGN3dFBsZmZ5OVIw?= =?utf-8?B?bmRoK3FmdWlGcVJLczJLTU1acE1MM0ZIZUk2b1c5WnVOTTRrUUVYaVRlZjB5?= =?utf-8?B?ajNwaVVlb1JFR0ZldHFsSzBZVjZvMEZNZ3ZXM2ZnSGFYZHUyQjNMMjhKT21m?= =?utf-8?B?bWs4M1lYUkR0U2xIazRkRUlKQSsrSjgxY2FEVXpma2ZUQmhkc1NObDltZW1N?= =?utf-8?B?MzdLSENiMUxMQlhLdnA5K3VFUUwrY0pUNDVqT0dWU2lGcGpERUpXRXYxNXRa?= =?utf-8?B?SUMwWGVKemVlNnBiWHJCZEFaMlFuL1FHbG1ER0trTEZzSmRjZEtKS2NjYnlp?= =?utf-8?B?eU5OdkxyWGxTaW9EZHFYQmF6RFdackE1ZkJ4UUZDYmpPKzVSNnVNeGxFTmRK?= =?utf-8?B?OE80aWJDOTEvL1JUU0RMckFYdVovWTlxejBhWEowalU4MjFFVFE4QnAvUWkx?= =?utf-8?B?a1M2M2RHT0ZWYmFFZkR6Y1ljQkZTV0JEN1NvZDdUS3JVSndURFQ3MStxclE0?= =?utf-8?B?OFpZN0NFcCtJTFNYOHdQUFBEc0NYTklmY1VTUWVqQ1FMZDdVb3Z5MEt2ZEdC?= =?utf-8?B?ZVlUSzkvUncxcUppSnZXQjYxM3RwcG83aEtGSDI5QTdwbXB1NHRMcXpGZlB4?= =?utf-8?B?dmNWNWFUaGNhZGNnZmsya0J4OTB2T1lrRlZROHdDeVQ4OG5xNm9EWjFhRVJt?= =?utf-8?B?M2JnTkdSNTdZVGFHY1l1Q1BvOXFjR0U0Q3JNbGFNUXNEKzZPOENlVm84TVE2?= =?utf-8?B?MHp5NUplNHJ0dk13VnliRnlnQVkrbHBlTTBrZjMvWnlIMDkwaUoyaGpTRXRE?= =?utf-8?Q?MKSUmMJ04K9y3?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS7PR12MB9473.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TjNjZkJKdlkyWnV4M0pwSXBLemhGdHhsREhqNW9GQy9PYStBTXFnbVd5SmI4?= =?utf-8?B?Y3owL2VVL25ZQUhBREE4dHdmLzZJTTdjenlDRUQ0aWlXZWc4U1VTUUZCM0hO?= =?utf-8?B?Q2Z4WlRBUkdTeWVrcW5pQWJrRkRYbVVheHBXRWYwckVOQVZONmlVbERMd2ZH?= =?utf-8?B?L0hDdFpkVEJYdy9hNlpEMVVXOXVWa3I1aVpOWVB6ZE05QUJXdHZIa09UR0Jn?= =?utf-8?B?cEYreTY2TVZZMG43c1daQ3JQdUFXdW1lbUNOZ1UrMkJMdkFmQWQ0SW5aeUZr?= =?utf-8?B?RllYTzFqTDltV1VJZnBTZjZxT09RS0RxMm1yUFlXZ3IxNkd1aUNFaUxQUDJp?= =?utf-8?B?d2ZaWjhwOU5DbFFGa3dhUGFQRXBlWG0vUmdrck1LZVJCTDFrZ0xpWjUweTkz?= =?utf-8?B?cGs0TXI0Y3k5OXhpc0lWcmdvZ29ydlN4MGlSczlreGtRVFA0amZSS3NiNTds?= =?utf-8?B?TmNMMEVFYUZWbTJZNk5KZ3pjMnhjQnJPN3hRUGN5QkhDUkdPV3RnMGxFQlpx?= =?utf-8?B?Q2lYNG5KUU9Caklac0ZzMzB6aWxmV0ZCNW5DRjRqUHE5T1lydCtJK2V0TXdJ?= =?utf-8?B?eHFoUHpGcGZNWTFTc0Y3bGlTNURZLzZoK0pYSkJYb3M0M3VzWXRqVEZsZ3Y5?= =?utf-8?B?enhMWnlhUnozRkpLcVFOSXBlSnB4aUtWTFBLM09rN1AvUW02eVhzekFWL2Rx?= =?utf-8?B?SjF2K2lGK2lOdDdKeDJGSlREejRrNU1XdjFkMzVFQ1l1cWpjZDJQekl1U3Vs?= =?utf-8?B?Z2xZU2JYY2sxQkVRbzNORW56WUV4cnMzWC9tcXlacnVNeUtDd29nSFNYbEh6?= =?utf-8?B?cnlvRkc0SEhPMnlQL2l3eVlpbkQrZEhBR01mZEkzOUpTN0FYUlYxVk5Ra1Bi?= =?utf-8?B?SnRwTWVHOEczRVMvWTZwRG4xckEzNkc1dnc3aXQ0ZnhBa0w1TVEzeTA5L29C?= =?utf-8?B?NEltNnNYMmkwTjIrTkd3RHFRU0dyeStVT1YrdzJ4L3g3aTBGVnFiK2NHY1Qw?= =?utf-8?B?b1hMRkZCVmVDaC9VV3pzazhha1dBaXJ5cXVTck5YZVI4L3oxT3NHNlUwMmFX?= =?utf-8?B?amorVDdiOGxEOTJ0QzhUYXBHd3U5OUx2a0NIYkI2T1RYMmNJaE9MSmQrN3hB?= =?utf-8?B?d0IxdE5HS056TUJRUlg3Qk1JMHVXV1VhSHc5dWlCaWFha3dXcXZXVlFwNHVS?= =?utf-8?B?c09Yam52OXRpMFJoUmtoaDRRQ0d1ZGdheStCZzVHbkNNVDNpVnZVSitJQ0Jz?= =?utf-8?B?clR6NUJvVGZPZHRvNWFHUDlMdkZucVlOMzZFWEpOZU1WUHlXQitrUlJ0dm50?= =?utf-8?B?cEpxdVA0cWtuaHI1eFFVeGkyelFtVmNjSFFKSjdqSmNMY3lHaDd4cVJrQ0g3?= =?utf-8?B?TW5CalBrTkYxNkpDUUFHQVVYbjBxMTQrVm5SQTBTOTcvcU9FbnNsZFk0NFJp?= =?utf-8?B?WVJaYndBcDBEd3hXU0ZHaXE3NTRwWk0xNk5xbVhFbk9aUWsrb2E2SnNOSHJB?= =?utf-8?B?NUNkSTJsaVU1Z1lpd3dITGhUTyt4K2xWeWkvRGg1OHloV1VFN1VXOWR2M0FN?= =?utf-8?B?cUN2V0ZBaDZibzZyNkJFRmFyM0o5MEpuT3BwbVJ0cy95dENNNk5jV2xDcEhY?= =?utf-8?B?VmtiS1ViWVAzU3Bic2dXdHVDMjZFcm9VdzVmQUJlb2xmejJFaklVL0V5dHVl?= =?utf-8?B?NHRqdVBaSzNFL1lKNW1vUlVCc1o3bVVGYnhVbUhLS21MRkg0bVJ6YzBsdFBv?= =?utf-8?B?ZzZuZk0yTlozNmc3SmxxcXNFVSt0NW1OTzdnamsyVVRTaUVIeFljUk1ueE43?= =?utf-8?B?bHdyYlNSbGJ2MjBxb0ZHOWtRUGpFamxMRFNvQ2xOS1huQnVnVFplbng5UFhC?= =?utf-8?B?RzVOemtVNHJrOUlHNTFSRiswVVRVWDUzbXg2RmZvYkJUMVE2ejlRbXdpcVo4?= =?utf-8?B?c0I0d2pzaGZVVGNuK05lNHJyM1Vsc3k0VzF6Ym80OFhZWXNFYVgvSkR0amcx?= =?utf-8?B?R25DdmNvV1daR2VtYmd4VmJ5NkNLOFpwV3JQQ2MyM05kR1VzRUMwZkVzQWxQ?= =?utf-8?B?UDJzaHJHdGRGUTZRdUFYd1lCWkRwUkpZaldETnFBaTk5WHRTaFk5WWJXcmJv?= =?utf-8?Q?8xobO/TpMRZblSVE9KkDKUae0?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d08961f6-028b-46ac-cf1a-08dd4c43db19 X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB9473.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Feb 2025 15:34:08.0499 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hPc8fG4W9HOIDbJ1u4udgRfoNRKC58NHHcY9y/YSTwrZ22DeG9U9dJ8p6iNHGqHt X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7252 X-Stat-Signature: 6twaqfak6371o8r9p7m7jtnby5hi56z5 X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 50B1E140007 X-Rspam-User: X-HE-Tag: 1739460854-961235 X-HE-Meta: U2FsdGVkX19qyI408XhcvZOM//JJGB60Sj7bLA3wKJ0SL3qzGS+5Oy97K78/GzvykDLUjGkg5a3CsHp97Kl4Y0RXnOsJK8OTk3WJtN4Bl05rgWQW2xLrq/2Oo1TCTZuEcUir4Bsm43HcQJFleknW8xK++Cf1GmKFnIzwplRDQ3c3AwuaT0xBP9cWWL3MFuftteRZZu9G4R0RcFdaAfSjBzxa6wa+9DAEu+vMr4IxrJtzZAD4GrXv8YDTVsz2AyRdXhqRxwqFAsHhYGy7SwzM8vRCzaXprjWPaVjl+jG2Em7z+U1B/rN8OTjb/HaA/B6tZDdfRlRuyULeFQqD9bbVhlgFVh9tumIH8Ta7TP5xgrRXf+GU+TL9YS4Ndvh688NAhaGt7LE7AF3veY/lk7ypmRZwh9UJQr4oECoV9GF+x4dtbYnwm1SXw776GVFmuhIQbwqyr8bMtD/lNDvdgD5VYIzwctLv7Ft6KHl/03O0jIvBkDHxfrrBfM5ez9HnClqmTaUuPo+6eJPdZMSjRclsY4h5NGNrfFoohNYN8b/tn3iF2Q9XN4vyOQZB/3fv2obdby0dt2aEWXKgYEQ/ZBA0kwcc4lY0/hYR1wuilRA6BlXXIy4rKEx2tMNF/VO0Sfxkv4YPBClkBU8dfRQhWweJDSE96yO9tC585n7KdRGLryOjaacnrqZLwfl3Qhp3e2A7ziNGP0jsW3OveAiO1tvbyaijmoUVO2bgI9G3aaQwZzhGDHJ60MOYn9VG3ikMdAgXmO/fOT2ktSgsory2yigL1gjtkMe3Ita1O+Hpj0wh2aPXJNlY0YQPjlgsXMEVVfWuLNLR8jH2IHo+kkkNpa9riXhlEKa/563cqJ4OCiUs1TZpwDmt/RAinKZY9MmnqqEIc+O0qnab5iNqtPKrqXk7vHIb/LTta4BqOPxRo4Oos1Q+6BNgnmKdUnC+cqHPPKQJmUd3iF321B8uV9K5o8C 2YUrhaWL gfuWMYvjO2SpFkJRs7TlrotaV1z4sR6KfLCteTzTFitseCKIQgG+/CVQQlpsSQfLIhIcc1V2fA6opmPJT91+aWSAgKN4PCJl/2b0EVj4BAFnXTqGLjX/PRx8yIaVCgx076PLb2GWGu5Oq/ZwvSBGfcgNuvKK+USUv8i6/PVdIxMt6maQp1RF77h8m0d1NwtyasxMGXvPKawODlnPOIb417eHgSEwmzmSh81n7sXmEUuPnWR7Ky9yzaNlXiaMx0xvPS0sITSsrSplbvyvQBH+21KAnMynILBE8mitaf4uLitpCi6Lgm/RWgW+kqen61XIkfhZuKF4D4aI01PAPs5ixpa6hF6CsW/mZ99jTE9tSex1/TGWj8p2cOVSz7T3UeggFLpvHk11IksmIbJOSZnHd2gs8PujSCqXdBYR7Ut2YdO3HI4+R6nv9lirbjlz0r5Ppe5SvQd8hrujcIH9u1VV/uO9do+F+C+FJ680xLEIl8wtLaK3xBnEhEmafvMEIDBuctZPO 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: List-Subscribe: List-Unsubscribe: On 13 Feb 2025, at 7:44, Byungchul Park wrote: > On Fri, Jan 03, 2025 at 12:24:18PM -0500, Zi Yan wrote: >> Now page copies are batched, multi-threaded page copy can be used to >> increase page copy throughput. Add copy_page_lists_mt() to copy pages in >> multi-threaded manners. Empirical data show more than 32 base pages are >> needed to show the benefit of using multi-threaded page copy, so use 32 = as >> the threshold. >> >> Signed-off-by: Zi Yan >> --- >> include/linux/migrate.h | 3 + >> mm/Makefile | 2 +- >> mm/copy_pages.c | 186 ++++++++++++++++++++++++++++++++++++++++ >> mm/migrate.c | 19 ++-- >> 4 files changed, 199 insertions(+), 11 deletions(-) >> create mode 100644 mm/copy_pages.c >> >> diff --git a/include/linux/migrate.h b/include/linux/migrate.h >> index 29919faea2f1..a0124f4893b0 100644 >> --- a/include/linux/migrate.h >> +++ b/include/linux/migrate.h >> @@ -80,6 +80,9 @@ void folio_migrate_flags(struct folio *newfolio, struc= t folio *folio); >> int folio_migrate_mapping(struct address_space *mapping, >> struct folio *newfolio, struct folio *folio, int extra_count); >> >> +int copy_page_lists_mt(struct list_head *dst_folios, >> + struct list_head *src_folios, int nr_items); >> + >> #else >> >> static inline void putback_movable_pages(struct list_head *l) {} >> diff --git a/mm/Makefile b/mm/Makefile >> index 850386a67b3e..f8c7f6b4cebb 100644 >> --- a/mm/Makefile >> +++ b/mm/Makefile >> @@ -92,7 +92,7 @@ obj-$(CONFIG_KMSAN) +=3D kmsan/ >> obj-$(CONFIG_FAILSLAB) +=3D failslab.o >> obj-$(CONFIG_FAIL_PAGE_ALLOC) +=3D fail_page_alloc.o >> obj-$(CONFIG_MEMTEST) +=3D memtest.o >> -obj-$(CONFIG_MIGRATION) +=3D migrate.o >> +obj-$(CONFIG_MIGRATION) +=3D migrate.o copy_pages.o >> obj-$(CONFIG_NUMA) +=3D memory-tiers.o >> obj-$(CONFIG_DEVICE_MIGRATION) +=3D migrate_device.o >> obj-$(CONFIG_TRANSPARENT_HUGEPAGE) +=3D huge_memory.o khugepaged.o >> diff --git a/mm/copy_pages.c b/mm/copy_pages.c >> new file mode 100644 >> index 000000000000..0e2231199f66 >> --- /dev/null >> +++ b/mm/copy_pages.c >> @@ -0,0 +1,186 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +/* >> + * Parallel page copy routine. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> + >> +unsigned int limit_mt_num =3D 4; >> + >> +struct copy_item { >> + char *to; >> + char *from; >> + unsigned long chunk_size; >> +}; >> + >> +struct copy_page_info { >> + struct work_struct copy_page_work; >> + unsigned long num_items; >> + struct copy_item item_list[]; >> +}; >> + >> +static void copy_page_routine(char *vto, char *vfrom, >> + unsigned long chunk_size) >> +{ >> + memcpy(vto, vfrom, chunk_size); >> +} >> + >> +static void copy_page_work_queue_thread(struct work_struct *work) >> +{ >> + struct copy_page_info *my_work =3D (struct copy_page_info *)work; >> + int i; >> + >> + for (i =3D 0; i < my_work->num_items; ++i) >> + copy_page_routine(my_work->item_list[i].to, >> + my_work->item_list[i].from, >> + my_work->item_list[i].chunk_size); >> +} >> + >> +int copy_page_lists_mt(struct list_head *dst_folios, >> + struct list_head *src_folios, int nr_items) >> +{ >> + int err =3D 0; >> + unsigned int total_mt_num =3D limit_mt_num; >> + int to_node =3D folio_nid(list_first_entry(dst_folios, struct folio, l= ru)); >> + int i; >> + struct copy_page_info *work_items[32] =3D {0}; >> + const struct cpumask *per_node_cpumask =3D cpumask_of_node(to_node); > > Hi, > > Why do you use the cpumask of dst's node than src for where queueing > the works on? Is it for utilizing CPU cache? Isn't it better to use > src's node than dst where nothing has been loaded to CPU cache? Or why Because some vendor=E2=80=99s CPU achieves higher copy throughput by pushin= g data from src to dst, whereas other vendor=E2=80=99s CPU get higher by pull= ing data from dst to src. More in [1]. > don't you avoid specifying cpus to queue on but let system_unbound_wq > select the appropriate CPUs e.g. idlest CPUs, when the system is not > that idle? Based on wq_select_unbound_cpu()[2], a round robin method is used to select target CPUs, not the idlest CPUs. queue_work_node(), which queue job= s on a NUMA node, uses select_numa_node_cpu() and it just chooses the random (or known as first) CPU from the NUMA node[3]. There is no idleness detection in workqueue implementation yet. In addition, based on CPU topology, not all idle CPUs are equal. For exampl= e, AMD CPUs have CCDs and two cores from one CCD would saturate the CCD bandwi= dth. This means if you want to achieve high copy throughput, even if all cores in a CCD are idle, other idle CPUs from another CCD should be chosen first[= 4]. I am planning to reach out to scheduling folks to learn more about CPU sche= duling and come up with a better workqueue or an alternative for multithreading pa= ge migration. [1] https://lore.kernel.org/linux-mm/8B66C7BA-96D6-4E04-89F7-13829BF480D7@n= vidia.com/ [2] https://elixir.bootlin.com/linux/v6.13.2/source/kernel/workqueue.c#L221= 2 [3] https://elixir.bootlin.com/linux/v6.13.2/source/kernel/workqueue.c#L240= 8 [4] https://lore.kernel.org/linux-mm/D969919C-A241-432E-A0E3-353CCD8AC7E8@n= vidia.com/ > > Byungchul > >> + int cpu_id_list[32] =3D {0}; >> + int cpu; >> + int max_items_per_thread; >> + int item_idx; >> + struct folio *src, *src2, *dst, *dst2; >> + >> + total_mt_num =3D min_t(unsigned int, total_mt_num, >> + cpumask_weight(per_node_cpumask)); >> + >> + if (total_mt_num > 32) >> + total_mt_num =3D 32; >> + >> + /* Each threads get part of each page, if nr_items < totla_mt_num */ >> + if (nr_items < total_mt_num) >> + max_items_per_thread =3D nr_items; >> + else >> + max_items_per_thread =3D (nr_items / total_mt_num) + >> + ((nr_items % total_mt_num) ? 1 : 0); >> + >> + >> + for (cpu =3D 0; cpu < total_mt_num; ++cpu) { >> + work_items[cpu] =3D kzalloc(sizeof(struct copy_page_info) + >> + sizeof(struct copy_item) * max_items_per_thread, >> + GFP_NOWAIT); >> + if (!work_items[cpu]) { >> + err =3D -ENOMEM; >> + goto free_work_items; >> + } >> + } >> + >> + i =3D 0; >> + /* TODO: need a better cpu selection method */ >> + for_each_cpu(cpu, per_node_cpumask) { >> + if (i >=3D total_mt_num) >> + break; >> + cpu_id_list[i] =3D cpu; >> + ++i; >> + } >> + >> + if (nr_items < total_mt_num) { >> + for (cpu =3D 0; cpu < total_mt_num; ++cpu) { >> + INIT_WORK((struct work_struct *)work_items[cpu], >> + copy_page_work_queue_thread); >> + work_items[cpu]->num_items =3D max_items_per_thread; >> + } >> + >> + item_idx =3D 0; >> + dst =3D list_first_entry(dst_folios, struct folio, lru); >> + dst2 =3D list_next_entry(dst, lru); >> + list_for_each_entry_safe(src, src2, src_folios, lru) { >> + unsigned long chunk_size =3D PAGE_SIZE * folio_nr_pages(src) / total= _mt_num; >> + /* XXX: not working in HIGHMEM */ >> + char *vfrom =3D page_address(&src->page); >> + char *vto =3D page_address(&dst->page); >> + >> + VM_WARN_ON(PAGE_SIZE * folio_nr_pages(src) % total_mt_num); >> + VM_WARN_ON(folio_nr_pages(dst) !=3D folio_nr_pages(src)); >> + >> + for (cpu =3D 0; cpu < total_mt_num; ++cpu) { >> + work_items[cpu]->item_list[item_idx].to =3D >> + vto + chunk_size * cpu; >> + work_items[cpu]->item_list[item_idx].from =3D >> + vfrom + chunk_size * cpu; >> + work_items[cpu]->item_list[item_idx].chunk_size =3D >> + chunk_size; >> + } >> + >> + item_idx++; >> + dst =3D dst2; >> + dst2 =3D list_next_entry(dst, lru); >> + } >> + >> + for (cpu =3D 0; cpu < total_mt_num; ++cpu) >> + queue_work_on(cpu_id_list[cpu], >> + system_unbound_wq, >> + (struct work_struct *)work_items[cpu]); >> + } else { >> + int num_xfer_per_thread =3D nr_items / total_mt_num; >> + int per_cpu_item_idx; >> + >> + >> + for (cpu =3D 0; cpu < total_mt_num; ++cpu) { >> + INIT_WORK((struct work_struct *)work_items[cpu], >> + copy_page_work_queue_thread); >> + >> + work_items[cpu]->num_items =3D num_xfer_per_thread + >> + (cpu < (nr_items % total_mt_num)); >> + } >> + >> + cpu =3D 0; >> + per_cpu_item_idx =3D 0; >> + item_idx =3D 0; >> + dst =3D list_first_entry(dst_folios, struct folio, lru); >> + dst2 =3D list_next_entry(dst, lru); >> + list_for_each_entry_safe(src, src2, src_folios, lru) { >> + /* XXX: not working in HIGHMEM */ >> + work_items[cpu]->item_list[per_cpu_item_idx].to =3D >> + page_address(&dst->page); >> + work_items[cpu]->item_list[per_cpu_item_idx].from =3D >> + page_address(&src->page); >> + work_items[cpu]->item_list[per_cpu_item_idx].chunk_size =3D >> + PAGE_SIZE * folio_nr_pages(src); >> + >> + VM_WARN_ON(folio_nr_pages(dst) !=3D >> + folio_nr_pages(src)); >> + >> + per_cpu_item_idx++; >> + item_idx++; >> + dst =3D dst2; >> + dst2 =3D list_next_entry(dst, lru); >> + >> + if (per_cpu_item_idx =3D=3D work_items[cpu]->num_items) { >> + queue_work_on(cpu_id_list[cpu], >> + system_unbound_wq, >> + (struct work_struct *)work_items[cpu]); >> + per_cpu_item_idx =3D 0; >> + cpu++; >> + } >> + } >> + if (item_idx !=3D nr_items) >> + pr_warn("%s: only %d out of %d pages are transferred\n", >> + __func__, item_idx - 1, nr_items); >> + } >> + >> + /* Wait until it finishes */ >> + for (i =3D 0; i < total_mt_num; ++i) >> + flush_work((struct work_struct *)work_items[i]); >> + >> +free_work_items: >> + for (cpu =3D 0; cpu < total_mt_num; ++cpu) >> + kfree(work_items[cpu]); >> + >> + return err; >> +} >> diff --git a/mm/migrate.c b/mm/migrate.c >> index 95c4cc4a7823..18440180d747 100644 >> --- a/mm/migrate.c >> +++ b/mm/migrate.c >> @@ -1799,7 +1799,7 @@ static void migrate_folios_batch_move(struct list_= head *src_folios, >> int *nr_retry_pages) >> { >> struct folio *folio, *folio2, *dst, *dst2; >> - int rc, nr_pages =3D 0, nr_mig_folios =3D 0; >> + int rc, nr_pages =3D 0, total_nr_pages =3D 0, total_nr_folios =3D 0; >> int old_page_state =3D 0; >> struct anon_vma *anon_vma =3D NULL; >> bool is_lru; >> @@ -1807,11 +1807,6 @@ static void migrate_folios_batch_move(struct list= _head *src_folios, >> LIST_HEAD(err_src); >> LIST_HEAD(err_dst); >> >> - if (mode !=3D MIGRATE_ASYNC) { >> - *retry +=3D 1; >> - return; >> - } >> - >> /* >> * Iterate over the list of locked src/dst folios to copy the metadata >> */ >> @@ -1859,19 +1854,23 @@ static void migrate_folios_batch_move(struct lis= t_head *src_folios, >> migrate_folio_undo_src(folio, old_page_state & PAGE_WAS_MAPPED, >> anon_vma, true, ret_folios); >> migrate_folio_undo_dst(dst, true, put_new_folio, private); >> - } else /* MIGRATEPAGE_SUCCESS */ >> - nr_mig_folios++; >> + } else { /* MIGRATEPAGE_SUCCESS */ >> + total_nr_pages +=3D nr_pages; >> + total_nr_folios++; >> + } >> >> dst =3D dst2; >> dst2 =3D list_next_entry(dst, lru); >> } >> >> /* Exit if folio list for batch migration is empty */ >> - if (!nr_mig_folios) >> + if (!total_nr_pages) >> goto out; >> >> /* Batch copy the folios */ >> - { >> + if (total_nr_pages > 32) { >> + copy_page_lists_mt(dst_folios, src_folios, total_nr_folios); >> + } else { >> dst =3D list_first_entry(dst_folios, struct folio, lru); >> dst2 =3D list_next_entry(dst, lru); >> list_for_each_entry_safe(folio, folio2, src_folios, lru) { >> --=20 >> 2.45.2 >> Best Regards, Yan, Zi