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 X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6FF07C4708B for ; Thu, 27 May 2021 20:21:51 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 1748C60C3F for ; Thu, 27 May 2021 20:21:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1748C60C3F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id AC9336B0075; Thu, 27 May 2021 16:21:50 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A78966B0078; Thu, 27 May 2021 16:21:50 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8A47C6B007B; Thu, 27 May 2021 16:21:50 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 52A736B0075 for ; Thu, 27 May 2021 16:21:50 -0400 (EDT) Received: from smtpin36.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id E40C0C5A4 for ; Thu, 27 May 2021 20:21:49 +0000 (UTC) X-FDA: 78188131938.36.4E67E01 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by imf23.hostedemail.com (Postfix) with ESMTP id 8651DA0003A3 for ; Thu, 27 May 2021 20:21:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1622146909; h=from:from: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; bh=sXc/mxSeZGULf6gugl776EzWZkGQ1iCBUhKtJkC//uw=; b=L0aeuRejlhEPEkB0/J0pAk+fXSP3r523Ei9mmaj07l3Y8/e1x8I08Io10nLQNB9E0hVJCo zNvQhXFKQI1GH+N1BPuLLvc8NHSpJHBnDvR+QQX5PSKYtY+wDv0j3BXmlbHKG4KJBORFvC MkBBbnmzRTjNaWd3BZnDmIoJN3T7Bt4= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-425-o5BC9kdoNQSluffpVc5s7w-1; Thu, 27 May 2021 16:21:47 -0400 X-MC-Unique: o5BC9kdoNQSluffpVc5s7w-1 Received: by mail-qv1-f69.google.com with SMTP id r11-20020a0cb28b0000b02901c87a178503so979415qve.22 for ; Thu, 27 May 2021 13:21:47 -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=sXc/mxSeZGULf6gugl776EzWZkGQ1iCBUhKtJkC//uw=; b=o1JEmvkdVcdWGk1bwHJgIxEZw3W5CEg2VeHbXW8dEapVK+vcj7MO9XQrR8Y+6XK4tp /nsmKkEA94lCYdIAFksy/dM+7oiLr28t1B4jifD0pXezcd3W8ZRucUagdNDIq/s+RoVi wDR5/kUhZvAGlgxY/k+cnqXwwidClQrvpjjbJ/Vk6UAy1UalajBAZDsygvMsHLxBGs3O CTEE152blk9QLv3lOwVLIY9jon15G9R81qX71av5+ax3wBjm449aopEwTDotF7UcMQMD zft2KgMOQTWnuMg1Uj6NYLaP0K7Dq+oZWgl3bOOcxpSeiwzbAEcCBVbHF8x0g/zPPrxD NCVA== X-Gm-Message-State: AOAM530A5HyeuTzS31qp4D4uQ94YFVx59j7yeaIqMffXrW24vM1V5Cd/ oduKT/v9XptSBsPiMbKVpTVdxlo9eKs1jQfngPmfg4rxNHTHTlpOBUpIF9AYFDT98T4b+lqjmXD 2+6SwrZU9Wy90wDGdKIO53RH0pbs6FwpwV2mCLmsMbcWo93cUFdDJKxkixn5F X-Received: by 2002:a05:620a:1036:: with SMTP id a22mr358553qkk.186.1622146903346; Thu, 27 May 2021 13:21:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy5Oz7COp0aUtdezIVVE5UQeBKcbJN8nq1U8uOtI97y0IFIL9UJHzPhkuIkBKyAiw7/snh96w== X-Received: by 2002:a05:620a:1036:: with SMTP id a22mr358500qkk.186.1622146902914; Thu, 27 May 2021 13:21:42 -0700 (PDT) Received: from localhost.localdomain (bras-base-toroon474qw-grc-72-184-145-4-219.dsl.bell.ca. [184.145.4.219]) by smtp.gmail.com with ESMTPSA id e19sm2042910qtr.45.2021.05.27.13.21.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 May 2021 13:21:42 -0700 (PDT) From: Peter Xu To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Andrea Arcangeli , "Kirill A . Shutemov" , Axel Rasmussen , Nadav Amit , Hugh Dickins , Jerome Glisse , Jason Gunthorpe , peterx@redhat.com, Andrew Morton , Miaohe Lin , Mike Rapoport , Matthew Wilcox , Mike Kravetz Subject: [PATCH v3 10/27] mm: Pass zap_flags into unmap_mapping_pages() Date: Thu, 27 May 2021 16:21:39 -0400 Message-Id: <20210527202139.30942-1-peterx@redhat.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210527201927.29586-1-peterx@redhat.com> References: <20210527201927.29586-1-peterx@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="US-ASCII" X-Rspamd-Queue-Id: 8651DA0003A3 Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=L0aeuRej; spf=none (imf23.hostedemail.com: domain of peterx@redhat.com has no SPF policy when checking 216.205.24.124) smtp.mailfrom=peterx@redhat.com; dmarc=pass (policy=none) header.from=redhat.com X-Rspamd-Server: rspam04 X-Stat-Signature: 93ugfnzq8due6471pguouo1zkxtm1iwj X-HE-Tag: 1622146902-287233 Content-Transfer-Encoding: quoted-printable 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: Give unmap_mapping_pages() more power by allowing to specify a zap flag s= o that it can pass in more information than "whether we'd also like to zap cow p= ages". With the new flag, we can remove the even_cow parameter because even_cow=3D= =3Dfalse equals to zap_flags=3D=3DZAP_FLAG_CHECK_MAPPING, while even_cow=3D=3Dtrue= means a none zap flag to pass in (though in most cases we have had even_cow=3D=3Dfalse= ). No functional change intended. Signed-off-by: Peter Xu --- fs/dax.c | 10 ++++++---- include/linux/mm.h | 4 ++-- mm/khugepaged.c | 3 ++- mm/memory.c | 15 ++++++++------- mm/truncate.c | 11 +++++++---- 5 files changed, 25 insertions(+), 18 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 62352cbcf0f4..09d482c1595b 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -528,7 +528,7 @@ static void *grab_mapping_entry(struct xa_state *xas, xas_unlock_irq(xas); unmap_mapping_pages(mapping, xas->xa_index & ~PG_PMD_COLOUR, - PG_PMD_NR, false); + PG_PMD_NR, ZAP_FLAG_CHECK_MAPPING); xas_reset(xas); xas_lock_irq(xas); } @@ -623,7 +623,8 @@ struct page *dax_layout_busy_page_range(struct addres= s_space *mapping, * guaranteed to either see new references or prevent new * references from being established. */ - unmap_mapping_pages(mapping, start_idx, end_idx - start_idx + 1, 0); + unmap_mapping_pages(mapping, start_idx, end_idx - start_idx + 1, + ZAP_FLAG_CHECK_MAPPING); =20 xas_lock_irq(&xas); xas_for_each(&xas, entry, end_idx) { @@ -754,9 +755,10 @@ static void *dax_insert_entry(struct xa_state *xas, /* we are replacing a zero page with block mapping */ if (dax_is_pmd_entry(entry)) unmap_mapping_pages(mapping, index & ~PG_PMD_COLOUR, - PG_PMD_NR, false); + PG_PMD_NR, ZAP_FLAG_CHECK_MAPPING); else /* pte entry */ - unmap_mapping_pages(mapping, index, 1, false); + unmap_mapping_pages(mapping, index, 1, + ZAP_FLAG_CHECK_MAPPING); } =20 xas_reset(xas); diff --git a/include/linux/mm.h b/include/linux/mm.h index 1adf313a01fe..b1fb2826e29c 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1803,7 +1803,7 @@ extern int fixup_user_fault(struct mm_struct *mm, unsigned long address, unsigned int fault_flags, bool *unlocked); void unmap_mapping_pages(struct address_space *mapping, - pgoff_t start, pgoff_t nr, bool even_cows); + pgoff_t start, pgoff_t nr, unsigned long zap_flags); void unmap_mapping_range(struct address_space *mapping, loff_t const holebegin, loff_t const holelen, int even_cows); #else @@ -1823,7 +1823,7 @@ static inline int fixup_user_fault(struct mm_struct= *mm, unsigned long address, return -EFAULT; } static inline void unmap_mapping_pages(struct address_space *mapping, - pgoff_t start, pgoff_t nr, bool even_cows) { } + pgoff_t start, pgoff_t nr, unsigned long zap_flags) { } static inline void unmap_mapping_range(struct address_space *mapping, loff_t const holebegin, loff_t const holelen, int even_cows) { } #endif diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 7376a9b5bfc9..9e89a032e2fd 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -1830,7 +1830,8 @@ static void collapse_file(struct mm_struct *mm, } =20 if (page_mapped(page)) - unmap_mapping_pages(mapping, index, 1, false); + unmap_mapping_pages(mapping, index, 1, + ZAP_FLAG_CHECK_MAPPING); =20 xas_lock_irq(&xas); xas_set(&xas, index); diff --git a/mm/memory.c b/mm/memory.c index 8a3751be87ba..319552efc782 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3316,7 +3316,10 @@ static inline void unmap_mapping_range_tree(struct= rb_root_cached *root, * @mapping: The address space containing pages to be unmapped. * @start: Index of first page to be unmapped. * @nr: Number of pages to be unmapped. 0 to unmap to end of file. - * @even_cows: Whether to unmap even private COWed pages. + * @zap_flags: Zap flags for the process. E.g., when ZAP_FLAG_CHECK_MAP= PING is + * passed into it, we will only zap the pages that are in the same map= ping + * specified in the @mapping parameter; otherwise we will not check ma= pping, + * IOW cow pages will be zapped too. * * Unmap the pages in this address space from any userspace process whic= h * has them mmaped. Generally, you want to remove COWed pages as well w= hen @@ -3324,17 +3327,14 @@ static inline void unmap_mapping_range_tree(struc= t rb_root_cached *root, * cache. */ void unmap_mapping_pages(struct address_space *mapping, pgoff_t start, - pgoff_t nr, bool even_cows) + pgoff_t nr, unsigned long zap_flags) { pgoff_t first_index =3D start, last_index =3D start + nr - 1; struct zap_details details =3D { .zap_mapping =3D mapping, - .zap_flags =3D ZAP_FLAG_SKIP_SWAP, + .zap_flags =3D zap_flags | ZAP_FLAG_SKIP_SWAP, }; =20 - if (!even_cows) - details.zap_flags |=3D ZAP_FLAG_CHECK_MAPPING; - if (last_index < first_index) last_index =3D ULONG_MAX; =20 @@ -3376,7 +3376,8 @@ void unmap_mapping_range(struct address_space *mapp= ing, hlen =3D ULONG_MAX - hba + 1; } =20 - unmap_mapping_pages(mapping, hba, hlen, even_cows); + unmap_mapping_pages(mapping, hba, hlen, even_cows ? + 0 : ZAP_FLAG_CHECK_MAPPING); } EXPORT_SYMBOL(unmap_mapping_range); =20 diff --git a/mm/truncate.c b/mm/truncate.c index 57a618c4a0d6..85cd84486589 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -172,7 +172,8 @@ truncate_cleanup_page(struct address_space *mapping, = struct page *page) { if (page_mapped(page)) { unsigned int nr =3D thp_nr_pages(page); - unmap_mapping_pages(mapping, page->index, nr, false); + unmap_mapping_pages(mapping, page->index, nr, + ZAP_FLAG_CHECK_MAPPING); } =20 if (page_has_private(page)) @@ -652,14 +653,15 @@ int invalidate_inode_pages2_range(struct address_sp= ace *mapping, * Zap the rest of the file in one hit. */ unmap_mapping_pages(mapping, index, - (1 + end - index), false); + (1 + end - index), + ZAP_FLAG_CHECK_MAPPING); did_range_unmap =3D 1; } else { /* * Just zap this page */ unmap_mapping_pages(mapping, index, - 1, false); + 1, ZAP_FLAG_CHECK_MAPPING); } } BUG_ON(page_mapped(page)); @@ -685,7 +687,8 @@ int invalidate_inode_pages2_range(struct address_spac= e *mapping, * get remapped later. */ if (dax_mapping(mapping)) { - unmap_mapping_pages(mapping, start, end - start + 1, false); + unmap_mapping_pages(mapping, start, end - start + 1, + ZAP_FLAG_CHECK_MAPPING); } out: cleancache_invalidate_inode(mapping); --=20 2.31.1