Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp399507yba; Thu, 16 May 2019 02:44:19 -0700 (PDT) X-Google-Smtp-Source: APXvYqzzzSU2CQgIkiXyyvPsvHpOI6NdfHrrp+XeOusgsrnPo1/1qdVR9quFTi5vkTH9sZVWBv38 X-Received: by 2002:a17:902:e7:: with SMTP id a94mr24520753pla.182.1557999859349; Thu, 16 May 2019 02:44:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557999859; cv=none; d=google.com; s=arc-20160816; b=pIxdIG5qq4MsAB6GycKUiymN2Mai3ymn+L+3AmzNmJWS67+Nsakm8/vfqPetedteQB BviRB4vS0TnPKL56zkz0fnSSZ03s9Qn63ydrNovfoYOLRwcI9FS/WJTJhb+Al797Hf3q mI0YoNtQN90oFrcJeM+tS2DYn2pCvdTh0Kl0Rz2OXiXZxi2toglugRRL5SGeCf2BHXHq sqxPDRkHWkvWitr4yrAHUzgyIIDklsEAQgGVRIi0FALS5JdEi36uZMKFPqJSXFtcJuqJ eTrqh3RM6W1YOIck8JZjAMGrijzrtaPs+rsRYzadOG8ILGt11GvTWgTFVnVwSdha/3Pd Ej5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=ZZGnY1AeO4vEIRNllzlClW+UmlSDLeAarYqLIOTY4ZI=; b=OFELuGmPerjVAiip5O3sZGHxZxkieHMeANCSl6Pvjb+yEcCgHe77poElYKxsuARKJc /WnB5To1qNI7qpb5lrCsaKlpFdseiCZnXTvFLp7pbONBFclOOTxjcjVYilcasWh8vN9S ZgVKObUi3KkGE01w6vLL2YFsKlYyC0WizJnOgpadp+GJbEzPQ/5t1Tw1UygKn1yFnSz5 S/ATHhHfzcSzKEC59OdC7HfdJ8pl6Eum0d2nPkej6J1WfeiebacsVCedLdCzoRkzF0Rh AjInU5YPZjRLmjb/0EhKMWTkUAlNhEN+LmE8rXsDnBAGQqyHHYYxa2V0jArvQZo9Miir EcTQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f5si4482274plt.420.2019.05.16.02.44.04; Thu, 16 May 2019 02:44:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727218AbfEPJmu (ORCPT + 99 others); Thu, 16 May 2019 05:42:50 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:34161 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727159AbfEPJmp (ORCPT ); Thu, 16 May 2019 05:42:45 -0400 Received: by mail-wm1-f66.google.com with SMTP id j187so6615739wma.1 for ; Thu, 16 May 2019 02:42:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZZGnY1AeO4vEIRNllzlClW+UmlSDLeAarYqLIOTY4ZI=; b=T4SumkTlMDJ3SSjFW8XB2Bt9lpn7ZUkT3MyJq8RNL9OneIMNtjcfT1B+/ufEP7eD4E oRb3aae/cqfetFFl0BB47kWmPg+FRFckyjsU47aU1ELf9Mz2ao+0DcSoz4e3Elr2Kdqv 8N+HTOrk4Gs0GFT67wVvXpiNWTcUm8AoLUAtF/0e8IZYmPKE0yBBoNgcXYMCxBvZ7cHd zYDhp27jrSGe0eJfSFDkJQicaMA9BwZPQCEmGajcwSa808EvUdZcUE62Dw+DXiSG4qi0 c+I2IW5DsZiviThGnlKHbieXsuvMRwwBOxrqQXDGsvwqYs0Z8aX2P4di/TMV3SPEpDFk 2D+Q== X-Gm-Message-State: APjAAAWTXB1/5syQ29wDZ0V0FttnEnqvaTkiDe//tJYjwTuShdwuzvMw EVPFX7Mb/+r54lqB7ebMXdOiqAdUULNyag== X-Received: by 2002:a7b:c8d1:: with SMTP id f17mr14149157wml.45.1557999763188; Thu, 16 May 2019 02:42:43 -0700 (PDT) Received: from localhost (nat-pool-brq-t.redhat.com. [213.175.37.10]) by smtp.gmail.com with ESMTPSA id s18sm4074000wmc.41.2019.05.16.02.42.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 16 May 2019 02:42:42 -0700 (PDT) From: Oleksandr Natalenko To: linux-kernel@vger.kernel.org Cc: Kirill Tkhai , Hugh Dickins , Alexey Dobriyan , Vlastimil Babka , Michal Hocko , Matthew Wilcox , Pavel Tatashin , Greg KH , Suren Baghdasaryan , Minchan Kim , Timofey Titovets , Aaron Tomlin , Grzegorz Halat , linux-mm@kvack.org, linux-api@vger.kernel.org Subject: [PATCH RFC 4/5] mm/ksm, proc: introduce remote merge Date: Thu, 16 May 2019 11:42:33 +0200 Message-Id: <20190516094234.9116-5-oleksandr@redhat.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190516094234.9116-1-oleksandr@redhat.com> References: <20190516094234.9116-1-oleksandr@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use previously introduced remote madvise knob to mark task's anonymous memory as mergeable. To force merging task's VMAs, "merge" hint is used: # echo merge > /proc//madvise Force unmerging is done similarly: # echo unmerge > /proc//madvise To achieve this, previously introduced ksm_madvise_*() helpers are used. Signed-off-by: Oleksandr Natalenko --- fs/proc/base.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index f69532d6b74f..6677580080ed 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -94,6 +94,8 @@ #include #include #include +#include +#include #include #include "internal.h" #include "fd.h" @@ -2960,15 +2962,63 @@ static int proc_stack_depth(struct seq_file *m, struct pid_namespace *ns, static ssize_t madvise_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { + /* For now, only KSM hints are implemented */ +#ifdef CONFIG_KSM + char buffer[PROC_NUMBUF]; + int behaviour; struct task_struct *task; + struct mm_struct *mm; + int err = 0; + struct vm_area_struct *vma; + + memset(buffer, 0, sizeof(buffer)); + if (count > sizeof(buffer) - 1) + count = sizeof(buffer) - 1; + if (copy_from_user(buffer, buf, count)) + return -EFAULT; + + if (!memcmp("merge", buffer, min(sizeof("merge")-1, count))) + behaviour = MADV_MERGEABLE; + else if (!memcmp("unmerge", buffer, min(sizeof("unmerge")-1, count))) + behaviour = MADV_UNMERGEABLE; + else + return -EINVAL; task = get_proc_task(file_inode(file)); if (!task) return -ESRCH; + mm = get_task_mm(task); + if (!mm) { + err = -EINVAL; + goto out_put_task_struct; + } + + down_write(&mm->mmap_sem); + switch (behaviour) { + case MADV_MERGEABLE: + case MADV_UNMERGEABLE: + vma = mm->mmap; + while (vma) { + if (behaviour == MADV_MERGEABLE) + ksm_madvise_merge(vma->vm_mm, vma, &vma->vm_flags); + else + ksm_madvise_unmerge(vma, vma->vm_start, vma->vm_end, &vma->vm_flags); + vma = vma->vm_next; + } + break; + } + up_write(&mm->mmap_sem); + + mmput(mm); + +out_put_task_struct: put_task_struct(task); - return count; + return err ? err : count; +#else + return -EINVAL; +#endif /* CONFIG_KSM */ } static const struct file_operations proc_madvise_operations = { -- 2.21.0