Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2384618pxb; Thu, 11 Feb 2021 10:57:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJyzHatkRQa4+p1YwcLtthRa/syiu1zf5z3fY/Yszg6Zlr+7chGGqwxIUVVhFIIitphHVd2P X-Received: by 2002:a17:906:30c4:: with SMTP id b4mr9775618ejb.456.1613069842595; Thu, 11 Feb 2021 10:57:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613069842; cv=none; d=google.com; s=arc-20160816; b=BCXuTb28XFoMD1DT1Vw+5a1qtTGhYlN3pAmxlAehX/B0Xu803ai4rcZt5gdVrCR1eO qrk9Rldl/rMottnAqJPraWIG6EnL2CbRDZrHWLFNISWKwYvCVQ9NIp5qWQElgC40PQ1P JQnR+NRm6x7qvp+HKxod5SELaPZl328nJMMRq/D2FdJ5jWvIMRwpOD7QfC87gdeSobGB 4zSWOMZP60SXUJdgO8z3Ryv+p5QzExhheLIY35N0PmtKZ7uX9vNyCr673L7JihdZ4oYH x5xUHQGY7V8238UxhcA3R6k8Fr9MCfWbglCS30BU6Psyko1hf/tiOO8N87BxTvYow8Gl mnEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:subject:from :references:cc:to; bh=dPy7JHHJl3tfbLdpekj9SqK0ayGv3UlmgZhNU7I7tQU=; b=TsIlvji263dg7QkOn28ycvwf2F7EHdBVPFxs9RPkVyUhMNr+HbYYIQMuxSs6UDG/Fx SNy5ZROWJLzCqo0vKX0r3MCTMhjzyYjM36zqRhJ1TCpmg3l3PpvJ+E4jaq8xSY9iNJtD t//COZPcQ7dr9+vm6ATv9GgcjBs+2M7h4ST0rqsvHy/MNdrMkNHoV55QddXiPrSMZGDB gIaVTmnoJj/jgyNEsAHKS9fG00+uxQPN5b6x4YB+cg/yacXRgpjLwXYN4mc5hIJ/x1fe eK43OaERLLx9XdQknI/evhEu/agtvouoi/L2W+O/TbEnhCamyf0ET4xJ8/gfLO3k578c K0LQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p11si4124465ejo.704.2021.02.11.10.56.55; Thu, 11 Feb 2021 10:57:22 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229959AbhBKSxF (ORCPT + 99 others); Thu, 11 Feb 2021 13:53:05 -0500 Received: from mx2.suse.de ([195.135.220.15]:57182 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229553AbhBKSxD (ORCPT ); Thu, 11 Feb 2021 13:53:03 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 4F3B9AE3D; Thu, 11 Feb 2021 18:52:21 +0000 (UTC) To: Yang Shi Cc: Roman Gushchin , Kirill Tkhai , Shakeel Butt , Dave Chinner , Johannes Weiner , Michal Hocko , Andrew Morton , Linux MM , Linux FS-devel Mailing List , Linux Kernel Mailing List References: <20210209174646.1310591-1-shy828301@gmail.com> <20210209174646.1310591-13-shy828301@gmail.com> From: Vlastimil Babka Subject: Re: [v7 PATCH 12/12] mm: vmscan: shrink deferred objects proportional to priority Message-ID: Date: Thu, 11 Feb 2021 19:52:20 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2/11/21 6:29 PM, Yang Shi wrote: > On Thu, Feb 11, 2021 at 5:10 AM Vlastimil Babka wrote: >> > trace_mm_shrink_slab_start(shrinker, shrinkctl, nr, >> > freeable, delta, total_scan, priority); >> > @@ -737,10 +708,9 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl, >> > cond_resched(); >> > } >> > >> > - if (next_deferred >= scanned) >> > - next_deferred -= scanned; >> > - else >> > - next_deferred = 0; >> > + next_deferred = max_t(long, (nr - scanned), 0) + total_scan; >> >> And here's the bias I think. Suppose we scanned 0 due to e.g. GFP_NOFS. We count >> as newly deferred both the "delta" part of total_scan, which is fine, but also >> the "nr >> priority" part, where we failed to our share of the "reduce >> nr_deferred" work, but I don't think it means we should also increase >> nr_deferred by that amount of failed work. > > Here "nr" is the saved deferred work since the last scan, "scanned" is > the scanned work in this round, total_scan is the *unscanned" work > which is actually "total_scan - scanned" (total_scan is decreased by > scanned in each loop). So, the logic is "decrease any scanned work > from deferred then add newly unscanned work to deferred". IIUC this is > what "deferred" means even before this patch. Hm I thought the logic was "increase by any new work (delta) that wasn't done, decrease by old deferred work that was done now". My examples with scanned = 0 and scanned = total_work (total_work before subtracting scanned from it) should demonstrate that the logic is different with your patch. >> OTOH if we succeed and scan exactly the whole goal, we are subtracting from >> nr_deferred both the "nr >> priority" part, which is correct, but also delta, >> which was new work, not deferred one, so that's incorrect IMHO as well. > > I don't think so. The deferred comes from new work, why not dec new > work from deferred? > > And, the old code did: > > if (next_deferred >= scanned) > next_deferred -= scanned; > else > next_deferred = 0; > > IIUC, it also decreases the new work (the scanned includes both last > deferred and new delata). Yes, but in the old code, next_deferred starts as nr = count_nr_deferred()... total_scan = nr; delta = ... // something based on freeable total_scan += delta; next_deferred = total_scan; // in the common case total_scan >= 0 ... and that's "total_scan" before "scanned" is subtracted from it, so it includes the new_work ("delta"), so then it's OK to do "next_deferred -= scanned"; I still think your formula is (unintentionally) changing the logic. You can also look at it from different angle, it's effectively (without the max_t() part) "nr - scanned + total_scan" where total_scan is actually "total_scan - scanned" as you point your yourself. So "scanned" is subtracted twice? That can't be correct... >> So the calculation should probably be something like this? >> >> next_deferred = max_t(long, nr + delta - scanned, 0); >> >> Thanks, >> Vlastimil >> >> > + next_deferred = min(next_deferred, (2 * freeable)); >> > + >> > /* >> > * move the unused scan count back into the shrinker in a >> > * manner that handles concurrent updates. >> > >> >