From patchwork Wed Mar 19 19:30:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Raghavendra K T X-Patchwork-Id: 14023078 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 C98FDC35FFA for ; Wed, 19 Mar 2025 19:32:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E1C4C280017; Wed, 19 Mar 2025 15:32:49 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id DA472280010; Wed, 19 Mar 2025 15:32:49 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BAB41280017; Wed, 19 Mar 2025 15:32:49 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 9842A280010 for ; Wed, 19 Mar 2025 15:32:49 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id A450B1A04F2 for ; Wed, 19 Mar 2025 19:32:50 +0000 (UTC) X-FDA: 83239298100.30.7823841 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2067.outbound.protection.outlook.com [40.107.223.67]) by imf23.hostedemail.com (Postfix) with ESMTP id A4FB0140007 for ; Wed, 19 Mar 2025 19:32:47 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=amd.com header.s=selector1 header.b=228ZUA6S; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf23.hostedemail.com: domain of Raghavendra.KodsaraThimmappa@amd.com designates 40.107.223.67 as permitted sender) smtp.mailfrom=Raghavendra.KodsaraThimmappa@amd.com; dmarc=pass (policy=quarantine) header.from=amd.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742412767; 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-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=yMVd8QbmmNVnERYroypm9kZTSC/0smb5CRgcSN7QW8I=; b=ZWIjFuIGoZRYem3a/ywiywb8oi2CbP0wqJWD290Hi9ddofnw5j/7xvZ6sJhxvddmQjPUjX Y/jAThvMqs75G0cFaAqILu/OsSrNwCDV+zZnqN4xcLNUGtCnXhDj2P6OHc1mrRdDzuds4Q 0HTP1NesWKK02yChw5yr1gZc/w2KTfs= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742412767; a=rsa-sha256; cv=pass; b=EwnjPRVXG/X1oBa27xSjYr7aDEfYvp5AC/UY7hM7euqRqcIrypXV8NB2APYB3U07jOrkI9 8scaDs86EJhd65shQkLr84A9eY6Ynfuivj3q2zPnJk6La0vOEJlh228XNq1VGgrb45MNHn e+QwFLKf0Vvs1Jr+8rhz8cG6E8+t7vQ= ARC-Authentication-Results: i=2; imf23.hostedemail.com; dkim=pass header.d=amd.com header.s=selector1 header.b=228ZUA6S; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf23.hostedemail.com: domain of Raghavendra.KodsaraThimmappa@amd.com designates 40.107.223.67 as permitted sender) smtp.mailfrom=Raghavendra.KodsaraThimmappa@amd.com; dmarc=pass (policy=quarantine) header.from=amd.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tYjFmh+W2io2rjBHEVxDI9GaaUKZOfDf5MVJ6g/AcjxXkmJ6xKEV05al1ShoP8XYOuHv6t1atVPULsXy50t0RL7ZWpwZmyAi+XrlH+xkd4yVZXOHYF9RzdjMyqTjfG4GrN1ra4Df36Nyhi0k/TYVQAL8GxC46j97IB0NELdxpIMD9JHD7VWYn2jGJEsnuIjcb2BSJ01AzfLWlDBNoDGnM+VgDXUnG4M5AxB7/nKb2ODYBEEpQR9CB7uc3aWTWDw7OJoQjBH3lXR34llP1krMm2kfxq/c3Wm+vPyBWjeS5s7+mW5m7SkqCdPMvNdKtHWPcbKWGmylKaXOe1nJ2pZQLg== 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=yMVd8QbmmNVnERYroypm9kZTSC/0smb5CRgcSN7QW8I=; b=gnNADV4GF1XTZncC167hF97yk+H3xBi8RipuLK3gJIReuRJ2+BmiewoFT09r92uAJB+VTR2rWArbOJJ/kFnt/SZhsv3P290XZ3nvpQ+igHYznKvL/eeQQDXWN6p6TIrJfgYzVaKHKM2C/0hscytaTuRs9D4TyhlW3XdE2Suw9qXnxZNR1zH3ZKRx5lnHaXzErFG9twqeDGcYdI4jI+Y5R/7fiyziCdC/4kJNW+eXamfqUKSJtehlJd3Zc2v3/mF0t73yzGdNNrId7AbEGOH8n1iWzQlqFEZLo7bcrE54SHrSwO01Zk7wcO2dv+iFEZ114jHKgigSf7i9mHKNQBhTNw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=arm.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=yMVd8QbmmNVnERYroypm9kZTSC/0smb5CRgcSN7QW8I=; b=228ZUA6SiY0sEEmsrKpVoGHg1E07YX7wiZa+7UpI2obR3Buce0snpVjCd3v84qJ6VtklMC/BT8jokyFhM7uV/nvv5hgM97XdFciEa3cxSpXSf22L3MIaQ6miIDmidmgzoAC/W8GP2uxgFTmNLW2JqTnNoEtVi4kynjR3uCuAbIE= Received: from SA9PR10CA0001.namprd10.prod.outlook.com (2603:10b6:806:a7::6) by LV8PR12MB9229.namprd12.prod.outlook.com (2603:10b6:408:191::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Wed, 19 Mar 2025 19:32:42 +0000 Received: from SN1PEPF0002636E.namprd02.prod.outlook.com (2603:10b6:806:a7:cafe::96) by SA9PR10CA0001.outlook.office365.com (2603:10b6:806:a7::6) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8534.34 via Frontend Transport; Wed, 19 Mar 2025 19:32: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 SN1PEPF0002636E.mail.protection.outlook.com (10.167.241.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.8534.20 via Frontend Transport; Wed, 19 Mar 2025 19:32:41 +0000 Received: from tunga.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, 19 Mar 2025 14:32:31 -0500 From: Raghavendra K T To: CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [RFC PATCH V1 10/13] sysfs: Add sysfs support to tune scanning Date: Wed, 19 Mar 2025 19:30:25 +0000 Message-ID: <20250319193028.29514-11-raghavendra.kt@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250319193028.29514-1-raghavendra.kt@amd.com> References: <20250319193028.29514-1-raghavendra.kt@amd.com> MIME-Version: 1.0 X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF0002636E:EE_|LV8PR12MB9229:EE_ X-MS-Office365-Filtering-Correlation-Id: 7c35ec17-c9d3-4ec8-20f0-08dd671cd0ab X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|82310400026|1800799024|376014|36860700013; X-Microsoft-Antispam-Message-Info: d9gCgkgz0Dqnk0NRtvaDMsDCHBlj6IEcm7cax/yWMTCEsoCu86Vq787p/SyYH9CAFSe5TGdhbkVGkygkaDjqmRgVUq6r0DxQtR3wRziWS9tLzBwn5IMJtch6AL2gWrRkFBY+isXKvoIS1uLLzHU3lz53KAs1ShGMCiiHnr6g+Z2JL3dLm0HmRNrHqcaH94C1nnizTPb+icT8kXE/xg1VQjWiJpDQBHTnF8zEag2kJaw4zfN5nUsTpmziatkA/+a/F5STen8AmqSSMtJuH5Nbku0oipS5ojGcc6F+jeHXd+tZy323i0zPBIzGBMz7Ojaf+ViCa7OV4Y9pN4CJG3JWk0SyLB1bqDdV8XhTm1WsG6C7wIGoJlvYIcyIhLPjZZB8erl/g3P888/gi4nprRnJRmVpzqpaNsBB+DbnaxPjAyOoTcr3s7fjmlXO0eHZHRFqRzVCw4qle4MVVaDKEnY3S68ZhFs9irmp0Uhq6btt+pccqSpqPTaFuNHppEIBKdHckgHZdLPimGUO2sfdGunX5IgZVRqVL0XlPqcdGwkXV2tKbvL+MEkdWscgPXfRlEX4IH1n+xV/xpY5m26UAsyUnn8pz187+pmSTKb5T6uCcbcHes2Ly4hzhxva4vwbfbP3gMo1rEKaMVz1L2dRFjZuqX/x6a+RVCqvmQlQK1gIjckjkt5w5XjGIEFJSSioLA75ucFTGKgpwwgpCCuOMFhGUjATw6vpUPgsfoKTVz6ea7xR6v4eBGb7njXiKX4wYlMlU+Gk/COBRUfOMEvk/faY4gC2MHPzfXzuAT6RTrQQzNxAQ+vYyoV45CezyEtYRtwhfckgOr/Q9pAypYJOYdYZdiW6wRVDDUrh/B6F9a4BpUso+sTwWpFXU1RQFQg7SOJD6htqxEfcmwllM3DqaWsTiRfwArNnUNV00VuD5Szzzwlkoo9lIRv2FCAtxgiz76PabMmvUxt8Ed6cX1eDX6c9Ic9L0B0QAbo7z8cRvtpykXlPYIGif4cOZZjgiXuud4y07eTxcjHbkz7+4soKAyiQjQXYjbjZUvJdx/zqotc1RtHIYVDDjnAc5vH/Cau842QSHVcnDhEvRJD+OexsjKv10DpU0bDBzA9miK4tKFlbZu2YFWHVPu+RUpgOLySBOdpVBlk5BCZIeCVaDwv8Rsmzt3dSy5HSgDlHXBzj6GLoa8ln9hZpdlKNX3eVvj18dnfIDbc+eIj7HIeXujRpJaaXd8iEs+FxibM+XWTMe7ZQkIZjFvNt0Kn18eougjJH0gkMh6ebIkDf97wssyhibTdcBJ8w75s1wlqp93PorKToyZQKqtpPlMSgv1A7pxYXx9XD8nybc96J+MkdkJtOSHxYnR4FfzBuFUMLgseufochu8clfuqOBtMHNqPRAGJbkEZDgT4ELy6BcYa5Rfgq2VHvIqdvNxIKenmZFratRa/lJyx8mUqYi16mnwe48ExXM5Qi64FVy3GquY+rMcHg6/urkA== 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)(7416014)(82310400026)(1800799024)(376014)(36860700013);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Mar 2025 19:32:41.3162 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7c35ec17-c9d3-4ec8-20f0-08dd671cd0ab 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: SN1PEPF0002636E.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV8PR12MB9229 X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: A4FB0140007 X-Stat-Signature: pw7scz9jc473zkq3zfrq9qj4xe9etuf4 X-HE-Tag: 1742412767-907123 X-HE-Meta: U2FsdGVkX1/FvA/7lhIyz7O/Xk0nN8NJrx2q+OSJ/P9qB7psUY4FMiOFp0zyVNJVQIeqOruNKWhf15Vy4XKY2j5umZf8ZaR4pFeJJT64ZvJ58N06HEDQIpvbpAWpoMYyMtd3KHHTTVSdn+r4PBCg1SQj5PfLxS6dZM1iVdlZUyx4lVVaWX6VkfWKX21B9BpzfisRCd6O/7JIfL9B3WhKMU667XDyB4uwBXEwuHoO/T29xghFfwm9k95qkjfHF1TAauD6BGiibVCgNDZtFcCIW8Rw4DePVstFyu0vdryZjtswo2eXgrOxpUT9z+Vmkd/fHO8XBfhJESid4iQuD9CTVwYV7/eL+O0eP35Cvn4p/VeOFBuUi/tGoB4bTPUrhCaO0JEY3KAFohutfqi1ztgPLIrSKFltgKre8QT+iF6Vw2y/ycPSgEn77kzsZ7UbGHnMRZDGqhR8nSoba+bxSPO0CLs/mm2jdQ62uk3CZ+TpJ0ZknmuixEvAwh/RsvlY2PIsyWyM1Xv4zxHTgEeIye25D/7yNSFsFCuykQaKVrB00dHmTz4zKXhSj+VO7HiwBJ3eVczlLMR9PC0PDx9aihM4/0OIIcszgFlGZYXteWUoqEVmt+l2WZYY2+13OlgA0fF1R1o14pFtxV8Lnzmz6qfzJlwh2VE7e+968cNg+J+1vW9UKe+K+UpbvHo1bMW15/Nx4Wcuu+4mmF0zqnev1ZsNGhzSKm9jOfsXElas1dYBa/NCuhLsEMtD1LU71WWHtAn+UTDskC+uO7rI3ecKJstx3fKd45OV4uSBHK2Jj0qIW5AHsK4VF2ORDsyY196jJ82aWGlOUhoZTQBnQpF5oqX5eE2emZ69f7Iy5wZ25GhS86d4A84PsMJNSdpHRToay02lC8fOtTZJy7KxsTK0nPyHHI2ySzi3NpO1BCJqc/abnPHqwqh18qfwiAATSO+Y5eoMuZ9U6KEFUxvoMe17GDy ZVUJZkTh JDl7n60A95fcs1VLgCUzI5USFNvI3S0S+GOAPdtz/fbZ7IVJ0wcsv4oA67Ho5jNoNcceoXLBaBMQ4MjI1yldGmkXik/0eivcXQA2w1BUwKaO/kX33DLyAIE8wuUqS9/gQJ6FWt3CkmBmpD5GlTrA2y+pCME/c+GOzh5E51DwWxbVK9SGrGa2jOaS+S7UJouVdvf9ghaw+3UCa5DsLpfXMdrrbXuFcDuMu+jaAysznUOsxXsWaKgmfDL/NLrzyVprndH1mX+IWajN9W37YtA3+RJwcoSiKcgBokgrBnEAlqd1BQHlfu4HIvp8M21t6eCcP2dgVHzl6kHGXGZcFsXjGOlVMxnPJ4OFPm51tv0UDwQc3+l4nNSvrIzpg8Nhg0koBKFenfb8SJY8Y+UlFx02mcUCp3Y8bnSPWbLLIAXe6uizuONBBGSUAoHtik0g3GzUKbJzaOBnmStaBxYK7oUmazz1mydkVvhynG8L2q8TJUi+h7hHZvon79wTuazlA8td0nPia2Mc6otJHjzE6pGDs58yeVY0rRFCUoyKqgf3+8lC4EB18wSyKkJhVXtTkmoH51OGI1LUJ6tj5/tKLEb4TSYI0gQV7nixuc69Pc79F68twhzTqwl3iB02D96aXXbY/S77RTGpPPan9IWzGgivp86CHr5gOpERfiYBoi6iAux3GdmYWbe6+6Ot741tX0fmc2J1s10zI1zZ/SQsHVR6CHqPg2CWBQWc/gppNoMJQxFkCGD4kOQTbTqkhxXytb5mVKzkU 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: Support below tunables: scan_enable: turn on or turn off mm_struct scanning scan_period: initial scan_period (default: 2sec) scan_sleep_ms: sleep time between two successive round of scanning and migration. mms_to_scan: total mm_struct to scan before taking a pause. target_node: default regular node to which migration of accessed pages is done (this is only fall back mechnism, otherwise target_node heuristic is used). Signed-off-by: Raghavendra K T --- mm/kmmscand.c | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) diff --git a/mm/kmmscand.c b/mm/kmmscand.c index c2924b2e8a6d..618594d7c148 100644 --- a/mm/kmmscand.c +++ b/mm/kmmscand.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include "internal.h" @@ -158,6 +159,170 @@ static bool kmmscand_eligible_srcnid(int nid) return false; } +#ifdef CONFIG_SYSFS +static ssize_t scan_sleep_ms_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%u\n", kmmscand_scan_sleep_ms); +} + +static ssize_t scan_sleep_ms_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + unsigned int msecs; + int err; + + err = kstrtouint(buf, 10, &msecs); + if (err) + return -EINVAL; + + kmmscand_scan_sleep_ms = msecs; + kmmscand_sleep_expire = 0; + wake_up_interruptible(&kmmscand_wait); + + return count; +} +static struct kobj_attribute scan_sleep_ms_attr = + __ATTR_RW(scan_sleep_ms); + +static ssize_t mm_scan_period_ms_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%u\n", kmmscand_mm_scan_period_ms); +} + +/* If a value less than MIN or greater than MAX asked for store value is clamped */ +static ssize_t mm_scan_period_ms_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + unsigned int msecs, stored_msecs; + int err; + + err = kstrtouint(buf, 10, &msecs); + if (err) + return -EINVAL; + + stored_msecs = clamp(msecs, KMMSCAND_SCAN_PERIOD_MIN, KMMSCAND_SCAN_PERIOD_MAX); + + kmmscand_mm_scan_period_ms = stored_msecs; + kmmscand_sleep_expire = 0; + wake_up_interruptible(&kmmscand_wait); + + return count; +} + +static struct kobj_attribute mm_scan_period_ms_attr = + __ATTR_RW(mm_scan_period_ms); + +static ssize_t mms_to_scan_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%lu\n", kmmscand_mms_to_scan); +} + +static ssize_t mms_to_scan_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + unsigned long val; + int err; + + err = kstrtoul(buf, 10, &val); + if (err) + return -EINVAL; + + kmmscand_mms_to_scan = val; + kmmscand_sleep_expire = 0; + wake_up_interruptible(&kmmscand_wait); + + return count; +} + +static struct kobj_attribute mms_to_scan_attr = + __ATTR_RW(mms_to_scan); + +static ssize_t scan_enabled_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%u\n", kmmscand_scan_enabled ? 1 : 0); +} + +static ssize_t scan_enabled_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + unsigned int val; + int err; + + err = kstrtouint(buf, 10, &val); + if (err || val > 1) + return -EINVAL; + + if (val) { + kmmscand_scan_enabled = true; + need_wakeup = true; + } else + kmmscand_scan_enabled = false; + + kmmscand_sleep_expire = 0; + wake_up_interruptible(&kmmscand_wait); + + return count; +} + +static struct kobj_attribute scan_enabled_attr = + __ATTR_RW(scan_enabled); + +static ssize_t target_node_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%u\n", kmmscand_target_node); +} + +static ssize_t target_node_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + int err, node; + + err = kstrtoint(buf, 10, &node); + if (err) + return -EINVAL; + + kmmscand_sleep_expire = 0; + if (!node_is_toptier(node)) + return -EINVAL; + + kmmscand_target_node = node; + wake_up_interruptible(&kmmscand_wait); + + return count; +} +static struct kobj_attribute target_node_attr = + __ATTR_RW(target_node); + +static struct attribute *kmmscand_attr[] = { + &scan_sleep_ms_attr.attr, + &mm_scan_period_ms_attr.attr, + &mms_to_scan_attr.attr, + &scan_enabled_attr.attr, + &target_node_attr.attr, + NULL, +}; + +struct attribute_group kmmscand_attr_group = { + .attrs = kmmscand_attr, + .name = "kmmscand", +}; +#endif + static int kmmscand_has_work(void) { return !list_empty(&kmmscand_scan.mm_head); @@ -1036,9 +1201,43 @@ static int kmmscand(void *none) return 0; } +#ifdef CONFIG_SYSFS +extern struct kobject *mm_kobj; +static int __init kmmscand_init_sysfs(struct kobject **kobj) +{ + int err; + + err = sysfs_create_group(*kobj, &kmmscand_attr_group); + if (err) { + pr_err("failed to register kmmscand group\n"); + goto err_kmmscand_attr; + } + + return 0; + +err_kmmscand_attr: + sysfs_remove_group(*kobj, &kmmscand_attr_group); + return err; +} + +static void __init kmmscand_exit_sysfs(struct kobject *kobj) +{ + sysfs_remove_group(kobj, &kmmscand_attr_group); +} +#else +static inline int __init kmmscand_init_sysfs(struct kobject **kobj) +{ + return 0; +} +static inline void __init kmmscand_exit_sysfs(struct kobject *kobj) +{ +} +#endif + static inline void kmmscand_destroy(void) { kmem_cache_destroy(kmmscand_slot_cache); + kmmscand_exit_sysfs(mm_kobj); } void __kmmscand_enter(struct mm_struct *mm) @@ -1223,7 +1422,13 @@ static int __init kmmscand_init(void) return -ENOMEM; } + err = kmmscand_init_sysfs(&mm_kobj); + + if (err) + goto err_init_sysfs; + init_list(); + err = start_kmmscand(); if (err) goto err_kmmscand; @@ -1239,6 +1444,7 @@ static int __init kmmscand_init(void) err_kmmscand: stop_kmmscand(); +err_init_sysfs: kmmscand_destroy(); return err;