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 015B3C27C40 for ; Wed, 22 Nov 2023 21:12:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 89CE86B063C; Wed, 22 Nov 2023 16:12:41 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7FBF06B063D; Wed, 22 Nov 2023 16:12:41 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5DB6D6B063E; Wed, 22 Nov 2023 16:12:41 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 44FD76B063C for ; Wed, 22 Nov 2023 16:12:41 -0500 (EST) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 10B75C1262 for ; Wed, 22 Nov 2023 21:12:41 +0000 (UTC) X-FDA: 81486839322.13.41430EB Received: from mail-il1-f194.google.com (mail-il1-f194.google.com [209.85.166.194]) by imf12.hostedemail.com (Postfix) with ESMTP id 33A5540003 for ; Wed, 22 Nov 2023 21:12:39 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=KUAy04wZ; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf12.hostedemail.com: domain of gourry.memverge@gmail.com designates 209.85.166.194 as permitted sender) smtp.mailfrom=gourry.memverge@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1700687559; 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=nj0/yLijkUDdchJx9f8WaqM9fNxYMjAKFnMHDPEdLR0=; b=3J3NvZToICdr9ExFXWolobk16IMyCLa52Z6TmptWMd1mw6M1IovTBVU6Q2SLFXO6nsF4s4 XwIyjtnu4rpyW4hjX53OmVMTOL0D5uXnj5MhRW7+IcFulDpgx9DFF32nv5xE+zOIzdiFvF 7F3tCrpXVOb/boq3+Vhy47JJEy5TIl8= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=KUAy04wZ; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf12.hostedemail.com: domain of gourry.memverge@gmail.com designates 209.85.166.194 as permitted sender) smtp.mailfrom=gourry.memverge@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700687559; a=rsa-sha256; cv=none; b=0xAcuSENqRoIZm40qlOoGmNMM67Zz7YriPXU0qzrSxRRZCwMvBkEUZJwaleXQIM4PChtok LpMKGOmfemoJFtYSfVntxItcE0DN3LehohW+2EUnNuFH+nfSZw6eQ8duivoyr2bs6hKL0l BQHXjCrUIDGIn3jKSTrBGU5jgjOqCqw= Received: by mail-il1-f194.google.com with SMTP id e9e14a558f8ab-359d27f6d46so675455ab.3 for ; Wed, 22 Nov 2023 13:12:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1700687558; x=1701292358; 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=nj0/yLijkUDdchJx9f8WaqM9fNxYMjAKFnMHDPEdLR0=; b=KUAy04wZDZO9mARgZiK4yAyu4wm234JjjVbntG9JW669M43qGupkfKtqTiF1JPtCAM 2bh09FLPSGgFsXRCIMFa+VF/cNuIuKZtQAZrABRdy5jo+ABx5eSn7YGdUhw20TuhlQEM vHPfheM0dGZYkroymt9MaDXnTpCyGHP1j8mIJ2rtnm+uKpOv/WL7/EfnBF0KIEPdl0OW hzW86Gd1QQnw49FN6x6owbgK/wL+iqiYUf+QmrnfiydM8sYrEIGZQvGSfp5rupm9gDii P/8xNHtLu/AFIBWR43Px43ikYSvE0T7AcmAuLG5ivcqg22OatKGEKZ6yGNgDlydxjUZk ZPOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700687558; x=1701292358; 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=nj0/yLijkUDdchJx9f8WaqM9fNxYMjAKFnMHDPEdLR0=; b=LMH85DC5SBgbwWxQnihPAosNLi1fNFau/86irnlxJsNfzVCF+VNJB/PpIXDTyE+eMl TGjCs1rqPcM6hgqBhRKsATN9GntfU7okmpFlWi88L86y+uUrGbRFlvKCKpjVyE4MWXOp c7g+toke03LCR9UXsTUCW9bLj6FNSFy4n1OCAtan8+0Qtve5Yq0nEWcEyz4qoikDEOi0 Cm4g3AnepOWhYq+I2hfl/v0uL9a5OSb5uMJPBcgjxXV8ia+gokFuVZyQBTX45UgRXTRb 5JgFBsW6AEq7ZfuJQLnQzbnncSOlfJzhVC6g1x2SW56sdAtMEsnxbgpF9o5b7wlEHTB8 qUqA== X-Gm-Message-State: AOJu0YyVKSzGN2cR5ue3ow3aWH+rXzSRIKhyQ2/LP/EkM11wsDFkq6XU 0xPlxYyhdS60zxEaL2DGoM4+ReuAiL+L X-Google-Smtp-Source: AGHT+IGWypkgJaNcLXjK/eS64ds6ElauQ9WWQUmh33zgk8yVZiSbJ9XTKd3ElRdp4RxU4lnDOSLTsw== X-Received: by 2002:a05:6e02:1c84:b0:350:f51b:c32e with SMTP id w4-20020a056e021c8400b00350f51bc32emr4817949ill.16.1700687558122; Wed, 22 Nov 2023 13:12:38 -0800 (PST) Received: from fedora.mshome.net ([75.167.214.230]) by smtp.gmail.com with ESMTPSA id j18-20020a635512000000b005bdbce6818esm132136pgb.30.2023.11.22.13.12.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Nov 2023 13:12:37 -0800 (PST) From: Gregory Price X-Google-Original-From: Gregory Price To: linux-mm@kvack.org 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 Subject: [RFC PATCH 11/11] fs/proc: Add mempolicy attribute to allow read/write of task mempolicy Date: Wed, 22 Nov 2023 16:12:00 -0500 Message-Id: <20231122211200.31620-12-gregory.price@memverge.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20231122211200.31620-1-gregory.price@memverge.com> References: <20231122211200.31620-1-gregory.price@memverge.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Stat-Signature: 9cyxsga1asti6ku8xkdx1r65ntf4ouer X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 33A5540003 X-HE-Tag: 1700687559-771872 X-HE-Meta: U2FsdGVkX1/M4ryVGyaLg8gSv6NmKkh1xM2ZuuwQkawLsE/6JxXF88MeFJVlTHZHsZ8H55YTYZRFYj5U01bZ12DaeWztxvT2CSQHgE4fNtUDLRvgJhujWd6IZ30NtWegO93M2UgcVndLoCcoxOWmp0oCTb6I38xkGLJpaYkHPugQfNXrzJYO4dw1i12JQBALG34DerQHzB6XEaf+kQ45fnSSHSAr4djm3Xph2iM9yYABvvOUIBpL9dCtkgiZ3KO7rPo0pbkI3YsHjUS8fFt+5RPE59i7+q5kWYPn9En6B4dFwjBViqiFJPVpVnzmsMA6erUUlDXuKwDhitCzilsrSrVd2R/7qqPHKgEMq36W5R8oCe1nRgxveuCn9JQP2G27NLmGq0QG9Hy9a4CKxGvdo+fhRFy0TVjt5g0lUtbnPR4PigQVdQbWcq6FADOv7dpU6PxwoA4c1dsONyZEZ3emI35DzgswTLmPRJqo6Bjjr5PBl/zPbj5NvPhzRPRhYFKrsCCyd0aUreqBas8ldlmHGwZ+zEjIGLQ5l3VzEp7/rvByZcigGqoRmG8R7Xi93xOUf8/OfsYIlyU4VxNP8o2w1PryABc8fv6tQG44ZlGojM8nkKwKH9RvKt/nM8E1lOV69GK8iWC7HbWA+teFUmDvSdArj0hNpCkeIHIwH6RqizAT8MoZlQVlKjrmaPeKhNMXQK/vLOs3XzTPszPNQED39cIstklsdXw3ErsIELsBkYmTFnc6WUmp30BYfy8Kn6GdFdvLncpExM/HH0PfsikQNZRQ1o4G2mn5iPQNsVDvtcZByBN4xGOnL1aJGMmIL3phpVfnv5TzDSfZPJKzKPGkGu+CJgZaJZNcqIIu9ygz+X13GQueoY16y9ei4BBobMgRwOshpog6mt1Opj9gfK4fYn6EQzZP2J28vHxary8azRz5TXZXJKXWBi4GrHsV+1SDTCl5ImvuEYePRowpcAn MdT6KLwd FN7UgAbuozuB/hWi61SLUl16T/1IxCwfZlFaLFOWY0zOAxn0hUGiPJ5t8Mxfcqgxt0pKKdDLCyUsO0A3e0n5sT6SSdalA2r6BBHe2IyZ6lPla0lYWJB/VkiTODTyZ6+wUbv8lBJB3dZSE2AvSHclv7nOzlUBKEnzfdFgE1VTrq1QMTcynv3WOxdtuzbW3KkEFf5Ou3yWyJXwCtasSXA5wY6m6Uc30hWwTXYSsNve0ZzFGrPwlhlfsL9idtlMg30VdK5cp9wWAlbxhHacILeKE7dL50enEil9JO6lzr7A47rLDKgeQrPKbeyVYZEg00mbKC0RMK6RHG8GmYVZcPgOk6n9I7y5l+5zG/Yg1ZoAqTJG0vnWt23CKiJ4aCpZ2XjLwMIUmjIduBgn2CcrbKgiO1PHYHcECUYflJIenCSlYxEzkKR6ZG2R1FTNHxEN47+t4BS4mI2qhKZmUYq5AEdminp1s2zSNwwtzstVeRayy8D4hDjLcUG6Y8zQShHTD7SY3mbUJMwzRBdXo5+04ZRaNYV3+TQ== 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: Expose mempolicy via procfs, and utilize the existing mpol_parse_str format to allow external tasks to change the policies of another task. mpol_parse_str format: [=][:] valid settings: "prefer" (without a nodemask, aliases to 'local') "prefer:node" "interleave:nodelist" "local" "default" "prefer (many):nodelist" "bind:nodelist" flags are either "=static" or "=relative", and cannot be used with "prefer" or "local" ("prefer=flag:nodelist" is valid). Signed-off-by: Gregory Price --- fs/proc/Makefile | 1 + fs/proc/base.c | 1 + fs/proc/internal.h | 1 + fs/proc/mempolicy.c | 117 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 fs/proc/mempolicy.c diff --git a/fs/proc/Makefile b/fs/proc/Makefile index bd08616ed8ba..272d22d9022f 100644 --- a/fs/proc/Makefile +++ b/fs/proc/Makefile @@ -27,6 +27,7 @@ proc-y += softirqs.o proc-y += namespaces.o proc-y += self.o proc-y += thread_self.o +proc-y += mempolicy.o proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o proc-$(CONFIG_NET) += proc_net.o proc-$(CONFIG_PROC_KCORE) += kcore.o diff --git a/fs/proc/base.c b/fs/proc/base.c index dd31e3b6bf77..3eb3d6d81a8e 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -3279,6 +3279,7 @@ static const struct pid_entry tgid_base_stuff[] = { REG("maps", S_IRUGO, proc_pid_maps_operations), #ifdef CONFIG_NUMA REG("numa_maps", S_IRUGO, proc_pid_numa_maps_operations), + REG("mempolicy", S_IRUSR|S_IWUSR, proc_mempolicy_operations), #endif REG("mem", S_IRUSR|S_IWUSR, proc_mem_operations), LNK("cwd", proc_cwd_link), diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 9a8f32f21ff5..e8e81629a8d8 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -303,6 +303,7 @@ extern const struct file_operations proc_pid_smaps_operations; extern const struct file_operations proc_pid_smaps_rollup_operations; extern const struct file_operations proc_clear_refs_operations; extern const struct file_operations proc_pagemap_operations; +extern const struct file_operations proc_mempolicy_operations; extern unsigned long task_vsize(struct mm_struct *); extern unsigned long task_statm(struct mm_struct *, diff --git a/fs/proc/mempolicy.c b/fs/proc/mempolicy.c new file mode 100644 index 000000000000..417c2c8046d9 --- /dev/null +++ b/fs/proc/mempolicy.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-2.0 +#ifdef CONFIG_NUMA +#include +#include +#include +#include +#include +#include + +#include "internal.h" + +#define MPOL_STR_SIZE 4096 +static ssize_t mempolicy_read_proc(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +{ + struct task_struct *task; + struct mempolicy *policy; + char *buffer; + ssize_t rv = 0; + size_t outlen; + + buffer = kzalloc(MPOL_STR_SIZE, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + + task = get_proc_task(file_inode(file)); + if (!task) { + rv = -ESRCH; + goto freebuf; + } + + task_lock(task); + policy = get_task_policy(task); + mpol_get(policy); + task_unlock(task); + + if (!policy) + goto out; + + mpol_to_str(buffer, MPOL_STR_SIZE, policy); + + buffer[MPOL_STR_SIZE-1] = '\0'; + outlen = strlen(buffer); + if (outlen < MPOL_STR_SIZE - 1) { + buffer[outlen] = '\n'; + buffer[outlen + 1] = '\0'; + outlen++; + } + rv = simple_read_from_buffer(buf, count, ppos, buffer, outlen); + mpol_put(policy); +out: + put_task_struct(task); +freebuf: + kfree(buffer); + return rv; +} + +static ssize_t mempolicy_write_proc(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + struct task_struct *task; + struct mempolicy *new_policy = NULL; + char *mempolicy_str, *nl; + nodemask_t nodes; + int err; + + mempolicy_str = kmalloc(count + 1, GFP_KERNEL); + if (!mempolicy_str) + return -ENOMEM; + + if (copy_from_user(mempolicy_str, buf, count)) { + kfree(mempolicy_str); + return -EFAULT; + } + mempolicy_str[count] = '\0'; + + /* strip new line characters for simplicity of handling by parser */ + nl = strchr(mempolicy_str, '\n'); + if (nl) + *nl = '\0'; + nl = strchr(mempolicy_str, '\r'); + if (nl) + *nl = '\0'; + + err = mpol_parse_str(mempolicy_str, &new_policy); + if (err) { + kfree(mempolicy_str); + return err; + } + + /* If no error and no policy, it was 'default', clear node list */ + if (new_policy) + nodes = new_policy->nodes; + else + nodes_clear(nodes); + + task = get_proc_task(file_inode(file)); + if (!task) { + mpol_put(new_policy); + kfree(mempolicy_str); + return -ESRCH; + } + + err = replace_mempolicy(task, new_policy, &nodes); + + put_task_struct(task); + kfree(mempolicy_str); + + return err ? err : count; +} + +const struct file_operations proc_mempolicy_operations = { + .read = mempolicy_read_proc, + .write = mempolicy_write_proc, + .llseek = noop_llseek, +}; +#endif /* CONFIG_NUMA */ -- 2.39.1