From patchwork Mon Jan 23 17:37:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roesch X-Patchwork-Id: 47299 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp1744503wrn; Mon, 23 Jan 2023 10:07:35 -0800 (PST) X-Google-Smtp-Source: AMrXdXsWKuVtR6wg+RMyN6ZSLeq0Y8fomy9ENPa4jE0XthH5jiPqTlHxiOKkD3muv/9P+OAp+X/t X-Received: by 2002:a17:902:c943:b0:195:f071:900 with SMTP id i3-20020a170902c94300b00195f0710900mr14617553pla.42.1674497255105; Mon, 23 Jan 2023 10:07:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674497255; cv=none; d=google.com; s=arc-20160816; b=kV7ZNtTm99xjnDJD5IEaSia2XBfIi9zuxrbPd+Oq1e8gR2L48mepfe6xjA3wZM43t3 wVLwP+4eXFsbjRK056qiqGAYhXHJNb9Y/mP3V75Kg/WS42Rx7u9BYDziB7gxjKR92Xi/ HRhEyEfGzopYLEAQxAAz+MEyVlNubVJWBb2qnQ4RSO7Noi350YWJ4VOHz1ucsPtt7FwL lXyqhojpOVxLvOk0/Dzc3nAQ2rF+VPKR2LS6nzzpCPPjGDllS6ppXr//Jst12bwMK6nb XICny4B5+7qljoAkTzTIXx7uBoqWZqDwo7hASZJHPkDfJc9QNAXgMPMO6PFRzPBOGTX7 4wNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=/hifLxhpa0/uSr3tT88zM9tTa9s6CvyvsChFXbISRug=; b=JQtw0JjP7dTw4IyJ3SS1hE+Ekq1hCGaxPprYlVho9qNwWZ8WFifIKRZecdh1GInlWT oonYWhSJnqZCY0rUn3VQoI2R+3WnSsGcnHSDiHiMyym62lpE+xR1NN3D/ooyUFepn5xE rx0UUQUITlJMrilEC/amPzneJgeXi6R/5JQbXBo9oFcWffP5dMNwkMiZWqfGzqwYqfLn hBJfJyMaqKaFEf3OKS8e0ZjJ+9doefUe+Gi0LXxfvmA+fR49J+ACzmtRNCgH9xgXYN0B GNyKGEZsqt85hx2C95kOszIfhqaiTeXcI5TbsgZ8+IKjoAXmtKb0/UmV1ZKNkValmQEU kJ2w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o16-20020a170902779000b00194d5ec9bfbsi638993pll.439.2023.01.23.10.07.22; Mon, 23 Jan 2023 10:07:35 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233431AbjAWSDQ (ORCPT + 99 others); Mon, 23 Jan 2023 13:03:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42110 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233483AbjAWSDN (ORCPT ); Mon, 23 Jan 2023 13:03:13 -0500 Received: from 66-220-144-178.mail-mxout.facebook.com (66-220-144-178.mail-mxout.facebook.com [66.220.144.178]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 987E4113E4 for ; Mon, 23 Jan 2023 10:03:11 -0800 (PST) Received: by dev0134.prn3.facebook.com (Postfix, from userid 425415) id 4EC195616BD9; Mon, 23 Jan 2023 09:37:56 -0800 (PST) From: Stefan Roesch To: linux-mm@kvack.org Cc: shr@devkernel.io, linux-doc@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [RESEND RFC PATCH v1 04/20] mm: invoke madvise for all vmas in scan_get_next_rmap_item Date: Mon, 23 Jan 2023 09:37:32 -0800 Message-Id: <20230123173748.1734238-5-shr@devkernel.io> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230123173748.1734238-1-shr@devkernel.io> References: <20230123173748.1734238-1-shr@devkernel.io> MIME-Version: 1.0 X-Spam-Status: No, score=2.4 required=5.0 tests=BAYES_00,RDNS_DYNAMIC, SPF_HELO_PASS,SPF_NEUTRAL,SUSPICIOUS_RECIPS,TVD_RCVD_IP autolearn=no autolearn_force=no version=3.4.6 X-Spam-Level: ** X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755837633695262685?= X-GMAIL-MSGID: =?utf-8?q?1755837633695262685?= If the new flag MMF_VM_MERGE_ANY has been set for a process, iterate over all the vmas and enable ksm if possible. For the vmas that can be ksm enabled this is only done once. Signed-off-by: Stefan Roesch --- mm/ksm.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/mm/ksm.c b/mm/ksm.c index 83796328574c..967eda719fab 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -1013,6 +1013,7 @@ static int unmerge_and_remove_all_rmap_items(void) mm_slot_free(mm_slot_cache, mm_slot); clear_bit(MMF_VM_MERGEABLE, &mm->flags); + clear_bit(MMF_VM_MERGE_ANY, &mm->flags); mmdrop(mm); } else spin_unlock(&ksm_mmlist_lock); @@ -2243,6 +2244,17 @@ static struct ksm_rmap_item *get_next_rmap_item(struct ksm_mm_slot *mm_slot, return rmap_item; } +static bool vma_ksm_mergeable(struct vm_area_struct *vma) +{ + if (vma->vm_flags & VM_MERGEABLE) + return true; + + if (test_bit(MMF_VM_MERGE_ANY, &vma->vm_mm->flags)) + return true; + + return false; +} + static struct ksm_rmap_item *scan_get_next_rmap_item(struct page **page) { struct mm_struct *mm; @@ -2319,8 +2331,20 @@ static struct ksm_rmap_item *scan_get_next_rmap_item(struct page **page) goto no_vmas; for_each_vma(vmi, vma) { - if (!(vma->vm_flags & VM_MERGEABLE)) + if (!vma_ksm_mergeable(vma)) continue; + if (!(vma->vm_flags & VM_MERGEABLE)) { + unsigned long flags = vma->vm_flags; + + /* madvise failed, use next vma */ + if (ksm_madvise(vma, vma->vm_start, vma->vm_end, MADV_MERGEABLE, &flags)) + continue; + /* vma, not supported as being mergeable */ + if (!(flags & VM_MERGEABLE)) + continue; + + vma->vm_flags = flags; + } if (ksm_scan.address < vma->vm_start) ksm_scan.address = vma->vm_start; if (!vma->anon_vma) @@ -2389,6 +2413,7 @@ static struct ksm_rmap_item *scan_get_next_rmap_item(struct page **page) mm_slot_free(mm_slot_cache, mm_slot); clear_bit(MMF_VM_MERGEABLE, &mm->flags); + clear_bit(MMF_VM_MERGE_ANY, &mm->flags); mmap_read_unlock(mm); mmdrop(mm); } else {