From nobody Tue Oct 7 07:07:36 2025 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2077.outbound.protection.outlook.com [40.107.236.77]) (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 CE23B367; Sun, 13 Jul 2025 17:48:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.236.77 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428896; cv=fail; b=ERbZv3L620UEeZhlkfbc3VXU4HU9YqfwSMq16fmW9l0dN98On/ABV1I2Rs9q6yP4bq6M0oKfUrsZuGzhdV3hOuJ/8/gWILAtM8BCjh0ASaSHzI2ye7YVMKqqSQjL+JBoJyuRMME/+un1FxBDJtuTpe69HzT/AZnJBAuczVzHDJA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428896; c=relaxed/simple; bh=XgGH/jn5i3ZwreXnFnAQm4S9etK58fMAnurujIUUX8Y=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Q3+cAyahYdrPoyhiKgpNBv7+TVLABrcqprujkV64ADFBMaP1ETkKyM/5yLFo9FAGuJnedO9AY29idWuTCmK3FItG5PuV8Nm52bES3JfYkSR3Q/Wxh/GH71QBylvd2QKxEBa0Vzr631vLNmXJY5Y8itiJT3TUgu+27wwPG+TFJq0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=EWP8xdOf; arc=fail smtp.client-ip=40.107.236.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="EWP8xdOf" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZBurinUAR0DK82+yT0hDOdHEqvu8pezSzmg7/sl1M06mD/K8ltbYTY5LTidv8oYwXjCm9/TZICm++fTKjlRFtBc1V11XFhOQ5ajHKACSXXVaz1cJz/BRsNvSI77XIpTlZb0LAJa8QdkqW2rjLR8vvFHcPeaEQt3jr3D04p9dLTh9VpHEx6i6g71Xj7/ApS7dp/HWbeejljivEvKvkOrd4tAmxDpHUrfyCNxZ5A7/w/rLP4zKResXQz9Cm2e/yspogMPDiAZeOTvQPu5TD9UP77qdadh/rcJSHpqo0GYISLe9KRjSpKoqZMdbt6zjgooZJdsJ+0E4RUb+o6iVIBldPQ== 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=HHEry6TrMM6YwTIsEMy6xU6qIRKzlrf+533jG1Q6zBA=; b=Mmutlmn1iApevTAODEiCdgPSDFnBdgRBYuZW0fHYZANLMsiXsepGrlxHAkCp+SjWQjq0DBap4ce63pYPC7xQ7G+RdX2AmTBjjyjlIem9ipUvZNiU3gHqKlZnSlI0ukRjhqpPynEzSlgqKXRnOYNx5PYbUzubJPaB3xJz21p8xacl69rkVmKbQwbmBw5BdDsJ3dO3zLqnUqC6NSv4bh4ceNZS+pW/SAyuc+R0cyFoXc5LwwX+c33ck61HaoNDoXLgtq4ED0CURLPoIwGiaBJzgD3+Nc9sApj7yCgSeN96C6/y+vF/Mg+o0ADmafZNo2DDOm9xA7Okq/Jp7PHn/60Xiw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=google.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=HHEry6TrMM6YwTIsEMy6xU6qIRKzlrf+533jG1Q6zBA=; b=EWP8xdOfq8U3dIj0UsQKaejCedwAOlyk3L5vXa1aYIdGiUiPNxtdEUIshqWFVIBzKmtARuAHrtsZuDfI2fdIqv08yMn1r6Wdt15BOxLBDY8y3uezQp/YkJPmj62gIJkGSPP06AVsReVZ2MkPtBYtassVhHBL5OqRfPEtEQJmjhg= Received: from BY5PR03CA0011.namprd03.prod.outlook.com (2603:10b6:a03:1e0::21) by CY8PR12MB7243.namprd12.prod.outlook.com (2603:10b6:930:58::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8880.23; Sun, 13 Jul 2025 17:48:11 +0000 Received: from SJ5PEPF000001CA.namprd05.prod.outlook.com (2603:10b6:a03:1e0:cafe::d4) by BY5PR03CA0011.outlook.office365.com (2603:10b6:a03:1e0::21) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8922.27 via Frontend Transport; Sun, 13 Jul 2025 17:48:11 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ5PEPF000001CA.mail.protection.outlook.com (10.167.242.39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8922.22 via Frontend Transport; Sun, 13 Jul 2025 17:48:10 +0000 Received: from kaveri.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Sun, 13 Jul 2025 12:47:50 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH V9 1/7] KVM: guest_memfd: Use guest mem inodes instead of anonymous inodes Date: Sun, 13 Jul 2025 17:43:35 +0000 Message-ID: <20250713174339.13981-4-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250713174339.13981-2-shivankg@amd.com> References: <20250713174339.13981-2-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF000001CA:EE_|CY8PR12MB7243:EE_ X-MS-Office365-Filtering-Correlation-Id: 36179e1c-5f07-4767-2ea4-08ddc2356f2a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|36860700013|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?FU9eFFQqaIeov9ARThdEUldafSHEIFSpEoUdHx6lPJ2Lho4DNX8Vs9ZrpLBV?= =?us-ascii?Q?/vmeEiYuRv2Dn0GxqSrhjjdUYO87FXq6gCIviLdoslvglCGkDPw4zTpKWnU8?= =?us-ascii?Q?HlyHvnNoAVmaP738nR7npxXZmJIm/GfW6UjBD1Nv0X9qubSp80FQYYffyaPR?= =?us-ascii?Q?DaQQFTNaLXeLrmbszbdVglk5YK/ZMevdiIPAA0hoa3i3cg6FnUPFuTUNzrPs?= =?us-ascii?Q?DXh/PeIyd/bnWS59CwhGjTuHk1ufsXYfjseu2hXR1bQJPmQI3B+0r1Ys4hKr?= =?us-ascii?Q?33e0IKwnvq2pITWn3jJghPgVCPC8ilf/BAvydw7kgo74acpVQ7oY8viFlJkc?= =?us-ascii?Q?nh4QNz4sVegSg2nVNqOBZLrDgLEvDh2F7euNmJnfZ16DEQWYuQr60KXl9rDj?= =?us-ascii?Q?FDRkEbQVgfle90KXiQ0vb/i9Ai1F6eb2W9pKIoBawZ1JzNjmoQ+zW8i0EFPn?= =?us-ascii?Q?QWLXWPCNO2hxAv2yfeRdvgmLcqy+Pwh1hAKjxY/YjLdPpOV+xnEH4za8BHBz?= =?us-ascii?Q?Sflis0pchCpyep8akXeiPBBPghOmP+WuNPFOOuSP8NZQ0Rw9+v9QLC+M4X6Q?= =?us-ascii?Q?TCUnn4k4EqsNXDShR0CAnBdyw95Pw5R7qeQIB6ai5dv3w/aswDhsURmzyO1P?= =?us-ascii?Q?CjUSmHVuluyGo+3qt2OMlukwsvBWEv2PP+Zeg+KwS05r0YRdqJM8lfJfzB3F?= =?us-ascii?Q?/p/vKlKEkI8EiGvcGJ0rIp9maEi91jnijrCvr+tr7pBoGL9uZ+ymdWzsggS0?= =?us-ascii?Q?TbC+dbDlGfl67trWGQSEzEdMccUzLfTah2pYPY0NhkJl75dODWUXVdA5rIWA?= =?us-ascii?Q?0N3O8qeEj+pqNjmc5JuuXkYfRlymkPZuhnl/7gMFxi/JyakW36C0SUhFRhl3?= =?us-ascii?Q?ou/M6ZlNnpquP9rrVEW/BRGEtZvCdi2Gti/+kThQSzrUC9D08Ih+RDq8W4t0?= =?us-ascii?Q?ol2+LBJJij8ERGpMpBwpr3dKuN1nH0aa2H7z9367UZTR+fOSFWPaqOSFA/09?= =?us-ascii?Q?egJYX6gpYsJBG9nppUqPJMgD+Me9Sm3NLO8XNF0uV/MT6r3pa5PT0URcpLLx?= =?us-ascii?Q?qJh3T+MtwHVad1v4m1pOAaK2DOFkf79foQTc/dByCLQKzl3hXepYSRkw16Uu?= =?us-ascii?Q?y45cBDFd5q8RQxbKc7utXZZ0hheXRpaSFQnzVemIUpzSe8JaRqNLr4pH42NE?= =?us-ascii?Q?X+tv81Huq1jko9Aw1tUAMcHptBE4fJn8Dq2/UUftHfu/gopKksEXV+Z9sX/G?= =?us-ascii?Q?7dywOZwpikZT3g1ZTuTfOlv8nbHA/Hhjky2x7nnX419pAXW31P/BJMnngD4U?= =?us-ascii?Q?+xCGkN6vOODc2mgvaYKPKCE2VTdsoXrrVqSqHv7quK5fP9Zzdh6pbSVPRjdz?= =?us-ascii?Q?UFo0YYybtL9cR9kAAKc9Kd48JDxTs+oN0QOzxpRbv/AF2S5skVxsasY0ZTt9?= =?us-ascii?Q?0G4s2lRQKB48xg4X/wqZZxl9aF3OEEEM5rRT5TDYrsMDTmy22tpdF3rxkDjM?= =?us-ascii?Q?ydkkx6c9C6gLmk2NGaXqdNNU1IuMthkR2yJn?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(36860700013)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2025 17:48:10.9227 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 36179e1c-5f07-4767-2ea4-08ddc2356f2a X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001CA.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7243 Content-Type: text/plain; charset="utf-8" From: Ackerley Tng guest_memfd's inode represents memory the guest_memfd is providing. guest_memfd's file represents a struct kvm's view of that memory. Using a custom inode allows customization of the inode teardown process via callbacks. For example, ->evict_inode() allows customization of the truncation process on file close, and ->destroy_inode() and ->free_inode() allow customization of the inode freeing process. Customizing the truncation process allows flexibility in management of guest_memfd memory and customization of the inode freeing process allows proper cleanup of memory metadata stored on the inode. Memory metadata is more appropriately stored on the inode (as opposed to the file), since the metadata is for the memory and is not unique to a specific binding and struct kvm. Co-developed-by: Fuad Tabba Signed-off-by: Fuad Tabba Signed-off-by: Ackerley Tng Signed-off-by: Shivank Garg --- include/uapi/linux/magic.h | 1 + virt/kvm/guest_memfd.c | 134 +++++++++++++++++++++++++++++++------ virt/kvm/kvm_main.c | 7 +- virt/kvm/kvm_mm.h | 10 ++- 4 files changed, 127 insertions(+), 25 deletions(-) diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h index bb575f3ab45e..638ca21b7a90 100644 --- a/include/uapi/linux/magic.h +++ b/include/uapi/linux/magic.h @@ -103,5 +103,6 @@ #define DEVMEM_MAGIC 0x454d444d /* "DMEM" */ #define SECRETMEM_MAGIC 0x5345434d /* "SECM" */ #define PID_FS_MAGIC 0x50494446 /* "PIDF" */ +#define GUEST_MEMFD_MAGIC 0x474d454d /* "GMEM" */ =20 #endif /* __LINUX_MAGIC_H__ */ diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index d01bd7a2c2bd..dabcc2317291 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -1,12 +1,16 @@ // SPDX-License-Identifier: GPL-2.0 +#include #include #include +#include #include +#include #include -#include =20 #include "kvm_mm.h" =20 +static struct vfsmount *kvm_gmem_mnt; + struct kvm_gmem { struct kvm *kvm; struct xarray bindings; @@ -388,9 +392,51 @@ static struct file_operations kvm_gmem_fops =3D { .fallocate =3D kvm_gmem_fallocate, }; =20 -void kvm_gmem_init(struct module *module) +static const struct super_operations kvm_gmem_super_operations =3D { + .statfs =3D simple_statfs, +}; + +static int kvm_gmem_init_fs_context(struct fs_context *fc) +{ + struct pseudo_fs_context *ctx; + + if (!init_pseudo(fc, GUEST_MEMFD_MAGIC)) + return -ENOMEM; + + ctx =3D fc->fs_private; + ctx->ops =3D &kvm_gmem_super_operations; + + return 0; +} + +static struct file_system_type kvm_gmem_fs =3D { + .name =3D "kvm_guest_memory", + .init_fs_context =3D kvm_gmem_init_fs_context, + .kill_sb =3D kill_anon_super, +}; + +static int kvm_gmem_init_mount(void) +{ + kvm_gmem_mnt =3D kern_mount(&kvm_gmem_fs); + + if (IS_ERR(kvm_gmem_mnt)) + return PTR_ERR(kvm_gmem_mnt); + + kvm_gmem_mnt->mnt_flags |=3D MNT_NOEXEC; + return 0; +} + +int kvm_gmem_init(struct module *module) { kvm_gmem_fops.owner =3D module; + + return kvm_gmem_init_mount(); +} + +void kvm_gmem_exit(void) +{ + kern_unmount(kvm_gmem_mnt); + kvm_gmem_mnt =3D NULL; } =20 static int kvm_gmem_migrate_folio(struct address_space *mapping, @@ -472,11 +518,71 @@ static const struct inode_operations kvm_gmem_iops = =3D { .setattr =3D kvm_gmem_setattr, }; =20 +static struct inode *kvm_gmem_inode_make_secure_inode(const char *name, + loff_t size, u64 flags) +{ + struct inode *inode; + + inode =3D anon_inode_make_secure_inode(kvm_gmem_mnt->mnt_sb, name, NULL); + if (IS_ERR(inode)) + return inode; + + inode->i_private =3D (void *)(unsigned long)flags; + inode->i_op =3D &kvm_gmem_iops; + inode->i_mapping->a_ops =3D &kvm_gmem_aops; + inode->i_mode |=3D S_IFREG; + inode->i_size =3D size; + mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); + mapping_set_inaccessible(inode->i_mapping); + /* Unmovable mappings are supposed to be marked unevictable as well. */ + WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); + + return inode; +} + +static struct file *kvm_gmem_inode_create_getfile(void *priv, loff_t size, + u64 flags) +{ + static const char *name =3D "[kvm-gmem]"; + struct inode *inode; + struct file *file; + int err; + + err =3D -ENOENT; + if (!try_module_get(kvm_gmem_fops.owner)) + goto err; + + inode =3D kvm_gmem_inode_make_secure_inode(name, size, flags); + if (IS_ERR(inode)) { + err =3D PTR_ERR(inode); + goto err_put_module; + } + + file =3D alloc_file_pseudo(inode, kvm_gmem_mnt, name, O_RDWR, + &kvm_gmem_fops); + if (IS_ERR(file)) { + err =3D PTR_ERR(file); + goto err_put_inode; + } + + file->f_flags |=3D O_LARGEFILE; + file->private_data =3D priv; + +out: + return file; + +err_put_inode: + iput(inode); +err_put_module: + module_put(kvm_gmem_fops.owner); +err: + file =3D ERR_PTR(err); + goto out; +} + static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) { - const char *anon_name =3D "[kvm-gmem]"; struct kvm_gmem *gmem; - struct inode *inode; struct file *file; int fd, err; =20 @@ -490,32 +596,16 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t = size, u64 flags) goto err_fd; } =20 - file =3D anon_inode_create_getfile(anon_name, &kvm_gmem_fops, gmem, - O_RDWR, NULL); + file =3D kvm_gmem_inode_create_getfile(gmem, size, flags); if (IS_ERR(file)) { err =3D PTR_ERR(file); goto err_gmem; } =20 - file->f_flags |=3D O_LARGEFILE; - - inode =3D file->f_inode; - WARN_ON(file->f_mapping !=3D inode->i_mapping); - - inode->i_private =3D (void *)(unsigned long)flags; - inode->i_op =3D &kvm_gmem_iops; - inode->i_mapping->a_ops =3D &kvm_gmem_aops; - inode->i_mode |=3D S_IFREG; - inode->i_size =3D size; - mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); - mapping_set_inaccessible(inode->i_mapping); - /* Unmovable mappings are supposed to be marked unevictable as well. */ - WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); - kvm_get_kvm(kvm); gmem->kvm =3D kvm; xa_init(&gmem->bindings); - list_add(&gmem->entry, &inode->i_mapping->i_private_list); + list_add(&gmem->entry, &file_inode(file)->i_mapping->i_private_list); =20 fd_install(fd, file); return fd; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index f1ac872e01e9..9ccdedc9460a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -6486,7 +6486,9 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align,= struct module *module) if (WARN_ON_ONCE(r)) goto err_vfio; =20 - kvm_gmem_init(module); + r =3D kvm_gmem_init(module); + if (r) + goto err_gmem; =20 r =3D kvm_init_virtualization(); if (r) @@ -6507,6 +6509,8 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align,= struct module *module) err_register: kvm_uninit_virtualization(); err_virt: + kvm_gmem_exit(); +err_gmem: kvm_vfio_ops_exit(); err_vfio: kvm_async_pf_deinit(); @@ -6538,6 +6542,7 @@ void kvm_exit(void) for_each_possible_cpu(cpu) free_cpumask_var(per_cpu(cpu_kick_mask, cpu)); kmem_cache_destroy(kvm_vcpu_cache); + kvm_gmem_exit(); kvm_vfio_ops_exit(); kvm_async_pf_deinit(); kvm_irqfd_exit(); diff --git a/virt/kvm/kvm_mm.h b/virt/kvm/kvm_mm.h index ec311c0d6718..089f87ed00dc 100644 --- a/virt/kvm/kvm_mm.h +++ b/virt/kvm/kvm_mm.h @@ -68,17 +68,23 @@ static inline void gfn_to_pfn_cache_invalidate_start(st= ruct kvm *kvm, #endif /* HAVE_KVM_PFNCACHE */ =20 #ifdef CONFIG_KVM_GMEM -void kvm_gmem_init(struct module *module); +int kvm_gmem_init(struct module *module); +void kvm_gmem_exit(void); int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args); int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot, unsigned int fd, loff_t offset); void kvm_gmem_unbind(struct kvm_memory_slot *slot); #else -static inline void kvm_gmem_init(struct module *module) +static inline int kvm_gmem_init(struct module *module) { =20 + return 0; } =20 +static inline void kvm_gmem_exit(void) {}; + +static inline void kvm_gmem_init(struct module *module) + static inline int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot, unsigned int fd, loff_t offset) --=20 2.43.0 From nobody Tue Oct 7 07:07:36 2025 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2059.outbound.protection.outlook.com [40.107.243.59]) (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 F2F10367; Sun, 13 Jul 2025 17:48:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.243.59 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428908; cv=fail; b=OUqwJuNOVtLtDJYd0J+jbL/nHiPAlBx7oRPCnHeF+ZurERR0TtIW0cdRqeniqVt9HXXVfrz0rnhXjDGqhNybDvvmmJ3DYrMEik+/VBqPU0G5gN7U+LyBHOGc2kKTO38AFHRQgVuoqoc6JCE9vosYH8HO5pjGZ4LBsz2qAqa/29U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428908; c=relaxed/simple; bh=D+6JD409pVb+77Ug+MkNP2edE5kvzhjFRxqnbtguMj4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=IpX+mlwxZ9OrvSNMd4NGBhSfjWqBqf+T1/9EhGjeVmh24M99WJNdtgYPmGhTdK4QapnWvekJZ2Zm1A50iE8JitdcDIV1ejVDOkemurxZYz4J62NtKXa7tde6m5J9MdQR/HKc1GsThs8gbK+LkW42Ih1QZrd6cxQhJn92tgiXwqE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=HIOFSBOQ; arc=fail smtp.client-ip=40.107.243.59 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="HIOFSBOQ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YnvvPwVn1ezEbH3gST2VXReK64KxocDBmKm1oQGW1OtwZUZ57p/yfAy2tjYZOiApgR/7hN4NEUQ3cTr4GF+e/sXE5cGZfAVIWBojaDzDBABinmqTK2Gfem2gKwOS2nVFiBOx/3mn87J5H8Na0pLEa70GyVsKmUnlAy27+oDldos+ZOZdnkODNJW6gdODc66GuMlx/h83hzY+vBDy6x2BehmrJYPdIzr5CSRnD7xq/UKw28Uavr7cHNmP314iWFPhObhtR8DlrS4fk+TdWxP2Ed5d9aZ8lKRx7XxJBB2aLJw/2/UC8NEgDZsgh6MkuG0EKawNWPZWMetgRrfKvCwxnA== 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=jBfZ/TZ4VBwWXgzIw5njBfpLgomVCPsMziWmRrKE2V8=; b=E3dXrOsZqbn3NJm8NDUm0hENXZFu8R4BY/27fdzR0/0PAvzEI/HA5eNMwGxnuFofleZ3XZHaIC4fp+SqWb7of5TDEdBeS9MlNg/tEyONT/z9+548pS3NksjUA3P9r/sE7oqRIqt8UFljDohSA4v//zwL/LvZtI/9UkSkaSTPEWcfx2GT4/4fxqGyEQfVRSQ4bbebJfNZ+RwI7gHxd3F2hf04YOVHGfkqLB1D/N87R/WhKyYsaab9SfaHkjtL6Mi/rGjYPGjfJtoahCC9JrQ5ALw+fio75FGq6KWcb5QOOmLFCukMGl/2m8IQy+CQiydkDcYHhtnOIzvtQyqG8mJIyg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=google.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jBfZ/TZ4VBwWXgzIw5njBfpLgomVCPsMziWmRrKE2V8=; b=HIOFSBOQcCCc6TKNuNE5U6/J9qX1PLkiy0ccUtgpf3o/9YKbE3WmjhBNyqp5Nau7ONY1oz5Yb/OYS657cSRN3/NBRKQzmVjHazj1aCaGUgRkVR97v1rYTgnaDXKaYBcIxU8ifKScL4gbz7/rDHJAZLAOguSHTBVdxrste6kt6oI= Received: from SJ0PR03CA0268.namprd03.prod.outlook.com (2603:10b6:a03:3a0::33) by SJ0PR12MB7034.namprd12.prod.outlook.com (2603:10b6:a03:449::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8901.29; Sun, 13 Jul 2025 17:48:21 +0000 Received: from SJ5PEPF000001CB.namprd05.prod.outlook.com (2603:10b6:a03:3a0:cafe::b5) by SJ0PR03CA0268.outlook.office365.com (2603:10b6:a03:3a0::33) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8922.30 via Frontend Transport; Sun, 13 Jul 2025 17:48:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ5PEPF000001CB.mail.protection.outlook.com (10.167.242.40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8922.22 via Frontend Transport; Sun, 13 Jul 2025 17:48:21 +0000 Received: from kaveri.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Sun, 13 Jul 2025 12:48:05 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH V9 2/7] mm/filemap: Add NUMA mempolicy support to filemap_alloc_folio() Date: Sun, 13 Jul 2025 17:43:36 +0000 Message-ID: <20250713174339.13981-5-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250713174339.13981-2-shivankg@amd.com> References: <20250713174339.13981-2-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF000001CB:EE_|SJ0PR12MB7034:EE_ X-MS-Office365-Filtering-Correlation-Id: 313ac2aa-23e0-42f0-5b78-08ddc2357544 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|376014|7416014|1800799024|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?U5YA1zd76wql9WaDp4opB3ZInqs6GB8yMC3DxybFo3n9qWw25XD6i0pyYbWm?= =?us-ascii?Q?bcUbXajRi8suBBatXFqY7BdKXBjIFVd5Njivkt+oPiIca4JdPEh/6J1M6RCP?= =?us-ascii?Q?eTiQU/cS0VihqaLgT6dFcmoqIHQ8dXZrqYKXJHQYzVcwQmpq8avjGuoMKnsA?= =?us-ascii?Q?r8NIPN9Q9rd0mHG8P8mcsmsoT4ScTA2iW89qQD6MFU3/I0prIyfXu3alasom?= =?us-ascii?Q?wnfIJxNbLc368OJg11XqcvzPJNAJlQw/fRzTXAN+V1pueX0/Z/UDP/6wDRpB?= =?us-ascii?Q?ZdfWMM8FAYT/mEwmf5EO3BCH4jZQerIngL1Ad9EXzcY1Ihls9vUeXZowKtXH?= =?us-ascii?Q?uNXfJ3KXWLrbe3bMjS68HzcaLXXRI8aQvHhJ8sfLjDJhiC4GFLR0t7XF8ssc?= =?us-ascii?Q?YiV1hgvI4LsAHdsQL7zMPXwg3Vm+a+2DEkoPKHmjcuShXPDT4XCY0EvSYPnQ?= =?us-ascii?Q?bQPLNLjdlO9HZkyBOxlJcnsvUysY/tsClnfyRW6v8TXGCsz7T9YSCpgAubfe?= =?us-ascii?Q?J2fLgspc5E4sN2ZV/m6rnElkEpbTv0sPlvwD08Zi6ToEfKWjsq2TVobL6KbB?= =?us-ascii?Q?Acsauo8UU/VGcotjFcsCpA91roNMMnutfQZXHTOrQAeZaEVvcYbryHvTwHsv?= =?us-ascii?Q?KcQWVOLLFDC2bEsFD1hMgkvpQ0/u+iVtSKSI2EpPk++MJCmVtbdxQyjUu91+?= =?us-ascii?Q?ONjDNt4oJTqDWPHBy37bkp0waD9zDfrWlPE2zbpyNscdLRC5G87XV8ZcNUI4?= =?us-ascii?Q?z888QeVpu8plnDKpKQnG/UIq6GuHE/erEvpSJuYU+1UUr7W3YpWbMseOKqPR?= =?us-ascii?Q?p6t/Q4R2Tti3ZqSuOOC0Nb3CfwlvMSYpkwLw50b3bn0DY7raoCbGvHMkeh47?= =?us-ascii?Q?cZqRoKWHloiEwLAQ16UroJ/bWKl4k5rovhm4rxOeFl172Rnp8CUSenDoWkkA?= =?us-ascii?Q?wqkoVpl2gqPa0LCw5MA2qRYOh/LzH04uvQs3rliPjW8CpFsEHDXXx0qoCwe7?= =?us-ascii?Q?vGTCsZak0AzYvuqxn/HMN0NVB62YrJoqPAski6tQbKBihDvPfmlNmNZeNpUJ?= =?us-ascii?Q?D7i5q1b+lQKR/TPitZ1F7JgFbUVFKE16net9MMEPVgio4f+ncLSXw45JH5zk?= =?us-ascii?Q?krEjObSxdJwecf3xJtEAM99HrWzLDPdnAcy9rf9NNNfgd3qGhkN0FcYwZv1K?= =?us-ascii?Q?a1kerLSp6je7Y526QGqfJ6em6fPQuWshWVhdQrrdX7xBdtHOfEQ7HOGT4UB/?= =?us-ascii?Q?oc1XR5b71gfNZ5rLVSw5U6jJIR6v0biZMDI00yuQSXJpj4lE8PsHu1xkZ1X2?= =?us-ascii?Q?mNQu2rftt+cN/FIfWEFzxNlpVjEOxYEdmzQ3iQoB2Lg/3jKWWX3Dw1VBChy0?= =?us-ascii?Q?Yq8RAgXwo8PX909PBUZMYL/yPf+LoRlS8lPKINhXKYomiVby8WY6p3HOxB+F?= =?us-ascii?Q?MTccZQk7MVxLks7g9MMXrzNPA+Xj/p/Q6wZEN9UmXfg+P4934iJxbXLhNxY2?= =?us-ascii?Q?w3wfRYNdL9Btn6UpgXcPAzIGm1ubIXN2d88i?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(376014)(7416014)(1800799024)(82310400026);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2025 17:48:21.1599 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 313ac2aa-23e0-42f0-5b78-08ddc2357544 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001CB.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB7034 Content-Type: text/plain; charset="utf-8" From: "Matthew Wilcox (Oracle)" Add a mempolicy parameter to filemap_alloc_folio() to enable NUMA-aware page cache allocations. This will be used by upcoming changes to support NUMA policies in guest-memfd, where guest_memory need to be allocated NUMA policy specified by VMM. All existing users pass NULL maintaining current behavior. Reviewed-by: Pankaj Gupta Reviewed-by: Vlastimil Babka Signed-off-by: Matthew Wilcox (Oracle) Signed-off-by: Shivank Garg Reviewed-by: David Hildenbrand --- fs/bcachefs/fs-io-buffered.c | 2 +- fs/btrfs/compression.c | 4 ++-- fs/btrfs/verity.c | 2 +- fs/erofs/zdata.c | 2 +- fs/f2fs/compress.c | 2 +- include/linux/pagemap.h | 8 +++++--- mm/filemap.c | 14 +++++++++----- mm/readahead.c | 2 +- 8 files changed, 21 insertions(+), 15 deletions(-) diff --git a/fs/bcachefs/fs-io-buffered.c b/fs/bcachefs/fs-io-buffered.c index 66bacdd49f78..392344232b16 100644 --- a/fs/bcachefs/fs-io-buffered.c +++ b/fs/bcachefs/fs-io-buffered.c @@ -124,7 +124,7 @@ static int readpage_bio_extend(struct btree_trans *tran= s, if (folio && !xa_is_value(folio)) break; =20 - folio =3D filemap_alloc_folio(readahead_gfp_mask(iter->mapping), order); + folio =3D filemap_alloc_folio(readahead_gfp_mask(iter->mapping), order,= NULL); if (!folio) break; =20 diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 48d07939fee4..a0808c8f897f 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -474,8 +474,8 @@ static noinline int add_ra_bio_pages(struct inode *inod= e, continue; } =20 - folio =3D filemap_alloc_folio(mapping_gfp_constraint(mapping, - ~__GFP_FS), 0); + folio =3D filemap_alloc_folio(mapping_gfp_constraint(mapping, ~__GFP_FS), + 0, NULL); if (!folio) break; =20 diff --git a/fs/btrfs/verity.c b/fs/btrfs/verity.c index b7a96a005487..c43a789ba6d2 100644 --- a/fs/btrfs/verity.c +++ b/fs/btrfs/verity.c @@ -742,7 +742,7 @@ static struct page *btrfs_read_merkle_tree_page(struct = inode *inode, } =20 folio =3D filemap_alloc_folio(mapping_gfp_constraint(inode->i_mapping, ~_= _GFP_FS), - 0); + 0, NULL); if (!folio) return ERR_PTR(-ENOMEM); =20 diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index e3f28a1bb945..f9ce234e1a66 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -562,7 +562,7 @@ static void z_erofs_bind_cache(struct z_erofs_frontend = *fe) * Allocate a managed folio for cached I/O, or it may be * then filled with a file-backed folio for in-place I/O */ - newfolio =3D filemap_alloc_folio(gfp, 0); + newfolio =3D filemap_alloc_folio(gfp, 0, NULL); if (!newfolio) continue; newfolio->private =3D Z_EROFS_PREALLOCATED_FOLIO; diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index b3c1df93a163..7ef937dd7624 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -1942,7 +1942,7 @@ void f2fs_cache_compressed_page(struct f2fs_sb_info *= sbi, struct page *page, return; } =20 - cfolio =3D filemap_alloc_folio(__GFP_NOWARN | __GFP_IO, 0); + cfolio =3D filemap_alloc_folio(__GFP_NOWARN | __GFP_IO, 0, NULL); if (!cfolio) return; =20 diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index e63fbfbd5b0f..78ea357d2077 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -646,9 +646,11 @@ static inline void *detach_page_private(struct page *p= age) } =20 #ifdef CONFIG_NUMA -struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order); +struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order, + struct mempolicy *policy); #else -static inline struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned= int order) +static inline struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned= int order, + struct mempolicy *policy) { return folio_alloc_noprof(gfp, order); } @@ -659,7 +661,7 @@ static inline struct folio *filemap_alloc_folio_noprof(= gfp_t gfp, unsigned int o =20 static inline struct page *__page_cache_alloc(gfp_t gfp) { - return &filemap_alloc_folio(gfp, 0)->page; + return &filemap_alloc_folio(gfp, 0, NULL)->page; } =20 static inline gfp_t readahead_gfp_mask(struct address_space *x) diff --git a/mm/filemap.c b/mm/filemap.c index bada249b9fb7..a30cd4dd085a 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -989,11 +989,16 @@ int filemap_add_folio(struct address_space *mapping, = struct folio *folio, EXPORT_SYMBOL_GPL(filemap_add_folio); =20 #ifdef CONFIG_NUMA -struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order) +struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order, + struct mempolicy *policy) { int n; struct folio *folio; =20 + if (policy) + return folio_alloc_mpol_noprof(gfp, order, policy, + NO_INTERLEAVE_INDEX, numa_node_id()); + if (cpuset_do_page_mem_spread()) { unsigned int cpuset_mems_cookie; do { @@ -1977,7 +1982,7 @@ struct folio *__filemap_get_folio(struct address_spac= e *mapping, pgoff_t index, err =3D -ENOMEM; if (order > min_order) alloc_gfp |=3D __GFP_NORETRY | __GFP_NOWARN; - folio =3D filemap_alloc_folio(alloc_gfp, order); + folio =3D filemap_alloc_folio(alloc_gfp, order, NULL); if (!folio) continue; =20 @@ -2516,7 +2521,7 @@ static int filemap_create_folio(struct kiocb *iocb, s= truct folio_batch *fbatch) if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_WAITQ)) return -EAGAIN; =20 - folio =3D filemap_alloc_folio(mapping_gfp_mask(mapping), min_order); + folio =3D filemap_alloc_folio(mapping_gfp_mask(mapping), min_order, NULL); if (!folio) return -ENOMEM; if (iocb->ki_flags & IOCB_DONTCACHE) @@ -3853,8 +3858,7 @@ static struct folio *do_read_cache_folio(struct addre= ss_space *mapping, repeat: folio =3D filemap_get_folio(mapping, index); if (IS_ERR(folio)) { - folio =3D filemap_alloc_folio(gfp, - mapping_min_folio_order(mapping)); + folio =3D filemap_alloc_folio(gfp, mapping_min_folio_order(mapping), NUL= L); if (!folio) return ERR_PTR(-ENOMEM); index =3D mapping_align_index(mapping, index); diff --git a/mm/readahead.c b/mm/readahead.c index 20d36d6b055e..0b2aec0231e6 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -183,7 +183,7 @@ static struct folio *ractl_alloc_folio(struct readahead= _control *ractl, { struct folio *folio; =20 - folio =3D filemap_alloc_folio(gfp_mask, order); + folio =3D filemap_alloc_folio(gfp_mask, order, NULL); if (folio && ractl->dropbehind) __folio_set_dropbehind(folio); =20 --=20 2.43.0 From nobody Tue Oct 7 07:07:36 2025 Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam02on2045.outbound.protection.outlook.com [40.107.95.45]) (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 6EED6278E6A; Sun, 13 Jul 2025 17:48:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.95.45 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428925; cv=fail; b=lCPHyg3gSyqPE3UeA/MfDjBC0b9OTmQdnWbij6B4S6tWjyM8Th3LJzl3k4WdEVKWGFSJ/RsTJv38FbWC9lF9PCN4nD39owyou9VlzKvqsp/bzXEihPFrBQTglfZfgmM/RXMOtqzOrL8ls7rwARhuoAoU/PqAJLs0F6M/cIvA+FE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428925; c=relaxed/simple; bh=gfNYMfnLukmF73ZJ2Z7VWI+hQCHRZHri0RiDELXFSRs=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=a0wywGx9rf0rMePU7lSbsrarAIeueLj7djqMEsCSCJZEtN09EbshXzHT0D/vVKSGXfcLNXf1POLJFe0G0BIpDGejcB+qqxXVzzsQAOdhtGMzwdo3IpTgQjwbs1+pZZyhz2x5wheJ0MZDxGMmb9Sc7495/tA9E62S9EfRQHhfsWQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=X5zs9+Pc; arc=fail smtp.client-ip=40.107.95.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="X5zs9+Pc" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tH6Q/6qALBqv9vEv2INjcc/Q4tpMVJbHgYemGz/x4QTH+EcUa9+UOiezSuE6AeyBQTT1ZrCtNw6vTssRYR6khqGPxZ/27rvi9/2Gjmj0zAar9DgNx1OIPf/1RIZCcwKpyZMxSX/n9n/Y9ev/VUDcCPtPz+fvhJFqXIM/eUbP85+9wuUzFyBRCUrp0L2++kdJIy25F4xSfU0pBXxBXvs/kwUTbFe7Go1INkelE+W8Vha17a9K5kVuNYVpECY/fr8X6pfejqFBHShIvjSN3qK/MvMCFBwCccEGYcdQfZGJ3J8gudVHMfSSPCeLq4dqjteWErxCsKDXyj3YItjMn+/OFA== 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=g/oQjyIjfSR+3rbrkG9B6F+18QPCmeaIjmYcygmhV4w=; b=qkhHBicW11JayPHGp7c/gr3sTaxI8PFxSOLskFm63hPNNS48nsHhOEorCBx8lLBvSkOj7yoAQKRqwtjYofAW4ZR7jqUtV8hF6QKFceM+ERDn1oLzBJTVkrnb2GjRof64Gcmww0OFMPgUc0Pk8e2hxHQ2DIH5UDosqDZDKwlYG9p23z+jK+R49lKTRQf7ym9b5H5hfwgF5h31Aaw2xqU16YkrIodDNmpxZ/uYo58Zw/Fmfi5lpkOqiQ95cFf5FgVxSwT9Jje/5k8x7UkuBI+EK9TI+aEb5pkBwWEixzv8BJ1lpynFSblAivJwyTL2SO2tUHT7jcAekI0bm9lTtwrYiQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=google.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=g/oQjyIjfSR+3rbrkG9B6F+18QPCmeaIjmYcygmhV4w=; b=X5zs9+PcdMsleoSlkmFmWuBq4zwYAQsEnR0Bnx7Hr+tIXjca56eYsraTTvovuGymIG6P4Xd3Qg+HoaPiuit+w+R8xILUg9Pfxa7eu/1iwrsUnIQm2Fcg0mVuhSME3J5b78j6bYDPyhp2nJzm2wTdEMAHvrLzTZMsjCkjQa4x4DU= Received: from SJ0P220CA0015.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:41b::19) by MN6PR12MB8469.namprd12.prod.outlook.com (2603:10b6:208:46e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8901.26; Sun, 13 Jul 2025 17:48:36 +0000 Received: from SJ5PEPF000001CE.namprd05.prod.outlook.com (2603:10b6:a03:41b:cafe::94) by SJ0P220CA0015.outlook.office365.com (2603:10b6:a03:41b::19) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8922.30 via Frontend Transport; Sun, 13 Jul 2025 17:48:36 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ5PEPF000001CE.mail.protection.outlook.com (10.167.242.38) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8922.22 via Frontend Transport; Sun, 13 Jul 2025 17:48:36 +0000 Received: from kaveri.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Sun, 13 Jul 2025 12:48:20 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH V9 3/7] mm/filemap: Extend __filemap_get_folio() to support NUMA memory policies Date: Sun, 13 Jul 2025 17:43:37 +0000 Message-ID: <20250713174339.13981-6-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250713174339.13981-2-shivankg@amd.com> References: <20250713174339.13981-2-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF000001CE:EE_|MN6PR12MB8469:EE_ X-MS-Office365-Filtering-Correlation-Id: 66623946-be79-4824-efa5-08ddc2357e49 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|376014|7416014|82310400026|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?QPEWqFe1CjLvoMKck3A5FdJ4sFwwSdGlz2wtIW5R6jk2q8hK0KF8Nnj22Xts?= =?us-ascii?Q?F7pcypr/1VcwCx+yR2c+0UvN4jBFJUKbSqmQ5Z40YrqkCDhkdU2Mt6kzbTpu?= =?us-ascii?Q?TKWYkzgGgKLqRtxeT72e4M/T5o8ag+4/bGr3W1ESR+9hjEYLGP/YEfxIxLra?= =?us-ascii?Q?Y9rwktGisdiLyZDNLyYit0aBeS0sxgg6XmnjyBvSSe1SNHNxFbRBqIdLxDsx?= =?us-ascii?Q?A+z9nvjkxt1rieCBgX/7BrMFg9iTN9kMGz6QHFe5till3C/vUc5UWKKZrAeT?= =?us-ascii?Q?82WEx6gNfZaMlpzBuHBnFjmRXE6ATwaLCufMHIcrjuNdEPydtDKlOUYG9maq?= =?us-ascii?Q?GoFcUXLNh9IsRPIMbXZau49GDuSDt5MSOKEik7vII+qx234WBb+48vwiOgXH?= =?us-ascii?Q?aI7FTYUnXhjl/tTRVGmBsGNaUv0cJobQZGQ7TzU50eW/0Tdx3Bz0G/ZiH/N1?= =?us-ascii?Q?aiqly2LESIDysouYcZp08PUhro7MkKEnCx0/pRint1jsfpzTsui/rI1v++VO?= =?us-ascii?Q?uk0b1mWByRs7Qgvd+9nRZnNXDLjTC9w0cCkksk41JNSYo9/s5FOYPmvI7/L8?= =?us-ascii?Q?g+9CGpRnpm7NP0vZSEjormN4LlSyrO/Q/BbcW6XSifXXs0COwhqx953S8Cx3?= =?us-ascii?Q?kabTh3zySL3yRRdmWQMeh6tXIHyCF3wnnqD87TkOuJ/ixVGHhKQRP34cgeZY?= =?us-ascii?Q?Q9+P0uIOCHILKzbUAR5iGLbLL9rWB5uPxSbm1ZVmH31oGD8NNRIl8kYhh39m?= =?us-ascii?Q?WwbyMrIgizPyS1RhwfTShLvIsn/jXhesnCPDjt9Wt7O398xOC7sTi5hvdJ+x?= =?us-ascii?Q?/oAo5l9uy1EJQrswXONV6DuOcHMFvQCVAWELyzH9gJyLHr8sWIO17T9gpkZI?= =?us-ascii?Q?CD9pipM9KQj3NNZfTUXhbbs7o7iQIhfFZYYdBSfhZrzt+UBM24TdTSga27D3?= =?us-ascii?Q?w4SDgkeTqi4Ua5X5c02j5W0Ofm565cNrTvqZ8MWnVTncLdEYoF+eCS0q9dSa?= =?us-ascii?Q?2txw6l5pm2nPqJ1zF31xkdgL37HL2pS7kx/wdP+tB4WadxTofILwWo6+Tbry?= =?us-ascii?Q?BMIv6dzae8iIkAaIxTZfjeih+5K4RPZV+F5VMZxjWuNShprSI//depoSVFZz?= =?us-ascii?Q?Nwi1Y6xrt7mmsl7hPUK2Ny2zp1UlszrWofgzF93YUVOhLDjFxCoZHUnTiowZ?= =?us-ascii?Q?9QZfSDtIZe5VbLFY7iqfHQrnR4XFzEZ7Aycna3r05Mf5iOeFtEp7ndMdkVnG?= =?us-ascii?Q?CN4QgGBrNpavEmlURONLpd/Ija9j1BzVZrAgQ1ygq2W4RzxC1ZfJbyAHMdGn?= =?us-ascii?Q?mAEMNqbbSayn8hYg4h4M6tPZD2dBe/ZmvPdVrpRDp2YRiqdN2HvmniJyIMnk?= =?us-ascii?Q?F9qVfNl+FK20hd/aCMzeNqwbgNeirYHqFXHwWv//FM/eVugt8taT1Na3QucO?= =?us-ascii?Q?j3+QqYumqFCLn8QuL5ttyWxKQSrpD3NeaBBonPkIW51KPetOYutaIWFhAqf6?= =?us-ascii?Q?Ln3cRSyl/CDC+aPHUBfSMtN48Jp8Rv2XBvCf?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(376014)(7416014)(82310400026)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2025 17:48:36.2965 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 66623946-be79-4824-efa5-08ddc2357e49 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001CE.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN6PR12MB8469 Content-Type: text/plain; charset="utf-8" From: "Matthew Wilcox (Oracle)" Extend __filemap_get_folio() to support NUMA memory policies by renaming the implementation to __filemap_get_folio_mpol() and adding a mempolicy parameter. The original function becomes a static inline wrapper that passes NULL for the mempolicy. This infrastructure will enable future support for NUMA-aware page cache allocations in guest_memfd memory backend KVM guests. Reviewed-by: Pankaj Gupta Reviewed-by: Vlastimil Babka Signed-off-by: Matthew Wilcox (Oracle) Signed-off-by: Shivank Garg Reviewed-by: David Hildenbrand --- include/linux/pagemap.h | 10 ++++++++-- mm/filemap.c | 11 ++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 78ea357d2077..981ff97b4445 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -747,11 +747,17 @@ static inline fgf_t fgf_set_order(size_t size) } =20 void *filemap_get_entry(struct address_space *mapping, pgoff_t index); -struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t i= ndex, - fgf_t fgp_flags, gfp_t gfp); +struct folio *__filemap_get_folio_mpol(struct address_space *mapping, + pgoff_t index, fgf_t fgf_flags, gfp_t gfp, struct mempolicy *policy); struct page *pagecache_get_page(struct address_space *mapping, pgoff_t ind= ex, fgf_t fgp_flags, gfp_t gfp); =20 +static inline struct folio *__filemap_get_folio(struct address_space *mapp= ing, + pgoff_t index, fgf_t fgf_flags, gfp_t gfp) +{ + return __filemap_get_folio_mpol(mapping, index, fgf_flags, gfp, NULL); +} + /** * filemap_get_folio - Find and get a folio. * @mapping: The address_space to search. diff --git a/mm/filemap.c b/mm/filemap.c index a30cd4dd085a..ec7de38c17c1 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1896,11 +1896,12 @@ void *filemap_get_entry(struct address_space *mappi= ng, pgoff_t index) } =20 /** - * __filemap_get_folio - Find and get a reference to a folio. + * __filemap_get_folio_mpol - Find and get a reference to a folio. * @mapping: The address_space to search. * @index: The page index. * @fgp_flags: %FGP flags modify how the folio is returned. * @gfp: Memory allocation flags to use if %FGP_CREAT is specified. + * @policy: NUMA memory allocation policy to follow. * * Looks up the page cache entry at @mapping & @index. * @@ -1911,8 +1912,8 @@ void *filemap_get_entry(struct address_space *mapping= , pgoff_t index) * * Return: The found folio or an ERR_PTR() otherwise. */ -struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t i= ndex, - fgf_t fgp_flags, gfp_t gfp) +struct folio *__filemap_get_folio_mpol(struct address_space *mapping, + pgoff_t index, fgf_t fgp_flags, gfp_t gfp, struct mempolicy *policy) { struct folio *folio; =20 @@ -1982,7 +1983,7 @@ struct folio *__filemap_get_folio(struct address_spac= e *mapping, pgoff_t index, err =3D -ENOMEM; if (order > min_order) alloc_gfp |=3D __GFP_NORETRY | __GFP_NOWARN; - folio =3D filemap_alloc_folio(alloc_gfp, order, NULL); + folio =3D filemap_alloc_folio(alloc_gfp, order, policy); if (!folio) continue; =20 @@ -2029,7 +2030,7 @@ struct folio *__filemap_get_folio(struct address_spac= e *mapping, pgoff_t index, folio_clear_dropbehind(folio); return folio; } -EXPORT_SYMBOL(__filemap_get_folio); +EXPORT_SYMBOL(__filemap_get_folio_mpol); =20 static inline struct folio *find_get_entry(struct xa_state *xas, pgoff_t m= ax, xa_mark_t mark) --=20 2.43.0 From nobody Tue Oct 7 07:07:36 2025 Received: from NAM04-DM6-obe.outbound.protection.outlook.com (mail-dm6nam04on2058.outbound.protection.outlook.com [40.107.102.58]) (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 D87E019D07A; Sun, 13 Jul 2025 17:48:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.102.58 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428936; cv=fail; b=q/e268QyID+pqyQOORipmPr6q3xlHp5XVa75vfThb0kyOmFUPl4KIC5nmNYcRY1b9DZsRmhXI4f7A2r4VCz4XdFTNszsDOxvqKBQrhUdjP8LckD65MVeLQKKKMp/T2AJZq3ROGgMaVA625VN/iCOA2pyUt3RpVi5ib5bJsrESak= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428936; c=relaxed/simple; bh=iE9d4Den1dvoDhkkaVMmJJQpP+gH/Fs5HtXiiqSJvgg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=U4GW+MYpnM4aHmWO3tdGzrCtBF5ddXgrcarWBZgAxf8yH2gjI5yB4BOAKfFWIJNHSWKcnSYUvkU/Zh5AKccD7HHAKdRuVZSUqfO2h6E+mIo5IsQkAyfms6URT5AHA9UAjGTagMs5s60wC2UJ7kkpERJ/KL5d4UkS7oYbdizwnp0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=lJXmeMy+; arc=fail smtp.client-ip=40.107.102.58 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="lJXmeMy+" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hIH4FGemcONA2X50RnSnHVm6Qrz0wcJ5LtnvsixlIr63dYQvwphzTd8tzQLtD8SJrnAkj9FOKZ79OQ1yvBRfxrocWwuMHa1zwlLX6s43C8ZDR3wnPOFMfQHDO3q7gRLEaVxmM4i8r3rvoULQqfTGPl9lOLJOBAMg42Sb3U1vgkAI5HaQajLaXyZVC6dc2Z+AoKpavG4bTC6yGgvZudpQEH60zACrCNhui9xCPCesb1OkvtMthk/wQbRpnPqBitUSpIdgnyx8aOeTeIATeKtmF9+IKVe8g42totdBnn6aL4hQwllExdYDSvcogAU2vgxqyW9qkGV3KfBMbaZWCcMItg== 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=dTjj+lVZp0RixDQuYKs/TN0YmDJpa6lnG98n9bmpL9k=; b=WKcJMapWzKTig6eTaqocdYxzM6ocA+QErXcukVYJPiV849XTg/RxQEkYMoOt/hSognDmZB6XIjP+rhFz67sHi5EnzkOsHyVGbW9Sl7glBDPhWnDii+SKOnlrTDslKahIjXQkY9+wNcNEIM08IoJ2cJ8jUW9dSEsVpk3Pfv3l50AFtv4Jn8kOCjf7BwaVqrUe0yFk2pVhjfWnjSE4t9aae9CfmgChVKgotKwab2thOspkJns+bKQhQfvuA554CL+X07H+bQ7wwBx3OGBbGsMzp64vQ7/btajKHPRRvhMKl8g9G+GyOZa9u9DjiwcUuVvyikCAkOaLLyX0yBrQYiiYbw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=google.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=dTjj+lVZp0RixDQuYKs/TN0YmDJpa6lnG98n9bmpL9k=; b=lJXmeMy+9kZ4XigTJzOfAvOsfmVXqL4wAGi0G5kpzcBTTNms44WjkUgpQck1Lk5OMfD9OXJnmQmiL/LMrnocD19sqGwSQKMB3fjhr/CY0UKTQv2gCoPO+DsSBJw+h09uc8yFUSMdPB2M7Dem5pdjPYex3k2BAl9kiEwWrOu1g0I= Received: from BY5PR03CA0027.namprd03.prod.outlook.com (2603:10b6:a03:1e0::37) by BY5PR12MB4081.namprd12.prod.outlook.com (2603:10b6:a03:20e::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8922.23; Sun, 13 Jul 2025 17:48:51 +0000 Received: from SJ5PEPF000001CA.namprd05.prod.outlook.com (2603:10b6:a03:1e0:cafe::81) by BY5PR03CA0027.outlook.office365.com (2603:10b6:a03:1e0::37) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8922.27 via Frontend Transport; Sun, 13 Jul 2025 17:48:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ5PEPF000001CA.mail.protection.outlook.com (10.167.242.39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8922.22 via Frontend Transport; Sun, 13 Jul 2025 17:48:51 +0000 Received: from kaveri.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Sun, 13 Jul 2025 12:48:35 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH V9 4/7] mm/mempolicy: Export memory policy symbols Date: Sun, 13 Jul 2025 17:43:38 +0000 Message-ID: <20250713174339.13981-7-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250713174339.13981-2-shivankg@amd.com> References: <20250713174339.13981-2-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF000001CA:EE_|BY5PR12MB4081:EE_ X-MS-Office365-Filtering-Correlation-Id: e2bf1582-9468-4c11-e590-08ddc2358742 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700013|82310400026|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?np14MBrIx0sY7627s80IPmyH58CZ75QiahyJk/ra8k3Keue+wT+kKJmXDBH2?= =?us-ascii?Q?zkL+PwKZfhNXF6SXmJXsiOQOtGTrfbDmr8MP+9lHfkNIyQKx7Fzr+Y+6eBAX?= =?us-ascii?Q?Pb11eInX8ojSy6i2zbpziVEbDYOEWYDGzrhauq7uiBDXgFulo5pNqblVHb3J?= =?us-ascii?Q?1aueakYVLvH/UI3Xx3hEa+HfamfiT2SEPgmZseKWSm9D9AdGYU54UUTnhICf?= =?us-ascii?Q?3Q4+wJtwEVyIHzIbEczDQBSLic5dPF7S0M0AGZLa5GqYt4GEjCirLDEbJRTP?= =?us-ascii?Q?P8eIysxmkU2aimcMlSNf9YMpd72zGi8XU9zfTl7ISi3tixQe0RuuVUqnlsSc?= =?us-ascii?Q?FkLFG3sRbAnPAPqL2pQwpZBDonne0cDLUOH5cmo6BtTKq/p5br/tCiHzs+aP?= =?us-ascii?Q?UKDw24W1VfMwFBpUnFiTN0XHExIyduFfaglDY9oTuBbMIC/EuoUvRhnIzHfR?= =?us-ascii?Q?h/Q3UpiLAdwC4eV1oy7Bo8SMurbKPrCqtIIMJBrvP1+2ybCwHW3NqmgLZIqH?= =?us-ascii?Q?j/iFkxu0fZ8V13VTB2OjoZzYYRGctgms2GSdS2LQ1RBAYMCp3njL5fCiFBB2?= =?us-ascii?Q?7Ii0B+xlV4hM5yVy7V6OiicxU5SzbkQw4gkxX/kbO8wYSI2Ar2V94ClUWVQf?= =?us-ascii?Q?NwcEaSFFwqYGdySOYxo6i3lKq9yiiuXnnU4omUXvlMYo7MvCazcyJleEDqlE?= =?us-ascii?Q?iWA0DFSF3agkAHKg4Bqq2EItz1+TI2Wvr2qC+DwZB6YB4tpcHLKjHPZZLRvd?= =?us-ascii?Q?JZhGHVNBv9p+JOrCL2QwRvL0Y+W8tNWUG7fs1d9znjo6ea26X2Bt1d9s10xf?= =?us-ascii?Q?GPEdQhhtNYrH0A8XqJ5EEfnYM8k0AQ8rsfv1LbbdaRmWFatIb9G+qP6QIVCC?= =?us-ascii?Q?jyz/OC2ToxAkyVbxbsdFWBqoe4Yg73AwVHkzOvQvfV7SET4c8HRPccVdCTg9?= =?us-ascii?Q?hjZTYGWQlXGrikU+pd6qe8iNcu6v7FQtXhiFvyu4wcXI5Zcr3DpbGEU9ODP4?= =?us-ascii?Q?thzW6QadD7yok0nKp6skIn95c5OrbzzcfnWS7WWZK/aDIpZk2KAOO6F4Ohli?= =?us-ascii?Q?grOkFLTt56z6MeFekZSTmSSVyjVCho6T8e5EUBM/qdCjl0ztFjzW8M1p8H3l?= =?us-ascii?Q?swG7FWmpQsVwVm+Sbz5aYVy56UPOXFeHdkiY6G85v3KjHL8FeervSIZibHEf?= =?us-ascii?Q?Vg4xjOLcGfrzGs4vJ7aAjBHDRhzylznWKVOuhX2u0UwEvNVEDcl2TRnYTj2A?= =?us-ascii?Q?yDsENV+8QwpE15jeZ9qgk1ukaUKEmp5vgWwDu/vbLBDV8Xxunis64iqqhHaX?= =?us-ascii?Q?uZ3U02R0ZxA4BwMB54cj0Siq5wWJpVkHGmX8ZzrS/izXeA2dCi5s9Qpd7q17?= =?us-ascii?Q?mbbaJD4KTEEiRrB9KZ52LTQglWWOnPLPrkx2yToxWMsdvGiqS9uSNy8QgO6v?= =?us-ascii?Q?L3lAXus7fbbsUR8VjscVjdViB2uO6yjo4P3uECXcNVd1ju86haKGWyZVVtOV?= =?us-ascii?Q?w5oKwf1Iq13v/oUv1JV75KQOwOUMKz/4FGc+?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(36860700013)(82310400026)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2025 17:48:51.3488 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e2bf1582-9468-4c11-e590-08ddc2358742 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001CA.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4081 Content-Type: text/plain; charset="utf-8" KVM guest_memfd wants to implement support for NUMA policies just like shmem already does using the shared policy infrastructure. As guest_memfd currently resides in KVM module code, we have to export the relevant symbols. In the future, guest_memfd might be moved to core-mm, at which point the symbols no longer would have to be exported. When/if that happens is still unclear. Acked-by: David Hildenbrand Acked-by: Vlastimil Babka Signed-off-by: Shivank Garg --- mm/mempolicy.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 3b1dfd08338b..a502e06cfaa2 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -354,6 +354,7 @@ struct mempolicy *get_task_policy(struct task_struct *p) =20 return &default_policy; } +EXPORT_SYMBOL_GPL_FOR_MODULES(get_task_policy, "kvm"); =20 static const struct mempolicy_operations { int (*create)(struct mempolicy *pol, const nodemask_t *nodes); @@ -487,6 +488,7 @@ void __mpol_put(struct mempolicy *pol) return; kmem_cache_free(policy_cache, pol); } +EXPORT_SYMBOL_GPL_FOR_MODULES(__mpol_put, "kvm"); =20 static void mpol_rebind_default(struct mempolicy *pol, const nodemask_t *n= odes) { @@ -2888,6 +2890,7 @@ struct mempolicy *mpol_shared_policy_lookup(struct sh= ared_policy *sp, read_unlock(&sp->lock); return pol; } +EXPORT_SYMBOL_GPL_FOR_MODULES(mpol_shared_policy_lookup, "kvm"); =20 static void sp_free(struct sp_node *n) { @@ -3173,6 +3176,7 @@ void mpol_shared_policy_init(struct shared_policy *sp= , struct mempolicy *mpol) mpol_put(mpol); /* drop our incoming ref on sb mpol */ } } +EXPORT_SYMBOL_GPL_FOR_MODULES(mpol_shared_policy_init, "kvm"); =20 int mpol_set_shared_policy(struct shared_policy *sp, struct vm_area_struct *vma, struct mempolicy *pol) @@ -3191,6 +3195,7 @@ int mpol_set_shared_policy(struct shared_policy *sp, sp_free(new); return err; } +EXPORT_SYMBOL_GPL_FOR_MODULES(mpol_set_shared_policy, "kvm"); =20 /* Free a backing policy store on inode delete. */ void mpol_free_shared_policy(struct shared_policy *sp) @@ -3209,6 +3214,7 @@ void mpol_free_shared_policy(struct shared_policy *sp) } write_unlock(&sp->lock); } +EXPORT_SYMBOL_GPL_FOR_MODULES(mpol_free_shared_policy, "kvm"); =20 #ifdef CONFIG_NUMA_BALANCING static int __initdata numabalancing_override; --=20 2.43.0 From nobody Tue Oct 7 07:07:36 2025 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2078.outbound.protection.outlook.com [40.107.223.78]) (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 5EA38255F2B; Sun, 13 Jul 2025 17:49:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.223.78 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428951; cv=fail; b=mB2IEUkuGDi9EWyPSFukyJum1HhDzXRVv/h9XdLUEmylWi4V/TsQAqdh+Mi6g11yxy6ewRg1wDXBF0QSPsWnnUxzj2ArHTEEyq6XttZ2H1Jr2IzgwGM/ZyJvhpPesWwHbiwZdL2KscFrRmws6kNlXzZWQ+q6gh/U4ilAWdSD0iM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428951; c=relaxed/simple; bh=GeccQzH+SB2nfgl2D+0SrQzvXZYRY45L6mIPASbrrCU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=R0RQ+OOnpBYBGh1IukDVsmzaJdU4G0gLaWzMrTy701ETZpu5CXfLmj9O/8g7yIRvjLdsPhqIMsaLrF/jXawHWQD/6rGj+tDCWpJUsk7CaN8krkTszdgohXbJg/TaY3FqDPHzD3d1WR2zIhbdsAFg6K6ow+Ee3t2HDz7dqQMtqk0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=zam0z5NH; arc=fail smtp.client-ip=40.107.223.78 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="zam0z5NH" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=x+pugnGz3C0Q8fPKm6Pp7m12q895s3Xedjq0WXZR8mPQTYU1otmqr6kTlR4AZlpVCEnvevTxDbXCyqA9QLJXNdDAKiv3j0fab3/LipNd2NgYNNt6DET7PoRziDHHKDzhyRAx0cqE07zVXKkNJrqci9Haqx7zgAi08tRjvCqf+sNpgXIsCpcL0sKLVP+iHzDw292erzK+6c1uy6cumEgG5GVJtovJe8oyjSY04n9R7R0FfleK5boM2LetThCZfU2OIbp/Yn8j0zlAKC1JOJcKFNJulRGfSiV/IkT6T7Pi0+O9UfWm5LgXVqnvNqlfZvgVOtTFvbTpcjFr64EXIP9zHQ== 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=sRslfXg1FfLdRhN1RCeZhZ8lWrpPq+GzUdZBZnLnT54=; b=QwWjbK2hjM5OwIxa3e4JxUi5YhDRITw7sbkSD5EnXCcoFhgKbFUE7NpFmQLTgYlq/E1T0ODeSvQ8/3oKH+bqxQGr1SrYP5M9uE5GNkDre/I1qoKTV+67V5QXAJrPT4GerNVqZgNAtfXhIuBjwUT+qaxd4xK20IAjOea9DpAOKAlGUAyhTmiRFtxR1Dh9dfytX+lPsA9QO50S3qrqmU7NpiEuSlL3Rn4VXY80Kz+lO6puTiURAhxm/dEraHVJbCsp+axbt8ZDVXW9+znYnpYXVFL9ADTj2BzX77pp/5uIr/x5BXlG5dKNrvbYRTo7JvNrR3sLBVn9qvgFXjkitjTFmQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=google.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sRslfXg1FfLdRhN1RCeZhZ8lWrpPq+GzUdZBZnLnT54=; b=zam0z5NHZ2R4lD4t5S1M23tmD1kEuU7dJB0RVSugGWaweBNzhZ7M4+nj04UCHZje/ZW5+C6XOMbvHiZBVVBA0wd+lZIS8Xw5NQZAnsak3U2qj8UJzNLZ00ZLfp++lF3D8CmnO6zW+TCA7e9hIFNMsRrxmE58HSvi+ywR3YV+3FA= Received: from BY1P220CA0003.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:59d::10) by DM4PR12MB6012.namprd12.prod.outlook.com (2603:10b6:8:6c::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8880.21; Sun, 13 Jul 2025 17:49:07 +0000 Received: from SJ5PEPF000001CC.namprd05.prod.outlook.com (2603:10b6:a03:59d:cafe::89) by BY1P220CA0003.outlook.office365.com (2603:10b6:a03:59d::10) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8922.32 via Frontend Transport; Sun, 13 Jul 2025 17:49:06 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ5PEPF000001CC.mail.protection.outlook.com (10.167.242.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8922.22 via Frontend Transport; Sun, 13 Jul 2025 17:49:06 +0000 Received: from kaveri.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Sun, 13 Jul 2025 12:48:50 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH V9 5/7] KVM: guest_memfd: Add slab-allocated inode cache Date: Sun, 13 Jul 2025 17:43:39 +0000 Message-ID: <20250713174339.13981-8-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250713174339.13981-2-shivankg@amd.com> References: <20250713174339.13981-2-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF000001CC:EE_|DM4PR12MB6012:EE_ X-MS-Office365-Filtering-Correlation-Id: e62adb62-ea74-4c94-0b62-08ddc2359071 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700013|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?xOonWxU5ZF3c0dlhJRyU1BinyNf9xhoXlSHz6qbfaGdcWRGhm1EzMyn5KYJR?= =?us-ascii?Q?cAHCbxnuUPpuM8I7m0NfDCT6In8dXwE/jUWSpfVNyrEGhCuxhP3h02eMZOk4?= =?us-ascii?Q?wpKhVh1onPf/Fp0o/uWrfZCJon7U86RKHjjkAO4z4Tfw7qCciVEKK+eud7Wb?= =?us-ascii?Q?Hz7LCj6nZvowQBa7jKikxDpcEEWzbHsmAUaqUeW5rguUCMxP8rUseyQ9kueu?= =?us-ascii?Q?BGGsbJyZVO6WRFjldrIrfh1XMwsMBVmtFFgS3kznRd4TJLnsmMpFX5yWFpPB?= =?us-ascii?Q?BzlEjLPS3x72APj4antFx9AEhWysmEZSNW3KNsAGar4nQnur3RHHRRZYLZrC?= =?us-ascii?Q?0GhNEz9611Qb4oKxd6i8m7e290xQmS29ATvqgvS14qaQVwERPbRSR/ftr3rg?= =?us-ascii?Q?kF3KusBW66i+a3ToFb8f0ssNuWWuBvEfk9knNwZgWRqWfujxCJBclVR7Nzm+?= =?us-ascii?Q?0h/bORCYtxg+gJxEmLMl/t9kqIPeQqvIJ7ZKANLn9v8wQTQTbCzyemTiG6ua?= =?us-ascii?Q?YTI5U8wQeDiEy6zL2d528GXSRFp+WdgnbU4vNqfw9NxUlRi6nvWxDGqWUW4c?= =?us-ascii?Q?vLvFl55Rv5bpznnywqd+SFxPyMAPKEEtJOmMNRJqFD9u7m8nzwV6K9lv2s7X?= =?us-ascii?Q?tAur11AehQouOpc66NGhW0YnxYgKOiOQBub9SAhOHB23CidOjxp544uPT6RK?= =?us-ascii?Q?drGd8eZU+1Fgvs+8LwHFLuCiJVNKcmD7eG6ougy2Us3Nenmx2yiYhVwEHVVp?= =?us-ascii?Q?D4CN+IjNE8L3Uet5skDQis/FUTWI7Xq0u1aozgbow88PBW4AK0t2Or9PD0PI?= =?us-ascii?Q?80MteGmyI8KphkxGtimYLsDQHKnMxgpeyJJVVtckSkTSBQLQZy8ELER6r+uB?= =?us-ascii?Q?YZGmK2d/Zfl7sAw7G4FQh9avzVCGrGDMd5IlfN9P1aPS4joHl8WT1nb4dlcU?= =?us-ascii?Q?1StNDa9B9Dp7YrW5eaKTskUR6DRZpJXO/IXXuDZzCWM/k9qHncvSsTv+iJzK?= =?us-ascii?Q?oZKbCl0uA2ADYVDCLndOlTkZTWYlfnrrv4ogDxJqMd9YICyQffWuDvasrx1M?= =?us-ascii?Q?Fb/Op8nmnlvwQS8mXli3kZ9h6k5hpSSURuwu8+WvpMcho8n0UhAu3ULm4Bzp?= =?us-ascii?Q?5sBklIwH+BiaLcJ2cBCnOFK+O+T/ZRnb9T0gMd5MZ5F6HuPBJ6d1/DzPg7Jy?= =?us-ascii?Q?pM51Tk19/KxRMv/++8rzqBlFLcuU++EgHLmMPtXaRyXPqm7xgY8cwIWFWbFM?= =?us-ascii?Q?XyyIz2P+2ujqwopj3XRxeOpLzyZovt4fUj7CNcxI6cHl9vgnpHxlAN5ZxhBx?= =?us-ascii?Q?qu2VeKzEk1+IEBvtSXWyHdWChbmaq0tSko5yge9A6rujU+izt8abslfPLLMN?= =?us-ascii?Q?AI+o7BhZYiooAfEqEZQcG/ib0WkU7WRgIcGN1NWqldjP2higC8NXyTOAAu6i?= =?us-ascii?Q?x2S5AhhOqMiBSssylTX8VREw7LwC1hOW/wT6K0h7EUCaiYgjKdNF3qPV3U2M?= =?us-ascii?Q?B+vhnrsdZR1d4pT4pkpnuPGp7jK8dzvYW45S?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(36860700013)(1800799024)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2025 17:49:06.7517 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e62adb62-ea74-4c94-0b62-08ddc2359071 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001CC.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB6012 Content-Type: text/plain; charset="utf-8" Add dedicated inode structure (kvm_gmem_inode_info) and slab-allocated inode cache for guest memory backing, similar to how shmem handles inodes. This adds the necessary allocation/destruction functions and prepares for upcoming guest_memfd NUMA policy support changes. Signed-off-by: Shivank Garg --- virt/kvm/guest_memfd.c | 58 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index dabcc2317291..989e2b26b344 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -17,6 +17,15 @@ struct kvm_gmem { struct list_head entry; }; =20 +struct kvm_gmem_inode_info { + struct inode vfs_inode; +}; + +static inline struct kvm_gmem_inode_info *KVM_GMEM_I(struct inode *inode) +{ + return container_of(inode, struct kvm_gmem_inode_info, vfs_inode); +} + /** * folio_file_pfn - like folio_file_page, but return a pfn. * @folio: The folio which contains this index. @@ -392,8 +401,33 @@ static struct file_operations kvm_gmem_fops =3D { .fallocate =3D kvm_gmem_fallocate, }; =20 +static struct kmem_cache *kvm_gmem_inode_cachep; + +static struct inode *kvm_gmem_alloc_inode(struct super_block *sb) +{ + struct kvm_gmem_inode_info *info; + + info =3D alloc_inode_sb(sb, kvm_gmem_inode_cachep, GFP_KERNEL); + if (!info) + return NULL; + + return &info->vfs_inode; +} + +static void kvm_gmem_destroy_inode(struct inode *inode) +{ +} + +static void kvm_gmem_free_inode(struct inode *inode) +{ + kmem_cache_free(kvm_gmem_inode_cachep, KVM_GMEM_I(inode)); +} + static const struct super_operations kvm_gmem_super_operations =3D { .statfs =3D simple_statfs, + .alloc_inode =3D kvm_gmem_alloc_inode, + .destroy_inode =3D kvm_gmem_destroy_inode, + .free_inode =3D kvm_gmem_free_inode, }; =20 static int kvm_gmem_init_fs_context(struct fs_context *fc) @@ -426,17 +460,37 @@ static int kvm_gmem_init_mount(void) return 0; } =20 +static void kvm_gmem_init_inode(void *foo) +{ + struct kvm_gmem_inode_info *info =3D foo; + + inode_init_once(&info->vfs_inode); +} + int kvm_gmem_init(struct module *module) { - kvm_gmem_fops.owner =3D module; + int ret; =20 - return kvm_gmem_init_mount(); + kvm_gmem_fops.owner =3D module; + kvm_gmem_inode_cachep =3D kmem_cache_create("kvm_gmem_inode_cache", + sizeof(struct kvm_gmem_inode_info), + 0, SLAB_ACCOUNT, + kvm_gmem_init_inode); + if (!kvm_gmem_inode_cachep) + return -ENOMEM; + ret =3D kvm_gmem_init_mount(); + if (ret) { + kmem_cache_destroy(kvm_gmem_inode_cachep); + return ret; + } + return 0; } =20 void kvm_gmem_exit(void) { kern_unmount(kvm_gmem_mnt); kvm_gmem_mnt =3D NULL; + kmem_cache_destroy(kvm_gmem_inode_cachep); } =20 static int kvm_gmem_migrate_folio(struct address_space *mapping, --=20 2.43.0 From nobody Tue Oct 7 07:07:36 2025 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2080.outbound.protection.outlook.com [40.107.93.80]) (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 D1390285404; Sun, 13 Jul 2025 17:49:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.93.80 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428969; cv=fail; b=FgPDAzTMZRAlhBhoNlFhUeuVG+uwNs7sCFsxnDJa+zBQPul3MtqTRmaN58DE/qX8OUnJZ0IToh3FOJb6uF2L24inzbg13tSYfZSo6y8h7FyagzIFx6t6x7IteYtP08O2X2CaUua88s/gTHkhpSIuVNL7z9+NB365oRbFR4uUXO4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428969; c=relaxed/simple; bh=K5R53kNZctp42Ea1BvF3uyz0pmM8QiNJFYHUFaHns3c=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tmKkPnBV4gUacrSgNFKlUdibgmxvBQi6i2cqZnSMgrs1Y0WZKCf7kdNXOBBPfwwHsza7qLMH2x5OH80kn4BgQMkmqgVRLT0WVumm04+oFs62BTNV8UcdeBDE0ShGBVNk4jy7wS3LcAbQli3JGwXxgPYtBPN8EY2SGvuAxi4P6c0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=J3uu+g3W; arc=fail smtp.client-ip=40.107.93.80 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="J3uu+g3W" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kUaQ2APsMnouUCuxWGnmerQcajz697Ad8LFu1ZWIiFsdHMIRDl/7yKKzhZbPqSbv8ORjOoCfjV4K+Y38NQ4BydTt330xeVLUc/my4KGYENL0r83ArvRy1JioNsPVv2t2/JOFaPFTpjTTEAiK/1qBv0ViwZlKCXk3iaYTs6g0NKji5M90B/UTYL4vqPbiHKzMNWUwTBU14iW8CJhPqmEu54+PrnJsfF+WlZJrwAcrx42JdUIxmO9e4wzryhXR17wpAg8AXAvPAV9LxpQ2cPpmSHDa0sVg0Iete5sHyJIGx+suO1HJAQr1fwqKKf6UhpUil0pzqey9HWPWBcTZsCc4TA== 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=E/Wxln1Nupj56Hrkb0yr1rSSkEPeB3D7ncSOmQaDyy8=; b=PfwhKmbrvU+Rd902iJOhTCGfRABKI5Rp1/cEmaoCK17RLZAv+XqQl1CoC0G6fNAnqkeFrp4kSjZ9LMnTkDQwbmBKD/RgKI8VpHRXrYKyfa6T2uJj19/WRBotUVv6gCciev/5Rl7+fO98zmZTSNIMbUbnaYjMgDAdDl/5WpcNou+XuTalm9KiVdfKWeB8oN53KKo7yLlrJl3KFMuMvjLfLD63Sqc6n6eaSIr68aQ9CLd4nEFYIfbQOVJ6SQhm7ziQ7gCCxkpsxOiF0n+QL1cKOfKSMvzhVtDB/EZoZ3QfgPpLGMoaUP5fIjvMbeAlmArejCuOUhsNTN7m/7isYmtiZA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=google.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=E/Wxln1Nupj56Hrkb0yr1rSSkEPeB3D7ncSOmQaDyy8=; b=J3uu+g3WwXDLGweo32NsipREJpvS3avjZE327jdJ9sYfMISXtYY5k1dXGE/EimwLV6xwGcsHfumBmehQWWuHtophI/idKOwTP7wkvc31hSfsb5sLoEHudlcQoEV2yj4Vf5WPRqwMOZ7w55dFEuzRnvNDjbktHhA4ZHMA096UvL8= Received: from BY5PR03CA0008.namprd03.prod.outlook.com (2603:10b6:a03:1e0::18) by SA5PPF7D510B798.namprd12.prod.outlook.com (2603:10b6:80f:fc04::8d0) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8901.28; Sun, 13 Jul 2025 17:49:22 +0000 Received: from SJ5PEPF000001CA.namprd05.prod.outlook.com (2603:10b6:a03:1e0:cafe::79) by BY5PR03CA0008.outlook.office365.com (2603:10b6:a03:1e0::18) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8922.30 via Frontend Transport; Sun, 13 Jul 2025 17:49:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ5PEPF000001CA.mail.protection.outlook.com (10.167.242.39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8922.22 via Frontend Transport; Sun, 13 Jul 2025 17:49:21 +0000 Received: from kaveri.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Sun, 13 Jul 2025 12:49:06 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH V9 6/7] KVM: guest_memfd: Enforce NUMA mempolicy using shared policy Date: Sun, 13 Jul 2025 17:43:40 +0000 Message-ID: <20250713174339.13981-9-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250713174339.13981-2-shivankg@amd.com> References: <20250713174339.13981-2-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF000001CA:EE_|SA5PPF7D510B798:EE_ X-MS-Office365-Filtering-Correlation-Id: 04b47af5-1b3a-4528-8a3b-08ddc2359952 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700013|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?yhEfXwqgAs4S/jaycdYsK76j4Ndvldl732s1Q+KatS2SU+EJgbKQQpkUiHAi?= =?us-ascii?Q?YNqRqdGtkrAif2MogTldgunMVxux1SN1Sb5iQPTXnQub5tY8Cdqmngc2MU78?= =?us-ascii?Q?UnZzo9DoElHm1qqu9KEUYYoBLd6g+CPrpFfyWXSykpDQDqsWGp7olYY/636d?= =?us-ascii?Q?TC1AMroJC29VQl2iRBCcUUH9RQ8tiRsDBvnZc8IZolAsnHdZZ2+iILbfjIgY?= =?us-ascii?Q?qy4/NoHFPTEeDkrZlSDfYGaoYG636exNN06JtRCKIvRUgI4ViLp/ZHgUdFho?= =?us-ascii?Q?lIblMufpG0I63HAfz7ygC/XjTl5Db8IVHhI4jPZDvQN+iyY++ixzHEgB9dnn?= =?us-ascii?Q?33Abw1LAhMp2aRizNrIJ1eSgCj0JAArYf5y9ie9Ee5Tn2DZBedfOUeV6S9yr?= =?us-ascii?Q?Rp53E3dvyH9Y6piV3jwmtp4pFBJiQhlK+Fn+8BYa2Zzi7R6pcAzAbIpb68AY?= =?us-ascii?Q?dEVEjMPEqQ+7wz5FUcs0kM4PZcAZQEPDVp2fr+96V0D84VNBV+qklUlYANCW?= =?us-ascii?Q?YeEnNmi3IJMylCnlscOHtXXm2OJYNno7iysdJGfsakCtN+EOfwH4lti3fTYf?= =?us-ascii?Q?4hAsceyQf0OSyM/3y0XrcLJhdMarU5c3/uLNog8WnLDC8Gjs76uANRfmhtBE?= =?us-ascii?Q?+so9n0VUwyT3UjR57wPd/qDPdTj72k+Yr1aC47rBVczGOI6DTO9soqLyyFXt?= =?us-ascii?Q?L2EzizMaH3q5cy90EUNIG1Ns5oMJXc0SROCf6+JL62Yfa4QkBUsHaVPWFIcP?= =?us-ascii?Q?k2uilOlUTkhoo1unyuJr6X6NLr+7NPHR7PTljzry0yLGOYiUKeu8S7xROjSE?= =?us-ascii?Q?XOtubkAKTkzGe3r7/VM4f7q5poSOyzhN10zjcOhMLPlZj8GucNB0lqpVc9uN?= =?us-ascii?Q?pZ4W5Vv9XzP644RanTH2JYYMna5yMMILUlZHnhblxr2sy6+f7lhyYElxDBUg?= =?us-ascii?Q?jql4Ke8d06TzwDqP4gj6Z+Y8k6/LkPkNo4z+t42lJuKZrcOIN5TvO/0J0DtY?= =?us-ascii?Q?F2RVljNHZuXKYmMEvEt8uoaoLTxGRLOuhhvACSG6nWVGJ3omdHIJuJwvRLMJ?= =?us-ascii?Q?06Q+8eBXnlW0TfYIKp/OWlETu2nvmOj9NkFO9XY+AxzLNhdQ+oEIg4I0sgx3?= =?us-ascii?Q?qFj95YAvkyoXMkQwUkRC//wYid1wLE/qF3Jz4JZL0CzSegrPXgWYsGMg5vCm?= =?us-ascii?Q?gsfeBdMMtTPazAQSWgLqbTi7n86LDCiD+MX7RVjwzqFijA5Qw1UKB3Qk0Tfk?= =?us-ascii?Q?XAR7uCsAZIqd7Il2hbRclYmD+qR+ZcRj/10PCkqACzOVW34hbzeFdwkMlgKm?= =?us-ascii?Q?V+8LWNSOVyz4aDbMpcKs5ry2bofcvBIonON+wEpdop1vlB4HBQqvbgFKzPGZ?= =?us-ascii?Q?6z56Gfbmv3IV5Y7pqBFT9xN1o3PY2Jt50ETI3ram8vbVaBtQ2rCV2js3RTUG?= =?us-ascii?Q?yQlhWoGIpBs28GMwbI+/6vlwyDuNQ/pvtKqrvng/kSoFQIYokKoRlQysURtE?= =?us-ascii?Q?UM4v2r7Au9KUOAa4y09C+dBUH5ZXhF7yDK7p?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(36860700013)(376014)(7416014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2025 17:49:21.6516 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 04b47af5-1b3a-4528-8a3b-08ddc2359952 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001CA.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA5PPF7D510B798 Content-Type: text/plain; charset="utf-8" Previously, guest-memfd allocations followed local NUMA node id in absence of process mempolicy, resulting in arbitrary memory allocation. Moreover, mbind() couldn't be used by the VMM as guest memory wasn't mapped into userspace when allocation occurred. Enable NUMA policy support by implementing vm_ops for guest-memfd mmap operation. This allows the VMM to map the memory and use mbind() to set the desired NUMA policy. The policy is stored in the inode structure via kvm_gmem_inode_info, as memory policy is a property of the memory (struct inode) itself. The policy is then retrieved via mpol_shared_policy_lookup() and passed to filemap_grab_folio_mpol() to ensure that allocations follow the specified memory policy. This enables the VMM to control guest memory NUMA placement by calling mbind() on the mapped memory regions, providing fine-grained control over guest memory allocation across NUMA nodes. The policy change only affect future allocations and does not migrate existing memory. This matches mbind(2)'s default behavior which affects only new allocations unless overridden with MPOL_MF_MOVE/MPOL_MF_MOVE_ALL flags, which are not supported for guest_memfd as it is unmovable. Suggested-by: David Hildenbrand Signed-off-by: Shivank Garg Acked-by: David Hildenbrand Acked-by: Vlastimil Babka --- virt/kvm/guest_memfd.c | 67 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 989e2b26b344..5c9a5eb5c13f 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include =20 @@ -18,6 +19,7 @@ struct kvm_gmem { }; =20 struct kvm_gmem_inode_info { + struct shared_policy policy; struct inode vfs_inode; }; =20 @@ -26,6 +28,9 @@ static inline struct kvm_gmem_inode_info *KVM_GMEM_I(stru= ct inode *inode) return container_of(inode, struct kvm_gmem_inode_info, vfs_inode); } =20 +static struct mempolicy *kvm_gmem_get_pgoff_policy(struct kvm_gmem_inode_i= nfo *info, + pgoff_t index); + /** * folio_file_pfn - like folio_file_page, but return a pfn. * @folio: The folio which contains this index. @@ -112,7 +117,25 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, str= uct kvm_memory_slot *slot, static struct folio *kvm_gmem_get_folio(struct inode *inode, pgoff_t index) { /* TODO: Support huge pages. */ - return filemap_grab_folio(inode->i_mapping, index); + struct mempolicy *policy; + struct folio *folio; + + /* + * Fast-path: See if folio is already present in mapping to avoid + * policy_lookup. + */ + folio =3D __filemap_get_folio(inode->i_mapping, index, + FGP_LOCK | FGP_ACCESSED, 0); + if (!IS_ERR(folio)) + return folio; + + policy =3D kvm_gmem_get_pgoff_policy(KVM_GMEM_I(inode), index); + folio =3D __filemap_get_folio_mpol(inode->i_mapping, index, + FGP_LOCK | FGP_ACCESSED | FGP_CREAT, + mapping_gfp_mask(inode->i_mapping), policy); + mpol_cond_put(policy); + + return folio; } =20 static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, @@ -375,8 +398,45 @@ static vm_fault_t kvm_gmem_fault_user_mapping(struct v= m_fault *vmf) return ret; } =20 +#ifdef CONFIG_NUMA +static int kvm_gmem_set_policy(struct vm_area_struct *vma, struct mempolic= y *mpol) +{ + struct inode *inode =3D file_inode(vma->vm_file); + + return mpol_set_shared_policy(&KVM_GMEM_I(inode)->policy, vma, mpol); +} + +static struct mempolicy *kvm_gmem_get_policy(struct vm_area_struct *vma, + unsigned long addr, pgoff_t *pgoff) +{ + struct inode *inode =3D file_inode(vma->vm_file); + + *pgoff =3D vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT); + return mpol_shared_policy_lookup(&KVM_GMEM_I(inode)->policy, *pgoff); +} + +static struct mempolicy *kvm_gmem_get_pgoff_policy(struct kvm_gmem_inode_i= nfo *info, + pgoff_t index) +{ + struct mempolicy *mpol; + + mpol =3D mpol_shared_policy_lookup(&info->policy, index); + return mpol ? mpol : get_task_policy(current); +} +#else +static struct mempolicy *kvm_gmem_get_pgoff_policy(struct kvm_gmem_inode_i= nfo *info, + pgoff_t index) +{ + return NULL; +} +#endif /* CONFIG_NUMA */ + static const struct vm_operations_struct kvm_gmem_vm_ops =3D { - .fault =3D kvm_gmem_fault_user_mapping, + .fault =3D kvm_gmem_fault_user_mapping, +#ifdef CONFIG_NUMA + .get_policy =3D kvm_gmem_get_policy, + .set_policy =3D kvm_gmem_set_policy, +#endif }; =20 static int kvm_gmem_mmap(struct file *file, struct vm_area_struct *vma) @@ -411,11 +471,14 @@ static struct inode *kvm_gmem_alloc_inode(struct supe= r_block *sb) if (!info) return NULL; =20 + mpol_shared_policy_init(&info->policy, NULL); + return &info->vfs_inode; } =20 static void kvm_gmem_destroy_inode(struct inode *inode) { + mpol_free_shared_policy(&KVM_GMEM_I(inode)->policy); } =20 static void kvm_gmem_free_inode(struct inode *inode) --=20 2.43.0 From nobody Tue Oct 7 07:07:36 2025 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2058.outbound.protection.outlook.com [40.107.236.58]) (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 1CC61285C98; Sun, 13 Jul 2025 17:49:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.236.58 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428985; cv=fail; b=mjUtTNoR5x1Kmg3lwFnBrycQuZHauYO0/yOcFBfmqVZu7sZDmaMx0reaDbNwmcyFII3jiCaGGGOMx/LBG1xzPaFVYN75O+vUFFmOzeAA0785v99aSpFyKHD6EWhnxus/DPnjG9fRnbrBVaaQNetD8ckO8v0XboOreirRPIAHnjM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752428985; c=relaxed/simple; bh=DFbOIpUIIdycsIHS6x0Qj9ca5JRubTDSJ97GR4+pFpI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=W6tkFcut5qnkkPItAZl//XEYp3yQXH0QETlvkX4nd5zlBFMzbDKxSmye/Hu9ikGsL4Mb+opUhYntAYXEGLxqbSwG2aJuZNbxeNby8bZ0Z2qgpT60C+iS9py0A8BLG0YYNC/mcaPLO+PvoE378/LUW+P2EAR7saa/FBfXkjsLxS4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=a1PvBTnZ; arc=fail smtp.client-ip=40.107.236.58 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="a1PvBTnZ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OEPww0AqJOeROSBjdr2R04guHoKf0hYeXV4wnO1sLQUvANv9bLWN7PN2yXb4nmfgdRYpA7Twr7EAwOmplf/ETGXqkDx7foaO6XMrTtjIzgwwRfMqWPek8wJL2vkQlNQ+U0vLcrcbiXPXj1bpGcjs5h4tpof37T/q1Zjhs1oBcky5QXbQeqvu/nWGb9cIeduXpqR/ply//GwcrFX1e2VzIQb8Cj2td56rD8v/Se+o1V6Uc4x6J+NXGm8NtHQgdPGOSxL1dWsyNctvYRp2GXekiryDrljk/qLhUHAnEN7rcX4vRPaIoGT4AA6teBK1S50pCO+ifKxfw4tjqy1X+hSDUQ== 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=+CVimU9xw3Fu7ChZR7ZXtFlrGo59bHwQQCmVDL+EEJ4=; b=gAHlziJk0drxQO1MHOO/krOkV9XDSxWplLOJo05OBqR7MXuM2v3mT7fxo9mVs+G2xBTrOCkuN7BZeymaXdvioLqLGgVWycfBXlpcVKS39OAk0VmGSRLyshKnOY82aGi3XK2M89GGH1rdWzQerZq+VrkYk9lX/aaHAmSl7GrSjoEiHHVZ2dN+MAWSjmPHssLlMFoyLoL/g2bbQuMwZJlGRICKRxsq2PnXU/9TICyrEtutU/g13GiXmc2WaTmfxN9bTSV/CQQlC/Jl36cA/jJRkUaW5Lb4PxboWMvv9X0qSPmKQ9fspZCBNK4Jhcr9FDVJiIyv4OdWsNScOcNjoaidWg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=google.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+CVimU9xw3Fu7ChZR7ZXtFlrGo59bHwQQCmVDL+EEJ4=; b=a1PvBTnZw53Bb+eBTUlLI1c56tcLWVgWVZhLJP1t16bC9Y5pzjCaYTIFHTriz+J4c3Qs8mHcRhcd8YlujkNa3rUw3yjbUxMVgW/EoJCj0zMHCCnbN5Q51IeXISbXogFyQKA0pHWFpYKePbwlAIBILV9z4WNXKIEjsEaIpX9osYM= Received: from MW4PR04CA0263.namprd04.prod.outlook.com (2603:10b6:303:88::28) by IA1PR12MB9530.namprd12.prod.outlook.com (2603:10b6:208:593::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8901.27; Sun, 13 Jul 2025 17:49:37 +0000 Received: from SJ5PEPF000001CF.namprd05.prod.outlook.com (2603:10b6:303:88:cafe::27) by MW4PR04CA0263.outlook.office365.com (2603:10b6:303:88::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8922.30 via Frontend Transport; Sun, 13 Jul 2025 17:49:37 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by SJ5PEPF000001CF.mail.protection.outlook.com (10.167.242.43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8922.22 via Frontend Transport; Sun, 13 Jul 2025 17:49:36 +0000 Received: from kaveri.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Sun, 13 Jul 2025 12:49:21 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH V9 7/7] KVM: guest_memfd: selftests: Add tests for mmap and NUMA policy support Date: Sun, 13 Jul 2025 17:43:41 +0000 Message-ID: <20250713174339.13981-10-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250713174339.13981-2-shivankg@amd.com> References: <20250713174339.13981-2-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF000001CF:EE_|IA1PR12MB9530:EE_ X-MS-Office365-Filtering-Correlation-Id: f74b6b1e-5f13-4b59-180a-08ddc235a266 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|376014|7416014|36860700013; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?cRY4V6V2FPUV3nVZu67KVdOTUiLf/Ry/8MOehSZbjE/QdS7fFp2c8phq8Lu9?= =?us-ascii?Q?snaJlBjDqpvofG0pVnBSJxVa0zGzhfs31ehFN5xUIzrF+6dV5E9/H7dBKT8V?= =?us-ascii?Q?tGXeGeqx0GwH4U6x2vmSZXR/0EkW68jCv+Uni5fFonEboQiM3lOnRgY63dn5?= =?us-ascii?Q?IAiC2SI6GRPra9PB3OJjL3G25hInAqB2pJp8VfuvAXCTCriXVI5cnYhDXcIw?= =?us-ascii?Q?TOhtpiLjo+/H+xg4r50NAgvTq85X/AoX5F2TzJ+OpL6ktB+EU0Co9vBCVekq?= =?us-ascii?Q?lzs1uj5sOgaq7b9HyK8KWYN125CaUBUUQA003o1zx8wp6oujmG55Gu8259+6?= =?us-ascii?Q?v5KcolCtpi6OEXzRHVRLogk0noX9ecrcCFxFuweRjVixU7lJ4RodgUjoV+va?= =?us-ascii?Q?tsKooK01kn61D712zlIKqLdlI3VW9wN8fgfIUmR+PgbzKAfYgTEscWkG9q7e?= =?us-ascii?Q?+Vk5f5FGBv4pCnU4oZZTCPiScLZ8R2jh2bGckBobXZlWbGH1qEc1ts3A+4m8?= =?us-ascii?Q?DrktFavF00wQ/8AlBPfI3nPLvhSYtMzvn5+eR8EQqSWm6W0MrW5myZpUvxQ8?= =?us-ascii?Q?JQ8Xme4a4rIzUXl5ZOVCFxWwaiv7AhSmMOjwFa27JgtwEyvM8tGIM2v5GiER?= =?us-ascii?Q?h9FgTkYIsX8f+R7BoWdLBcfnDpc2MxLxt0MmTIzg6hxn1mnG0ZmH25JQSZjh?= =?us-ascii?Q?uFBWVjfrjiB1vUoAbE3U3NfJ6HHKeAScLx1g7Oqw6IyDKzz5nFTK6zbfT3fA?= =?us-ascii?Q?m/P/iDIekcnYd2wh4MkcHmxuaHpV/QbiPwBk91luFdUG4xacd9uYVZIFpuYR?= =?us-ascii?Q?/nd+O9GCjgstEnHFt1zTx8V4j2Mpb1J5BtTcScbRyBeQy2lOzZyi2s+CaWTi?= =?us-ascii?Q?bWJ45rpC7pdBbYcxxwa0gZILrV7gvKNzX5PLHOPzc2+rFr6d+f7qKQzCdnnC?= =?us-ascii?Q?jdIiGh3OhVvB7opLY7trzRod5iiC3eJPAUgcSeACNq6K5lFxarPPFlwX3pwa?= =?us-ascii?Q?9bdzs19qkWU6+Nk2y1E/W6AA/7InmmDYNKGgUDl7LhKZd0qUKXdZG2hnI0fd?= =?us-ascii?Q?NDxiGcz91qcENqsxk53hhgV7tUlZ0OUv9Y40yrwqsHVKx/tvDtTkTCIeiP35?= =?us-ascii?Q?jqnV07NgJAENh1OzhaVmc/1kYPZoePhOKib6UY8upV18t/9SgWd8y2z7gg1V?= =?us-ascii?Q?yIUW27O8kfKGmdRSf48Rp7YFQ2Pd6JAeiKsYs7muSibO2BfMwig9gadjAUJG?= =?us-ascii?Q?aGnYfn5CtWuLC4GoFM10Z5FsEcuqKk+brmrPlkOaTpDgB2VKg2JCk/1r5KGQ?= =?us-ascii?Q?vKZ8vDISwwdPOpl8sUoBBAnuNr2dREjehiYnXxqdBsLgv1Rz2SLd3WILNOrY?= =?us-ascii?Q?/qqkKn+gD3oKse4w2bk9oVyEE7N7HlicpSjTxRH0/hWWYXNflioFYw8gWtMw?= =?us-ascii?Q?7B1bPFC4XivBdarJEo0kdWoQ/Nkc6eXpPjIRfy4TInbfyJ15xVa/Z6AmV0TA?= =?us-ascii?Q?ci2kl2Cb1VEVYLq2XUBsNS3U5bFtswfgd/XD?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(376014)(7416014)(36860700013);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Jul 2025 17:49:36.7972 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f74b6b1e-5f13-4b59-180a-08ddc235a266 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001CF.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB9530 Content-Type: text/plain; charset="utf-8" Add tests for NUMA memory policy binding and NUMA aware allocation in guest_memfd. This extends the existing selftests by adding proper validation for: - KVM GMEM set_policy and get_policy() vm_ops functionality using mbind() and get_mempolicy() - NUMA policy application before and after memory allocation These tests help ensure NUMA support for guest_memfd works correctly. Signed-off-by: Shivank Garg --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../testing/selftests/kvm/guest_memfd_test.c | 122 +++++++++++++++++- 2 files changed, 122 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index e11ed9e59ab5..f4bb02231d6a 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -273,6 +273,7 @@ pgste-option =3D $(call try-run, echo 'int main(void) {= return 0; }' | \ $(CC) -Werror -Wl$(comma)--s390-pgste -x c - -o "$$TMP",-Wl$(comma)--s390= -pgste) =20 LDLIBS +=3D -ldl +LDLIBS +=3D -lnuma LDFLAGS +=3D -pthread $(no-pie-option) $(pgste-option) =20 LIBKVM_C :=3D $(filter %.c,$(LIBKVM)) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing= /selftests/kvm/guest_memfd_test.c index 1252e74fbb8f..d8f3beccd5a0 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include #include @@ -18,6 +20,7 @@ #include #include #include +#include =20 #include "kvm_util.h" #include "test_util.h" @@ -115,6 +118,122 @@ static void test_mmap_not_supported(int fd, size_t pa= ge_size, size_t total_size) TEST_ASSERT_EQ(mem, MAP_FAILED); } =20 +#define TEST_REQUIRE_NUMA_MULTIPLE_NODES() \ + TEST_REQUIRE(numa_available() !=3D -1 && numa_max_node() >=3D 1) + +static void test_mbind(int fd, size_t page_size, size_t total_size) +{ + unsigned long nodemask =3D 1; /* nid: 0 */ + unsigned long maxnode =3D 8; + unsigned long get_nodemask; + int get_policy; + char *mem; + int ret; + + TEST_REQUIRE_NUMA_MULTIPLE_NODES(); + + mem =3D mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + TEST_ASSERT(mem !=3D MAP_FAILED, "mmap for mbind test should succeed"); + + /* Test MPOL_INTERLEAVE policy */ + ret =3D syscall(__NR_mbind, mem, page_size * 2, MPOL_INTERLEAVE, + &nodemask, maxnode, 0); + TEST_ASSERT(!ret, "mbind with INTERLEAVE to node 0 should succeed"); + ret =3D syscall(__NR_get_mempolicy, &get_policy, &get_nodemask, + maxnode, mem, MPOL_F_ADDR); + TEST_ASSERT(!ret && get_policy =3D=3D MPOL_INTERLEAVE && get_nodemask =3D= =3D nodemask, + "Policy should be MPOL_INTERLEAVE and nodes match"); + + /* Test basic MPOL_BIND policy */ + ret =3D syscall(__NR_mbind, mem + page_size * 2, page_size * 2, MPOL_BIND, + &nodemask, maxnode, 0); + TEST_ASSERT(!ret, "mbind with MPOL_BIND to node 0 should succeed"); + ret =3D syscall(__NR_get_mempolicy, &get_policy, &get_nodemask, + maxnode, mem + page_size * 2, MPOL_F_ADDR); + TEST_ASSERT(!ret && get_policy =3D=3D MPOL_BIND && get_nodemask =3D=3D no= demask, + "Policy should be MPOL_BIND and nodes match"); + + /* Test MPOL_DEFAULT policy */ + ret =3D syscall(__NR_mbind, mem, total_size, MPOL_DEFAULT, NULL, 0, 0); + TEST_ASSERT(!ret, "mbind with MPOL_DEFAULT should succeed"); + ret =3D syscall(__NR_get_mempolicy, &get_policy, &get_nodemask, + maxnode, mem, MPOL_F_ADDR); + TEST_ASSERT(!ret && get_policy =3D=3D MPOL_DEFAULT && get_nodemask =3D=3D= 0, + "Policy should be MPOL_DEFAULT and nodes zero"); + + /* Test with invalid policy */ + ret =3D syscall(__NR_mbind, mem, page_size, 999, &nodemask, maxnode, 0); + TEST_ASSERT(ret =3D=3D -1 && errno =3D=3D EINVAL, + "mbind with invalid policy should fail with EINVAL"); + + TEST_ASSERT(munmap(mem, total_size) =3D=3D 0, "munmap should succeed"); +} + +static void test_numa_allocation(int fd, size_t page_size, size_t total_si= ze) +{ + unsigned long node0_mask =3D 1; /* Node 0 */ + unsigned long node1_mask =3D 2; /* Node 1 */ + unsigned long maxnode =3D 8; + void *pages[4]; + int status[4]; + char *mem; + int ret, i; + + TEST_REQUIRE_NUMA_MULTIPLE_NODES(); + + /* Clean slate: deallocate all file space, if any */ + ret =3D fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, tota= l_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) should succeed"); + + mem =3D mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + TEST_ASSERT(mem !=3D MAP_FAILED, "mmap should succeed"); + + for (i =3D 0; i < 4; i++) + pages[i] =3D (char *)mem + page_size * i; + + /* Set NUMA policy after allocation */ + memset(mem, 0xaa, page_size); + ret =3D syscall(__NR_mbind, pages[0], page_size, MPOL_BIND, &node0_mask, = maxnode, 0); + TEST_ASSERT(!ret, "mbind after allocation page 0 to node 0 should succeed= "); + ret =3D fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, page= _size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) should succeed"); + + /* Set NUMA policy before allocation */ + ret =3D syscall(__NR_mbind, pages[0], page_size * 2, MPOL_BIND, &node1_ma= sk, maxnode, 0); + TEST_ASSERT(!ret, "mbind page 0, 1 to node 1 should succeed"); + ret =3D syscall(__NR_mbind, pages[2], page_size * 2, MPOL_BIND, &node0_ma= sk, maxnode, 0); + TEST_ASSERT(!ret, "mbind page 2, 3 to node 0 should succeed"); + memset(mem, 0xaa, total_size); + + /* Validate if pages are allocated on specified NUMA nodes */ + ret =3D syscall(__NR_move_pages, 0, 4, pages, NULL, status, 0); + TEST_ASSERT(ret >=3D 0, "move_pages should succeed for status check"); + TEST_ASSERT(status[0] =3D=3D 1, "Page 0 should be allocated on node 1"); + TEST_ASSERT(status[1] =3D=3D 1, "Page 1 should be allocated on node 1"); + TEST_ASSERT(status[2] =3D=3D 0, "Page 2 should be allocated on node 0"); + TEST_ASSERT(status[3] =3D=3D 0, "Page 3 should be allocated on node 0"); + + /* Punch hole for all pages */ + ret =3D fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, tota= l_size); + TEST_ASSERT(!ret, "fallocate(PUNCH_HOLE) should succeed"); + + /* Change NUMA policy nodes and reallocate */ + ret =3D syscall(__NR_mbind, pages[0], page_size * 2, MPOL_BIND, &node0_ma= sk, maxnode, 0); + TEST_ASSERT(!ret, "mbind page 0, 1 to node 0 should succeed"); + ret =3D syscall(__NR_mbind, pages[2], page_size * 2, MPOL_BIND, &node1_ma= sk, maxnode, 0); + TEST_ASSERT(!ret, "mbind page 2, 3 to node 1 should succeed"); + memset(mem, 0xaa, total_size); + + ret =3D syscall(__NR_move_pages, 0, 4, pages, NULL, status, 0); + TEST_ASSERT(ret >=3D 0, "move_pages should succeed after reallocation"); + TEST_ASSERT(status[0] =3D=3D 0, "Page 0 should be allocated on node 0"); + TEST_ASSERT(status[1] =3D=3D 0, "Page 1 should be allocated on node 0"); + TEST_ASSERT(status[2] =3D=3D 1, "Page 2 should be allocated on node 1"); + TEST_ASSERT(status[3] =3D=3D 1, "Page 3 should be allocated on node 1"); + + TEST_ASSERT(munmap(mem, total_size) =3D=3D 0, "munmap should succeed"); +} + static void test_file_size(int fd, size_t page_size, size_t total_size) { struct stat sb; @@ -275,7 +394,8 @@ static void test_with_type(unsigned long vm_type, uint6= 4_t guest_memfd_flags, if (expect_mmap_allowed) { test_mmap_supported(fd, page_size, total_size); test_fault_overflow(fd, page_size, total_size); - + test_mbind(fd, page_size, total_size); + test_numa_allocation(fd, page_size, total_size); } else { test_mmap_not_supported(fd, page_size, total_size); } --=20 2.43.0