From patchwork Wed Jun 18 11:29:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shivank Garg X-Patchwork-Id: 897786 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2063.outbound.protection.outlook.com [40.107.243.63]) (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 BEEBE2853F3; Wed, 18 Jun 2025 11:30:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.243.63 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750246244; cv=fail; b=kVgWcInS9+ORqmTEeIpyo2yMe4jiPxCsda2QTI8gx+pB7b69qdOeMD337WBKcFJRATwv3vMCYkC6sOL/UGdw81aaY6q2ZmLDLOC/fiysgJWLaPj4NnfkDTD1SWZk6jwq7EGlArY8ObnB3G/LG0NoOTGViCxBiQnpA1Z3LQP6B8M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750246244; c=relaxed/simple; bh=RTX69MxLrzMRl3tGjhigtmM11snxLJPwr8CuoMpLMSA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UEtSBecJocJwHLoQkHzStxaiHVZIlVcQGUzoLb6c1suk4JzOd4Rqcs6DdRYaF70viI4KFnguikXRhUXhJxrxX6M/V36TyP7/SmLb0fs/dIxPaMLU6+ch1Dfd6MSOz8sqqbCoQikoPxQJ5QFlERlm7z8GIfYRm9aSV+knLWckaLA= 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=PAW/7C+c; arc=fail smtp.client-ip=40.107.243.63 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="PAW/7C+c" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=g11h/KtSGyyqfby2Qee8jn8eYCytMLicMzwyv+HfGRHf3aU7sjehD7lQKHug1TjUA9SAOZ+QLGGfuzqE+UVg1jX+E+Q7TlK0sBArl5x97D6/jo24C0y6MmHXFjrtpJkzLVXS3KcBE6ZEiZV3N8CZ1XHtygdkgOSUe/cKQF2IowiMrvOJEv37JEEbvyXDCVYSqPQIP8uh0WEkZgGFVhuMH9AMe7O0WwkczmFK3GphLWi4raPQd5ji6vqITyyMRS7ViAou9Jpbri58i3p55b0BuHkfKFGRSCqVIqKw+p3M6jIwQkvzgDIKzInjQC7Kqic2tBX7VmLIlSkIxpjc1e9nqQ== 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=S//fZd9LYLxSjIwb1vhn1CUPtCMBp4NUQzl4E+yMDGM=; b=TK7faNaVajBv/BC+Voigq9ZPnpaxe4GYG4qBDk7j4If4fo6/gqxqng6mVrSpaPIW+CJh6l+z9Cd0dTMriwOtk8qLNQo2hqEBSMYUKB1BDk7pRrtlD+gEFzAUjukjXSqSxe6jXOoij20Q4BwgLxeonnjlRBJXytKp8k8Ulo/TOokSZb0vt5YmimoJ5NVDOtg4nZZtXSdnDPhd/ubL08fHJyqnlAkqOcIVIP7qxPHZNJ1EevfoLtofuHJWnDOdVlc0vhDEwtELD/h4n+Zq7b15p+W+y1D63rZBCYAe1FuYQfF2cWGfDTf5u5nxFG3iMvxz5SX9mfLAbfIGmNsa80In+w== 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=S//fZd9LYLxSjIwb1vhn1CUPtCMBp4NUQzl4E+yMDGM=; b=PAW/7C+cVrinw4YIKc/ELG/1HzU/qabNvxcUXO7AqkFoHwL1uBxLPs+z9d3C5uyo5NXmbqUtzinMwW3hPo9snKNubETvoCIfRDMmi0dLIZ3OJZbNovjA0AYO70ol68eoEtIM/dTbiweSnY+IUdoYRygV3lSasPocLkot78Cn/kw= Received: from DM6PR11CA0018.namprd11.prod.outlook.com (2603:10b6:5:190::31) by PH0PR12MB7469.namprd12.prod.outlook.com (2603:10b6:510:1e9::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.29; Wed, 18 Jun 2025 11:30:39 +0000 Received: from DS1PEPF0001709B.namprd05.prod.outlook.com (2603:10b6:5:190:cafe::91) by DM6PR11CA0018.outlook.office365.com (2603:10b6:5:190::31) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8835.32 via Frontend Transport; Wed, 18 Jun 2025 11:30:39 +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 DS1PEPF0001709B.mail.protection.outlook.com (10.167.18.105) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8857.21 via Frontend Transport; Wed, 18 Jun 2025 11:30:39 +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; Wed, 18 Jun 2025 06:30:23 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [RFC PATCH v8 2/7] KVM: guest_memfd: Use guest mem inodes instead of anonymous inodes Date: Wed, 18 Jun 2025 11:29:30 +0000 Message-ID: <20250618112935.7629-3-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250618112935.7629-1-shivankg@amd.com> References: <20250618112935.7629-1-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 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: DS1PEPF0001709B:EE_|PH0PR12MB7469:EE_ X-MS-Office365-Filtering-Correlation-Id: 9c98e7ac-5418-4be3-809e-08ddae5b8d75 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|36860700013|82310400026|1800799024|7416014; X-Microsoft-Antispam-Message-Info: OzF305btAQRJkTrGh10jCpNq8cLc+VbgYGUJ/oOOlAANTyatVuo118SP/QCo0Ox3OVMM3Phf7Br8mxDwQkn0Mb+aFdJyNqhcTzppFMSjdbwMCkiuHdB0PPvLGpg39ZA+oTJQThokNrMKuTzj3XOBDoXQ9ZdUXbQGs08fy0ONxPNHaw8T4K9GE0lkm87SdrIN4rgG0ZDK1QZkmC5WFGjW8oza557GFUDFwDCKpJtvamc3ltmuz5SLQJ5jlNDKFMghjpDf6l35TDAZ+PEuG74ekDdiEjyU4kQEVB2LvOgoEeQajrXJfGRc9Qx1Tks++wr5xBiihju8VV6T/4ND9hJQCYTRD8ouv994Q+S3my9p79sjDh9B9iK1NUwy2rDVJT9xTIrvFtWUw7q1D3R32oJGyakz0Mrk4Jlg9lEW6hlg84BxWo1lrSLb4a5tlMY8c2JEslczd2Sal0sFlqhvOgdAIACrcRNL2Iq/EmDe+lagC7mnXTrFuXkQUc8JDZ11nU4ftcf/O9yzHQ/z5u+Gj0I/ucJmmcwoNJ1h+AKJjALy7A3PUGezI1bwbatscWSA45ORLHKlKFKD7iVBdP+dvAj8hrF9If/ObXAd/2+vwrVtyBrOPp2Ig+6pWyzqTp2qDf7hWHMSrT9L8mX8nCuJKLFjEPSsz2v5xx+jujyABJxwsJLFp4CPwc1Olp0d1xfL2cCKOqnRsJcMejuJEU9b2lFH+yaM4nUutRSHSihy1u6H+W+lZEm9WhlpBvGzXfTXuhxDrk5FCFbNDHJoJAs8OkF5TA2pOZ2wlhHEGIbxPCLYV1EvkJRj4/DaPDUs8dGVrl/wW8gb8SeMtqvvJDvQt0bHHV/W5fZGr21WvAmkRBsL6u6r2BLtdNZLOvRpaREUvQ0eFrhlzy/ytLH1TRQXT2JitksOUkSvIL0SKhHQ+D+aIn/35JbGFdIjiJSvdZWn8Fkbrq3TMsvwpN+kTZfQIMhLpBVmMZTB3djpf9gCOWCT6UJFseK0pnVB2U01EAZQGGbSeXdXm3J16z2f68YlOpL7ktc32eaYCKkoL3B9oCU2czKoS1oXO2xAdQOb1QHDJ5e0anPdpGZrirembpIpOoIsfhjRIMg9QShj00KUciQQlcahkRLYv99a7RM4KUN57vM8Bm2JXj/+fzBRoyAXfuqXXTXKyV5FZdR84gc0afjVqTHP5lrNA0Y8mMsJtCdzS9hIGx5EZBCNU/OZjgDZ+9snTi1BILcf5w+JcQazBstwrBeSbNEglBB+kFy8iBZ+mphTPGx8jdZI45GBaCJi2CtgM9LcXgGj0Y0w9tb8JDd8VuWYIKRKu4qOhzY/abPthTruMBiCJmSqUPVrv+75uWOp9o4o9Oopp6/VFpiJYOodXZynK1ElRRvYugMm/iReloWmbE4iON5M9K1PCVtLWjJBoqNmUVhTngid/smo8yYGeXfcPEaLaSoOU6FCPN+s93ED2lEqyJL8b5NAJ4+oVBS/tH6a4dOr2wpnjlZMqExXc132tto8xxmJoQTut4KrUEQ6 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)(376014)(36860700013)(82310400026)(1800799024)(7416014); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jun 2025 11:30:39.4238 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9c98e7ac-5418-4be3-809e-08ddae5b8d75 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: DS1PEPF0001709B.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7469 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. Signed-off-by: Ackerley Tng Co-developed-by: Fuad Tabba Signed-off-by: Fuad Tabba 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" */ #endif /* __LINUX_MAGIC_H__ */ diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index ebdb2d8bf57a..159df462d193 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 #include "kvm_mm.h" +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 = { .fallocate = kvm_gmem_fallocate, }; -void kvm_gmem_init(struct module *module) +static const struct super_operations kvm_gmem_super_operations = { + .statfs = 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 = fc->fs_private; + ctx->ops = &kvm_gmem_super_operations; + + return 0; +} + +static struct file_system_type kvm_gmem_fs = { + .name = "kvm_guest_memory", + .init_fs_context = kvm_gmem_init_fs_context, + .kill_sb = kill_anon_super, +}; + +static int kvm_gmem_init_mount(void) +{ + kvm_gmem_mnt = kern_mount(&kvm_gmem_fs); + + if (WARN_ON_ONCE(IS_ERR(kvm_gmem_mnt))) + return PTR_ERR(kvm_gmem_mnt); + + kvm_gmem_mnt->mnt_flags |= MNT_NOEXEC; + return 0; +} + +int kvm_gmem_init(struct module *module) { kvm_gmem_fops.owner = module; + + return kvm_gmem_init_mount(); +} + +void kvm_gmem_exit(void) +{ + kern_unmount(kvm_gmem_mnt); + kvm_gmem_mnt = NULL; } static int kvm_gmem_migrate_folio(struct address_space *mapping, @@ -472,11 +518,71 @@ static const struct inode_operations kvm_gmem_iops = { .setattr = kvm_gmem_setattr, }; +static struct inode *kvm_gmem_inode_make_secure_inode(const char *name, + loff_t size, u64 flags) +{ + struct inode *inode; + + inode = anon_inode_make_secure_inode(kvm_gmem_mnt->mnt_sb, name, NULL); + if (IS_ERR(inode)) + return inode; + + inode->i_private = (void *)(unsigned long)flags; + inode->i_op = &kvm_gmem_iops; + inode->i_mapping->a_ops = &kvm_gmem_aops; + inode->i_mode |= S_IFREG; + inode->i_size = 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 = "[kvm-gmem]"; + struct inode *inode; + struct file *file; + int err; + + err = -ENOENT; + if (!try_module_get(kvm_gmem_fops.owner)) + goto err; + + inode = kvm_gmem_inode_make_secure_inode(name, size, flags); + if (IS_ERR(inode)) { + err = PTR_ERR(inode); + goto err_put_module; + } + + file = alloc_file_pseudo(inode, kvm_gmem_mnt, name, O_RDWR, + &kvm_gmem_fops); + if (IS_ERR(file)) { + err = PTR_ERR(file); + goto err_put_inode; + } + + file->f_flags |= O_LARGEFILE; + file->private_data = priv; + +out: + return file; + +err_put_inode: + iput(inode); +err_put_module: + module_put(kvm_gmem_fops.owner); +err: + file = ERR_PTR(err); + goto out; +} + static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) { - const char *anon_name = "[kvm-gmem]"; struct kvm_gmem *gmem; - struct inode *inode; struct file *file; int fd, err; @@ -490,32 +596,16 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) goto err_fd; } - file = anon_inode_create_getfile(anon_name, &kvm_gmem_fops, gmem, - O_RDWR, NULL); + file = kvm_gmem_inode_create_getfile(gmem, size, flags); if (IS_ERR(file)) { err = PTR_ERR(file); goto err_gmem; } - file->f_flags |= O_LARGEFILE; - - inode = file->f_inode; - WARN_ON(file->f_mapping != inode->i_mapping); - - inode->i_private = (void *)(unsigned long)flags; - inode->i_op = &kvm_gmem_iops; - inode->i_mapping->a_ops = &kvm_gmem_aops; - inode->i_mode |= S_IFREG; - inode->i_size = 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 = 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); fd_install(fd, file); return fd; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index e2f6344256ce..88c7dd6770da 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -6482,7 +6482,9 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module) if (WARN_ON_ONCE(r)) goto err_vfio; - kvm_gmem_init(module); + r = kvm_gmem_init(module); + if (r) + goto err_gmem; r = kvm_init_virtualization(); if (r) @@ -6503,6 +6505,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(); @@ -6534,6 +6538,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..4b825a7f114a 100644 --- a/virt/kvm/kvm_mm.h +++ b/virt/kvm/kvm_mm.h @@ -68,16 +68,22 @@ static inline void gfn_to_pfn_cache_invalidate_start(struct kvm *kvm, #endif /* HAVE_KVM_PFNCACHE */ #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) { + return 0; } + +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, From patchwork Wed Jun 18 11:29:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shivank Garg X-Patchwork-Id: 897785 Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam02on2074.outbound.protection.outlook.com [40.107.95.74]) (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 04F772DBF53; Wed, 18 Jun 2025 11:31:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.95.74 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750246293; cv=fail; b=MXP8NaboEwFwiE7JQ+Duny6NPWMR55aP41OZVbsgLjEEnvlL+dZY9K8tEYQaLk7sYXtxNUv79k+ZYIKmYz3bEHtpIM9v4CASH5y0u9x5c0ul1eWXZrt+i5PhU2gxDudcgROUtlK9E/VphvltWkPqawNMsvMdCWllsRr+MQTE8i0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750246293; c=relaxed/simple; bh=lfXGXm+Ek8zzvw23WEeag0FZAgtggJFpXyPM86bM/Jo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=c/fa1DCvxymymL+oXaoTSn+QmJOUEK90mx34l78JdeYoonfCzdSsC0CVCS7HpQZ8aOSmHe6WbZKotZWOAeXmemLmKUtK0ofibAohCPz7RZiLfBsp1U/GygCAWd+6B3v8DK1ASH0mslMz00wtfDIwj/X4jyCZmTAdhNTWPricD9M= 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=wZiZwcA1; arc=fail smtp.client-ip=40.107.95.74 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="wZiZwcA1" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GI9kOcogCbYhnmm4aaI58otgolz3Wi+LeqfEhPgHT2zc6eR8SU6hRmpEzTt1XbJyKygVHLxf+/iJ3NlztQX4Hg8QoDgIhgUhOhgZ5mZgzpk6EX9D5E1pA5A+bjE3A0gofILQkIp4Zp92mSpnZ9abN7mejfpL7fSLX8O9duAAsECUTruaAZtEccQFaLVxR6h1S5Q1FHY0C+YFDDmjYQUKz5Nta/fEOCs8uoCmUQXUW7rzxFlQ53NS58jYeu0DTdDF75qbx5V5ytCWO6Okx04RQCKOz7Ju7cNYTxet60/+qdCYnmuxEdOWwLrB4ZTPGn9FLGNUSRpnApjssoId8QVV7A== 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=cAmX9iRNDTZi0f1Ik14X6Rpj4CEBbwYZWKOSW4ycUR0=; b=UtgELZJli/Dh9Z9PrQKA3sRvA8KRGy4vzUeIaoYFSAgDzqx9I8sNuXzPGnmj+AyIRUqTXkytotOJYiiMRGoavDBJE7gAjo+cRANN+62byWUOpOl3p517r0/+OeQ+stHNDfYene4Xei86gXMD9gDZ+zJo9gA3OLwuIy25xlCBSlW7NlOJXw71uql8VfSemYJ++EqGo7Q5TyN3a/t0N4WKvlRyFlWiZWbBFiIRnfJI9YKU+zFPHCCQX65zE0Idiq1A2KX28tnfCLVukAOmyGwuB8wsP4NIg8aRzscPtR/OhR9gGqn2RdWVDTa/OS+0Tciss0ibULuY65JagD1ztXe4DA== 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=cAmX9iRNDTZi0f1Ik14X6Rpj4CEBbwYZWKOSW4ycUR0=; b=wZiZwcA1sVxO4zgBXE2zQbQeNJDMwJKXA3SXAVKYUt55MmErL7YApdjTYH13gsQ1ZVbiHU73Sb5pstcJO+kUWO8LM/36o2Qe7yFLcL49h4A00jOErcpubZEyBf0EeNlC9Pu5jzgfu2Ih02ccHC/lp66CuRP3NEq8UWMXL6n17AQ= Received: from SN1PR12CA0099.namprd12.prod.outlook.com (2603:10b6:802:21::34) by PH0PR12MB7958.namprd12.prod.outlook.com (2603:10b6:510:285::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.28; Wed, 18 Jun 2025 11:31:27 +0000 Received: from SN1PEPF000397AF.namprd05.prod.outlook.com (2603:10b6:802:21:cafe::d1) by SN1PR12CA0099.outlook.office365.com (2603:10b6:802:21::34) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8835.30 via Frontend Transport; Wed, 18 Jun 2025 11:31:27 +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 SN1PEPF000397AF.mail.protection.outlook.com (10.167.248.53) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8857.21 via Frontend Transport; Wed, 18 Jun 2025 11:31:27 +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; Wed, 18 Jun 2025 06:30:54 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [RFC PATCH v8 4/7] mm/mempolicy: Export memory policy symbols Date: Wed, 18 Jun 2025 11:29:32 +0000 Message-ID: <20250618112935.7629-5-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250618112935.7629-1-shivankg@amd.com> References: <20250618112935.7629-1-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 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: SN1PEPF000397AF:EE_|PH0PR12MB7958:EE_ X-MS-Office365-Filtering-Correlation-Id: da92630e-11b1-4f74-87ec-08ddae5ba9f9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|1800799024|36860700013|7416014|376014; X-Microsoft-Antispam-Message-Info: m3sTfJJsWNzmXpowWpoY5VKjJLqa0ITKwKDQw/0Pv0WpUN5+aFBreKrXeWt5z0YvARaZVke0KfkVKW9iORR0diMrAkXu/clx8ru87vINMKy4CqL1WV1mV/61qQ+TqcU+iw1VVVVeslEydf7TmpGDd22tzDbQKd7wGCH8rMckwMERXSSxI144V5ND/C9oE6XBpKXwch8mcdyOAj1CUvwfyG0dP0gYdQqfTpnzt6Wcj0P4H0uhZ+BcWIuUEWK4hKjYzpzQTDnCqcdVFoXQX256hBbfY+e9W3ilV454Rs0dHPw49gRsMSgjRdY6ON8C5hBD+1EIucKqUVjfHHNlXO0XCiiMPwWv7bgjyGwjhJz7InouU4+hDNLLXQxHYP6j/wfvUVm4Un8L0DNMwFvHtEw9tl6rNmej2eWnOyVBpIYMN/LXL5lKW3qJreXOi5jczadLwipNaNP60hryK8FwPtOnx6I2+JS4+z8D4N0cL6wp90RlkNlPFjZJxGCmCIdMC3bdbQvgUW5+QKc/uVQrABL0HPpnrC27FEfRCjLzIMot3GxX7fMZT5Zvv+U/gVomXmzvG4eVH83LCmKIG/IgT0x+jxf2TstFci1Mg8TEqZvrOjcONesCEyX7IahX6k/TZJu/MTg7w8dQ7DEutLdbJDyPmEEhJvd3aIT14GfVpddretneBdlaTeDeZFAT2KpQpdS5x7XoL0tsRRMEcYhY2tEJwuUF9Olg5xwBKHCB54PEOIx3EoVwdZ+tsgbY12wAc/aVcw4U8idHBscPAuOff2sW37BYCJRBNhAUD1fxT6HQ9s70blILLmeST5r2z+fLuXAXxK5l+cvYF2KakRwIuZ6scEKaVlzzzeMh9qDxH50FlytoKbM37JiFcud+1gCgWqCJpjyNa/J5MiZI3CVbhJ+CKECCbLqZOOlthHG7FP4+gNoOJFnVLqQlAgw3+ntKimcEqV4EF5rfxXG+t4V1+MSerkEAIQ37sX06cT+iEKzwqNuODrHZAF/lQGHm3cCpgwtMaTKRZLaa1FAIRXl7RyDRnIqRd15NePI+HacdXuGx5IpEHAAn2ap6D5sd67wfJ4MiGwVytvJh9yU2qPGBVZLN71t2naMH8U0CagTN/MHP+v5SRTLhqOaA5V5Dr0WSny9/G75eMMkjGMUX4k6+SmH4G+ot6ADsub+6SRDJM5dSPwOQMYT3IecN4wfSxHf3E5V0QkretxE+pyKb7AzN1Vmjbjva0kCRTtmX4nGyJxzTel82LBf0Tk8SYAXMXYu12HGifvGt6fp60jIeTFj/4YkZ0Wm38E2Ax+TR4O7YkCrjP2WcHbz0biodqWnDIv+YJ2PjJ/Dnsz4pgGRj2bo3KEnlvqXj0P3YcDqmy0sFAtZ+IiXiVECM4Hmtjh6KGHEPRcDZTMnS+F8GJLBKFdnt8bMYXgf1YMXceLwQtfP1xrS68Kq0h26G+RxRD7lmYXoJklbjvPJoeTpT6lEHzglnFgYrhFAXUrKMC4Vzb4znO3JJcuYNlOE8O1vXadAtsCI3POfp 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)(7416014)(376014); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jun 2025 11:31:27.2711 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: da92630e-11b1-4f74-87ec-08ddae5ba9f9 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: SN1PEPF000397AF.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7958 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..d98243cdf090 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -354,6 +354,7 @@ struct mempolicy *get_task_policy(struct task_struct *p) return &default_policy; } +EXPORT_SYMBOL_GPL(get_task_policy); 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(__mpol_put); static void mpol_rebind_default(struct mempolicy *pol, const nodemask_t *nodes) { @@ -2888,6 +2890,7 @@ struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp, read_unlock(&sp->lock); return pol; } +EXPORT_SYMBOL_GPL(mpol_shared_policy_lookup); 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(mpol_shared_policy_init); 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(mpol_set_shared_policy); /* 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(mpol_free_shared_policy); #ifdef CONFIG_NUMA_BALANCING static int __initdata numabalancing_override; From patchwork Wed Jun 18 11:29:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shivank Garg X-Patchwork-Id: 897784 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2088.outbound.protection.outlook.com [40.107.92.88]) (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 442882DFF17; Wed, 18 Jun 2025 11:31:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.92.88 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750246307; cv=fail; b=g8dzL1wDdSHLAw/p1B10AJ1Qx5HlzWDWfCYTwDcMXRXxIcJORDjL7lBVzkTq6Wt/p5A/dGlcd1cNuSuhm/sIgePrlGtBP/04dQy8Ec2uKyxFOMBEEGGsnbFvOnsT3PZWpdTzqrtUF1bc9cWMSM0U8d0kdlo0X2//K721DpzknYY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750246307; c=relaxed/simple; bh=NhuU8ppHG2STCJcBdjxhd78hD8i5jObNdOKIlpbKBDo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DbKxYfMYvx4tc92HscqpPiAv5LR4NfblDwTnqVQYf0wEtFmz4kCOu1KDtm/cvbkgx8/URv1ifNvLhyLrMGA04Jo6PNyAsAag1vrewgfTWS5CWIAES0Br6b6tAtme1Pg+IjyqO/J+gagAclBUcik4rT5Xz97hXPlyPK73B0D7bt4= 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=fM8VtP/0; arc=fail smtp.client-ip=40.107.92.88 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="fM8VtP/0" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=b0EEAkLUcV1J0lhA0r/52NgO7vpW7jdWD5qpWyfWWJBlQmxU5F8ablvY0yThM6gwQhdnxY/TpMC7mKrlr+saAqZidRVyVzYa4mho34xuO4MbBKyGZkmAvUf3J1saCqHFmr0FWYOPZ3Gn8ILZhbNZzjZLrtlyCRTwuDn1RWdTlmjdVEwitv6UGO5xXUmPEWhLCoEZXcFwpe1niMnYXtsBxqYRvQDCH1jEDp6mgMm5+3de3/zsI4IJqPwnTjsamRnI4M6q4CRbPBslWJKysrcyoZUec3rBu291u1Atu0xiW5mc1l5ZzG9wzF9Qc3ommd4uCY9X+zJStr+TRunQDS2KcA== 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=C/udd3S7OSs9ba5kuMi2wHriDONJNB4tzfZ126Bnl04=; b=GDambBnexJZOGtxRungd5MR1DH4PZ7idbB+hslQ6/ugkUKH3v1j4cUASUUi/HGbRRGhorPQp9L+BbpUdT5ZiOfNQsk3vx0N103tFdCWwiDQb3XmToFJr04zo11Y/49xpvRI4PbREyNU8HgQG4dGs0K08I2Scr4oWrU1Cig62vvlF3MVEOYGakhxPD7BWUHcJKXga5lEQDNp/LEHMgia3G1TAXfljCIDC4OMSmdIJKX8Ew7zV49LXSkmMQl9DZFPafQfrAJL5ISYF4cCS/QbrOGcB9AJK/8+cttgBi6zN1xsMKcLVDP6Sxu9rAi+Ga6TsxWiXYuW93JjPM7UEFnRtFA== 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=C/udd3S7OSs9ba5kuMi2wHriDONJNB4tzfZ126Bnl04=; b=fM8VtP/0/v+ckL9EK1Ldi5pZ98Vi5RCmiWF5tPaRk0RVa0TBsUAOvFtkzuFXZbYfwAe0dWQ/dOWvLKM01f6ew/SFr9LHJ+fzz657i7g9qCC+h0Qe63N7BA39HAMdhDAglqMkxzoq1zyFxTXCX0up2GnsKVLjaYjRg2HxVWyJ6tg= Received: from SN6PR2101CA0027.namprd21.prod.outlook.com (2603:10b6:805:106::37) by IA0PR12MB7579.namprd12.prod.outlook.com (2603:10b6:208:43c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.29; Wed, 18 Jun 2025 11:31:41 +0000 Received: from SN1PEPF000397B4.namprd05.prod.outlook.com (2603:10b6:805:106:cafe::1e) by SN6PR2101CA0027.outlook.office365.com (2603:10b6:805:106::37) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8880.7 via Frontend Transport; Wed, 18 Jun 2025 11:31:41 +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 SN1PEPF000397B4.mail.protection.outlook.com (10.167.248.58) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8857.21 via Frontend Transport; Wed, 18 Jun 2025 11:31:41 +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; Wed, 18 Jun 2025 06:31:25 -0500 From: Shivank Garg To: , , , , , , , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [RFC PATCH v8 6/7] KVM: guest_memfd: Enforce NUMA mempolicy using shared policy Date: Wed, 18 Jun 2025 11:29:34 +0000 Message-ID: <20250618112935.7629-7-shivankg@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250618112935.7629-1-shivankg@amd.com> References: <20250618112935.7629-1-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 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: SN1PEPF000397B4:EE_|IA0PR12MB7579:EE_ X-MS-Office365-Filtering-Correlation-Id: bbd81e82-2871-4cc4-0d81-08ddae5bb246 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|82310400026|7416014|36860700013|1800799024; X-Microsoft-Antispam-Message-Info: lQUO9xLoZiW1LxMDt6SC0Pu4tB0MqtcQFQ1f6tbCni2e0QWkJgg4cGoH9SvXdWZoHUKK95w0KQSqB2qM9OnjSh264fy0cUHSrlD66Td+QmzHz3bSc8HcvTq4nTg63bKVy3/dRbEFL9kOJWTWU/WiJ+uP40zVAsv839uMAqR1TRHimssz7pGuxzOYYxOCdTYVloOE4HeZyBdlsyGKWSR0L5lEpBg7zFPTJccgRUhrehPL/PgV+0xw2cH25NAGfQtm8ENpx2V/pmtj3xzBjgnQJ49UAcXntxYxryFSnpeGzj2kiuEJRgcmSihI9VYVVtzXN33uyZa+B02H1Yi4rew69G7wPXk067iGp9bPbtbERCWTjblnIpL26sCqBwYvDEAccQlO+wBJYCGke1L8eu85YxbboZO8RBKrExYTMT6SllNVIG+F0zstl8+dCw/EK28UXQ7v6Y+11iiPCAhv93LRmFWI1sm3KwtVy9ehlLfsYT8larhHBmE2aIy1K4QO3FuqGsdnWdij3OeEwhnwsUkWJAzZbLeU/5HC/1XnYUQy89L3ypki4G5mmbyg7sgmD7U0r5bD0yGhYyDX0wF8Q1+DC1YI55OuD5rHsLGajmBiu2R23YlKu12T7AB/lgukq+Y9KHD9nuiKpB4RjLUU1Kn1QseS5xwz5rLfQtSn1btB85sO6JS+SsaRdBFV5kd4ffbWZxXSFWARK8l9X2eBbJQfUvzl7xYAn39RnQbtudvAXhoFP3T4karoi/iqaCo3WbDMcHnRKRcQL0kAJeQPnm/Bbrrw44Fqm06nSeTzpoq0WBejDBIU9lWYkKwhvJU9oAof5PvN/vCkroco/BMchG9e1MCwaNFtFlxatcD/azwpwOCv6uwc7oYHTh8QdTd1sejCPQC0kPledpOCemUeGL5d45tynMFUtYyUqNGtSMfMHrleUrBA6WqhRduWdbqauGkBjudxOlZypmZpXCDKSTNc5h93B6Fwn88XhVjVftxAftRBMm5bb+Xc4jKmHn+rtpk8BfEKJK8Ps3ShwDMonnuFF4k/gaLqqolb1/icG8BjQqMk7KL3R4cIrN+qIV/pet7J3ValEVne9xIA5yhmWsr/+j9q/xlZj7ukBuqDUAF0x0M56pvJI8aAsOJnIUfRbR4UcPSE5ciw/dzspK5adwsUx0BBbtQiwqhhXvKF9QVbZUGl6Q6CrJgF/RUUKiD7Og25QeO4oCato2cehz/7HMWSwp3lC6p5qUd5/uFb4ovKBMtM6iq9nx+9MnfCKIZOl63B3L3T/oHPPmW/nO+VfWHDm3KR7I1g144xgPqdTiuFKEI0moK2pLYS2s3Wk8ZWjeHQ0zolOJ/3LHs38B9ngudWn+cqFSmj5DX0RzLP25aVXipCdvZWM7IM0TnCgqbM/5j3WVobbjPvjuST2slE8EgAR4HAxPgs/W25gu3mz2mKW+Uhv8ifRZ39V8s46drhSfs3cbndzrgpXcu9kooNXyUqxolWsLX9j58IilTTAXAgchE77Lxr4FoFNjQI72ZeCPNp 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)(376014)(82310400026)(7416014)(36860700013)(1800799024); DIR:OUT; SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jun 2025 11:31:41.2027 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: bbd81e82-2871-4cc4-0d81-08ddae5bb246 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: SN1PEPF000397B4.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB7579 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 --- virt/kvm/guest_memfd.c | 69 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 5a1ce6f5e287..2bd5ff3abd87 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,7 @@ struct kvm_gmem { }; struct kvm_gmem_inode_info { + struct shared_policy policy; struct inode vfs_inode; }; @@ -26,6 +28,9 @@ static inline struct kvm_gmem_inode_info *KVM_GMEM_I(struct inode *inode) return container_of(inode, struct kvm_gmem_inode_info, vfs_inode); } +static struct mempolicy *kvm_gmem_get_pgoff_policy(struct kvm_gmem_inode_info *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,24 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, struct 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 = __filemap_get_folio(inode->i_mapping, index, + FGP_LOCK | FGP_ACCESSED, 0); + if (!IS_ERR(folio)) + return folio; + + policy = kvm_gmem_get_pgoff_policy(KVM_GMEM_I(inode), index); + folio = filemap_grab_folio_mpol(inode->i_mapping, index, policy, + NO_INTERLEAVE_INDEX); + mpol_cond_put(policy); + + return folio; } static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, @@ -375,12 +397,52 @@ static vm_fault_t kvm_gmem_fault_shared(struct vm_fault *vmf) return ret; } +#ifdef CONFIG_NUMA +static int kvm_gmem_set_policy(struct vm_area_struct *vma, struct mempolicy *mpol) +{ + struct inode *inode = 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 = file_inode(vma->vm_file); + + *pgoff = 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_info *info, + pgoff_t index) +{ + struct mempolicy *mpol; + + mpol = 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_info *info, + pgoff_t index) +{ + return NULL; +} +#endif /* CONFIG_NUMA */ + static const struct vm_operations_struct kvm_gmem_vm_ops = { - .fault = kvm_gmem_fault_shared, + .fault = kvm_gmem_fault_shared, +#ifdef CONFIG_NUMA + .get_policy = kvm_gmem_get_policy, + .set_policy = kvm_gmem_set_policy, +#endif }; static int kvm_gmem_mmap(struct file *file, struct vm_area_struct *vma) { + struct kvm_gmem *gmem = file->private_data; + struct kvm *kvm = gmem->kvm; + if (!kvm_gmem_supports_shared(file_inode(file))) return -ENODEV; @@ -411,11 +473,14 @@ static struct inode *kvm_gmem_alloc_inode(struct super_block *sb) if (!info) return NULL; + mpol_shared_policy_init(&info->policy, NULL); + return &info->vfs_inode; } static void kvm_gmem_destroy_inode(struct inode *inode) { + mpol_free_shared_policy(&KVM_GMEM_I(inode)->policy); } static void kvm_gmem_free_inode(struct inode *inode)