Message ID | 20231019131446.317-2-justinjiang@vivo.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2010:b0:403:3b70:6f57 with SMTP id fe16csp375020vqb; Thu, 19 Oct 2023 06:15:19 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEivz6Lopqm6A3FFHrOw2JbF2DFZc/E5oFbjC1wArTu0Ms/hLSxp/miTcS9VHo6J4ctHOpW X-Received: by 2002:a05:6870:7810:b0:1e9:b811:da13 with SMTP id hb16-20020a056870781000b001e9b811da13mr2877023oab.49.1697721319294; Thu, 19 Oct 2023 06:15:19 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1697721319; cv=pass; d=google.com; s=arc-20160816; b=Mh/F8oEPuG0yW1FkvIMGMayO1jL2pgHcAQgXDxSQ5tjGoQecHCgI6uIivYxgQiEB9c 1UixTLgfEp9zlXXJN+Vr8DJHyfPt4wzNH2S3y9gLqUnZZt/PEjG0++iVj3B15IlOHota coUY9/fvuxyDfqoHFJGGNKxyV6iR0PfPPvQdK8UhkYryoxO8/uF8B5fR8xR8FEGYwfaJ +yFg536l9CujlP5t259vC7RwJRyqZEEJOqTk41Ah1olT8rnBVJcr3oZ9RWbbagBgJhEl T2V/Ajb+NGMgiQE/IPZx4rRUmA6TTBd9ld/9qDyNhYrVJumC6Lw0H+sxsmOAVxNJiyJo g+Ng== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ZVCbfCgY6uphg+FnjetqR8dr7AX+sQTlt8WYhEGY+o4=; fh=c2eYxmN/YNr2ouhP31X3BrePKjLzNfOQt6lh5667ppQ=; b=eqPhtLGVRMKQCWaKTmKU+XjtSb42AEherm7GbOeHE+suldTEn+Du+EDHzie9wGvRQY WUnyuiZQLebm0SgD/SwfuhjJ9AepWgwELv/t9aaMX/A5JvKKXOtMnrq4P8vL+b5hbIBB SGyklUnHb6/DVhiVzTbKl3nHKFQHimnU0h2PV/cDNgfLVH4VrPtJDvx5sriw17OUF/WG ActJydPF9UKAmEa4mEYHDiAT7A334vDXILWQuqcJyV1in7FmxRQ6LaQzesa5Miqv57jm N3GMjJHqOuwBoLXFnTP7TB0v1CM4GoKgwyd5KMm03OkTRMKfUXJTYWxwbWmoAEJL/wH5 jTyQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@vivo.com header.s=selector2 header.b=oIqedpkD; arc=pass (i=1 spf=pass spfdomain=vivo.com dkim=pass dkdomain=vivo.com dmarc=pass fromdomain=vivo.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=vivo.com Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id d10-20020a63f24a000000b005b3bcd9d7f8si4325996pgk.808.2023.10.19.06.15.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Oct 2023 06:15:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@vivo.com header.s=selector2 header.b=oIqedpkD; arc=pass (i=1 spf=pass spfdomain=vivo.com dkim=pass dkdomain=vivo.com dmarc=pass fromdomain=vivo.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=vivo.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 7E003822D10A; Thu, 19 Oct 2023 06:15:18 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345839AbjJSNPL (ORCPT <rfc822;lkml4gm@gmail.com> + 25 others); Thu, 19 Oct 2023 09:15:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56986 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345494AbjJSNPH (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Thu, 19 Oct 2023 09:15:07 -0400 Received: from APC01-PSA-obe.outbound.protection.outlook.com (mail-psaapc01on2102.outbound.protection.outlook.com [40.107.255.102]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D541498 for <linux-kernel@vger.kernel.org>; Thu, 19 Oct 2023 06:15:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=E9QY1dxPHAn4Zx7A/ycRUF+TreMuWVmq14wK8cjQCxHwzZuob/1AahWf7IhDrD9YF0zvx1HSDKlGOPEH3fH7daKi5A+lncfcMNK9klvuCSnd8MvFEX7EnoAPDyiUxnoYRzIZo0tJhrelv7BSFEN5QpdAmzUyYLwrHzbVlSroF3DSt4rRYJ+LVVPElLurLIOcZBfNnAEE56hFo5yeJm/xp5N5bPuTY50Z08UCU8ROtA/rS297k9/D4RbfO1Bxi6U7soI8i9tuLjPYqbXL7FRRsDjfh6yJoJ3GLkTyi4pO5Zjo0M6+1hDOB7Kgb/A3LW3AwUhyLPaV5vRn6n6ZHSLjlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZVCbfCgY6uphg+FnjetqR8dr7AX+sQTlt8WYhEGY+o4=; b=e3k6DNOjmaqI5xOkGIJddfVakZWwNT9CSwjad02flAKxdnbqiisN3/mmhXYn9I/z2Mpx5uXRw/lg/bUQASERb2nzG/mtZ+qzujz3QLz0EITgKOhmt67ISy7oDOUYqm9arw2nl2HUj2CbdYCCbC11c+I0XmcChB1AydzcT0lWTDhJhMC7EGzJN1S2reSnS4ZHgMDs82LlFf0j4t/boHxEWFPQL3TLpBnPZ6urFrvMs+GkSq6ZtVTtr7mXZa8yksKe0EINcKidgG34Xv3SYpWb6aHJiZxiyFNbVmhvYKN/USrx+TcAFF4CUAjorwmv10kyoMDUU6A3coeYVPAGBoTIqg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=vivo.com; dmarc=pass action=none header.from=vivo.com; dkim=pass header.d=vivo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vivo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZVCbfCgY6uphg+FnjetqR8dr7AX+sQTlt8WYhEGY+o4=; b=oIqedpkDNK4kMlYxG3W+0qHZ3WxLlqIAymP4ElhFeUOZth6ZpMK3QtsQIo+xGU7jbvaYNbNTPuZUa4ZiLupSUqSqz07DV7mdsmJNN2sJ5OWG9jemYuNXIFNCYDafaVP038IoBD8GfEjFTyXpLDX0r+xAXCGN2P0ajauCB09+aZHWyJZpsve/FhrBb07TdVkuT+UKKkeIXgQiXKucGhaiPik/thd8kNKwAaC+G/GK9Dxh8ePYCsd/ODVb3SymjACgCeEXj006Le3GPi0zf2Mgg5H0JE6ehsf6INQVYrnpoxYUpu10Mm7Fgjayz3sVxT1PwvPaCs8NhUSjY1H3Ofcukg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=vivo.com; Received: from JH0PR06MB6849.apcprd06.prod.outlook.com (2603:1096:990:47::12) by PSAPR06MB4470.apcprd06.prod.outlook.com (2603:1096:301:86::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6907.26; Thu, 19 Oct 2023 13:15:00 +0000 Received: from JH0PR06MB6849.apcprd06.prod.outlook.com ([fe80::32d4:1209:6b36:86e5]) by JH0PR06MB6849.apcprd06.prod.outlook.com ([fe80::32d4:1209:6b36:86e5%7]) with mapi id 15.20.6907.025; Thu, 19 Oct 2023 13:15:00 +0000 From: Zhiguo Jiang <justinjiang@vivo.com> To: Andrew Morton <akpm@linux-foundation.org>, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: opensource.kernel@vivo.com, Zhiguo Jiang <justinjiang@vivo.com> Subject: [PATCH v2 1/2] mm:vmscan: the dirty folio in folio_list skip unmap Date: Thu, 19 Oct 2023 21:14:45 +0800 Message-ID: <20231019131446.317-2-justinjiang@vivo.com> X-Mailer: git-send-email 2.41.0.windows.3 In-Reply-To: <20231019131446.317-1-justinjiang@vivo.com> References: <20231019131446.317-1-justinjiang@vivo.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SG2PR06CA0252.apcprd06.prod.outlook.com (2603:1096:4:ac::36) To JH0PR06MB6849.apcprd06.prod.outlook.com (2603:1096:990:47::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: JH0PR06MB6849:EE_|PSAPR06MB4470:EE_ X-MS-Office365-Filtering-Correlation-Id: e188ed6c-90b9-43aa-0779-08dbd0a565a1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5DHS/WHs1IjQVsApHeLVYgiRFe1PDoN1JMEQ1Tm+SSh/b3tyWKrxj1aDtTI9fNZdf8/TgZNTRiNrvcw+PGh5eP+Y5f//GAkx4+hKK7tkQ0HOEKC0y6VDHgnHtDe2431anqcHSQ5lOXM9nGgUdnGJ+mxN5iqIqTGKxA5aiCruaQ0QtrzUXDJCcDTgn4mSnFpk8nvw2W6quRC48ZS6gnjW/LDDe2xX4x1DteYk9yLYOlodsgn/Bb7VzO5Sfmp6ViQqxWCUVUPpOY/1KNabBim90vAAES8hqI10gVZ+O+fko0QiQEolyLsJtjZB4Z70NYN+/O/Ziar4cvFGcoknffKBfUNSog+Oln5D9wJW4XsitJqL43CKh2tOr21xna+g5njiVByF2rwMs1EO09n3ziF6WS94VxRoZWbfmcjEvq7xHZnn/GnoHRNQ5z0YKPOaTWKKzRzMVcJhvwM1mW4+7qAhISF2czffYgnObThVkTSPy1GwNsNeDdYddPr6faOCdY5xqrBQ12bg+m4ool15+8pplGTKZZKy2KDDpOgLlzAZacBktpDDamlyx6XsDjVTXLHio4m1qA049M5pRaEkPd1njsq1p374wC5PqL4r05qJI0C895i6d0j58KS0axmphrg8SutSlFjaKIsCyXzwQbZuvQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:JH0PR06MB6849.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(376002)(39850400004)(136003)(366004)(396003)(346002)(230922051799003)(451199024)(64100799003)(186009)(1800799009)(6666004)(2906002)(52116002)(6506007)(6486002)(478600001)(41300700001)(4326008)(8676002)(8936002)(5660300002)(66476007)(66556008)(66946007)(316002)(83380400001)(36756003)(26005)(38350700005)(1076003)(6512007)(107886003)(38100700002)(2616005)(86362001)(14143004);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 5vB90dhy0ZXy0r62r028RWkd9HDcJdyhwICByWP3t+ryyUVcFix42Y9Uwo1eKhrZvdFJPYhPBepynrXuxetYI+hlgCrKok4vtgYKVGDhCo+4pKNjmRJy4eP0Ek5ir3BLpuyDRQODLBHkfLCg5CoRw0EXp7uv/YXsQNsEBG6xgoSIVlh71Ly4gOukGjM56CTZB+tHJFwsWiOzeIGR4eM8tZogP0yEGiriL90TyjHaJuIMuU1rxpKjYGxuFZb2U+wQYh9MWBKJIi2P4ebJkIKjjABf5/ozmhyMIihONm6KwL9OWq/Yxx16ywOI8yxA7SQEh6yC0pBQrHmfUpptyYpnyihrl0i9fzRoOcbWGh+mybvqhByuSifGsCUfRjxbZuPEtA0o/r7btwT5e0eseBsHiFY1EXDx1e6vo0eOJCtyZy9ydV8bOQnjtrW0J+56ysQWgzCkfjTuxxk5hzp6CwOE0OAo2PdcfdSkjkoN1lFqa+nMvTl5ETta5829aKEZWm1yPJuTQof5aF2wo8AR+cMz+TUYgdjLYU3h/bNuBpYr0mTmDd7SEAPDPJcjThJJ1mUKlfdKD74TtznlOUYcTMw6hsPGvTgRJwanXyJeiBnKljMsOKzpoHXbMZu6u6P93LLyJm3Gm6EnD+qoloKVreLqGQqgeyRckCnpZ35rEx2y1rziUq0WlqkYBDHiQhpjPKACy/f1EQNToogTPzGhwFNwq5Y30l2RO8oy5PQT77Xev45hqKD3oDpSzMZ8QMlas7VrEL/XOUGKLw5b3JcBrohZgadjo/HQABp40vxmZRoptakiVGtDLzfk1QqjjFWmWEbt8xv3MvP6N+fHm7hx+ggRHp15Qm4s+DdFzVZoFpsfGfcM7zB2x8WkD2Knm+rwyyv9P7AGgy5OCukKrpmlvwsKizgN7ssvXrYigSS09RufsoVOXJEq39lpcX/zWtdummwRkdAA1BQWu8j156d6nsH01AF400dfLWeRavDoN9C5Q7BVOw22tClaKCKjmv6/LZvFmSNBo9cfE1HMKemgvy62/Zr9RcrGt6knOvR8iHgJLG8X1E8jE7hiiPJKht1NGRKQk9jahxc9Kyv7O5xnwW91Ch/vSJyftD00w1kJUOijmp0LNxHyl9tPFSe0ykT3ZVsjp7+m4nVDEkz+h2JX5qojhwmfWCa3MkNPmbpHzCldGX3Q0q9Mqnq2AQKWQ2YKEDFKrKFTgqWuGRv9s7QhS1fkXeH1DbMSoK8IKUheb21haDLYfs9YFr82EqZ8z5Ie8tHNj+vwtxRgSIIBgrN+KFSUUTNjFBRQJgX674KXlTtYtgzFkDr17gIajDGBp/AJKlK9FKahNXFVf6XnRESOyzK4g27iw/d4COEfVrdWMejqUK5XNc5hNhBetALAD7iCfxi6CfTSUBbl9TuYFCQ2vdboqGtnI58PKetWCXvj0H4+U8h2MexZHf/UdC3/cT4tu+YlhVZ2uiR6FtozVmoEwKNYlkuRSIOdQFJVREjg/KjY/grn18RsBsAQEM5uNfDXZq2c1pGYVzjNUB0cpCLnY1UbmNNvaPJfteKoOgjbNgpvzyTUElOZdYRTC6QwgYfFG+ir X-OriginatorOrg: vivo.com X-MS-Exchange-CrossTenant-Network-Message-Id: e188ed6c-90b9-43aa-0779-08dbd0a565a1 X-MS-Exchange-CrossTenant-AuthSource: JH0PR06MB6849.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Oct 2023 13:14:59.9075 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 923e42dc-48d5-4cbe-b582-1a797a6412ed X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: DSjMmEFfByqao/3v+0PEbPxtbWyxqjuSsF5XG7xvf3mYinAp2/q4z/H5Pbp1sbcjWnf5QTxd7BYuByQbS4d6Og== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PSAPR06MB4470 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Thu, 19 Oct 2023 06:15:18 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780189829988896842 X-GMAIL-MSGID: 1780189829988896842 |
Series |
mm: the dirty folio unmap redundantly
|
|
Commit Message
Zhiguo Jiang
Oct. 19, 2023, 1:14 p.m. UTC
In the shrink_folio_list() the sources of the file dirty folio include
two ways below:
1. The dirty folio is from the incoming parameter folio_list,
which is the inactive file lru.
2. The dirty folio is from the PTE dirty bit transferred by
the try_to_unmap().
For the first source of the dirty folio, if the dirty folio does not
support pageout, the dirty folio can skip unmap in advance to reduce
recyling time.
Signed-off-by: Zhiguo Jiang <justinjiang@vivo.com>
---
Changelog:
v1->v2:
1. Keep the original judgment flow.
2. Add the interface of folio_check_pageout().
3. The dirty folio which does not support pageout in inactive file lru
skip unmap in advance.
mm/vmscan.c | 103 +++++++++++++++++++++++++++++++++-------------------
1 file changed, 66 insertions(+), 37 deletions(-)
Comments
On 19.10.23 15:14, Zhiguo Jiang wrote: > In the shrink_folio_list() the sources of the file dirty folio include > two ways below: > 1. The dirty folio is from the incoming parameter folio_list, > which is the inactive file lru. > 2. The dirty folio is from the PTE dirty bit transferred by > the try_to_unmap(). > > For the first source of the dirty folio, if the dirty folio does not > support pageout, the dirty folio can skip unmap in advance to reduce > recyling time. > > Signed-off-by: Zhiguo Jiang <justinjiang@vivo.com> > --- > > Changelog: > v1->v2: > 1. Keep the original judgment flow. > 2. Add the interface of folio_check_pageout(). > 3. The dirty folio which does not support pageout in inactive file lru > skip unmap in advance. > > mm/vmscan.c | 103 +++++++++++++++++++++++++++++++++------------------- > 1 file changed, 66 insertions(+), 37 deletions(-) > > diff --git a/mm/vmscan.c b/mm/vmscan.c > index a68d01fcc307..e067269275a5 100755 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -925,6 +925,44 @@ static void folio_check_dirty_writeback(struct folio *folio, > mapping->a_ops->is_dirty_writeback(folio, dirty, writeback); > } > > +/* Check if a dirty folio can support pageout in the recyling process*/ > +static bool folio_check_pageout(struct folio *folio, > + struct pglist_data *pgdat) > +{ > + int ret = true; > + > + /* > + * Anonymous folios are not handled by flushers and must be written > + * from reclaim context. Do not stall reclaim based on them. > + * MADV_FREE anonymous folios are put into inactive file list too. > + * They could be mistakenly treated as file lru. So further anon > + * test is needed. > + */ > + if (!folio_is_file_lru(folio) || > + (folio_test_anon(folio) && !folio_test_swapbacked(folio))) > + goto out; > + > + if (folio_test_dirty(folio) && > + (!current_is_kswapd() || > + !folio_test_reclaim(folio) || > + !test_bit(PGDAT_DIRTY, &pgdat->flags))) { > + /* > + * Immediately reclaim when written back. > + * Similar in principle to folio_deactivate() > + * except we already have the folio isolated > + * and know it's dirty > + */ > + node_stat_mod_folio(folio, NR_VMSCAN_IMMEDIATE, > + folio_nr_pages(folio)); > + folio_set_reclaim(folio); > + > + ret = false; > + } > + > +out: > + return ret; > +} > + > static struct folio *alloc_demote_folio(struct folio *src, > unsigned long private) > { > @@ -1078,6 +1116,12 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, > if (dirty && !writeback) > stat->nr_unqueued_dirty += nr_pages; > > + /* If the dirty folio dose not support pageout, > + * the dirty folio can skip this recycling. > + */ > + if (!folio_check_pageout(folio, pgdat)) > + goto activate_locked; > + > /* > * Treat this folio as congested if folios are cycling > * through the LRU so quickly that the folios marked > @@ -1261,43 +1305,6 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, > enum ttu_flags flags = TTU_BATCH_FLUSH; > bool was_swapbacked = folio_test_swapbacked(folio); > > - if (folio_test_dirty(folio)) { > - /* > - * Only kswapd can writeback filesystem folios > - * to avoid risk of stack overflow. But avoid > - * injecting inefficient single-folio I/O into > - * flusher writeback as much as possible: only > - * write folios when we've encountered many > - * dirty folios, and when we've already scanned > - * the rest of the LRU for clean folios and see > - * the same dirty folios again (with the reclaim > - * flag set). > - */ > - if (folio_is_file_lru(folio) && > - (!current_is_kswapd() || > - !folio_test_reclaim(folio) || > - !test_bit(PGDAT_DIRTY, &pgdat->flags))) { > - /* > - * Immediately reclaim when written back. > - * Similar in principle to folio_deactivate() > - * except we already have the folio isolated > - * and know it's dirty > - */ > - node_stat_mod_folio(folio, NR_VMSCAN_IMMEDIATE, > - nr_pages); > - folio_set_reclaim(folio); > - > - goto activate_locked; > - } > - > - if (references == FOLIOREF_RECLAIM_CLEAN) > - goto keep_locked; > - if (!may_enter_fs(folio, sc->gfp_mask)) > - goto keep_locked; > - if (!sc->may_writepage) > - goto keep_locked; > - } > - > if (folio_test_pmd_mappable(folio)) > flags |= TTU_SPLIT_HUGE_PMD; > > @@ -1323,6 +1330,28 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, > > mapping = folio_mapping(folio); > if (folio_test_dirty(folio)) { > + /* > + * Only kswapd can writeback filesystem folios > + * to avoid risk of stack overflow. But avoid > + * injecting inefficient single-folio I/O into > + * flusher writeback as much as possible: only > + * write folios when we've encountered many > + * dirty folios, and when we've already scanned > + * the rest of the LRU for clean folios and see > + * the same dirty folios again (with the reclaim > + * flag set). > + */ > + if (folio_is_file_lru(folio) && > + !folio_check_pageout(folio, pgdat)) > + goto activate_locked; > + > + if (references == FOLIOREF_RECLAIM_CLEAN) > + goto keep_locked; > + if (!may_enter_fs(folio, sc->gfp_mask)) > + goto keep_locked; > + if (!sc->may_writepage) > + goto keep_locked; > + > /* > * Folio is dirty. Flush the TLB if a writable entry > * potentially exists to avoid CPU writes after I/O I'm confused. Did you apply this on top of v1 by accident?
在 2023/10/19 22:15, David Hildenbrand 写道: > [你通常不会收到来自 david@redhat.com 的电子邮件。请访问 > https://aka.ms/LearnAboutSenderIdentification,以了解这一点为什么很重要] > > On 19.10.23 15:14, Zhiguo Jiang wrote: >> In the shrink_folio_list() the sources of the file dirty folio include >> two ways below: >> 1. The dirty folio is from the incoming parameter folio_list, >> which is the inactive file lru. >> 2. The dirty folio is from the PTE dirty bit transferred by >> the try_to_unmap(). >> >> For the first source of the dirty folio, if the dirty folio does not >> support pageout, the dirty folio can skip unmap in advance to reduce >> recyling time. >> >> Signed-off-by: Zhiguo Jiang <justinjiang@vivo.com> >> --- >> >> Changelog: >> v1->v2: >> 1. Keep the original judgment flow. >> 2. Add the interface of folio_check_pageout(). >> 3. The dirty folio which does not support pageout in inactive file lru >> skip unmap in advance. >> >> mm/vmscan.c | 103 +++++++++++++++++++++++++++++++++------------------- >> 1 file changed, 66 insertions(+), 37 deletions(-) >> >> diff --git a/mm/vmscan.c b/mm/vmscan.c >> index a68d01fcc307..e067269275a5 100755 >> --- a/mm/vmscan.c >> +++ b/mm/vmscan.c >> @@ -925,6 +925,44 @@ static void folio_check_dirty_writeback(struct >> folio *folio, >> mapping->a_ops->is_dirty_writeback(folio, dirty, >> writeback); >> } >> >> +/* Check if a dirty folio can support pageout in the recyling process*/ >> +static bool folio_check_pageout(struct folio *folio, >> + struct pglist_data *pgdat) >> +{ >> + int ret = true; >> + >> + /* >> + * Anonymous folios are not handled by flushers and must be >> written >> + * from reclaim context. Do not stall reclaim based on them. >> + * MADV_FREE anonymous folios are put into inactive file list too. >> + * They could be mistakenly treated as file lru. So further anon >> + * test is needed. >> + */ >> + if (!folio_is_file_lru(folio) || >> + (folio_test_anon(folio) && !folio_test_swapbacked(folio))) >> + goto out; >> + >> + if (folio_test_dirty(folio) && >> + (!current_is_kswapd() || >> + !folio_test_reclaim(folio) || >> + !test_bit(PGDAT_DIRTY, &pgdat->flags))) { >> + /* >> + * Immediately reclaim when written back. >> + * Similar in principle to folio_deactivate() >> + * except we already have the folio isolated >> + * and know it's dirty >> + */ >> + node_stat_mod_folio(folio, NR_VMSCAN_IMMEDIATE, >> + folio_nr_pages(folio)); >> + folio_set_reclaim(folio); >> + >> + ret = false; >> + } >> + >> +out: >> + return ret; >> +} >> + >> static struct folio *alloc_demote_folio(struct folio *src, >> unsigned long private) >> { >> @@ -1078,6 +1116,12 @@ static unsigned int shrink_folio_list(struct >> list_head *folio_list, >> if (dirty && !writeback) >> stat->nr_unqueued_dirty += nr_pages; >> >> + /* If the dirty folio dose not support pageout, >> + * the dirty folio can skip this recycling. >> + */ >> + if (!folio_check_pageout(folio, pgdat)) >> + goto activate_locked; >> + >> /* >> * Treat this folio as congested if folios are cycling >> * through the LRU so quickly that the folios marked >> @@ -1261,43 +1305,6 @@ static unsigned int shrink_folio_list(struct >> list_head *folio_list, >> enum ttu_flags flags = TTU_BATCH_FLUSH; >> bool was_swapbacked = >> folio_test_swapbacked(folio); >> >> - if (folio_test_dirty(folio)) { >> - /* >> - * Only kswapd can writeback filesystem >> folios >> - * to avoid risk of stack overflow. But >> avoid >> - * injecting inefficient single-folio >> I/O into >> - * flusher writeback as much as >> possible: only >> - * write folios when we've encountered >> many >> - * dirty folios, and when we've already >> scanned >> - * the rest of the LRU for clean folios >> and see >> - * the same dirty folios again (with >> the reclaim >> - * flag set). >> - */ >> - if (folio_is_file_lru(folio) && >> - (!current_is_kswapd() || >> - !folio_test_reclaim(folio) || >> - !test_bit(PGDAT_DIRTY, >> &pgdat->flags))) { >> - /* >> - * Immediately reclaim when >> written back. >> - * Similar in principle to >> folio_deactivate() >> - * except we already have the >> folio isolated >> - * and know it's dirty >> - */ >> - node_stat_mod_folio(folio, >> NR_VMSCAN_IMMEDIATE, >> - nr_pages); >> - folio_set_reclaim(folio); >> - >> - goto activate_locked; >> - } >> - >> - if (references == FOLIOREF_RECLAIM_CLEAN) >> - goto keep_locked; >> - if (!may_enter_fs(folio, sc->gfp_mask)) >> - goto keep_locked; >> - if (!sc->may_writepage) >> - goto keep_locked; >> - } >> - >> if (folio_test_pmd_mappable(folio)) >> flags |= TTU_SPLIT_HUGE_PMD; >> >> @@ -1323,6 +1330,28 @@ static unsigned int shrink_folio_list(struct >> list_head *folio_list, >> >> mapping = folio_mapping(folio); >> if (folio_test_dirty(folio)) { >> + /* >> + * Only kswapd can writeback filesystem folios >> + * to avoid risk of stack overflow. But avoid >> + * injecting inefficient single-folio I/O into >> + * flusher writeback as much as possible: only >> + * write folios when we've encountered many >> + * dirty folios, and when we've already scanned >> + * the rest of the LRU for clean folios and see >> + * the same dirty folios again (with the reclaim >> + * flag set). >> + */ >> + if (folio_is_file_lru(folio) && >> + !folio_check_pageout(folio, pgdat)) >> + goto activate_locked; >> + >> + if (references == FOLIOREF_RECLAIM_CLEAN) >> + goto keep_locked; >> + if (!may_enter_fs(folio, sc->gfp_mask)) >> + goto keep_locked; >> + if (!sc->may_writepage) >> + goto keep_locked; >> + >> /* >> * Folio is dirty. Flush the TLB if a writable >> entry >> * potentially exists to avoid CPU writes after >> I/O > > I'm confused. Did you apply this on top of v1 by accident? Hi, According to my modified mm_vmscan_lru_shrink_inactive test tracelog, in the 32 scanned inactive file pages, 20 were dirty, and the 20 dirty pages were not reclamed, but they took 20us to perform try_to_unmap. I think unreclaimed dirty folio in inactive file lru can skip to perform try_to_unmap. Please help to continue review. Thanks. kswapd0-99 ( 99) [005] ..... 687.793724: mm_vmscan_lru_shrink_inactive: [Justin] nid 0 scan=32 isolate=32 reclamed=12 nr_dirty=20 nr_unqueued_dirty=20 nr_writeback=0 nr_congested=0 nr_immediate=0 nr_activate[0]=0 nr_activate[1]=20 nr_ref_keep=0 nr_unmap_fail=0 priority=2 file=RECLAIM_WB_FILE|RECLAIM_WB_ASYNC total=39 exe=0 reference_cost=5 reference_exe=0 unmap_cost=21 unmap_exe=0 dirty_unmap_cost=20 dirty_unmap_exe=0 pageout_cost=0 pageout_exe=0 > > -- > Cheers, > > David / dhildenb >
在 2023/10/20 11:59, zhiguojiang 写道: > > > 在 2023/10/19 22:15, David Hildenbrand 写道: >> [你通常不会收到来自 david@redhat.com 的电子邮件。请访问 >> https://aka.ms/LearnAboutSenderIdentification,以了解这一点为什么很重要] >> >> On 19.10.23 15:14, Zhiguo Jiang wrote: >>> In the shrink_folio_list() the sources of the file dirty folio include >>> two ways below: >>> 1. The dirty folio is from the incoming parameter folio_list, >>> which is the inactive file lru. >>> 2. The dirty folio is from the PTE dirty bit transferred by >>> the try_to_unmap(). >>> >>> For the first source of the dirty folio, if the dirty folio does not >>> support pageout, the dirty folio can skip unmap in advance to reduce >>> recyling time. >>> >>> Signed-off-by: Zhiguo Jiang <justinjiang@vivo.com> >>> --- >>> >>> Changelog: >>> v1->v2: >>> 1. Keep the original judgment flow. >>> 2. Add the interface of folio_check_pageout(). >>> 3. The dirty folio which does not support pageout in inactive file lru >>> skip unmap in advance. >>> >>> mm/vmscan.c | 103 >>> +++++++++++++++++++++++++++++++++------------------- >>> 1 file changed, 66 insertions(+), 37 deletions(-) >>> >>> diff --git a/mm/vmscan.c b/mm/vmscan.c >>> index a68d01fcc307..e067269275a5 100755 >>> --- a/mm/vmscan.c >>> +++ b/mm/vmscan.c >>> @@ -925,6 +925,44 @@ static void folio_check_dirty_writeback(struct >>> folio *folio, >>> mapping->a_ops->is_dirty_writeback(folio, dirty, >>> writeback); >>> } >>> >>> +/* Check if a dirty folio can support pageout in the recyling >>> process*/ >>> +static bool folio_check_pageout(struct folio *folio, >>> + struct pglist_data >>> *pgdat) >>> +{ >>> + int ret = true; >>> + >>> + /* >>> + * Anonymous folios are not handled by flushers and must be >>> written >>> + * from reclaim context. Do not stall reclaim based on them. >>> + * MADV_FREE anonymous folios are put into inactive file list >>> too. >>> + * They could be mistakenly treated as file lru. So further anon >>> + * test is needed. >>> + */ >>> + if (!folio_is_file_lru(folio) || >>> + (folio_test_anon(folio) && >>> !folio_test_swapbacked(folio))) >>> + goto out; >>> + >>> + if (folio_test_dirty(folio) && >>> + (!current_is_kswapd() || >>> + !folio_test_reclaim(folio) || >>> + !test_bit(PGDAT_DIRTY, &pgdat->flags))) { >>> + /* >>> + * Immediately reclaim when written back. >>> + * Similar in principle to folio_deactivate() >>> + * except we already have the folio isolated >>> + * and know it's dirty >>> + */ >>> + node_stat_mod_folio(folio, NR_VMSCAN_IMMEDIATE, >>> + folio_nr_pages(folio)); >>> + folio_set_reclaim(folio); >>> + >>> + ret = false; >>> + } >>> + >>> +out: >>> + return ret; >>> +} >>> + >>> static struct folio *alloc_demote_folio(struct folio *src, >>> unsigned long private) >>> { >>> @@ -1078,6 +1116,12 @@ static unsigned int shrink_folio_list(struct >>> list_head *folio_list, >>> if (dirty && !writeback) >>> stat->nr_unqueued_dirty += nr_pages; >>> >>> + /* If the dirty folio dose not support pageout, >>> + * the dirty folio can skip this recycling. >>> + */ >>> + if (!folio_check_pageout(folio, pgdat)) >>> + goto activate_locked; >>> + >>> /* >>> * Treat this folio as congested if folios are cycling >>> * through the LRU so quickly that the folios marked >>> @@ -1261,43 +1305,6 @@ static unsigned int shrink_folio_list(struct >>> list_head *folio_list, >>> enum ttu_flags flags = TTU_BATCH_FLUSH; >>> bool was_swapbacked = >>> folio_test_swapbacked(folio); >>> >>> - if (folio_test_dirty(folio)) { >>> - /* >>> - * Only kswapd can writeback >>> filesystem folios >>> - * to avoid risk of stack overflow. >>> But avoid >>> - * injecting inefficient single-folio >>> I/O into >>> - * flusher writeback as much as >>> possible: only >>> - * write folios when we've encountered >>> many >>> - * dirty folios, and when we've >>> already scanned >>> - * the rest of the LRU for clean >>> folios and see >>> - * the same dirty folios again (with >>> the reclaim >>> - * flag set). >>> - */ >>> - if (folio_is_file_lru(folio) && >>> - (!current_is_kswapd() || >>> - !folio_test_reclaim(folio) || >>> - !test_bit(PGDAT_DIRTY, >>> &pgdat->flags))) { >>> - /* >>> - * Immediately reclaim when >>> written back. >>> - * Similar in principle to >>> folio_deactivate() >>> - * except we already have the >>> folio isolated >>> - * and know it's dirty >>> - */ >>> - node_stat_mod_folio(folio, NR_VMSCAN_IMMEDIATE, >>> - nr_pages); >>> - folio_set_reclaim(folio); >>> - >>> - goto activate_locked; >>> - } >>> - >>> - if (references == FOLIOREF_RECLAIM_CLEAN) >>> - goto keep_locked; >>> - if (!may_enter_fs(folio, sc->gfp_mask)) >>> - goto keep_locked; >>> - if (!sc->may_writepage) >>> - goto keep_locked; >>> - } >>> - >>> if (folio_test_pmd_mappable(folio)) >>> flags |= TTU_SPLIT_HUGE_PMD; >>> >>> @@ -1323,6 +1330,28 @@ static unsigned int shrink_folio_list(struct >>> list_head *folio_list, >>> >>> mapping = folio_mapping(folio); >>> if (folio_test_dirty(folio)) { >>> + /* >>> + * Only kswapd can writeback filesystem folios >>> + * to avoid risk of stack overflow. But avoid >>> + * injecting inefficient single-folio I/O into >>> + * flusher writeback as much as possible: only >>> + * write folios when we've encountered many >>> + * dirty folios, and when we've already scanned >>> + * the rest of the LRU for clean folios and see >>> + * the same dirty folios again (with the reclaim >>> + * flag set). >>> + */ >>> + if (folio_is_file_lru(folio) && >>> + !folio_check_pageout(folio, pgdat)) >>> + goto activate_locked; >>> + >>> + if (references == FOLIOREF_RECLAIM_CLEAN) >>> + goto keep_locked; >>> + if (!may_enter_fs(folio, sc->gfp_mask)) >>> + goto keep_locked; >>> + if (!sc->may_writepage) >>> + goto keep_locked; >>> + >>> /* >>> * Folio is dirty. Flush the TLB if a writable >>> entry >>> * potentially exists to avoid CPU writes >>> after I/O >> >> I'm confused. Did you apply this on top of v1 by accident? > Hi, > According to my modified mm_vmscan_lru_shrink_inactive test tracelog, > in the 32 scanned inactive file pages, 20 were dirty, and the 20 dirty > pages were not reclamed, but they took 20us to perform try_to_unmap. > > I think unreclaimed dirty folio in inactive file lru can skip to > perform try_to_unmap. Please help to continue review. Thanks. > > kswapd0-99 ( 99) [005] ..... 687.793724: > mm_vmscan_lru_shrink_inactive: [Justin] nid 0 scan=32 isolate=32 > reclamed=12 nr_dirty=20 nr_unqueued_dirty=20 nr_writeback=0 > nr_congested=0 nr_immediate=0 nr_activate[0]=0 nr_activate[1]=20 > nr_ref_keep=0 nr_unmap_fail=0 priority=2 > file=RECLAIM_WB_FILE|RECLAIM_WB_ASYNC total=39 exe=0 reference_cost=5 > reference_exe=0 unmap_cost=21 unmap_exe=0 dirty_unmap_cost=20 > dirty_unmap_exe=0 pageout_cost=0 pageout_exe=0 > To supplement, I think the unreclaimed dirty folio of the inactive file lru in shrink_folio_list() can exit the recyling flow in advance and avoid to execute some time-consuming interfaces, such as folio_check_references() and try_to_unmap(). >> -- >> Cheers, >> >> David / dhildenb >> >
On Fri, Oct 20, 2023 at 11:59:33AM +0800, zhiguojiang wrote: > > > @@ -1261,43 +1305,6 @@ static unsigned int shrink_folio_list(struct > > > list_head *folio_list, > > > enum ttu_flags flags = TTU_BATCH_FLUSH; > > > bool was_swapbacked = > > > folio_test_swapbacked(folio); > > > > > > - if (folio_test_dirty(folio)) { > > > - /* > > > - * Only kswapd can writeback > > > filesystem folios > > > - * to avoid risk of stack overflow. > > > But avoid > > > - * injecting inefficient single-folio > > > I/O into > > > - * flusher writeback as much as > > > possible: only > > > - * write folios when we've encountered > > > many > > > - * dirty folios, and when we've > > > already scanned > > > - * the rest of the LRU for clean > > > folios and see > > > - * the same dirty folios again (with > > > the reclaim > > > - * flag set). > > > - */ > > > - if (folio_is_file_lru(folio) && > > > - (!current_is_kswapd() || > > > - !folio_test_reclaim(folio) || > > > - !test_bit(PGDAT_DIRTY, > > > &pgdat->flags))) { > > > - /* > > > - * Immediately reclaim when > > > written back. > > > - * Similar in principle to > > > folio_deactivate() > > > - * except we already have the > > > folio isolated > > > - * and know it's dirty > > > - */ > > > - node_stat_mod_folio(folio, > > > NR_VMSCAN_IMMEDIATE, > > > - nr_pages); > > > - folio_set_reclaim(folio); > > > - > > > - goto activate_locked; > > > - } > > > - > > > - if (references == FOLIOREF_RECLAIM_CLEAN) > > > - goto keep_locked; > > > - if (!may_enter_fs(folio, sc->gfp_mask)) > > > - goto keep_locked; > > > - if (!sc->may_writepage) > > > - goto keep_locked; > > > - } > > > - > > > if (folio_test_pmd_mappable(folio)) > > > flags |= TTU_SPLIT_HUGE_PMD; > > > > > > > I'm confused. Did you apply this on top of v1 by accident? > Hi, > According to my modified mm_vmscan_lru_shrink_inactive test tracelog, in the You're missing David's point. You've generated this patch against ... something ... that isn't upstream. Probably against v1 of your patch. Please check your git tree. > 32 scanned inactive file pages, 20 were dirty, and the 20 dirty pages were > not reclamed, but they took 20us to perform try_to_unmap. > > I think unreclaimed dirty folio in inactive file lru can skip to perform > try_to_unmap. Please help to continue review. Thanks. > > kswapd0-99 ( 99) [005] ..... 687.793724: > mm_vmscan_lru_shrink_inactive: [Justin] nid 0 scan=32 isolate=32 reclamed=12 > nr_dirty=20 nr_unqueued_dirty=20 nr_writeback=0 nr_congested=0 > nr_immediate=0 nr_activate[0]=0 nr_activate[1]=20 nr_ref_keep=0 > nr_unmap_fail=0 priority=2 file=RECLAIM_WB_FILE|RECLAIM_WB_ASYNC total=39 > exe=0 reference_cost=5 reference_exe=0 unmap_cost=21 unmap_exe=0 > dirty_unmap_cost=20 dirty_unmap_exe=0 pageout_cost=0 pageout_exe=0 Are you seeing measurable changes for any workloads? It certainly seems like you should, but it would help if you chose a test from mmtests and showed how performance changed on your system.
在 2023/10/20 12:15, Matthew Wilcox 写道: > On Fri, Oct 20, 2023 at 11:59:33AM +0800, zhiguojiang wrote: >>>> @@ -1261,43 +1305,6 @@ static unsigned int shrink_folio_list(struct >>>> list_head *folio_list, >>>> enum ttu_flags flags = TTU_BATCH_FLUSH; >>>> bool was_swapbacked = >>>> folio_test_swapbacked(folio); >>>> >>>> - if (folio_test_dirty(folio)) { >>>> - /* >>>> - * Only kswapd can writeback >>>> filesystem folios >>>> - * to avoid risk of stack overflow. >>>> But avoid >>>> - * injecting inefficient single-folio >>>> I/O into >>>> - * flusher writeback as much as >>>> possible: only >>>> - * write folios when we've encountered >>>> many >>>> - * dirty folios, and when we've >>>> already scanned >>>> - * the rest of the LRU for clean >>>> folios and see >>>> - * the same dirty folios again (with >>>> the reclaim >>>> - * flag set). >>>> - */ >>>> - if (folio_is_file_lru(folio) && >>>> - (!current_is_kswapd() || >>>> - !folio_test_reclaim(folio) || >>>> - !test_bit(PGDAT_DIRTY, >>>> &pgdat->flags))) { >>>> - /* >>>> - * Immediately reclaim when >>>> written back. >>>> - * Similar in principle to >>>> folio_deactivate() >>>> - * except we already have the >>>> folio isolated >>>> - * and know it's dirty >>>> - */ >>>> - node_stat_mod_folio(folio, >>>> NR_VMSCAN_IMMEDIATE, >>>> - nr_pages); >>>> - folio_set_reclaim(folio); >>>> - >>>> - goto activate_locked; >>>> - } >>>> - >>>> - if (references == FOLIOREF_RECLAIM_CLEAN) >>>> - goto keep_locked; >>>> - if (!may_enter_fs(folio, sc->gfp_mask)) >>>> - goto keep_locked; >>>> - if (!sc->may_writepage) >>>> - goto keep_locked; >>>> - } >>>> - >>>> if (folio_test_pmd_mappable(folio)) >>>> flags |= TTU_SPLIT_HUGE_PMD; >>>> >>> I'm confused. Did you apply this on top of v1 by accident? >> Hi, >> According to my modified mm_vmscan_lru_shrink_inactive test tracelog, in the > You're missing David's point. You've generated this patch against ... > something ... that isn't upstream. Probably against v1 of your > patch. Please check your git tree. Yes, [PATCH v2 1/2] is against my patch v1 index 2cc0cb41fb32..cf555cdfcefc. > >> 32 scanned inactive file pages, 20 were dirty, and the 20 dirty pages were >> not reclamed, but they took 20us to perform try_to_unmap. >> >> I think unreclaimed dirty folio in inactive file lru can skip to perform >> try_to_unmap. Please help to continue review. Thanks. >> >> kswapd0-99 ( 99) [005] ..... 687.793724: >> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 scan=32 isolate=32 reclamed=12 >> nr_dirty=20 nr_unqueued_dirty=20 nr_writeback=0 nr_congested=0 >> nr_immediate=0 nr_activate[0]=0 nr_activate[1]=20 nr_ref_keep=0 >> nr_unmap_fail=0 priority=2 file=RECLAIM_WB_FILE|RECLAIM_WB_ASYNC total=39 >> exe=0 reference_cost=5 reference_exe=0 unmap_cost=21 unmap_exe=0 >> dirty_unmap_cost=20 dirty_unmap_exe=0 pageout_cost=0 pageout_exe=0 > Are you seeing measurable changes for any workloads? It certainly seems > like you should, but it would help if you chose a test from mmtests and > showed how performance changed on your system.
在 2023/10/20 12:15, Matthew Wilcox 写道: > On Fri, Oct 20, 2023 at 11:59:33AM +0800, zhiguojiang wrote: >>>> @@ -1261,43 +1305,6 @@ static unsigned int shrink_folio_list(struct >>>> list_head *folio_list, >>>> enum ttu_flags flags = TTU_BATCH_FLUSH; >>>> bool was_swapbacked = >>>> folio_test_swapbacked(folio); >>>> >>>> - if (folio_test_dirty(folio)) { >>>> - /* >>>> - * Only kswapd can writeback >>>> filesystem folios >>>> - * to avoid risk of stack overflow. >>>> But avoid >>>> - * injecting inefficient single-folio >>>> I/O into >>>> - * flusher writeback as much as >>>> possible: only >>>> - * write folios when we've encountered >>>> many >>>> - * dirty folios, and when we've >>>> already scanned >>>> - * the rest of the LRU for clean >>>> folios and see >>>> - * the same dirty folios again (with >>>> the reclaim >>>> - * flag set). >>>> - */ >>>> - if (folio_is_file_lru(folio) && >>>> - (!current_is_kswapd() || >>>> - !folio_test_reclaim(folio) || >>>> - !test_bit(PGDAT_DIRTY, >>>> &pgdat->flags))) { >>>> - /* >>>> - * Immediately reclaim when >>>> written back. >>>> - * Similar in principle to >>>> folio_deactivate() >>>> - * except we already have the >>>> folio isolated >>>> - * and know it's dirty >>>> - */ >>>> - node_stat_mod_folio(folio, >>>> NR_VMSCAN_IMMEDIATE, >>>> - nr_pages); >>>> - folio_set_reclaim(folio); >>>> - >>>> - goto activate_locked; >>>> - } >>>> - >>>> - if (references == FOLIOREF_RECLAIM_CLEAN) >>>> - goto keep_locked; >>>> - if (!may_enter_fs(folio, sc->gfp_mask)) >>>> - goto keep_locked; >>>> - if (!sc->may_writepage) >>>> - goto keep_locked; >>>> - } >>>> - >>>> if (folio_test_pmd_mappable(folio)) >>>> flags |= TTU_SPLIT_HUGE_PMD; >>>> >>> I'm confused. Did you apply this on top of v1 by accident? >> Hi, >> According to my modified mm_vmscan_lru_shrink_inactive test tracelog, in the > You're missing David's point. You've generated this patch against ... > something ... that isn't upstream. Probably against v1 of your > patch. Please check your git tree. > >> 32 scanned inactive file pages, 20 were dirty, and the 20 dirty pages were >> not reclamed, but they took 20us to perform try_to_unmap. >> >> I think unreclaimed dirty folio in inactive file lru can skip to perform >> try_to_unmap. Please help to continue review. Thanks. >> >> kswapd0-99 ( 99) [005] ..... 687.793724: >> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 scan=32 isolate=32 reclamed=12 >> nr_dirty=20 nr_unqueued_dirty=20 nr_writeback=0 nr_congested=0 >> nr_immediate=0 nr_activate[0]=0 nr_activate[1]=20 nr_ref_keep=0 >> nr_unmap_fail=0 priority=2 file=RECLAIM_WB_FILE|RECLAIM_WB_ASYNC total=39 >> exe=0 reference_cost=5 reference_exe=0 unmap_cost=21 unmap_exe=0 >> dirty_unmap_cost=20 dirty_unmap_exe=0 pageout_cost=0 pageout_exe=0 > Are you seeing measurable changes for any workloads? It certainly seems > like you should, but it would help if you chose a test from mmtests and > showed how performance changed on your system. In one mmtest, the max times for a invalid recyling of a folio_list dirty folio that does not support pageout and has been activated in shrink_folio_list() are: cost=51us, exe=2365us. Calculate according to this formula: dirty_cost / total_cost * 100%, the recyling efficiency of dirty folios can be improved 53.13%、82.95%. So this patch can optimize shrink efficiency and reduce the workload of kswapd to a certain extent. kswapd0-96 ( 96) [005] ..... 387.218548: mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 kswapd0-96 ( 96) [006] ..... 412.822532: mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC total_cost 88 total_exe 605 dirty_cost 73 total_exe 605
On Mon, Oct 23, 2023 at 04:07:28PM +0800, zhiguojiang wrote: > > Are you seeing measurable changes for any workloads? It certainly seems > > like you should, but it would help if you chose a test from mmtests and > > showed how performance changed on your system. > In one mmtest, the max times for a invalid recyling of a folio_list dirty > folio that does not support pageout and has been activated in > shrink_folio_list() are: cost=51us, exe=2365us. > > Calculate according to this formula: dirty_cost / total_cost * 100%, the > recyling efficiency of dirty folios can be improved 53.13%、82.95%. > > So this patch can optimize shrink efficiency and reduce the workload of > kswapd to a certain extent. > > kswapd0-96 ( 96) [005] ..... 387.218548: > mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 > nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 > nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC > total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 > > kswapd0-96 ( 96) [006] ..... 412.822532: > mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 > nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 > nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC > total_cost 88 total_exe 605 dirty_cost 73 total_exe 605 I appreciate that you can put probes in and determine the cost, but do you see improvements for a real workload? Like doing a kernel compile -- does it speed up at all?
在 2023/10/23 20:21, Matthew Wilcox 写道: > On Mon, Oct 23, 2023 at 04:07:28PM +0800, zhiguojiang wrote: >>> Are you seeing measurable changes for any workloads? It certainly seems >>> like you should, but it would help if you chose a test from mmtests and >>> showed how performance changed on your system. >> In one mmtest, the max times for a invalid recyling of a folio_list dirty >> folio that does not support pageout and has been activated in >> shrink_folio_list() are: cost=51us, exe=2365us. >> >> Calculate according to this formula: dirty_cost / total_cost * 100%, the >> recyling efficiency of dirty folios can be improved 53.13%、82.95%. >> >> So this patch can optimize shrink efficiency and reduce the workload of >> kswapd to a certain extent. >> >> kswapd0-96 ( 96) [005] ..... 387.218548: >> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 >> nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 >> nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >> total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 >> >> kswapd0-96 ( 96) [006] ..... 412.822532: >> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 >> nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 >> nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >> total_cost 88 total_exe 605 dirty_cost 73 total_exe 605 > I appreciate that you can put probes in and determine the cost, but do > you see improvements for a real workload? Like doing a kernel compile > -- does it speed up at all? Can you help share a method for testing thread workload, like kswapd? Thanks.
On Mon, Oct 23, 2023 at 08:44:55PM +0800, zhiguojiang wrote: > 在 2023/10/23 20:21, Matthew Wilcox 写道: > > On Mon, Oct 23, 2023 at 04:07:28PM +0800, zhiguojiang wrote: > > > > Are you seeing measurable changes for any workloads? It certainly seems > > > > like you should, but it would help if you chose a test from mmtests and > > > > showed how performance changed on your system. > > > In one mmtest, the max times for a invalid recyling of a folio_list dirty > > > folio that does not support pageout and has been activated in > > > shrink_folio_list() are: cost=51us, exe=2365us. > > > > > > Calculate according to this formula: dirty_cost / total_cost * 100%, the > > > recyling efficiency of dirty folios can be improved 53.13%、82.95%. > > > > > > So this patch can optimize shrink efficiency and reduce the workload of > > > kswapd to a certain extent. > > > > > > kswapd0-96 ( 96) [005] ..... 387.218548: > > > mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 > > > nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 > > > nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC > > > total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 > > > > > > kswapd0-96 ( 96) [006] ..... 412.822532: > > > mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 > > > nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 > > > nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC > > > total_cost 88 total_exe 605 dirty_cost 73 total_exe 605 > > I appreciate that you can put probes in and determine the cost, but do > > you see improvements for a real workload? Like doing a kernel compile > > -- does it speed up at all? > Can you help share a method for testing thread workload, like kswapd? Something dirt simple like 'time make -j8'.
在 2023/10/23 21:01, Matthew Wilcox 写道: > On Mon, Oct 23, 2023 at 08:44:55PM +0800, zhiguojiang wrote: >> 在 2023/10/23 20:21, Matthew Wilcox 写道: >>> On Mon, Oct 23, 2023 at 04:07:28PM +0800, zhiguojiang wrote: >>>>> Are you seeing measurable changes for any workloads? It certainly seems >>>>> like you should, but it would help if you chose a test from mmtests and >>>>> showed how performance changed on your system. >>>> In one mmtest, the max times for a invalid recyling of a folio_list dirty >>>> folio that does not support pageout and has been activated in >>>> shrink_folio_list() are: cost=51us, exe=2365us. >>>> >>>> Calculate according to this formula: dirty_cost / total_cost * 100%, the >>>> recyling efficiency of dirty folios can be improved 53.13%、82.95%. >>>> >>>> So this patch can optimize shrink efficiency and reduce the workload of >>>> kswapd to a certain extent. >>>> >>>> kswapd0-96 ( 96) [005] ..... 387.218548: >>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 >>>> nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 >>>> nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>> total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 >>>> >>>> kswapd0-96 ( 96) [006] ..... 412.822532: >>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 >>>> nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 >>>> nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>> total_cost 88 total_exe 605 dirty_cost 73 total_exe 605 >>> I appreciate that you can put probes in and determine the cost, but do >>> you see improvements for a real workload? Like doing a kernel compile >>> -- does it speed up at all? >> Can you help share a method for testing thread workload, like kswapd? > Something dirt simple like 'time make -j8'. Two compilations were conducted separately, and compared to the unmodified compilation, the compilation time for adding modified patches had a certain reduction, as follows: Compilation command: make distclean -j8 make ARCH=x86_64 x86_64_defconfig time make -j8 1.Unmodified Compilation time: real 2m40.276s user 16m2.956s sys 2m14.738s real 2m40.136s user 16m2.617s sys 2m14.722s 2.[Patch v2 1/2] Modified Compilation time: real 2m40.067s user 16m3.164s sys 2m14.211s real 2m40.123s user 16m2.439s sys 2m14.508s 3 [Patch v2 1/2] + [Patch v2 2/2] Modified Compilation time: real 2m40.367s user 16m3.738s sys 2m13.662s real 2m40.014s user 16m3.108s sys 2m14.096s
在 2023/10/23 21:01, Matthew Wilcox 写道: > On Mon, Oct 23, 2023 at 08:44:55PM +0800, zhiguojiang wrote: >> 在 2023/10/23 20:21, Matthew Wilcox 写道: >>> On Mon, Oct 23, 2023 at 04:07:28PM +0800, zhiguojiang wrote: >>>>> Are you seeing measurable changes for any workloads? It certainly seems >>>>> like you should, but it would help if you chose a test from mmtests and >>>>> showed how performance changed on your system. >>>> In one mmtest, the max times for a invalid recyling of a folio_list dirty >>>> folio that does not support pageout and has been activated in >>>> shrink_folio_list() are: cost=51us, exe=2365us. >>>> >>>> Calculate according to this formula: dirty_cost / total_cost * 100%, the >>>> recyling efficiency of dirty folios can be improved 53.13%、82.95%. >>>> >>>> So this patch can optimize shrink efficiency and reduce the workload of >>>> kswapd to a certain extent. >>>> >>>> kswapd0-96 ( 96) [005] ..... 387.218548: >>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 >>>> nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 >>>> nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>> total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 >>>> >>>> kswapd0-96 ( 96) [006] ..... 412.822532: >>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 >>>> nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 >>>> nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>> total_cost 88 total_exe 605 dirty_cost 73 total_exe 605 >>> I appreciate that you can put probes in and determine the cost, but do >>> you see improvements for a real workload? Like doing a kernel compile >>> -- does it speed up at all? >> Can you help share a method for testing thread workload, like kswapd? > Something dirt simple like 'time make -j8'. Two compilations were conducted separately, and compared to the unmodified compilation, the compilation time for adding modified patches had a certain reduction, as follows: Compilation command: make distclean -j8 make ARCH=x86_64 x86_64_defconfig time make -j8 1.Unmodified Compilation time: real 2m40.276s user 16m2.956s sys 2m14.738s real 2m40.136s user 16m2.617s sys 2m14.722s 2.[Patch v2 1/2] Modified Compilation time: real 2m40.067s user 16m3.164s sys 2m14.211s real 2m40.123s user 16m2.439s sys 2m14.508s 3.[Patch v2 1/2] + [Patch v2 2/2] Modified Compilation time: real 2m40.367s user 16m3.738s sys 2m13.662s real 2m40.014s user 16m3.108s sys 2m14.096s Thanks
On 24.10.23 04:04, zhiguojiang wrote: > > > 在 2023/10/23 21:01, Matthew Wilcox 写道: >> On Mon, Oct 23, 2023 at 08:44:55PM +0800, zhiguojiang wrote: >>> 在 2023/10/23 20:21, Matthew Wilcox 写道: >>>> On Mon, Oct 23, 2023 at 04:07:28PM +0800, zhiguojiang wrote: >>>>>> Are you seeing measurable changes for any workloads? It certainly seems >>>>>> like you should, but it would help if you chose a test from mmtests and >>>>>> showed how performance changed on your system. >>>>> In one mmtest, the max times for a invalid recyling of a folio_list dirty >>>>> folio that does not support pageout and has been activated in >>>>> shrink_folio_list() are: cost=51us, exe=2365us. >>>>> >>>>> Calculate according to this formula: dirty_cost / total_cost * 100%, the >>>>> recyling efficiency of dirty folios can be improved 53.13%、82.95%. >>>>> >>>>> So this patch can optimize shrink efficiency and reduce the workload of >>>>> kswapd to a certain extent. >>>>> >>>>> kswapd0-96 ( 96) [005] ..... 387.218548: >>>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 >>>>> nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 >>>>> nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>>> total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 >>>>> >>>>> kswapd0-96 ( 96) [006] ..... 412.822532: >>>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 nr_taken 32 >>>>> nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 >>>>> nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>>> total_cost 88 total_exe 605 dirty_cost 73 total_exe 605 >>>> I appreciate that you can put probes in and determine the cost, but do >>>> you see improvements for a real workload? Like doing a kernel compile >>>> -- does it speed up at all? >>> Can you help share a method for testing thread workload, like kswapd? >> Something dirt simple like 'time make -j8'. > Two compilations were conducted separately, and compared to the > unmodified compilation, > the compilation time for adding modified patches had a certain > reduction, as follows: > > Compilation command: > make distclean -j8 > make ARCH=x86_64 x86_64_defconfig > time make -j8 > > 1.Unmodified Compilation time: > real 2m40.276s > user 16m2.956s > sys 2m14.738s > > real 2m40.136s > user 16m2.617s > sys 2m14.722s > > 2.[Patch v2 1/2] Modified Compilation time: > real 2m40.067s > user 16m3.164s > sys 2m14.211s > > real 2m40.123s > user 16m2.439s > sys 2m14.508s > > 3 [Patch v2 1/2] + [Patch v2 2/2] Modified Compilation time: > real 2m40.367s > user 16m3.738s > sys 2m13.662s > > real 2m40.014s > user 16m3.108s > sys 2m14.096s > To get expressive numbers two iterations are usually not sufficient. How much memory does you system have? Does vmscan even ever get active?
在 2023/10/24 15:07, David Hildenbrand 写道: > On 24.10.23 04:04, zhiguojiang wrote: >> >> >> 在 2023/10/23 21:01, Matthew Wilcox 写道: >>> On Mon, Oct 23, 2023 at 08:44:55PM +0800, zhiguojiang wrote: >>>> 在 2023/10/23 20:21, Matthew Wilcox 写道: >>>>> On Mon, Oct 23, 2023 at 04:07:28PM +0800, zhiguojiang wrote: >>>>>>> Are you seeing measurable changes for any workloads? It >>>>>>> certainly seems >>>>>>> like you should, but it would help if you chose a test from >>>>>>> mmtests and >>>>>>> showed how performance changed on your system. >>>>>> In one mmtest, the max times for a invalid recyling of a >>>>>> folio_list dirty >>>>>> folio that does not support pageout and has been activated in >>>>>> shrink_folio_list() are: cost=51us, exe=2365us. >>>>>> >>>>>> Calculate according to this formula: dirty_cost / total_cost * >>>>>> 100%, the >>>>>> recyling efficiency of dirty folios can be improved 53.13%、82.95%. >>>>>> >>>>>> So this patch can optimize shrink efficiency and reduce the >>>>>> workload of >>>>>> kswapd to a certain extent. >>>>>> >>>>>> kswapd0-96 ( 96) [005] ..... 387.218548: >>>>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 >>>>>> nr_taken 32 >>>>>> nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 >>>>>> nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>>>> total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 >>>>>> >>>>>> kswapd0-96 ( 96) [006] ..... 412.822532: >>>>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 >>>>>> nr_taken 32 >>>>>> nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 >>>>>> nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>>>> total_cost 88 total_exe 605 dirty_cost 73 total_exe 605 >>>>> I appreciate that you can put probes in and determine the cost, >>>>> but do >>>>> you see improvements for a real workload? Like doing a kernel >>>>> compile >>>>> -- does it speed up at all? >>>> Can you help share a method for testing thread workload, like kswapd? >>> Something dirt simple like 'time make -j8'. >> Two compilations were conducted separately, and compared to the >> unmodified compilation, >> the compilation time for adding modified patches had a certain >> reduction, as follows: >> >> Compilation command: >> make distclean -j8 >> make ARCH=x86_64 x86_64_defconfig >> time make -j8 >> >> 1.Unmodified Compilation time: >> real 2m40.276s >> user 16m2.956s >> sys 2m14.738s >> >> real 2m40.136s >> user 16m2.617s >> sys 2m14.722s >> >> 2.[Patch v2 1/2] Modified Compilation time: >> real 2m40.067s >> user 16m3.164s >> sys 2m14.211s >> >> real 2m40.123s >> user 16m2.439s >> sys 2m14.508s >> >> 3 [Patch v2 1/2] + [Patch v2 2/2] Modified Compilation time: >> real 2m40.367s >> user 16m3.738s >> sys 2m13.662s >> >> real 2m40.014s >> user 16m3.108s >> sys 2m14.096s >> > > To get expressive numbers two iterations are usually not sufficient. > How much memory does you system have? Does vmscan even ever get active? Test system memory: MemTotal: 8161608 kB. When multiple Apps were opened, vmscan can get active. I can capture a lot of tracelog data through testing, I only posted two sets of tracelog data.
在 2023/10/24 15:21, zhiguojiang 写道: > > > 在 2023/10/24 15:07, David Hildenbrand 写道: >> On 24.10.23 04:04, zhiguojiang wrote: >>> >>> >>> 在 2023/10/23 21:01, Matthew Wilcox 写道: >>>> On Mon, Oct 23, 2023 at 08:44:55PM +0800, zhiguojiang wrote: >>>>> 在 2023/10/23 20:21, Matthew Wilcox 写道: >>>>>> On Mon, Oct 23, 2023 at 04:07:28PM +0800, zhiguojiang wrote: >>>>>>>> Are you seeing measurable changes for any workloads? It >>>>>>>> certainly seems >>>>>>>> like you should, but it would help if you chose a test from >>>>>>>> mmtests and >>>>>>>> showed how performance changed on your system. >>>>>>> In one mmtest, the max times for a invalid recyling of a >>>>>>> folio_list dirty >>>>>>> folio that does not support pageout and has been activated in >>>>>>> shrink_folio_list() are: cost=51us, exe=2365us. >>>>>>> >>>>>>> Calculate according to this formula: dirty_cost / total_cost * >>>>>>> 100%, the >>>>>>> recyling efficiency of dirty folios can be improved 53.13%、82.95%. >>>>>>> >>>>>>> So this patch can optimize shrink efficiency and reduce the >>>>>>> workload of >>>>>>> kswapd to a certain extent. >>>>>>> >>>>>>> kswapd0-96 ( 96) [005] ..... 387.218548: >>>>>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 >>>>>>> nr_taken 32 >>>>>>> nr_reclaimed 31 nr_dirty 1 nr_unqueued_dirty 1 nr_writeback 0 >>>>>>> nr_activate[1] 1 nr_ref_keep 0 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>>>>> total_cost 96 total_exe 2365 dirty_cost 51 total_exe 2365 >>>>>>> >>>>>>> kswapd0-96 ( 96) [006] ..... 412.822532: >>>>>>> mm_vmscan_lru_shrink_inactive: [Justin] nid 0 nr_scanned 32 >>>>>>> nr_taken 32 >>>>>>> nr_reclaimed 0 nr_dirty 32 nr_unqueued_dirty 32 nr_writeback 0 >>>>>>> nr_activate[1] 19 nr_ref_keep 13 f RECLAIM_WB_FILE|RECLAIM_WB_ASYNC >>>>>>> total_cost 88 total_exe 605 dirty_cost 73 total_exe 605 >>>>>> I appreciate that you can put probes in and determine the cost, >>>>>> but do >>>>>> you see improvements for a real workload? Like doing a kernel >>>>>> compile >>>>>> -- does it speed up at all? >>>>> Can you help share a method for testing thread workload, like kswapd? >>>> Something dirt simple like 'time make -j8'. >>> Two compilations were conducted separately, and compared to the >>> unmodified compilation, >>> the compilation time for adding modified patches had a certain >>> reduction, as follows: >>> >>> Compilation command: >>> make distclean -j8 >>> make ARCH=x86_64 x86_64_defconfig >>> time make -j8 >>> >>> 1.Unmodified Compilation time: >>> real 2m40.276s >>> user 16m2.956s >>> sys 2m14.738s >>> >>> real 2m40.136s >>> user 16m2.617s >>> sys 2m14.722s >>> >>> 2.[Patch v2 1/2] Modified Compilation time: >>> real 2m40.067s >>> user 16m3.164s >>> sys 2m14.211s >>> >>> real 2m40.123s >>> user 16m2.439s >>> sys 2m14.508s >>> >>> 3 [Patch v2 1/2] + [Patch v2 2/2] Modified Compilation time: >>> real 2m40.367s >>> user 16m3.738s >>> sys 2m13.662s >>> >>> real 2m40.014s >>> user 16m3.108s >>> sys 2m14.096s >>> >> >> To get expressive numbers two iterations are usually not sufficient. >> How much memory does you system have? Does vmscan even ever get active? > Test system memory: MemTotal: 8161608 kB. When multiple Apps were > opened, vmscan can get active. I can capture a lot of tracelog data > through testing, I only posted two sets of tracelog data. Hi, please help to continue reviewing this path and draw a conclusion on whether it can be merged. Thanks. > >
diff --git a/mm/vmscan.c b/mm/vmscan.c index a68d01fcc307..e067269275a5 100755 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -925,6 +925,44 @@ static void folio_check_dirty_writeback(struct folio *folio, mapping->a_ops->is_dirty_writeback(folio, dirty, writeback); } +/* Check if a dirty folio can support pageout in the recyling process*/ +static bool folio_check_pageout(struct folio *folio, + struct pglist_data *pgdat) +{ + int ret = true; + + /* + * Anonymous folios are not handled by flushers and must be written + * from reclaim context. Do not stall reclaim based on them. + * MADV_FREE anonymous folios are put into inactive file list too. + * They could be mistakenly treated as file lru. So further anon + * test is needed. + */ + if (!folio_is_file_lru(folio) || + (folio_test_anon(folio) && !folio_test_swapbacked(folio))) + goto out; + + if (folio_test_dirty(folio) && + (!current_is_kswapd() || + !folio_test_reclaim(folio) || + !test_bit(PGDAT_DIRTY, &pgdat->flags))) { + /* + * Immediately reclaim when written back. + * Similar in principle to folio_deactivate() + * except we already have the folio isolated + * and know it's dirty + */ + node_stat_mod_folio(folio, NR_VMSCAN_IMMEDIATE, + folio_nr_pages(folio)); + folio_set_reclaim(folio); + + ret = false; + } + +out: + return ret; +} + static struct folio *alloc_demote_folio(struct folio *src, unsigned long private) { @@ -1078,6 +1116,12 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, if (dirty && !writeback) stat->nr_unqueued_dirty += nr_pages; + /* If the dirty folio dose not support pageout, + * the dirty folio can skip this recycling. + */ + if (!folio_check_pageout(folio, pgdat)) + goto activate_locked; + /* * Treat this folio as congested if folios are cycling * through the LRU so quickly that the folios marked @@ -1261,43 +1305,6 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, enum ttu_flags flags = TTU_BATCH_FLUSH; bool was_swapbacked = folio_test_swapbacked(folio); - if (folio_test_dirty(folio)) { - /* - * Only kswapd can writeback filesystem folios - * to avoid risk of stack overflow. But avoid - * injecting inefficient single-folio I/O into - * flusher writeback as much as possible: only - * write folios when we've encountered many - * dirty folios, and when we've already scanned - * the rest of the LRU for clean folios and see - * the same dirty folios again (with the reclaim - * flag set). - */ - if (folio_is_file_lru(folio) && - (!current_is_kswapd() || - !folio_test_reclaim(folio) || - !test_bit(PGDAT_DIRTY, &pgdat->flags))) { - /* - * Immediately reclaim when written back. - * Similar in principle to folio_deactivate() - * except we already have the folio isolated - * and know it's dirty - */ - node_stat_mod_folio(folio, NR_VMSCAN_IMMEDIATE, - nr_pages); - folio_set_reclaim(folio); - - goto activate_locked; - } - - if (references == FOLIOREF_RECLAIM_CLEAN) - goto keep_locked; - if (!may_enter_fs(folio, sc->gfp_mask)) - goto keep_locked; - if (!sc->may_writepage) - goto keep_locked; - } - if (folio_test_pmd_mappable(folio)) flags |= TTU_SPLIT_HUGE_PMD; @@ -1323,6 +1330,28 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, mapping = folio_mapping(folio); if (folio_test_dirty(folio)) { + /* + * Only kswapd can writeback filesystem folios + * to avoid risk of stack overflow. But avoid + * injecting inefficient single-folio I/O into + * flusher writeback as much as possible: only + * write folios when we've encountered many + * dirty folios, and when we've already scanned + * the rest of the LRU for clean folios and see + * the same dirty folios again (with the reclaim + * flag set). + */ + if (folio_is_file_lru(folio) && + !folio_check_pageout(folio, pgdat)) + goto activate_locked; + + if (references == FOLIOREF_RECLAIM_CLEAN) + goto keep_locked; + if (!may_enter_fs(folio, sc->gfp_mask)) + goto keep_locked; + if (!sc->may_writepage) + goto keep_locked; + /* * Folio is dirty. Flush the TLB if a writable entry * potentially exists to avoid CPU writes after I/O