From patchwork Wed Feb 19 18:25:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Sultan Alsawaf (unemployed)" X-Patchwork-Id: 11392283 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CD9CA92A for ; Wed, 19 Feb 2020 18:25:44 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8F31324670 for ; Wed, 19 Feb 2020 18:25:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ErnGyphI" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8F31324670 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kerneltoast.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id C61DA6B0003; Wed, 19 Feb 2020 13:25:43 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id C12AA6B0006; Wed, 19 Feb 2020 13:25:43 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B28B26B0007; Wed, 19 Feb 2020 13:25:43 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0110.hostedemail.com [216.40.44.110]) by kanga.kvack.org (Postfix) with ESMTP id 990146B0003 for ; Wed, 19 Feb 2020 13:25:43 -0500 (EST) Received: from smtpin24.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 51394180AD802 for ; Wed, 19 Feb 2020 18:25:43 +0000 (UTC) X-FDA: 76507704966.24.rat84_6c16087b02862 X-Spam-Summary: 2,0,0,31a78dd3b1fa7d87,d41d8cd98f00b204,sultan@kerneltoast.com,:sultan@kerneltoast.com:akpm@linux-foundation.org::linux-kernel@vger.kernel.org,RULES_HIT:41:355:379:387:541:800:960:965:966:973:981:988:989:1260:1311:1314:1345:1431:1437:1515:1535:1543:1711:1730:1747:1777:1792:2196:2198:2199:2200:2393:2559:2562:2731:2899:3138:3139:3140:3141:3142:3354:3865:3866:3867:3868:3870:3872:3874:4117:4250:4321:4385:4390:4395:4605:5007:6119:6261:6653:7576:7875:8603:9121:10004:11026:11658:11914:12043:12294:12296:12297:12438:12517:12519:12555:12679:12895:13894:13972:14096:14394:14721:21094:21323:21324:21444:21451:21627:21740:21987:21990:30054:30070,0,RBL:209.85.215.196:@mail-pg1-f196.google.com:.lbl8.mailshell.net-66.100.201.100 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:hn,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:23,LUA_SUMMARY:none X-HE-Tag: rat84_6c16087b02862 X-Filterd-Recvd-Size: 6325 Received: from mail-pg1-f196.google.com (mail-pg1-f196.google.com [209.85.215.196]) by imf38.hostedemail.com (Postfix) with ESMTP for ; Wed, 19 Feb 2020 18:25:42 +0000 (UTC) Received: by mail-pg1-f196.google.com with SMTP id j4so522138pgi.1 for ; Wed, 19 Feb 2020 10:25:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=bqZVrRoOAUt9UUKGyxeCCPnn57dTnI4JXggwFljPBlE=; b=ErnGyphInuohGNozRNte3SyvYzrsJDZkzP/OAgyDBsr5BDxAntKa4H2D96y+Ab33a+ 07wt6qeEnZ+l9aPtnv/Npiw48a2O0zCICWt69+2r5FWOnOHJEkbcouUmYGNgvMNFax8h aPcYAY5QWne+u+T9gHmV2q0J6rgSbkM8cXt67vLo5rNzqI24X/VIGDj8d6HIzATDwRFG nSKAYQD9hpn4rYCQwNkAjQ91eM9asJQ2H3q8c1a90luzuG+B8nyxm36+mQXcYgVBXnkf F/jZ+saQvZ8M+IZYW3948C0risNEyKikWm95S8fhpEGPENEzdw4vXf8nJD11n8IiI7CE AbDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; bh=bqZVrRoOAUt9UUKGyxeCCPnn57dTnI4JXggwFljPBlE=; b=KlS9D6H5br1B3p6keiWwC9aU6jutXxEBlplXPTPzY3n4f+M62rjnJ31pJViRMNk/1v hB8h4nqkQj2LUeKlG6SN2CDfZpl1AUA8E51nrgl+epuYYR49RnWIewjBUFkgZGemSMJo n+gHPXH+G0Aag7tGZABAQ2CT5tKXTvAs7+gDpHLQMht7pegGH8mKsTKicXemUynuOOFg IR+HaK57Spd0bpCccfrJT/mN7BEkjYLtMziXSkinWNKwomMK3AvRVS001Avoh0BVQECm Fov74cSOJSbwF8XkmiArcoMLBiwZ/Ts7Lr5bOhF1dZ+lNbGHjWbfdWbXwxaLow+4WIba oEYA== X-Gm-Message-State: APjAAAUkR+kswZLMR6PPfnOcaKM3htYatRkCNjNpcDuk3T/uPoqj0C9i lk5TOc/2LfwhlP4AGAOBHj8= X-Google-Smtp-Source: APXvYqwT679RENHBGltOCmpBZU2SH7qLnxN6MgBWl+jf5LO4Vf+qbeP9hyVtzy3+ySIDonRDodMuSQ== X-Received: by 2002:a63:565b:: with SMTP id g27mr29181514pgm.309.1582136741605; Wed, 19 Feb 2020 10:25:41 -0800 (PST) Received: from sultan-book.localdomain ([104.200.129.62]) by smtp.gmail.com with ESMTPSA id t15sm389874pgr.60.2020.02.19.10.25.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2020 10:25:40 -0800 (PST) From: Sultan Alsawaf X-Google-Original-From: Sultan Alsawaf To: Cc: Sultan Alsawaf , Andrew Morton , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH] mm: Stop kswapd early when nothing's waiting for it to free pages Date: Wed, 19 Feb 2020 10:25:22 -0800 Message-Id: <20200219182522.1960-1-sultan@kerneltoast.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000001, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: Sultan Alsawaf Keeping kswapd running when all the failed allocations that invoked it are satisfied incurs a high overhead due to unnecessary page eviction and writeback, as well as spurious VM pressure events to various registered shrinkers. When kswapd doesn't need to work to make an allocation succeed anymore, stop it prematurely to save resources. Signed-off-by: Sultan Alsawaf --- include/linux/mmzone.h | 2 ++ mm/page_alloc.c | 17 ++++++++++++++--- mm/vmscan.c | 3 ++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 462f6873905a..49c922abfb90 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -20,6 +20,7 @@ #include #include #include +#include #include /* Free memory management - zoned buddy allocator. */ @@ -735,6 +736,7 @@ typedef struct pglist_data { unsigned long node_spanned_pages; /* total size of physical page range, including holes */ int node_id; + refcount_t kswapd_waiters; wait_queue_head_t kswapd_wait; wait_queue_head_t pfmemalloc_wait; struct task_struct *kswapd; /* Protected by diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3c4eb750a199..2d4caacfd2fc 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -4401,6 +4401,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, int no_progress_loops; unsigned int cpuset_mems_cookie; int reserve_flags; + pg_data_t *pgdat = ac->preferred_zoneref->zone->zone_pgdat; + bool woke_kswapd = false; /* * We also sanity check to catch abuse of atomic reserves being used by @@ -4434,8 +4436,13 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, if (!ac->preferred_zoneref->zone) goto nopage; - if (alloc_flags & ALLOC_KSWAPD) + if (alloc_flags & ALLOC_KSWAPD) { + if (!woke_kswapd) { + refcount_inc(&pgdat->kswapd_waiters); + woke_kswapd = true; + } wake_all_kswapds(order, gfp_mask, ac); + } /* * The adjusted alloc_flags might result in immediate success, so try @@ -4640,9 +4647,12 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, goto retry; } fail: - warn_alloc(gfp_mask, ac->nodemask, - "page allocation failure: order:%u", order); got_pg: + if (woke_kswapd) + refcount_dec(&pgdat->kswapd_waiters); + if (!page) + warn_alloc(gfp_mask, ac->nodemask, + "page allocation failure: order:%u", order); return page; } @@ -6711,6 +6721,7 @@ static void __meminit pgdat_init_internals(struct pglist_data *pgdat) pgdat_page_ext_init(pgdat); spin_lock_init(&pgdat->lru_lock); lruvec_init(&pgdat->__lruvec); + pgdat->kswapd_waiters = (refcount_t)REFCOUNT_INIT(0); } static void __meminit zone_init_internals(struct zone *zone, enum zone_type idx, int nid, diff --git a/mm/vmscan.c b/mm/vmscan.c index c05eb9efec07..e795add372d1 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3694,7 +3694,8 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int classzone_idx) __fs_reclaim_release(); ret = try_to_freeze(); __fs_reclaim_acquire(); - if (ret || kthread_should_stop()) + if (ret || kthread_should_stop() || + !refcount_read(&pgdat->kswapd_waiters)) break; /*