From patchwork Mon Feb 10 06:32:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shivank Garg X-Patchwork-Id: 13967245 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2055.outbound.protection.outlook.com [40.107.237.55]) (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 A210418BB8E; Mon, 10 Feb 2025 06:38:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.237.55 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739169530; cv=fail; b=qkE4C2Y15MK285ME1c9SeHy4mFLBzIIeydQFKXiaaIwcI0hVEnS09XQtJPoSBzZD56NypSIwJVFlhgVfuCe8MiP06YyyX3eBl5PW8n71ll1CkTPRhkPT6uM0G3F2X9nMnfjYN0hKHz8zG1G6ZNhGdyOFIKLsnZwzu0MWSuXZ6FA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739169530; c=relaxed/simple; bh=YDDOgxWrsIMWyL7Ci9UpGotIt8HVoZ6Mn+m6F73vwMI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HITnUBycAbgSKaF7PfPakJw2rWsd3WiLThdrb9Gb2E7xsTb/ovYJu5No0JlDTRp4egwCE2odSjOSANYW8bstPY23oAKdfcs1GGE9O5GmBZ8BbUvp82OI5+q9AAZdVv3CLnxuI2ta+L8kBvyMrFbIq/KdUB/SvgT1df63JbWPAN4= 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=dWxAXkQ5; arc=fail smtp.client-ip=40.107.237.55 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="dWxAXkQ5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=cMoYrJtv6nfRzgRx7q6EJKCFC1jOb4DwIHkQcyazC/BDWf3Ril5PbtyYMuqePpxFNjellIkC0xc2ZrogTVYMFbS1lEiddyyCFCvsJpt11s+dEnKGpCdV/qf0AT1VCl8iie5FeA/e5T6UMUKublqHns0uCB6gTQ8Z5UwQrUUmG2l+S73q9r3qlJc92YEDrilW8kr/qdkxBvceNTLa2/PJ5S4pbZ03VWEKpSIbcdIxRK5x/DsHqrYq1YSGc9zxxmZVe2fKyhKV+ZO1KD7ngsy4o3jofMSFjDuBZyXyPfB9WtbXQvdJlqIVQY4fb1dsPG1VDK6j/v8j5B1SdDoFHbxh6g== 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=FnAbgB0IEVH8MUXmuFIr2W1E91pBiD0xMCFv9PnvN5E=; b=H4eIOATbCGiLpahqlRri5Xx/0rib9/aV/I7XsQwBnTLZ5FMcUsKyDbq+1PRDT/ipFAFU4iPxRENC0WuZNuN5Fc3aa2oEqmvMDTHAbytJPyyaL1jgfYh3YHjpEAllLmfgu87hhyWzKlxkLpPRU2uuyZuDNQdgGi+Xe+UP+sq35bOjmMCisLeL0k/uwZJYAG/OUqcJWESy1l88LcenXBSHI0AEu9TOWP5wJc3kwygp0s/4Rlbe7t1kQWI8p9V0yjsqJZRcjxFToznXuKlROLl5y5weizynmj3tBcg+JTAMEm/p6RxCsIzax8qYwOiaFJ9XD2G/TwQA3+LJmOKlkmjV6A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linux-foundation.org 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=FnAbgB0IEVH8MUXmuFIr2W1E91pBiD0xMCFv9PnvN5E=; b=dWxAXkQ5WdPlqLgfU+NeFLTpV1I8zWjtmJHJzTjHHZItmdORkcvQsb/ZXgVVAg9uYMZBjPT9CclKEqta6LrlttCG8v0RcSZ22Y+VLMAR2bvZ9x08247FBiCOCtRzXkBp3e4pbWiZO02ec/KDmaGv8gtKTqLHIfPWQHgezcicBew= Received: from BL1PR13CA0083.namprd13.prod.outlook.com (2603:10b6:208:2b8::28) by DM4PR12MB8449.namprd12.prod.outlook.com (2603:10b6:8:17f::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8422.16; Mon, 10 Feb 2025 06:38:44 +0000 Received: from BN1PEPF00004688.namprd05.prod.outlook.com (2603:10b6:208:2b8:cafe::55) by BL1PR13CA0083.outlook.office365.com (2603:10b6:208:2b8::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8398.24 via Frontend Transport; Mon, 10 Feb 2025 06:38:44 +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 BN1PEPF00004688.mail.protection.outlook.com (10.167.243.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8445.10 via Frontend Transport; Mon, 10 Feb 2025 06:38:44 +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; Mon, 10 Feb 2025 00:38:38 -0600 From: Shivank Garg To: , , CC: , , , , , , , , , , , , , , , , , Shivansh Dhiman Subject: [RFC PATCH v4 1/3] mm/filemap: add mempolicy support to the filemap layer Date: Mon, 10 Feb 2025 06:32:27 +0000 Message-ID: <20250210063227.41125-2-shivankg@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250210063227.41125-1-shivankg@amd.com> References: <20250210063227.41125-1-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-fsdevel@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: BN1PEPF00004688:EE_|DM4PR12MB8449:EE_ X-MS-Office365-Filtering-Correlation-Id: 9c89bb6c-633a-4c78-5284-08dd499d90ab X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|36860700013|82310400026|1800799024; X-Microsoft-Antispam-Message-Info: tLg/U3qx5IIZr7xwrAu102zL0AUUd5GnediAl4azfPHYdswYqkXTVCjA0A/d233ituL0c/tL/XTlrwqon4W6gbVHEcxxsFYnSsu64/zC/SoQAAxMubrd/JKiBd0cWJVq8MPYOuh5ckJ/RjKjaC87sXZDjIYC39MxfjEWB7C0Dxk7KwZXL7jesRxAdJfAvpWB62sdcs5q9JHucrN7lRMprCRsacyahaBroZ8k1RmrU1iQsaloEOEhfQgBHashhjEfwv9PwAzIDhnglkfmCfKSAaDQmeAtYr0ndhJTm4gb4ohe6+dXTjo1gq6WGvsgyRlUq7MTLDcFFs3v/syPVCDjPRjCzry2Jw/zLb8hIvyVPRjMyA9pkSAZqcLVhKh2zGtP9TiCcnFDaUlwfkYH8QMOT7+sv7eUN80KSgWfteZRsSXL3aEEEHPEuFKvcDE0dVBSHSIkWbw4xmmTVzHPzsVCLxzbUhOsagWZkiQLzZ82nbyoZxAEMtPkrQgH23kMszuKapRt53lykCrmwpzZAE9M8p8TnKtJwpMfwldNxEEHAa8aJAyFoOE2iAA4UhmeWdGipeSTSxseejZjlcukqNbSbU1LBU0Ul2LEX6uyDGkejwKK4dFKaGXhz92gINEeDmPMXvuceqPa66VCCRDVWd5OAfX4U95hlDBRTzCULl3EUb+8Yh3yx+Wj7wKiNOYZcdSGpZV94R/Not1ifc1q+i/YfAJcy2FKlHFFCLetTqeRcl+sh+aT9F0SXe6T3ZfoKjrCGe/rMjd2Vvvk6vJ1prrLQ5+oadO2SPibj14dPjm8ShYDNcQHME8p3P4gp+bziCLJXlSjd2eoC9kaJwc8hEs3+EMuRk/O4+dVlOqB7GUh+gVTiWFWIEN3CZRFsX6nJaNOtLQsK/MI9UugfOJVc7NMHfM2h1O1IEsICL8TBxRGBlBG8r7C5aGO0TQxSiZYUcqK4sQxwu187/B4SRKItzCBxzyOBVA+iNz9cHxinko+y2mJbheqLxULq80xMB5JgDi4BXwrB9jhO8TfTGSYHYX21MjBdue5YlDCcMnxAwXfyFXUOFV2PnFT6ynNo1d/wgrzf/0wixQD1KiHzZ/N435D/1qxM0IbFrSRtGdfaeCgubZuiLwLi/KrMeJxNnbP2heybEsTH4Xg7U//XBOxrfjvcf54vb82Zck34GsPUJBn9lIjcLbg5KO8dCLgR4rwAI04Or1oihpKKwbDYnvD8WOO+DkgUe+MQemwBiQh4ylJiDZO62gznUFF2NXWrjF2ZcuzVgC77nR4vfaNragoTRyiKm0QH51QtoUhXCamd3ozHrWjh2BNgDKtg1fkR4lUaGpNVfn4uHg42Neh1gQ+1fn17vL16zcTZjWRqItAvqKK0UGz8plPaaYmeNP9KGHdNzlaCRLKj8ShqD9LAxxp5R7u2X3/S3S5lPajJ3+VHh+sBIiU//RQ33YpbyRWOs0cLVUaPDcz2ROZvlxUxIMqiANGFYpveOazIt+DcmGxaDCBsKE= 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)(7416014)(36860700013)(82310400026)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Feb 2025 06:38:44.1693 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9c89bb6c-633a-4c78-5284-08dd499d90ab 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: BN1PEPF00004688.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB8449 From: Shivansh Dhiman Add NUMA mempolicy support to the filemap allocation path by introducing new APIs that take a mempolicy argument: - filemap_grab_folio_mpol() - filemap_alloc_folio_mpol() - __filemap_get_folio_mpol() These APIs allow callers to specify a NUMA policy during page cache allocations, enabling fine-grained control over memory placement. This is particularly needed by KVM when using guest-memfd memory backends, where the guest memory needs to be allocated according to the NUMA policy specified by VMM. The existing non-mempolicy APIs remain unchanged and continue to use the default allocation behavior. Signed-off-by: Shivansh Dhiman Signed-off-by: Shivank Garg --- include/linux/pagemap.h | 40 ++++++++++++++++++++++++++++++++++++++++ mm/filemap.c | 30 +++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 47bfc6b1b632..4ae7fa63cb26 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -662,15 +662,25 @@ static inline void *detach_page_private(struct page *page) #ifdef CONFIG_NUMA struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order); +struct folio *filemap_alloc_folio_mpol_noprof(gfp_t gfp, unsigned int order, + struct mempolicy *mpol); #else static inline struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order) { return folio_alloc_noprof(gfp, order); } +static inline struct folio *filemap_alloc_folio_mpol_noprof(gfp_t gfp, + unsigned int order, + struct mempolicy *mpol) +{ + return filemap_alloc_folio_noprof(gfp, order); +} #endif #define filemap_alloc_folio(...) \ alloc_hooks(filemap_alloc_folio_noprof(__VA_ARGS__)) +#define filemap_alloc_folio_mpol(...) \ + alloc_hooks(filemap_alloc_folio_mpol_noprof(__VA_ARGS__)) static inline struct page *__page_cache_alloc(gfp_t gfp) { @@ -762,6 +772,8 @@ static inline fgf_t fgf_set_order(size_t size) void *filemap_get_entry(struct address_space *mapping, pgoff_t index); struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index, 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 *mpol); struct page *pagecache_get_page(struct address_space *mapping, pgoff_t index, fgf_t fgp_flags, gfp_t gfp); @@ -820,6 +832,34 @@ static inline struct folio *filemap_grab_folio(struct address_space *mapping, mapping_gfp_mask(mapping)); } +/** + * filemap_grab_folio_mpol - grab a folio from the page cache + * @mapping: The address space to search + * @index: The page index + * @mpol: The mempolicy to apply + * + * Same as filemap_grab_folio(), except that it allocates the folio using + * given memory policy. + * + * Return: A found or created folio. ERR_PTR(-ENOMEM) if no folio is found + * and failed to create a folio. + */ +#ifdef CONFIG_NUMA +static inline struct folio *filemap_grab_folio_mpol(struct address_space *mapping, + pgoff_t index, struct mempolicy *mpol) +{ + return __filemap_get_folio_mpol(mapping, index, + FGP_LOCK | FGP_ACCESSED | FGP_CREAT, + mapping_gfp_mask(mapping), mpol); +} +#else +static inline struct folio *filemap_grab_folio_mpol(struct address_space *mapping, + pgoff_t index, struct mempolicy *mpol) +{ + return filemap_grab_folio(mapping, index); +} +#endif /* CONFIG_NUMA */ + /** * find_get_page - find and get a page reference * @mapping: the address_space to search diff --git a/mm/filemap.c b/mm/filemap.c index 804d7365680c..c5ea32702774 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1001,8 +1001,13 @@ int filemap_add_folio(struct address_space *mapping, struct folio *folio, EXPORT_SYMBOL_GPL(filemap_add_folio); #ifdef CONFIG_NUMA -struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order) +struct folio *filemap_alloc_folio_mpol_noprof(gfp_t gfp, unsigned int order, + struct mempolicy *mpol) { + if (mpol) + return folio_alloc_mpol_noprof(gfp, order, mpol, + NO_INTERLEAVE_INDEX, numa_node_id()); + int n; struct folio *folio; @@ -1018,6 +1023,12 @@ struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order) } return folio_alloc_noprof(gfp, order); } +EXPORT_SYMBOL(filemap_alloc_folio_mpol_noprof); + +struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order) +{ + return filemap_alloc_folio_mpol_noprof(gfp, order, NULL); +} EXPORT_SYMBOL(filemap_alloc_folio_noprof); #endif @@ -1881,11 +1892,12 @@ void *filemap_get_entry(struct address_space *mapping, pgoff_t index) } /** - * __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. + * @mpol: The mempolicy to apply. * * Looks up the page cache entry at @mapping & @index. * @@ -1896,8 +1908,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 index, - 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 *mpol) { struct folio *folio; @@ -1967,7 +1979,7 @@ struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index, err = -ENOMEM; if (order > min_order) alloc_gfp |= __GFP_NORETRY | __GFP_NOWARN; - folio = filemap_alloc_folio(alloc_gfp, order); + folio = filemap_alloc_folio_mpol(alloc_gfp, order, mpol); if (!folio) continue; @@ -2003,6 +2015,14 @@ struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index, folio_clear_dropbehind(folio); return folio; } +EXPORT_SYMBOL(__filemap_get_folio_mpol); + +struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index, + fgf_t fgp_flags, gfp_t gfp) +{ + return __filemap_get_folio_mpol(mapping, index, + fgp_flags, gfp, NULL); +} EXPORT_SYMBOL(__filemap_get_folio); static inline struct folio *find_get_entry(struct xa_state *xas, pgoff_t max, From patchwork Mon Feb 10 06:32:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shivank Garg X-Patchwork-Id: 13967246 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2082.outbound.protection.outlook.com [40.107.220.82]) (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 000A23987D; Mon, 10 Feb 2025 06:39:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.220.82 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739169545; cv=fail; b=WF8kl1Nu+DVw6DzHxFQQksaiR/fRjNYAoiiRLY4OA6wCb4O8al7gMQvP55hFqJDAkQSeGuzGMrhPQh1nDzUdsUWVSXcTqDWEORyGz6zLYlQKCdR5fO63NxMnNBn2BANuVgXzj+/c6CNVtVSSBFyAu61hihYAUqwyMCnuvOFE7N8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739169545; c=relaxed/simple; bh=D+wLC4Fdnbz6o9C25toMvmJFcey3rMVvF4W+h8VrB0Q=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=WielhCtPkY6cbMb72TDALj1VPwjKKLu7nQRLzlm7WsmjxE2K1oL4USj3/yALfNN9b+IqsfdcOIQ0O8sgEVTh2gVXelivg+FEYmGo4f1iGnG4Yu4Np26ZssJvabEcWoRy24FDBHynTZ//UhG194LN9TFqWtrEeU503KnhGrlAlG0= 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=CRnGF8gA; arc=fail smtp.client-ip=40.107.220.82 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="CRnGF8gA" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=W0BLAwzYHadGlMlUpE/UpFURc2X7Istjj+D9aFigbv9uESy0wNaKcZEvbidSiI0MnJq+CUraCfQPRUpodrLVKBs81MnwgXEHZ+W39R7wv8QLFng5lI7M5VK0k+fcrVPmb2rzwjv4TRQOQoWfppLJXHwon5OP4y6YB+ISJt+5bLVaDk29PDfV9Qr/krwyNvTgNTu+kMu1lqfV7X/oMGwdKXQvrjNeyYsinrHiIQDkhsdpn3L17fbGx0wN+fG2JKxm9FCmrfzcit9Ln+wSXQ9MzrQXe+opqHOdM4NvEH+XE/2h6LKGVtLxqAbJL4+7PZeB/gdUiS5cfxMNB1w8BIRhUg== 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=S5Mxbbtw3oz3yU7GkS2l8DQ/1dodFTGqb6nIsH8nUP4=; b=C4O5QOIkFTZNp6MDm4BxS1TN0gOqM8SeEnrmZXI7TAcWN+fNCjkXfqCkupWzupUkoG1iJsyjVXh9hmgbknlXcNJ5d+6uJEZT1HFIUaJCc7pKK6F4OVC532eWPZkQ21+vlR/HNGT4UXWcH5YpfV7piviJgK0zG8vVBv3F/36VkYtH76c4ZZm8Cs3eNRDVjNzQQJL298GQuKeBb1o1s/GWPB5E4yxEBxVxmZTcYbcwsYA/pl6B9mrptYYZKNiq1467JEf5t0zh11KM9jqDsCqb5cUM8KUVCMPLB5r+R/vn73lxqEPK7zUiL5Ni4x1X2VtRj1K3/5kIK6vVniAwqHviPg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linux-foundation.org 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=S5Mxbbtw3oz3yU7GkS2l8DQ/1dodFTGqb6nIsH8nUP4=; b=CRnGF8gAvjY5HzMHqqM4BwccznM9+KcsrA1xfKjiGpJb0vUMSXLGEpLaZ/WhDtuzmpUt9kyYE80p1/UyyhvjLjfkX4sRba0dV80jFbgsDdbKp8CfToME5taz3lWwvdCRhSIl2Oy4AIZ4iI4UvWGu9ybtkTSk2sC0yUv0LUDpy8g= Received: from BLAPR03CA0047.namprd03.prod.outlook.com (2603:10b6:208:32d::22) by PH8PR12MB6698.namprd12.prod.outlook.com (2603:10b6:510:1cd::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8422.15; Mon, 10 Feb 2025 06:39:01 +0000 Received: from BN1PEPF0000468E.namprd05.prod.outlook.com (2603:10b6:208:32d:cafe::b3) by BLAPR03CA0047.outlook.office365.com (2603:10b6:208:32d::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8398.31 via Frontend Transport; Mon, 10 Feb 2025 06:39:00 +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 BN1PEPF0000468E.mail.protection.outlook.com (10.167.243.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8445.10 via Frontend Transport; Mon, 10 Feb 2025 06:39:00 +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; Mon, 10 Feb 2025 00:38:54 -0600 From: Shivank Garg To: , , CC: , , , , , , , , , , , , , , , , Subject: [RFC PATCH v4 2/3] mm/mempolicy: export memory policy symbols Date: Mon, 10 Feb 2025 06:32:28 +0000 Message-ID: <20250210063227.41125-3-shivankg@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250210063227.41125-1-shivankg@amd.com> References: <20250210063227.41125-1-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-fsdevel@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: BN1PEPF0000468E:EE_|PH8PR12MB6698:EE_ X-MS-Office365-Filtering-Correlation-Id: 6817be59-455e-4336-8d09-08dd499d9a59 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|36860700013|82310400026|1800799024; X-Microsoft-Antispam-Message-Info: mCdi0pV0JlrwoxpriC5aXTSUxzmUF5V1Eje0leH1hRpQWMfxphnZC55Zou/d+v5DRBzC3X1m/9loKhJt2NUTWhlIsMWtFwhCPurOvf0Nrb/Bt+EjOfBNzyPdTHmgCC2mlV3aaEkY+GF2XYtCm6pDqQQFtFuYW0wDGoBmQ1cMICeNe8J3Tk5gAwKjYZWNZjQ3rxoew4xSmIF8T8iHzvOsUXHm6PTdI7iE5FipdugFK7CFaLXE6xsyLsKz/+HuqwR+961Yakx9emNgFcQlAUdl8iiKsGjM8qSP1aUosYCGKUAxf/s+XVVeelpTHeqH6kWxd9kx3UDzwUmIaDDsR8jjqzAiqbCXCXjuwpqbKkwMSCLofaOMvlqUEwd+OZtA4TwaPhhysevbnOVs+yGrIEu0gPM7oec7Ap/SgQlGQq+e0ZtP8xhhzJQvaBmLZb8+q75EKHCTt+9gWB2b5vgru0qx7Tq+uj1MfvIKUx03dleMKT6K4njMNuRboUsBrUuqlxLI27D/BHrY0pBrR+rurihIlwBIrRRubvPStre4rVrFe41grK4RjNi75KsXgDpdpdc2v9LOXRUawkszdpckkjR7oB4iAETOiYCvcM9W/xYgwbNxS3EJwudK6QlBW5mHnosvu+i/wkOADtZpKwoTHtOq+Qcxi7naZImBEdBaMn4R+RlGsHerswG7LUcWIwx6DfZRoL2Bu4JnoYGeAcz+ZaLtcm005jbtFeg7wfI4nU/zVpSfnQRCjlIW9LRi994mp7drsFYWk6kypISY1gud7NVWNc55HlN4yAhhXophxTUL8VkW3fIZ+D2jkDkFmysYv+P6EMVcPN0RQnmzxuhKcv+MgyzvujwMJmbDKD/feCLBL0SswARfLbwnBbfZd1VzjM7yuWNpnqZvymIqWN8uuKnq33GLmf/unRVvMIN8ltPFLJcW6clgOWV1O5R/lBBspLsWjRaChcxgaRnpASlJuC2Lz0gXZTg9RP+9agrR924X93/J7RTvsmkwhDF2l+7Jb+Irf9GNz0NwOWmm57bcTUtXbb42jx1nYyHAEqeIppgzcftQwJ4p/HRmqLOSXIAQGtF21QzOQT1L4SSH2SndLI7SWxXkfXDZiAmfkQv2uiApvaMLBo/b9AtyQOfwM6KkJqoa8vMs0yhFp6bIR9CNu+7TBUTMh+7lSJioBWa1zQ5GZAr7fCV3Jih0fMyrLmhaPt19BYZp2tMr7EYfyiObQmqEMNjeYF7Klxk+xesiyTGLw0pcCoCUq8QQxWK83lg8iJy+S5C2F0BfLKHAe93QMtpYuYXvDjEeQAr3i5XZj1yRMpZn2ikuyN9vuLpirTC+mu8J02z84kq+SIXygGflH2dz/bToxekKFfD1sr7TCru5k4SLX+xEljYP3VuD7MWT662pBBaW0bKYsJaGIQTcDo1EB+frSYnSncUHm+f0Mzy4wkvm8wVQZXvmH71PKeeILbMCaB5PKNNZp10jZvdyqesibUsyz8GhSePOVmnMQDCvQiY= 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)(7416014)(36860700013)(82310400026)(1800799024);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Feb 2025 06:39:00.3950 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6817be59-455e-4336-8d09-08dd499d9a59 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: BN1PEPF0000468E.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR12MB6698 Export memory policy related symbols needed by the KVM guest-memfd to implement NUMA policy support. These symbols are required to implement per-memory region NUMA policies for guest memory, allowing VMMs to control guest memory placement across NUMA nodes. Signed-off-by: Shivank Garg Acked-by: David Hildenbrand --- mm/mempolicy.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mm/mempolicy.c b/mm/mempolicy.c index bbaadbeeb291..9c15780cfa63 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -214,6 +214,7 @@ struct mempolicy *get_task_policy(struct task_struct *p) return &default_policy; } +EXPORT_SYMBOL(get_task_policy); static const struct mempolicy_operations { int (*create)(struct mempolicy *pol, const nodemask_t *nodes); @@ -347,6 +348,7 @@ void __mpol_put(struct mempolicy *pol) return; kmem_cache_free(policy_cache, pol); } +EXPORT_SYMBOL(__mpol_put); static void mpol_rebind_default(struct mempolicy *pol, const nodemask_t *nodes) { @@ -2736,6 +2738,7 @@ struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp, read_unlock(&sp->lock); return pol; } +EXPORT_SYMBOL(mpol_shared_policy_lookup); static void sp_free(struct sp_node *n) { @@ -3021,6 +3024,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(mpol_shared_policy_init); int mpol_set_shared_policy(struct shared_policy *sp, struct vm_area_struct *vma, struct mempolicy *pol) @@ -3039,6 +3043,7 @@ int mpol_set_shared_policy(struct shared_policy *sp, sp_free(new); return err; } +EXPORT_SYMBOL(mpol_set_shared_policy); /* Free a backing policy store on inode delete. */ void mpol_free_shared_policy(struct shared_policy *sp) @@ -3057,6 +3062,7 @@ void mpol_free_shared_policy(struct shared_policy *sp) } write_unlock(&sp->lock); } +EXPORT_SYMBOL(mpol_free_shared_policy); #ifdef CONFIG_NUMA_BALANCING static int __initdata numabalancing_override; From patchwork Mon Feb 10 06:32:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shivank Garg X-Patchwork-Id: 13967247 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2067.outbound.protection.outlook.com [40.107.236.67]) (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 42B66192B76; Mon, 10 Feb 2025 06:39:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.236.67 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739169557; cv=fail; b=ZFyaqgTqHctU20tfCUH8dCncB8I/OBhjpdcTPbGor25xqtoXaWaKrwTdDm/BvmJgIU+lbjgu9brTzQlh8FOCuNJS1lfK47nl1/9Wo1TYj3vBDTOZeiEr6/pkTDDAwwx3jsli8QXTnNU0LyqrAF4vszqdG84aacYhe/pB0bUHpQI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739169557; c=relaxed/simple; bh=F8zDbV/IKGK+pQ3FfP4mgHcyDm6ZgA0saoVSjkiurG4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=NwcOfYdvp4FxYUw8T3RgDUPZK3ePypPsyDlgLoiWdUHOQ1xwz9s3XI8/JWJ25n4nuz21adWAu+VZooOTn/59k1S7Gb5t6exFa9xyDCJL7ykfIk6BDj9DbCAhCByN7SRTGTl7yMhxyq5w858RuiPwb/vcVGSqock8UGf8o2nM9qA= 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=5JfT5EdU; arc=fail smtp.client-ip=40.107.236.67 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="5JfT5EdU" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GVh4kkDXq7+AjVnDwLlIUznn5XHbwbUITvj6MDT/F+9eELOX8QiAPySybBdSaQR1RXHQVtNoJUB3fcEoLxeTf0Y2F3wO2a7C6TaDZQUHLR3pUqln+8hymxFBLOBVVF/dOAZVi68n1UD6QwPSyx1dS5zTXPnGVgI+fgRUdN1uTMpiOMfTGjf/Fq1SbcKVpPiHobPNww3Xt0qUqZHizlCijgPc/hDaSlsmL89AAwfmhK96BWsXW5MkI6ahOqED4CCGPflBn6XTICfd0AQktST0wGOe4OgDKpU9h30/8FPclmcZInhY51d2K5YTbGaLQWObtBA0kAU5Ge8/E0OXh3GrYw== 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=ARPUQ0qI0jyB3ykl6pWjnHNttD+6UqvBxNWuyZj5uq0=; b=pGm4OyZbHDbeNhPnxqhc1j7VFTY8IdgMCaHTHrbZhwrGdExfeE32K1McHJZC4e9hapCuoR5Vlt8hEtzlCL/6E2SQRKQyF1wDdibR6Xnxs5rEn1FvQIoUY84IMqejjleWEn6Y6dECazMXqwQRgQeyP7zXnK/9i6d+rIiQ8X9Yqc3heY3VszExkJvohO/heH4He8rJ/DHgKJWdqvwVggsYfQAR+VNAkqD5H9izYWRH2g/F192+XbMbyVaaUg4znBeKQHmS5/3GDs1oz5E+vsiMEpLuiFMXXHF33eYh05IuhYlwFz0jfkhTUSzwG4Y+b9QyEsBDpt6wBumwPv70XDpyhQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linux-foundation.org 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=ARPUQ0qI0jyB3ykl6pWjnHNttD+6UqvBxNWuyZj5uq0=; b=5JfT5EdUpWflAG+A5cNWMb5GZXzZxtyktEhEzQqNCrdjcQNkmppnGXu9NDEy3dz+GBxRupO9lEhIjwSB1O+IJa30oRMuH21yvnjUITx8pSGXzGYArnXk2IFz6K5rYkpaVh6oGyYN52OuN4e7qAkMeo9Q9Z0OAF51jjVKit5VFpo= Received: from BN7PR06CA0053.namprd06.prod.outlook.com (2603:10b6:408:34::30) by PH7PR12MB7380.namprd12.prod.outlook.com (2603:10b6:510:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8422.14; Mon, 10 Feb 2025 06:39:08 +0000 Received: from BN1PEPF00004687.namprd05.prod.outlook.com (2603:10b6:408:34:cafe::60) by BN7PR06CA0053.outlook.office365.com (2603:10b6:408:34::30) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8398.31 via Frontend Transport; Mon, 10 Feb 2025 06:39:07 +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 BN1PEPF00004687.mail.protection.outlook.com (10.167.243.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8445.10 via Frontend Transport; Mon, 10 Feb 2025 06:39:07 +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; Mon, 10 Feb 2025 00:39:02 -0600 From: Shivank Garg To: , , CC: , , , , , , , , , , , , , , , , Subject: [RFC PATCH v4 3/3] KVM: guest_memfd: Enforce NUMA mempolicy using shared policy Date: Mon, 10 Feb 2025 06:32:29 +0000 Message-ID: <20250210063227.41125-4-shivankg@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250210063227.41125-1-shivankg@amd.com> References: <20250210063227.41125-1-shivankg@amd.com> Precedence: bulk X-Mailing-List: linux-fsdevel@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: BN1PEPF00004687:EE_|PH7PR12MB7380:EE_ X-MS-Office365-Filtering-Correlation-Id: 6710d119-026d-4c70-b765-08dd499d9eb2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|82310400026|376014|36860700013; X-Microsoft-Antispam-Message-Info: ECpuUoMmvJklYHEFB0ej3vv5Al5XD0IvhGif5KaApOmYbts4K05nYqCil99atIuUbo2QFNwmKaTI2ycTg3IQbIHLML4XN1X5rhGC0T54pAdDMLoE/+Soc/eFF3Zrzj+LdSZWAHSnRVWeS7EWIe0nSgyJSyW1bQ/DnfWwI2AraXRjSaZVh1FmI+5CN5lBltyezheuCX3hR/4U93EKKBDHsLH1ncoP3PSZC+7B9b0l1v/Cyaa5DdyLhJZubfd9GkWkDyBIQ7sOShBzkGYBjbynUlQ8GaNXtdQrRjw8k0lDXWu9ybnXsC0pepT8QBnuHepCgCrSsX0vfQS8NxKFn7SUOU7fYVGX2GD/q4soMKIjuRgB+fUxqb9bZwnKuGE9KTkkieNUPItzuzm4PY4Cvz1f96f2huUdifHAQFwS1tyN1Kdn31T5kBkAgVysTAcq3nwS5z/CLlFqlFKJdfxzSHqJ36o/FF7bkYEZrn+9v4YnZLfjvkiYyb/noLERB2NDQkGmDHOl3vLEPm1L+Hv5YdgtEC5atxMsRPR+zc6+JS34sgziJ6EfzjNuG1mufu22W5ydLhtDr56Fg/gDlZqINN4xdPCW07v98vBFeona7Q8vxv91/RdMyXwKD+M3bMeFmDRBmatCpUXGmO/X/DAd0mmllkzA0JFUD+VUnADpSC99bh52bsnJa6visFDhgBuLI/n0n2u6G+9vIK7nkKov5Np4gqGTZO8DP13nmHWa6I2tLNpplZ+LnU06lwYzbZmu9MAXoI9jaXkKV6MFLGi6sht+5PsaCXk/VmuJgPTn7jD+vWVZ8UlBlHqQCCmcTqg+mBCtt7c4cBYvhyV8bj59/qx8eTgrH4/43ZER7fd15Yb81Hhl+I7cQOV2olRMiWRcgRJarMbP/naHxsGdGeLo3kJYnZNt54r2JfL4eAm2GtONBtx2mRYENgKRiukh0Ht48QlfOKhmQ1oC5aqaNb8qS9s/tt64hrl1R2x/9bBKPNO6iux7ZULMYLf9VqNfWMDU2FXwT3KYIpIqDibH/bq2nwEx33Mz8PZt1DIYzGZdbJnvzwY61uyPJ/XProaXTd/LBbGjEVAdOCiAGMya4j/ylmR6SSXKYleUY2nmum//Ux4en+PswgxDSEoRi1AmB7HR6N1P9K0J408B3XlXgNv4zhzKNtMvaAt5m93ssPmh+eVy9qukB74y8HmxkH1QmbHPNNOM9I0k5wMgGGGWLV6v/MvebI56hB4r8Mv8kyBDuMWZkIlBbC/Ece9Mby65oRXVTxvNPMbztDFFWnlUMu3xYlnicDiZ0/Cym08ML7/q8meklTOxskIOzSqNWtDN4U6UyDEg5/NQ1uhNUjtEPP7rTrHcuC6iKwfvA8tdWZM94uzPS848UdSuiz4J+L6DMHDU151b9G5wwYMU1vciH29CHUqI7d/kM8tUI6f2EWIHgb77m3zhBMdAskh/J7CYq0Fcm8hXzlQ6zN6xwR/WC0TZnBR2c9dzA/eSpBFvPa7ei0wEOS0= 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)(7416014)(82310400026)(376014)(36860700013);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Feb 2025 06:39:07.7059 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6710d119-026d-4c70-b765-08dd499d9eb2 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: BN1PEPF00004687.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7380 Previously, guest-memfd allocations were following local NUMA node id in absence of process mempolicy, resulting in random memory allocation. Moreover, mbind() couldn't be used since memory wasn't mapped to userspace in VMM. Enable NUMA policy support by implementing vm_ops for guest-memfd mmap operation. This allows VMM to map the memory and use mbind() to set the desired NUMA policy. 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 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. Suggested-by: David Hildenbrand Signed-off-by: Shivank Garg --- virt/kvm/guest_memfd.c | 84 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b2aa6bf24d3a..e1ea8cb292fa 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -11,8 +12,13 @@ struct kvm_gmem { struct kvm *kvm; struct xarray bindings; struct list_head entry; + struct shared_policy policy; }; +static struct mempolicy *kvm_gmem_get_pgoff_policy(struct kvm_gmem *gmem, + pgoff_t index, + pgoff_t *ilx); + /** * folio_file_pfn - like folio_file_page, but return a pfn. * @folio: The folio which contains this index. @@ -96,10 +102,20 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slot *slot, * Ignore accessed, referenced, and dirty flags. The memory is * unevictable and there is no storage to write back to. */ -static struct folio *kvm_gmem_get_folio(struct inode *inode, pgoff_t index) +static struct folio *kvm_gmem_get_folio(struct file *file, pgoff_t index) { /* TODO: Support huge pages. */ - return filemap_grab_folio(inode->i_mapping, index); + struct folio *folio = NULL; + struct inode *inode = file_inode(file); + struct kvm_gmem *gmem = file->private_data; + struct mempolicy *policy; + pgoff_t ilx; + + policy = kvm_gmem_get_pgoff_policy(gmem, index, &ilx); + folio = filemap_grab_folio_mpol(inode->i_mapping, index, policy); + mpol_cond_put(policy); + + return folio; } static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, @@ -177,8 +193,9 @@ static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t len) return 0; } -static long kvm_gmem_allocate(struct inode *inode, loff_t offset, loff_t len) +static long kvm_gmem_allocate(struct file *file, loff_t offset, loff_t len) { + struct inode *inode = file_inode(file); struct address_space *mapping = inode->i_mapping; pgoff_t start, index, end; int r; @@ -201,7 +218,7 @@ static long kvm_gmem_allocate(struct inode *inode, loff_t offset, loff_t len) break; } - folio = kvm_gmem_get_folio(inode, index); + folio = kvm_gmem_get_folio(file, index); if (IS_ERR(folio)) { r = PTR_ERR(folio); break; @@ -241,7 +258,7 @@ static long kvm_gmem_fallocate(struct file *file, int mode, loff_t offset, if (mode & FALLOC_FL_PUNCH_HOLE) ret = kvm_gmem_punch_hole(file_inode(file), offset, len); else - ret = kvm_gmem_allocate(file_inode(file), offset, len); + ret = kvm_gmem_allocate(file, offset, len); if (!ret) file_modified(file); @@ -290,6 +307,7 @@ static int kvm_gmem_release(struct inode *inode, struct file *file) mutex_unlock(&kvm->slots_lock); xa_destroy(&gmem->bindings); + mpol_free_shared_policy(&gmem->policy); kfree(gmem); kvm_put_kvm(kvm); @@ -311,8 +329,61 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) { return gfn - slot->base_gfn + slot->gmem.pgoff; } +#ifdef CONFIG_NUMA +static int kvm_gmem_set_policy(struct vm_area_struct *vma, struct mempolicy *new) +{ + struct file *file = vma->vm_file; + struct kvm_gmem *gmem = file->private_data; + + return mpol_set_shared_policy(&gmem->policy, vma, new); +} + +static struct mempolicy *kvm_gmem_get_policy(struct vm_area_struct *vma, + unsigned long addr, pgoff_t *pgoff) +{ + struct file *file = vma->vm_file; + struct kvm_gmem *gmem = file->private_data; + + *pgoff = vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT); + return mpol_shared_policy_lookup(&gmem->policy, *pgoff); +} + +static struct mempolicy *kvm_gmem_get_pgoff_policy(struct kvm_gmem *gmem, + pgoff_t index, + pgoff_t *ilx) +{ + struct mempolicy *mpol; + + *ilx = NO_INTERLEAVE_INDEX; + mpol = mpol_shared_policy_lookup(&gmem->policy, index); + return mpol ? mpol : get_task_policy(current); +} + +static const struct vm_operations_struct kvm_gmem_vm_ops = { + .get_policy = kvm_gmem_get_policy, + .set_policy = kvm_gmem_set_policy, +}; + +static int kvm_gmem_mmap(struct file *file, struct vm_area_struct *vma) +{ + file_accessed(file); + vma->vm_ops = &kvm_gmem_vm_ops; + return 0; +} +#else +static struct mempolicy *kvm_gmem_get_pgoff_policy(struct kvm_gmem *gmem, + pgoff_t index, + pgoff_t *ilx) +{ + *ilx = 0; + return NULL; +} +#endif /* CONFIG_NUMA */ static struct file_operations kvm_gmem_fops = { +#ifdef CONFIG_NUMA + .mmap = kvm_gmem_mmap, +#endif .open = generic_file_open, .release = kvm_gmem_release, .fallocate = kvm_gmem_fallocate, @@ -445,6 +516,7 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) kvm_get_kvm(kvm); gmem->kvm = kvm; xa_init(&gmem->bindings); + mpol_shared_policy_init(&gmem->policy, NULL); list_add(&gmem->entry, &inode->i_mapping->i_private_list); fd_install(fd, file); @@ -585,7 +657,7 @@ static struct folio *__kvm_gmem_get_pfn(struct file *file, return ERR_PTR(-EIO); } - folio = kvm_gmem_get_folio(file_inode(file), index); + folio = kvm_gmem_get_folio(file, index); if (IS_ERR(folio)) return folio;