From patchwork Fri Mar 21 17:37:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sourav Panda X-Patchwork-Id: 14025838 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 70882C36005 for ; Fri, 21 Mar 2025 17:37:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 49E1E280007; Fri, 21 Mar 2025 13:37:43 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4269D280001; Fri, 21 Mar 2025 13:37:43 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 22E65280007; Fri, 21 Mar 2025 13:37:43 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id EBE9B280001 for ; Fri, 21 Mar 2025 13:37:42 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 45E54B78B7 for ; Fri, 21 Mar 2025 17:37:44 +0000 (UTC) X-FDA: 83246265648.16.2F6D7A6 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf15.hostedemail.com (Postfix) with ESMTP id 9DE95A001C for ; Fri, 21 Mar 2025 17:37:42 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=OCixDwp+; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf15.hostedemail.com: domain of 35aPdZwsKCOgcYebKfZKXNKQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--souravpanda.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=35aPdZwsKCOgcYebKfZKXNKQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--souravpanda.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742578662; a=rsa-sha256; cv=none; b=FGPGjcmVKA1Ch/m/Dqu3tAWYNOo9bPldIgQkTGtd7si7yo8Jo2sUwq6hiYKa7BlPSBl+UT AOlYI8N6wtOCc9v7FUhK5KVzP3DH0rRRkHpGruzoj1gvTfJ/kL5YEa/no70+lkXNWWwXml zYeZa2oxsY7A//WmUQEKRj+w/JAjq9A= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=OCixDwp+; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf15.hostedemail.com: domain of 35aPdZwsKCOgcYebKfZKXNKQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--souravpanda.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=35aPdZwsKCOgcYebKfZKXNKQYYQVO.MYWVSXeh-WWUfKMU.YbQ@flex--souravpanda.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742578662; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=oVY3EzVTKOjztz/iA3gGAorv/v23BkdoPGQ1O9sMpRg=; b=G4Wlqb0mI7UZasxBUOA1KK9DEEVwXXi0vQ5/H9rZU6tig9T3+Obp2NCTWb8EhpbAtotE3m s23hzzCakOYSAr2vue1lypAvjYd+NPLmwF+v597A7xXiva47Je5mD7Hp9eRv4MUyfuVNPC UblijESyITNiC2qb8PxM5e1WyOZF0XQ= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2242f3fd213so32636325ad.1 for ; Fri, 21 Mar 2025 10:37:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742578661; x=1743183461; darn=kvack.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=oVY3EzVTKOjztz/iA3gGAorv/v23BkdoPGQ1O9sMpRg=; b=OCixDwp+NNI5VH21VHiTPky/Ona3oRtENWWTNUdIQjMtTQeT5uwjRk2CHK/x7Mqiux q5G2aYFTC4g+Tojgee35dCLKJVSMCplAz8QYaozl5HModd6wSG6ah43KIGP52XG1GXfi jFPuKYsfoT3V/CaYwOWYg1T9+uASytMlMobSo62/QXgJMbHSxg66lZ8BtA2gZOq1SNDz bsPUuFGX1jNpaefLKhGZ8fewiryYzXhPZwIvaIHBrd58n47czJJ+tvVfpnNqHzh1Wi9y 6alssybYjRRI4jnjVJYN2iGODPXslIG6nIpNr8dGKnFgyJx8MbHp6HpBUHs/oMOG8Dv7 sqpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742578661; x=1743183461; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=oVY3EzVTKOjztz/iA3gGAorv/v23BkdoPGQ1O9sMpRg=; b=ktjUigW6BLGhIUuz8icDWAPVAusG/UcusYH8a686oabiZrH3kG1GNy5pEVDLRJzij9 9aBQc8AXOR+0/XivHxedUsqzDDKVi01k1yMiNxhLCGhreBsfMGuFLwTrwiBaYln3kUp4 k630PJtQ7LQqUCdwAvdmKToAvFFD3A5mEs5scfMMM7esLTqDDU8pdXfTJJX3xWKXCPJM llADEavRLtpZmxvHZerbvm/IV925tARUAhTZsAYsH9LFe4xAAIbX6k//lyNvy0wyiUUA 2A14CKPPWHYPbEobzD8iWYgHxgyZwTmvwPkCrIDgTu0JIo10lxqJRT2jt58qrG0gUvSi FNBg== X-Forwarded-Encrypted: i=1; AJvYcCVQ9MwHvEWLHhulEd3sEoj7qthS5KqYwn96p245VorlwMnYQnH+lFqrw8K2rSLVqob//Mpiu1UsOQ==@kvack.org X-Gm-Message-State: AOJu0Yy3I/0//a4fSB7faK24GEeizoxMEAghuVAa6sXOGRHVgThm/onj WjCo8VR8FTGbM2ZD86CWitsACtt5Z3nJKnRepe9wpE8J+l57pqX7NYsm5lGLXMxw9VmEFZhEzyx 8blWUMI5vmTcjapGg2QNYRg== X-Google-Smtp-Source: AGHT+IF+cvqsQFV2a6Y9/WZ27WhrC22Tdz6Ik3urAFxxcSKORKZ17tAg0m4s+cXw6DmZenA0G9mdHnaddcz52VU3Tw== X-Received: from pfbdo13.prod.google.com ([2002:a05:6a00:4a0d:b0:736:a055:1ce3]) (user=souravpanda job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:218b:b0:736:7a00:e522 with SMTP id d2e1a72fcca58-7390593b7f2mr6721955b3a.2.1742578661516; Fri, 21 Mar 2025 10:37:41 -0700 (PDT) Date: Fri, 21 Mar 2025 17:37:28 +0000 In-Reply-To: <20250321173729.3175898-1-souravpanda@google.com> Mime-Version: 1.0 References: <20250321173729.3175898-1-souravpanda@google.com> X-Mailer: git-send-email 2.49.0.395.g12beb8f557-goog Message-ID: <20250321173729.3175898-6-souravpanda@google.com> Subject: [RFC PATCH 5/6] mm: trigger unmerge and remove SELECTIVE KSM partition From: Sourav Panda To: mathieu.desnoyers@efficios.com, willy@infradead.org, david@redhat.com, pasha.tatashin@soleen.com, rientjes@google.com, akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, weixugc@google.com, gthelen@google.com, souravpanda@google.com, surenb@google.com X-Rspam-User: X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 9DE95A001C X-Stat-Signature: 3nhn1fwn1y7uxspis93x3onixrd5rapx X-HE-Tag: 1742578662-709879 X-HE-Meta: U2FsdGVkX1/xLUtveuQi339cLvzvfCw5f2jFXmUhC5Ypf40RjGOZhMaZtAQvvrGSLVwIGZdTKAVpj2n/pdZl4GS56iOmVv/0Qpx6Sm1ewz+PLszPwvzAbBA37XIWcBCDDLoIkV5N+s4jCLMm/mDpqdtcyK57uxPGwXLMG8hwQ7HfPfWfEBs7Bhpm3TUnK/9g0erTGW4NtoP9hoU0GWZLIEuwS/jrhgLUU8peThX9ZQ6QVBBeMsAjSiJ/QOD3XfQc+/OPZx6gk3EBECW4+VYLIlMT9gP76C5lafxDy93y9x9rnJo9g1fP40Bq5jguHexGoG3LiAuvkbKC9HsrwiOv/xfOeruSV21CbpVGOnIQnBuJyhkXKXd5E6eK1tzyQZpfG4tnry2SgNcnnqsh3SFKFgpHlbqSkCep0de1ivkXPTaCJ7ygIS/iX2nmlOpJp94GWD8fDbClkj9H2TEBbPvAX9kuFgMY/qgRE7QN5PptI8/2t96XfEgs/7Z03FmDbUU/OSyWHNIHW3rLS3bz7IgoL+RcHzvqt1Zh3PqWdhCunMsAnC5RE3hNIu7xkAV3UVxVQjXJrBl1EIUaobWua7uWueyoDdF43TBeXKKygbRve0hzRsot3kqPl8HZHTlAA9r3oVoSxyItN/QYUCFg1wg4HGavaGLEMZZltiPS9B6qiyi2CPPKMehLhFTJsHkqdGWzULcf3jwH4MP1w7uTki3aozcFFJ6KP8l4iNqSQNVrX/REZD8Qh6AJMbfo8zLKc9YBBzyvdq1WpSOUNe5cDnziu5W+foT7FXVbNpODq2Kvk8YAaCH2mvPNPWtkyT/0wgwb9xUbUBTR3gmoXdsPZikDVvLOOZa4pfp2VtHPCN6g7iwhhpGrwj1av1vbbBQ29lQkJ4VHl/hrbK59h+E2Fs3CBKkitFTyHydyD7HQyLN9k6rkAMIgbvJze4dfwCSAhGnRrn7gvmgKUf4+6dzNEAR cS2Ixmj/ jCdnm6Bn8m6DavJU2rn3MTJNk2SvCPY/0Hp0qZZnOJ9bWb8Hz9y4Un9+L3IuxllhZFZL2nOIIEDYZtLLIiuA2GddHFmrEBR5h2Ho0iawFVNMCJ/mx459ddrQiTjGcJkDSiMsVM/DpnVXPUgoq/FsaK2JrOjo6M8b0Ddynu7SdV+vxLpS3iIDklX9jK2okoGPudz5XM8rHue/hZajETlE8Ms/y+IVSB6zu8KD0r86s8W/9LI4hhJRxWVYWtK5Ro2mv99R6ebcAPlSjQGQYkfhbxfZgLfMoi9kj4GDNhrGw/L10Ztk= 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: Trigger unmerge or remove a partition using the following sysfs interface: Triggering an unmerge for a specific partition: echo "pid" > /sys/kernel/mm/ksm/partition_name/trigger_unmerge Removing a partition: echo "partition_to_remove" > /sys/kernel/mm/ksm/control/remove_partition Limitation of current implementation: On carrying out trigger_unmerge, we unmerge all rmap items which is wrong. We should only unmerge the rmap items that belong to the partition where we called unmerge. Another limitation is that we do not specify the address range when echoing into trigger unmerge. Intentionally left out till until we determine the implementation feasibility. Signed-off-by: Sourav Panda --- mm/ksm.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/mm/ksm.c b/mm/ksm.c index b575250aaf45..fd7626d5d8c9 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -2556,6 +2556,31 @@ static void ksm_sync_merge(struct mm_struct *mm, put_page(page); } +static void ksm_sync_unmerge(struct mm_struct *mm) +{ + struct mm_slot *slot; + struct ksm_mm_slot *mm_slot; + + struct vm_area_struct *vma; + struct vma_iterator vmi; + + slot = mm_slot_lookup(mm_slots_hash, mm); + mm_slot = container_of(slot, struct ksm_mm_slot, slot); + + ksm_scan.address = 0; + vma_iter_init(&vmi, mm, ksm_scan.address); + + mmap_read_lock(mm); + for_each_vma(vmi, vma) { + if (!(vma->vm_flags & VM_MERGEABLE) || !vma->anon_vma) + continue; + unmerge_ksm_pages(vma, vma->vm_start, vma->vm_end, false); + } + remove_trailing_rmap_items(&mm_slot->rmap_list); + + mmap_read_unlock(mm); +} + #else /* CONFIG_SELECTIVE_KSM */ /* * Calculate skip age for the ksm page age. The age determines how often @@ -3644,6 +3669,58 @@ static ssize_t trigger_merge_store(struct kobject *kobj, } KSM_ATTR(trigger_merge); +static ssize_t trigger_unmerge_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return -EINVAL; /* Not yet implemented */ +} + +static ssize_t trigger_unmerge_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + pid_t pid; + char *input, *ptr; + int ret; + struct task_struct *task; + struct mm_struct *mm; + + input = kstrdup(buf, GFP_KERNEL); + if (!input) + return -ENOMEM; + + ptr = strim(input); + ret = kstrtoint(ptr, 10, &pid); + kfree(input); + + /* Find the mm_struct */ + rcu_read_lock(); + task = find_task_by_vpid(pid); + if (!task) { + rcu_read_unlock(); + return -ESRCH; + } + + get_task_struct(task); + + rcu_read_unlock(); + mm = get_task_mm(task); + put_task_struct(task); + + if (!mm) + return -EINVAL; + + mutex_lock(&ksm_thread_mutex); + wait_while_offlining(); + ksm_sync_unmerge(mm); + mutex_unlock(&ksm_thread_mutex); + + mmput(mm); + return count; +} +KSM_ATTR(trigger_unmerge); + #ifdef CONFIG_NUMA static ssize_t merge_across_nodes_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) @@ -4044,6 +4121,7 @@ static struct attribute *ksm_attrs[] = { &pages_to_scan_attr.attr, &run_attr.attr, &trigger_merge_attr.attr, + &trigger_unmerge_attr.attr, &pages_scanned_attr.attr, &pages_shared_attr.attr, &pages_sharing_attr.attr, @@ -4156,9 +4234,51 @@ static ssize_t add_partition_store(struct kobject *kobj, static struct kobj_attribute add_kobj_attr = __ATTR(add_partition, 0220, NULL, add_partition_store); +static ssize_t remove_partition_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + struct partition_kobj *partition; + struct partition_kobj *partition_found = NULL; + char partition_name[50]; + int err = 0; + + if (sscanf(buf, "%31s", partition_name) != 1) + return -EINVAL; + + mutex_lock(&ksm_thread_mutex); + + list_for_each_entry(partition, &partition_list, list) { + if (strcmp(kobject_name(partition->kobj), partition_name) == 0) { + partition_found = partition; + break; + } + } + + if (!partition_found) { + err = -ENOENT; + goto unlock; + } + + unmerge_and_remove_all_rmap_items(); + + kobject_put(partition_found->kobj); + list_del(&partition_found->list); + kfree(partition_found->root_stable_tree); + kfree(partition_found); + +unlock: + mutex_unlock(&ksm_thread_mutex); + return err ? err : count; +} + +static struct kobj_attribute rm_kobj_attr = __ATTR(remove_partition, 0220, NULL, + remove_partition_store); + /* Array of attributes for base kobject */ static struct attribute *ksm_base_attrs[] = { &add_kobj_attr.attr, + &rm_kobj_attr.attr, NULL, /* NULL-terminated */ };