From patchwork Wed Mar 15 05:14:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13175357 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 6A672C7618D for ; Wed, 15 Mar 2023 05:32:39 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 03AB78E0007; Wed, 15 Mar 2023 01:32:39 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id F2FF58E0001; Wed, 15 Mar 2023 01:32:38 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DF5598E0007; Wed, 15 Mar 2023 01:32:38 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id CF1218E0001 for ; Wed, 15 Mar 2023 01:32:38 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id ADFEC1C5EFA for ; Wed, 15 Mar 2023 05:32:38 +0000 (UTC) X-FDA: 80570012796.26.86531FF Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf05.hostedemail.com (Postfix) with ESMTP id EBD9B100010 for ; Wed, 15 Mar 2023 05:32:36 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=hY0UUqTG; spf=none (imf05.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1678858357; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZB/nojsqXTtfSMaj4C8ZgsYbK0b2FnBz3f1ii2GaXkQ=; b=SAfvd8XMD7+kyEU9+x9O7IWodlqjAllZ9ytHYDVbnJPzXOgXW2IUU0B9YYADc2hdMhDZWr onPn2ZkgtGYWN2mH05kpow/0SdTw29uNeRCx1V2JX2JiMaCGBORQ0mj8Rp/czCQ7TC2pDP ITj3vVggGsnIwfB80TVGesUSL86YaUE= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=hY0UUqTG; spf=none (imf05.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1678858357; a=rsa-sha256; cv=none; b=P4pvjQvEJfvtQ7AycTRDHXUgJLKT8xNLtXpcPCDLcKhcVOhtdigV2NTgg4Y3cR+3TXK6Z8 KHSXGlznCpGfg3zKmmQYDNlsY3b6WMM/HZOvChHWmJilqyfOIG5Q0S+KExlFAU7TSD1BVp sy8wBU4BSYR0FxZ3/aXSbFJKotMLM6g= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=ZB/nojsqXTtfSMaj4C8ZgsYbK0b2FnBz3f1ii2GaXkQ=; b=hY0UUqTGJDzLw4RBYtIYxgeVvN 63iW/9r3FQoz3cmvNkkqfiUK9D3PXsg4xMaIMPfprUGUdDWLfFX8lqQ3C82dUtIIJbUVjiPS7bkew 3SVH8K0ra3lSNQjOGGGVyPINBnyh+l1lpy9vvC+bXrgxroKRo6SBBqMHZ/6OCUELUKsVgdksovkJT OvXxNguIF8woiUKmuJj3JF3fXhM+G7vSEr0sxyhz6N12DAq6wpZJTX8hDZKK1dlve+VZatmATm7Qi Cujmwp3ehFlZS15JwLjFg7ZbiZQcI3M7wVp8XqdQrQfxLY2iEj5jOexlolxHUH/oEfQmY/I+3E1Oo YD831Jww==; Received: from willy by casper.infradead.org with local (Exim 4.94.2 #2 (Red Hat Linux)) id 1pcJTO-00DYEB-U2; Wed, 15 Mar 2023 05:14:50 +0000 From: "Matthew Wilcox (Oracle)" To: linux-arch@vger.kernel.org Cc: Yin Fengwei , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Matthew Wilcox Subject: [PATCH v4 36/36] filemap: Batch PTE mappings Date: Wed, 15 Mar 2023 05:14:44 +0000 Message-Id: <20230315051444.3229621-37-willy@infradead.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20230315051444.3229621-1-willy@infradead.org> References: <20230315051444.3229621-1-willy@infradead.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam03 X-Stat-Signature: ictoawo367a7sc6rcikhj9bop1dsywtp X-Rspamd-Queue-Id: EBD9B100010 X-HE-Tag: 1678858356-427075 X-HE-Meta: U2FsdGVkX1/+iPmP+/gpQSPbeb6+1arGGZWgT40FABqZj9cBcrGlklJg43h1bzyddAXD1ero2yZ8Vvma9COk+gklt67fq1kLfq7pbF4IJjy9mbBEb9xB+CL6gXqh++M6V5AguW0P+VdxIugkQ+ye/VMaXRzFw0wbSM3/kKGyTWUwLrXwVc7Z4g9k5M6Amewe2vQZsHNTt2WNmlwOAvb1acCgZbuj6zxRo8BtY5wEifJmbykNUA+iK5eThb+b16AO3l+KS88yjuNrfqrgmqCUC73QIIRauehvc1cTZRMDIRAouIbPyVq6LIHp6IIY8Lg0LUXSdC7sdz3xNHIQ3heLxaj9RQRHcGfdUAC8V/JX2Z3fuYLNs7Vn+CtfThozqNnCM1OP5Fn5sv32j+HSEdEvb8vE7Qdz5PcCIMI8hWp0BqElrvg9ZGZCc+K0GPHeooV49SP6azkflZnVf0b/ucMlLbkAlJ5c2hFfdej+xD0N41cCeKQPAtTwAw+6IxG0KzsYjDKrLWLDzFWD741z85hVk/8/nAthOMZAxXDBGvD2a+u/ytIKQaK1oX8CvOQZ4RKyweu+z5jhr6J4Tq8/ZqSOwC4nc4ML+5GAogD93z29oNeLc1EYO5VDv6bEjS4Cz+HWKjTXmFCnaFBgk4VjsggcaXG4gW/Ey1fq0I8iAg/aaTG1Ed1asbm5aubOMuMz6uslMRZpC+YVDB9L/Bopvi20NjRbxh1bD9zOyD1GQWr060vs38pMEHjeLMJWZDiFuWTc+0DQt6BqFwika6dlT4JAR1aBe6RyRbcATwbgXy8xkbWnGXAn/zdKd7amhYvZ4opHHuzc0a37etQnk4HYhENcWzRrCoPk+YmbA2ZL3P2H9snK/Zn8nauqah+EAFCerYmCzxsYfWGhsW+pVl5ddstMRdOQyiullH0VYewUoes25oVeQs/MhJUWyHfv08vB2w67SsM3fEQUNbyKanEvTF+ tYRIkkEE moCgCkhnMBHvV1SmmoKnYz7AFf6bMKIsgjITKYCCmwrBhRammSXjy54ov8jjvPI8ljcrM9YPAqC4qVZbfmZZvrmcL+2m+pRF72h/8gHIzD1uq2J5L8nCFAKDZHhyLy6DmeLEhLLqwBDxmD8nIQ9djgQdH8gVhbLYEdXUvgGV3mOXSj3tnFfMZK+UKoqPDUCdNoBc8j7Au+D9LgWGISoIRArT/J5dzZHA5ohsvfBz3BuC3AZPqk42ofZ0Zlg== 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: From: Yin Fengwei Call set_pte_range() once per contiguous range of the folio instead of once per page. This batches the updates to mm counters and the rmap. With a will-it-scale.page_fault3 like app (change file write fault testing to read fault testing. Trying to upstream it to will-it-scale at [1]) got 15% performance gain on a 48C/96T Cascade Lake test box with 96 processes running against xfs. Perf data collected before/after the change: 18.73%--page_add_file_rmap | --11.60%--__mod_lruvec_page_state | |--7.40%--__mod_memcg_lruvec_state | | | --5.58%--cgroup_rstat_updated | --2.53%--__mod_lruvec_state | --1.48%--__mod_node_page_state 9.93%--page_add_file_rmap_range | --2.67%--__mod_lruvec_page_state | |--1.95%--__mod_memcg_lruvec_state | | | --1.57%--cgroup_rstat_updated | --0.61%--__mod_lruvec_state | --0.54%--__mod_node_page_state The running time of __mode_lruvec_page_state() is reduced about 9%. [1]: https://github.com/antonblanchard/will-it-scale/pull/37 Signed-off-by: Yin Fengwei Signed-off-by: Matthew Wilcox (Oracle) --- mm/filemap.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/mm/filemap.c b/mm/filemap.c index e2317623dcbf..7a1534460b55 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -3483,11 +3483,12 @@ static vm_fault_t filemap_map_folio_range(struct vm_fault *vmf, struct file *file = vma->vm_file; struct page *page = folio_page(folio, start); unsigned int mmap_miss = READ_ONCE(file->f_ra.mmap_miss); - unsigned int ref_count = 0, count = 0; + unsigned int count = 0; + pte_t *old_ptep = vmf->pte; do { - if (PageHWPoison(page)) - continue; + if (PageHWPoison(page + count)) + goto skip; if (mmap_miss > 0) mmap_miss--; @@ -3497,20 +3498,33 @@ static vm_fault_t filemap_map_folio_range(struct vm_fault *vmf, * handled in the specific fault path, and it'll prohibit the * fault-around logic. */ - if (!pte_none(*vmf->pte)) - continue; + if (!pte_none(vmf->pte[count])) + goto skip; if (vmf->address == addr) ret = VM_FAULT_NOPAGE; - ref_count++; - set_pte_range(vmf, folio, page, 1, addr); - } while (vmf->pte++, page++, addr += PAGE_SIZE, ++count < nr_pages); + count++; + continue; +skip: + if (count) { + set_pte_range(vmf, folio, page, count, addr); + folio_ref_add(folio, count); + } - /* Restore the vmf->pte */ - vmf->pte -= nr_pages; + count++; + page += count; + vmf->pte += count; + addr += count * PAGE_SIZE; + count = 0; + } while (--nr_pages > 0); + + if (count) { + set_pte_range(vmf, folio, page, count, addr); + folio_ref_add(folio, count); + } - folio_ref_add(folio, ref_count); + vmf->pte = old_ptep; WRITE_ONCE(file->f_ra.mmap_miss, mmap_miss); return ret;