Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756213AbcDDROH (ORCPT ); Mon, 4 Apr 2016 13:14:07 -0400 Received: from gum.cmpxchg.org ([85.214.110.215]:49026 "EHLO gum.cmpxchg.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755579AbcDDROA (ORCPT ); Mon, 4 Apr 2016 13:14:00 -0400 From: Johannes Weiner To: Andres Freund , Rik van Riel , Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [PATCH 1/3] mm: workingset: only do workingset activations on reads Date: Mon, 4 Apr 2016 13:13:36 -0400 Message-Id: <1459790018-6630-2-git-send-email-hannes@cmpxchg.org> X-Mailer: git-send-email 2.8.0 In-Reply-To: <1459790018-6630-1-git-send-email-hannes@cmpxchg.org> References: <1459790018-6630-1-git-send-email-hannes@cmpxchg.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1708 Lines: 43 From: Rik van Riel When rewriting a page, the data in that page is replaced with new data. This means that evicting something else from the active file list, in order to cache data that will be replaced by something else, is likely to be a waste of memory. It is better to save the active list for frequently read pages, because reads actually use the data that is in the page. This patch ignores partial writes, because it is unclear whether the complexity of identifying those is worth any potential performance gain obtained from better caching pages that see repeated partial writes at large enough intervals to not get caught by the use-twice promotion code used for the inactive file list. Reported-by: Andres Freund Signed-off-by: Rik van Riel Signed-off-by: Johannes Weiner --- mm/filemap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mm/filemap.c b/mm/filemap.c index a8c69c8..ca33816 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -713,8 +713,12 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping, * The page might have been evicted from cache only * recently, in which case it should be activated like * any other repeatedly accessed page. + * The exception is pages getting rewritten; evicting other + * data from the working set, only to cache data that will + * get overwritten with something else, is a waste of memory. */ - if (shadow && workingset_refault(shadow)) { + if (!(gfp_mask & __GFP_WRITE) && + shadow && workingset_refault(shadow)) { SetPageActive(page); workingset_activation(page); } else -- 2.8.0