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 4FC88C77B78 for ; Tue, 18 Apr 2023 17:30:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D79988E0002; Tue, 18 Apr 2023 13:30:08 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D29338E0001; Tue, 18 Apr 2023 13:30:08 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BF17F8E0002; Tue, 18 Apr 2023 13:30:08 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id B0E6A8E0001 for ; Tue, 18 Apr 2023 13:30:08 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 760851603ED for ; Tue, 18 Apr 2023 17:30:08 +0000 (UTC) X-FDA: 80695200096.15.5309AB7 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) by imf05.hostedemail.com (Postfix) with ESMTP id 9142E100009 for ; Tue, 18 Apr 2023 17:30:06 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=G9HWkOlA; spf=pass (imf05.hostedemail.com: domain of 3ndM-ZAQKCGgLbJRMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--fvdl.bounces.google.com designates 209.85.210.202 as permitted sender) smtp.mailfrom=3ndM-ZAQKCGgLbJRMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--fvdl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1681839006; 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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=PlOlbguZJLrNwmoIaPL1ifiEMFL+mnPjJo6jiLeiwy0=; b=b8n5nRrqVV4yv7u2hf54d0Wz0FUNyTOTpv5CAJXEm9+gixAtGodHuoev9dkONd3fIQKpAp /ok5CeFOScCJrGqZMUeW7Rff0ppWvCR4gjj6/LYqffjiNiv686cmYV9Vhfp7Eca/ctoEa6 zDnXnyb3NzjWQ22b7ueutu6XlvB5OTM= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=G9HWkOlA; spf=pass (imf05.hostedemail.com: domain of 3ndM-ZAQKCGgLbJRMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--fvdl.bounces.google.com designates 209.85.210.202 as permitted sender) smtp.mailfrom=3ndM-ZAQKCGgLbJRMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--fvdl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1681839006; a=rsa-sha256; cv=none; b=yKyHtBwvKXVBVWBMG5xa8W5Ai9tVBd6BVeo21LKqMwa4VDN4YAa07NWMVNCR6I5COMJ0Wi n9Ob8yVGMQurUEM2LJuCsSbCD7GB7i7A1x7EAlkY14jTpWA+4j0g5L+/zkDwPpaKtwriWh pfHFxogYfR6IM2YMkFHb2YNbClrH+7k= Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-63b3bf0b814so2063155b3a.2 for ; Tue, 18 Apr 2023 10:30:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1681839005; x=1684431005; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=PlOlbguZJLrNwmoIaPL1ifiEMFL+mnPjJo6jiLeiwy0=; b=G9HWkOlA0TiZebZZw+BMSxSLc5r9Jiy9rx89WRkLtCGZZZ36xur97IUfA5HnEoyh9G KAIlk6yeNa97YBy19TiATPTOyZmAJwh07XsiZfSXhjZm6iDzKsA7vGqvXg+TXZsAdmGh HYn2FaRZC2EpVHyewDTC17u4mCjI5eBBhM6pdfkPqTzA2K+Xgx1W+et0dTYlBeW3C5kY 90Zl1vjuesr2FIufXZK0VNUubN/QktlHs4WIrSDeuvkxIJfYmIexL3mG7RC6ZeTdac9i saJJ40b6xgvv5MOqo3xJr/NAOVxQWx+oucZsKe4rMUSkFuPX+Pl00ZYMtU4TWRsK7vRx /Cpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681839005; x=1684431005; h=cc: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=PlOlbguZJLrNwmoIaPL1ifiEMFL+mnPjJo6jiLeiwy0=; b=EpQy9bwC4CPlRX/ytHePOR6vYw1cZdAQRyLuRhCgceouzvmd5SzpuPs++vvLMyHssh 29goV4jEp8VYl8ikPRy2NiC6m5x/Q/4I11nzPxRKw2JpdXV1+YX0DBEsmO6WhOhaNETo DAlgs+uEnRLmHZ/V5fYcuOraYkPoUJLmIAZvuZEuPTt3t8eR0qRniLKfq3P/ZzUM1iB0 oGbWVYJAnAD8P25M+QRaWhb8bnU7sBrDoR5UMcSkg8a10ZvveNfeNOdtajnaTeUXmdHg 7rFCJhz4bs/C9sKxg7RS24kkROUvh0rVwtPQbi61YluRSP4I4mZLOwdZQjVyOjgX+hSV KiLw== X-Gm-Message-State: AAQBX9cTFtYMKHUqWzEPkXeGCDsRTeJsF4767DGnBnfNNPCY5gUFziUY 9NNIee1Eey52cM9t2vqZiHxMnzR8 X-Google-Smtp-Source: AKy350aIAJlfwJhWzziM8p+6vuzo1W8STSemhYtD8EtCpnLuWYwtfa8K+Iydds8sLtUmL6GmTkx9cQb5 X-Received: from fvdl-cloudtop.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:46ab]) (user=fvdl job=sendgmr) by 2002:a05:6a00:10cd:b0:625:66a9:c393 with SMTP id d13-20020a056a0010cd00b0062566a9c393mr346478pfu.0.1681839005210; Tue, 18 Apr 2023 10:30:05 -0700 (PDT) Date: Tue, 18 Apr 2023 17:29:42 +0000 In-Reply-To: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.40.0.634.g4ca3ef3211-goog Message-ID: <20230418172942.740769-1-fvdl@google.com> Subject: Re: [PATCH V7 0/2] mm: shmem: support POSIX_FADV_[WILL|DONT]NEED for shmem files From: Frank van der Linden To: quic_charante@quicinc.com Cc: akpm@linux-foundation.org, hughd@google.com, willy@infradead.org, markhemm@googlemail.com, rientjes@google.com, surenb@google.com, shakeelb@google.com, quic_pkondeti@quicinc.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Frank van der Linden Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam03 X-Stat-Signature: tgeeafqat96oeoc6ukzyia14d5yuja5x X-Rspamd-Queue-Id: 9142E100009 X-HE-Tag: 1681839006-559438 X-HE-Meta: U2FsdGVkX19g/f+NOspsyE/UNMy2hVr42M7l0iifmdWydCHgtqZvtjMxsqRJ8OdJYI0pACLm45aHapbOEUCjJ/kM4ao9RtW/4NcXaWxCtLqeZiQ2Tp2HkuUQzktJ0/kvZuIA8aUuCydzkowalKTPdEOVwT+wMxD5yErqd/a14+NsBOTRnw5m9X1JwaA10mMzXD0n1Wk+RlpWSpdUBkZ78ESD9vN/ZVQWxDvdAg6SXd+kwYW6u9b8FdK8IU9v1yCIhCmu+T00CWo3cOGvwjDnmgoTJnVe5Jvze7KvVLu/HQwVmpXZaOwViVqre6ntdalYgPICd/uf9cTiboh+I1FXFV4TA4YklDBufZZy2Ux6tv9Ixoq46JVRF34+k0B9VNur1JCrvjYtDy6s1kRs4iEeeE5uKSG1Y//5AMBW5X4IOs1m8tCDEQ+t8OGnDXRsewymfrFV6iLgHKhoJdKypSrtaqmFrjcgrCFPNpx8RR2KB96AXyCFcEwRJOV6QtoNVURGBtNfmxqX2/oG33DJy32aQdvaynn1Zb0iQkUZS52EnEGMMfcEjRMQNj2B0NDAjnx86kNeFyIUZrgXyLcJIDpAcqJk/BCTJFLlFIqwre+XGa4n8/jGSQtYGBhH8lBT/WC6HB0tm7g6nf3LaDonETdyFr/yQXUwvoYnsWUOiSuKSAM18eoWd6jWHJD7yJgoboHZ3gpNMc+wkSP0VH1oiz8+8N1r2Y7vMQeECiL4vDYj1QeFbBHlor3/hc564sGCgMchJs/8SAj2Qz873Mdw6kf4YV601Op/vVOu+yMYsHGnPYpmAECMSlNT3FJQ1FbKHalro0EuMhHr7iilL1Ws3vWhHqX1j/gxzxj13auIXUGMqC5C/Ly6rn17dsdkQuV61R1rA3DX7PZNA0lQkoN8R4IvL/ar4cNu2bw8ajtRx+vtS19urIxqYbHKiRuPy70hcmlru46kBlkXPuAk2Irc4Mj +963EpOL 7PLTAzcj6UPKFNwnUe+owNlpyUNlWE6shjKi6vhE2fOFv23XkhTgddeN2vmabQXlXJh3KQ9bpcf8KuQRTjDM+gOQrNcVX77zhdAgklVDbulNf6dHYYatCTXfWYwzsCtiVQMTYObwRBdnvLYLT5Bzitto78dJtg+VUJX82xgDgaxx/MmF/FonMhzuEdf6fllvuwFE0nA61XlBvW0aRYVZ/AiasYV6XCsP6d4JtCAS7ij6fPpVc44l61u8ACb8m2e+DcMXn/pwRteyNGtjD07Lhw5ErDRLbOs0dZxkZtjEkd7GJuJbkFuOlXZijuq5hkxf8VIdnJu9edeEcKRcTt2tXvNqxoPadly1HXSOEsJww5VFps/Q/Jkwl/oiBI6ye91at8mkEDFjG2OTDXGnSL+jPNaCIzJNs1IxFg0fJuyiisjrfSfVx6HUtI7PHQg/Ndx/VTcIVfOyfo+htuI5qVwN81flRWcljTIqrqLrtWkWGuNsCOM3XgDL5e19gMTlpK0wkJupOjLTtfIMrpLwjVyuKPW1ETXOahXxIvO36iJEFj7dYJqZawub7Y+i5Al4txRTyhc+n6PCoBRqnEsB74gFo96UQASwpFWEE0gKe88u/XkpmC8NjRjWnaXEqOnNtnVWi7Ry4 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: Below is a quick patch to allow FADVISE_DONTNEED for shmem to reclaim mapped pages too. This would fit our usecase, and matches MADV_PAGEOUT more closely. The patch series as posted skips mapped pages even if you remove the folio_mapped() check, because page_referenced() in shrink_page_list() will find page tables with the page mapped, and ignore_references is not set when called from reclaim_pages(). You can make this work in a similar fashion to MADV_PAGEOUT by first unmapping a page, but only if the mapping belongs to the caller. You just have to change the check for "is there only one mapping and am I the owner". To do that, change a few lines in try_to_unmap to allow for checking the mm the mapping belongs to, and pass in current->mm (NULL still unmaps all mappings). I lightly tested this in a somewhat older codebase, so the diff below isn't fully tested. But if there are no objections to this approach, we could add it on top of your patchset after better testing. - Frank diff --git a/include/linux/rmap.h b/include/linux/rmap.h index b87d01660412..4403cc2ccc4c 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h @@ -368,6 +368,8 @@ int folio_referenced(struct folio *, int is_locked, void try_to_migrate(struct folio *folio, enum ttu_flags flags); void try_to_unmap(struct folio *, enum ttu_flags flags); +void try_to_unmap_mm(struct mm_struct *mm, struct folio *folio, + enum ttu_flags flags); int make_device_exclusive_range(struct mm_struct *mm, unsigned long start, unsigned long end, struct page **pages, diff --git a/mm/rmap.c b/mm/rmap.c index 8632e02661ac..4d30e8f5afe2 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -1443,6 +1443,11 @@ void page_remove_rmap(struct page *page, struct vm_area_struct *vma, munlock_vma_folio(folio, vma, compound); } +struct unmap_arg { + enum ttu_flags flags; + struct mm_struct *mm; +}; + /* * @arg: enum ttu_flags will be passed to this argument */ @@ -1455,7 +1460,11 @@ static bool try_to_unmap_one(struct folio *folio, struct vm_area_struct *vma, struct page *subpage; bool anon_exclusive, ret = true; struct mmu_notifier_range range; - enum ttu_flags flags = (enum ttu_flags)(long)arg; + struct unmap_arg *uap = (struct unmap_arg *)arg; + enum ttu_flags flags = uap->flags; + + if (uap->mm && uap->mm != mm) + return true; /* * When racing against e.g. zap_pte_range() on another cpu, @@ -1776,6 +1785,7 @@ static int folio_not_mapped(struct folio *folio) /** * try_to_unmap - Try to remove all page table mappings to a folio. + * @mm: mm to unmap from (NULL to unmap from all) * @folio: The folio to unmap. * @flags: action and flags * @@ -1785,11 +1795,16 @@ static int folio_not_mapped(struct folio *folio) * * Context: Caller must hold the folio lock. */ -void try_to_unmap(struct folio *folio, enum ttu_flags flags) +void try_to_unmap_mm(struct mm_struct *mm, struct folio *folio, + enum ttu_flags flags) { + struct unmap_arg ua = { + .flags = flags, + .mm = mm, + }; struct rmap_walk_control rwc = { .rmap_one = try_to_unmap_one, - .arg = (void *)flags, + .arg = (void *)&ua, .done = folio_not_mapped, .anon_lock = folio_lock_anon_vma_read, }; @@ -1800,6 +1815,11 @@ void try_to_unmap(struct folio *folio, enum ttu_flags flags) rmap_walk(folio, &rwc); } +void try_to_unmap(struct folio *folio, enum ttu_flags flags) +{ + try_to_unmap_mm(NULL, folio, flags); +} + /* * @arg: enum ttu_flags will be passed to this argument. * diff --git a/mm/shmem.c b/mm/shmem.c index 1af85259b6fc..b24af2fb3378 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2362,8 +2362,24 @@ static void shmem_isolate_pages_range(struct address_space *mapping, loff_t star if (!folio_try_get(folio)) continue; - if (folio_test_unevictable(folio) || folio_mapped(folio) || - folio_isolate_lru(folio)) { + + if (folio_test_unevictable(folio)) { + folio_put(folio); + continue; + } + + /* + * If the folio is mapped once, try to unmap it from the + * caller's page table. If it's still mapped afterwards, + * it belongs to someone else, and we're not going to + * change someone else's mapping. + */ + if (folio_mapcount(folio) == 1 && folio_trylock(folio)) { + try_to_unmap_mm(current->mm, folio, TTU_BATCH_FLUSH); + folio_unlock(folio); + } + + if (folio_mapped(folio) || folio_isolate_lru(folio)) { folio_put(folio); continue; } @@ -2383,6 +2399,8 @@ static void shmem_isolate_pages_range(struct address_space *mapping, loff_t star } } rcu_read_unlock(); + + try_to_unmap_flush(); } static int shmem_fadvise_dontneed(struct address_space *mapping, loff_t start,