From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8C8AAC4167B for ; Thu, 7 Dec 2023 00:28:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2C1D06B007E; Wed, 6 Dec 2023 19:28:21 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 2492B6B0080; Wed, 6 Dec 2023 19:28:21 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id EA3DB6B0081; Wed, 6 Dec 2023 19:28:20 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id D43036B007E for ; Wed, 6 Dec 2023 19:28:20 -0500 (EST) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id A1C8C1C0898 for ; Thu, 7 Dec 2023 00:28:20 +0000 (UTC) X-FDA: 81538135560.10.D08B814 Received: from mail-yw1-f193.google.com (mail-yw1-f193.google.com [209.85.128.193]) by imf19.hostedemail.com (Postfix) with ESMTP id BC0411A0013 for ; Thu, 7 Dec 2023 00:28:18 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=KPjP8h5Q; spf=pass (imf19.hostedemail.com: domain of gourry.memverge@gmail.com designates 209.85.128.193 as permitted sender) smtp.mailfrom=gourry.memverge@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1701908898; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=o1EahSaWjn587JobDPcMa6mmsjiJNiTkmxUoMqVlCE8=; b=xIUo2RZNmPID/hEE6L/O5edEr4l+mfGW142jg3z3Uj2XgNmSYnpATLypgPhAxjR8mu+OGk iW6sJXdvHo9HMWd91b5iLaWW5dJIivbT0g27DEiC2iVGRJj9lm55R1y+IO7ONyamXQW24i 69/yGW6/lEWuMefMTmMyh/+H/59/vJ4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1701908898; a=rsa-sha256; cv=none; b=hUvpTCF79xFrVvOpH2b4ShGBRHiKWvspq4+tjUfvvdZ+x7SAyXNpQaVIs7yEGajRSUKAYi T8hc8myLNpaHJtjciIEBZ7xfz9aFNWc1XNdr9wiXhx4n5NiUjSyzOVdryGeXHJKc+tahFH Ldh6sfJ01LMpsBG4dVFKuA6ReETGPPo= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=KPjP8h5Q; spf=pass (imf19.hostedemail.com: domain of gourry.memverge@gmail.com designates 209.85.128.193 as permitted sender) smtp.mailfrom=gourry.memverge@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-yw1-f193.google.com with SMTP id 00721157ae682-5d747dbf81eso972377b3.1 for ; Wed, 06 Dec 2023 16:28:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701908898; x=1702513698; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=o1EahSaWjn587JobDPcMa6mmsjiJNiTkmxUoMqVlCE8=; b=KPjP8h5QqwJ3cmbV3yaUQe0NqcEcxaUWu0EwZgJCcjAk3tDxPusX+PyUF66iBOHNta 0TUp/pCAHf7cg9o5dHn+Dv8GAzVyCR2uYg4UEXvOv6otFQqPAF+MKhBi+TmzUkepEoHS VvBLjLOH4D+ywaevf2aLnycha90KhiyrsGThwZj6H8SZmWeJOPhRUX+69uuXPcuZqYLR /dfxUcS3dvbx5FE3ESGcAAzLVUR9IF1rhDAo1ELfwAVkAghwf6Yw6+g4GeVPYHixbKSs v+q/i8SCPenAO9m+nvYnfRw8dc6BJU1ggVZ+nWxw2vQM5J4AHS70hN540Hd7omI8hAKt AdSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701908898; x=1702513698; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=o1EahSaWjn587JobDPcMa6mmsjiJNiTkmxUoMqVlCE8=; b=tgobzlgbfwfkq+q55F8cdYcUrJeFRxQzou/7ukMhmjno7dK5Hw6irCWmeuVrvCXCqE 88soMnnkGcEcrTBpEvEZEozEw/9ysrFtnxBUKEun4I816Ok5DzQVHcbUOTwnnq0xoxIX pKCxgc6+Lecqz8kd2Kre/JBQISMOYzI3GdEmirgY5p+c87d8cn1PI05Y4Qk4YcjJnLAA Mdf0JcQnviZfIriqwVmJIugnjL0yGuR7REnMJtvJclk4N09MJB7kWOsduJiEOv5/powQ BafTQjENLh9dJ5nN9hvG6n5XrsA1G9UtbSfYRnsI48S4UQln8nITo5Ro8XDP5RkedjYb dy8A== X-Gm-Message-State: AOJu0Yx510lKUGK5TBXG9ryY0QCfJDAsEOsKZmGRD990m3m9A4W0Zphy aapxpPTrmWUVT7oJBqLGPMCatvTGqvu3 X-Google-Smtp-Source: AGHT+IHBofphJxufL4ShCxUpV+C9+5nfvGyyqF//uUTQHcd+l9eDG4oZDhCnaYTSmI9K3LJ+jqSscA== X-Received: by 2002:a81:aa0d:0:b0:5d3:d439:aabe with SMTP id i13-20020a81aa0d000000b005d3d439aabemr1632111ywh.26.1701908897789; Wed, 06 Dec 2023 16:28:17 -0800 (PST) Received: from fedora.mshome.net (pool-173-79-56-208.washdc.fios.verizon.net. [173.79.56.208]) by smtp.gmail.com with ESMTPSA id x145-20020a81a097000000b005d82fc8cc92sm19539ywg.105.2023.12.06.16.28.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Dec 2023 16:28:17 -0800 (PST) From: Gregory Price X-Google-Original-From: Gregory Price To: linux-mm@kvack.org, jgroves@micron.com, ravis.opensrc@micron.com, sthanneeru@micron.com, emirakhur@micron.com, Hasan.Maruf@amd.com Cc: linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, akpm@linux-foundation.org, arnd@arndb.de, tglx@linutronix.de, luto@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, mhocko@kernel.org, tj@kernel.org, ying.huang@intel.com, gregory.price@memverge.com, corbet@lwn.net, rakie.kim@sk.com, hyeongtak.ji@sk.com, honggyu.kim@sk.com, vtavarespetr@micron.com, peterz@infradead.org Subject: [RFC PATCH 04/11] mm/mempolicy: create struct mempolicy_args for creating new mempolicies Date: Wed, 6 Dec 2023 19:27:52 -0500 Message-Id: <20231207002759.51418-5-gregory.price@memverge.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20231207002759.51418-1-gregory.price@memverge.com> References: <20231207002759.51418-1-gregory.price@memverge.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: b1pxbf3ndxz7xme9d6oik4ushs3k4b8u X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: BC0411A0013 X-Rspam-User: X-HE-Tag: 1701908898-988963 X-HE-Meta: U2FsdGVkX1+VT9/0hBqZPnWdn92znQIHL7M3r7Aa92iWuMSn9s7JS3B8fDFs4xd/p8lGA11EGLyfrWtA/mxdLNB1km5mUDAK0WanKdulNuxTdbFjkWJDr3fO5Y/cpszgYFvfTwZdZSLF2INUOoW/gTCnfxVi0q312A3RkMEcG3pPdacWMRYc68tZyiJtZ54yoIO73LimmiYaFPB+b/WfsvJEcT/KWeiX7o+6gI1Bc/TmwmhAUcPgjJdSMh0HGmiUDV+R6A2WcpXMnzlBK8ZoPFpsjP0DbB59UCcgutB0iXRpRAEnEDvtsUvoBHM2BXWp2+ewk3IXyJ0QliuVWQj0KyKRWHkG9nH4u/H7fTu8+yZPVtNQwiYKYyQRbUujRVB8zBbYvdUtFvCnmh5JEg8GM5/siiQFXH1Pd2XV7/lCBYa7AbJsXnTXMrDcL4LO4G7PrTTiqPmKwrnUlaL153Ph5OyUAjBz8f7i7OL1t7ulaQbv/JHxA1cxPa3aVj8DTFhoOpvnDoJlKacnR3p18FO9XO8mhPEvWnV4M93+PyCB43G4aCka6B6Se81vRsPHqzwDSBx7jaIpJxE3lREkdwauJvb9RMkM4hEHtUwLdjgvYjG5bDQZr73W4k9Oj7l06Fm/mCe09CqvhalCDy1+iQQ2DkxjuySrODEpV7utG5qfDZAoCA2yR7s724qPYq38EmuqKkyvCYKiZJoeh2CTF1KD/c2Rx9EDeC5iDC88kKZFYYyUOskfUJPxqNA1piZGCb+67A8khV+0pn/wyfR+Hv/JxWXQKtf4pKXSVh2zdTCLBWFWoZOPvMnxQq/dtqtC5iqIXSWwIQh2/bx8TgiSGWoJjfQiWlGa04y0J347UfFAKeK+nRkMO0/7A5WVARI1eqNC9eZuaBJkZ7XDmOL8QQO4jmK4TQq1jFrNleWWo5/VNuVTdvxt4Bd7iIkIDTSO4Jq41FDiTrzLPKbtpZMErjl osDwqyXl OqsChFnKmwxr/LsLBqAXKP4MNSGRRBmYHHrSVACpzPxnefD/0oeCldh4C2WjuNXaup1LCvTvpqpavrCoDTvUR7AcuoSaiZZlXqGukqf01iH20NAToAnpSlihxgfer7O/fj35N7hLGe4dJxPL+GhxKySDzFC1UK6xhM79kleYZS0A95id7iV4v7A+Ka3ELmGdRMRr0uO9EuRMpcxGDCvIf2fz99aGHQnQ1zJNQs+ZmZDmJPPbHvc5vofNgVocVPQf6Ho13Q7/n6T9IlZR/CvVPDz5jitv8KovLJBNLKTRI+Js1EKCr8Ce3CVHOoUoRpNEDrziJUR0G7vExLHWuTKJYLEMAB2KRf2VqA9CPAaDGbCNiF0ko3iHT7LdGzXXfVM4LkWML9t2w/hvm0pIydTdgjRZk1USQCBVEVvbzEUOQ6UpIPjBVt+9SY5hGEsSQTky9HaCvqBPH7FUzx4r56PAr8sEk156IZl5HqeAUP7zQ8U65GBFRLp3Q1B1yIs3ShCZK4Qf3VTh5ozoWMbQ= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: This patch adds a new kernel structure `struct mempolicy_args`, intended to be used for an extensible get/set_mempolicy interface. This implements the fields required to support the existing syscall interfaces interfaces, but does not expose any user-facing arg structure. mpol_new is refactored to take the argument structure so that future mempolicy extensions can all be managed in the mempolicy constructor. The get_mempolicy and mbind syscalls are refactored to utilize the new argument structure, as are all the callers of mpol_new() and do_set_mempolicy. Signed-off-by: Gregory Price --- include/linux/mempolicy.h | 14 ++++++++ mm/mempolicy.c | 69 +++++++++++++++++++++++++++++---------- 2 files changed, 65 insertions(+), 18 deletions(-) diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index ba09167e80f7..117c5395c6eb 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h @@ -61,6 +61,20 @@ struct mempolicy { } wil; }; +/* + * Describes settings of a mempolicy during set/get syscalls and + * kernel internal calls to do_set_mempolicy() + */ +struct mempolicy_args { + unsigned short mode; /* policy mode */ + unsigned short mode_flags; /* policy mode flags */ + nodemask_t *policy_nodes; /* get/set/mbind */ + int policy_node; /* get: policy node information */ + unsigned long addr; /* get: vma address */ + int addr_node; /* get: node the address belongs to */ + int home_node; /* mbind: use MPOL_MF_HOME_NODE */ +}; + /* * Support for managing mempolicy data objects (clone, copy, destroy) * The default fast path of a NULL MPOL_DEFAULT policy is always inlined. diff --git a/mm/mempolicy.c b/mm/mempolicy.c index eec807d0c6a1..4c343218c033 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -268,10 +268,12 @@ static int mpol_set_nodemask(struct mempolicy *pol, * This function just creates a new policy, does some check and simple * initialization. You must invoke mpol_set_nodemask() to set nodes. */ -static struct mempolicy *mpol_new(unsigned short mode, unsigned short flags, - nodemask_t *nodes) +static struct mempolicy *mpol_new(struct mempolicy_args *args) { struct mempolicy *policy; + unsigned short mode = args->mode; + unsigned short flags = args->mode_flags; + nodemask_t *nodes = args->policy_nodes; if (mode == MPOL_DEFAULT) { if (nodes && !nodes_empty(*nodes)) @@ -820,8 +822,7 @@ static int mbind_range(struct vma_iterator *vmi, struct vm_area_struct *vma, } /* Set the process memory policy */ -static long do_set_mempolicy(unsigned short mode, unsigned short flags, - nodemask_t *nodes) +static long do_set_mempolicy(struct mempolicy_args *args) { struct mempolicy *new, *old; NODEMASK_SCRATCH(scratch); @@ -830,14 +831,14 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, if (!scratch) return -ENOMEM; - new = mpol_new(mode, flags, nodes); + new = mpol_new(args); if (IS_ERR(new)) { ret = PTR_ERR(new); goto out; } task_lock(current); - ret = mpol_set_nodemask(new, nodes, scratch); + ret = mpol_set_nodemask(new, args->policy_nodes, scratch); if (ret) { task_unlock(current); mpol_put(new); @@ -1235,8 +1236,7 @@ static struct folio *alloc_migration_target_by_mpol(struct folio *src, #endif static long do_mbind(unsigned long start, unsigned long len, - unsigned short mode, unsigned short mode_flags, - nodemask_t *nmask, unsigned long flags) + struct mempolicy_args *margs, unsigned long flags) { struct mm_struct *mm = current->mm; struct vm_area_struct *vma, *prev; @@ -1256,7 +1256,7 @@ static long do_mbind(unsigned long start, unsigned long len, if (start & ~PAGE_MASK) return -EINVAL; - if (mode == MPOL_DEFAULT) + if (margs->mode == MPOL_DEFAULT) flags &= ~MPOL_MF_STRICT; len = PAGE_ALIGN(len); @@ -1267,7 +1267,7 @@ static long do_mbind(unsigned long start, unsigned long len, if (end == start) return 0; - new = mpol_new(mode, mode_flags, nmask); + new = mpol_new(margs); if (IS_ERR(new)) return PTR_ERR(new); @@ -1284,7 +1284,8 @@ static long do_mbind(unsigned long start, unsigned long len, NODEMASK_SCRATCH(scratch); if (scratch) { mmap_write_lock(mm); - err = mpol_set_nodemask(new, nmask, scratch); + err = mpol_set_nodemask(new, margs->policy_nodes, + scratch); if (err) mmap_write_unlock(mm); } else @@ -1298,7 +1299,7 @@ static long do_mbind(unsigned long start, unsigned long len, * Lock the VMAs before scanning for pages to migrate, * to ensure we don't miss a concurrently inserted page. */ - nr_failed = queue_pages_range(mm, start, end, nmask, + nr_failed = queue_pages_range(mm, start, end, margs->policy_nodes, flags | MPOL_MF_INVERT | MPOL_MF_WRLOCK, &pagelist); if (nr_failed < 0) { @@ -1503,6 +1504,7 @@ static long kernel_mbind(unsigned long start, unsigned long len, unsigned long mode, const unsigned long __user *nmask, unsigned long maxnode, unsigned int flags) { + struct mempolicy_args margs; unsigned short mode_flags; nodemask_t nodes; int lmode = mode; @@ -1517,7 +1519,12 @@ static long kernel_mbind(unsigned long start, unsigned long len, if (err) return err; - return do_mbind(start, len, lmode, mode_flags, &nodes, flags); + memset(&margs, 0, sizeof(margs)); + margs.mode = lmode; + margs.mode_flags = mode_flags; + margs.policy_nodes = &nodes; + + return do_mbind(start, len, &margs, flags); } SYSCALL_DEFINE4(set_mempolicy_home_node, unsigned long, start, unsigned long, len, @@ -1598,6 +1605,7 @@ SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len, static long kernel_set_mempolicy(int mode, const unsigned long __user *nmask, unsigned long maxnode) { + struct mempolicy_args args; unsigned short mode_flags; nodemask_t nodes; int lmode = mode; @@ -1611,7 +1619,12 @@ static long kernel_set_mempolicy(int mode, const unsigned long __user *nmask, if (err) return err; - return do_set_mempolicy(lmode, mode_flags, &nodes); + memset(&args, 0, sizeof(args)); + args.mode = lmode; + args.mode_flags = mode_flags; + args.policy_nodes = &nodes; + + return do_set_mempolicy(&args); } SYSCALL_DEFINE3(set_mempolicy, int, mode, const unsigned long __user *, nmask, @@ -2877,6 +2890,7 @@ static int shared_policy_replace(struct shared_policy *sp, pgoff_t start, void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) { int ret; + struct mempolicy_args margs; sp->root = RB_ROOT; /* empty tree == default mempolicy */ rwlock_init(&sp->lock); @@ -2889,8 +2903,12 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) if (!scratch) goto put_mpol; + memset(&margs, 0, sizeof(margs)); + margs.mode = mpol->mode; + margs.mode_flags = mpol->flags; + margs.policy_nodes = &mpol->w.user_nodemask; /* contextualize the tmpfs mount point mempolicy to this file */ - npol = mpol_new(mpol->mode, mpol->flags, &mpol->w.user_nodemask); + npol = mpol_new(&margs); if (IS_ERR(npol)) goto free_scratch; /* no valid nodemask intersection */ @@ -2998,6 +3016,7 @@ static inline void __init check_numabalancing_enable(void) void __init numa_policy_init(void) { + struct mempolicy_args args; nodemask_t interleave_nodes; unsigned long largest = 0; int nid, prefer = 0; @@ -3043,7 +3062,11 @@ void __init numa_policy_init(void) if (unlikely(nodes_empty(interleave_nodes))) node_set(prefer, interleave_nodes); - if (do_set_mempolicy(MPOL_INTERLEAVE, 0, &interleave_nodes)) + memset(&args, 0, sizeof(args)); + args.mode = MPOL_INTERLEAVE; + args.policy_nodes = &interleave_nodes; + + if (do_set_mempolicy(&args)) pr_err("%s: interleaving failed\n", __func__); check_numabalancing_enable(); @@ -3052,7 +3075,12 @@ void __init numa_policy_init(void) /* Reset policy of current process to default */ void numa_default_policy(void) { - do_set_mempolicy(MPOL_DEFAULT, 0, NULL); + struct mempolicy_args args; + + memset(&args, 0, sizeof(args)); + args.mode = MPOL_DEFAULT; + + do_set_mempolicy(&args); } /* @@ -3082,6 +3110,7 @@ static const char * const policy_modes[] = */ int mpol_parse_str(char *str, struct mempolicy **mpol) { + struct mempolicy_args margs; struct mempolicy *new = NULL; unsigned short mode_flags; nodemask_t nodes; @@ -3168,7 +3197,11 @@ int mpol_parse_str(char *str, struct mempolicy **mpol) goto out; } - new = mpol_new(mode, mode_flags, &nodes); + memset(&margs, 0, sizeof(margs)); + margs.mode = mode; + margs.mode_flags = mode_flags; + margs.policy_nodes = &nodes; + new = mpol_new(&margs); if (IS_ERR(new)) goto out; -- 2.39.1