Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp122740ybb; Thu, 2 Apr 2020 22:42:46 -0700 (PDT) X-Google-Smtp-Source: APiQypLaPtLAkmPPfNroRHWleKuohp+rDmalSOrspye1GMYYXFZgjN3ZAknSwSUupu/cF4FwvFbn X-Received: by 2002:a05:6808:495:: with SMTP id z21mr1927215oid.30.1585892566647; Thu, 02 Apr 2020 22:42:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585892566; cv=none; d=google.com; s=arc-20160816; b=bTd5/g66z2HE1MiyRXz90irxqPGdb3n3jfjTKTk2890QoLmtGdVXDj+dOpnzA062pf p2Bgl9qLCMze7xOn45+4iCsRIxBNOJRL1EwxJmLaJfLNBfKoEjXow/ovwhuvKtgtfVKW KN4qpNcHFb9KonIsrgswO9r54qMEx3DRXYbAM1hnPnybkgxep58j9nrOqdlb6RLTiHHp xGrmiRIqNFvTQFiCCCrbDHDFdDWWFtrwR1MUB8oQRJmfzqJL3RbGgNj77w6gwri6KmK3 O2kMyBxy46kCeTl/oHT8J/kv7n66zCKONWqowyX9CMb3KlMsseY07pYSRMj6ZUM6lBlW QMog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=PGmzb8UxKP2obZ2hRRmNukkpDvHaqG21Hk67bEIKtgs=; b=Tbb8F+4StsebDD0w0lSKNLdz1FDovxPIo5OhSqEmmItCIa45QGWpchVk8oz0tSR/mE y3F2EvyA7ekjtYfZPlO+9pCfjoo73mneTQ+yXYFhFqONxqMO95zK/9dKzZahLZy/Lxr1 vz98ZiKVLjAbwVb1dBYMTt0uxnLRo4HF3ZmoN4e7SMSPUi8AsWnM2lQiLOkmp/CIo4nV BOzpU6+Gf0taunDPPi68t6FLsSQcyqxG/tlFr3sF1G1tZOWSXHZvvpnjqLlLLyRZ5jHM 2TcfbKcMHST7a2zvHxiv8lSZWe0PE2FJudssL37FazdRn0NGl70Hxbxwf+ld0hFkIHW+ BPnA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JR09QoXS; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y1si3198878oti.52.2020.04.02.22.42.33; Thu, 02 Apr 2020 22:42:46 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JR09QoXS; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388127AbgDCFlc (ORCPT + 99 others); Fri, 3 Apr 2020 01:41:32 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:36086 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729349AbgDCFlb (ORCPT ); Fri, 3 Apr 2020 01:41:31 -0400 Received: by mail-pg1-f193.google.com with SMTP id c23so3002078pgj.3 for ; Thu, 02 Apr 2020 22:41:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=PGmzb8UxKP2obZ2hRRmNukkpDvHaqG21Hk67bEIKtgs=; b=JR09QoXSNbBg28nXbmYJlqlma5NOT/BgLD7wvGBTcGFvGFAgYtLCu9nwNnjHYHQbOr ckoEOrXwaHenjnuBQpp76655Fa9RoUQBOIh2xtKt0s51R+krtPiiB4JXvkDqIRttqHac D07zPODRsve+ZnUojsGvjnBE5Ae4ZjtpAzb20e5/FBsedcY+05C00GR14mJWEi7rMKmW nk1QQoUuK6iuxsqdWhUaGiG4EjCCUSpVLrbfLtdP9EoA8KrfdyXTPRQiwq8FniJKd1MY 9xF1BUt7WX4khFtCnUjj1WHB1jQMlg3R6M9eYNprhtBGUAyw9eoda8F04p394gFIg5lE yazw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=PGmzb8UxKP2obZ2hRRmNukkpDvHaqG21Hk67bEIKtgs=; b=mhhaICbD/joDUeBc7c3TXClmSjCKCKnnRapMt9hNwE4vaHHjgQqhNnCWFtdlk3yPsW 5m32VcQs5xAUABZmrUoQ42diSmeEABgSqKNlFPqaLg86fm0C+whGsqlY0ohKr96zeD87 qsVWUguTsYcwv/7IQmlPSDWZzXzzEdzHPKzawcBvgg93lx0BVpS0thdOYRA1mLULWQ/T MQc9jbhVnBryPpzUSAvcihaG5k4owJQbvD1/X363b3KXqaoniRafNDPNfNRG1yumE412 rwNiorqQi87tuZzauNlUICfU1BlUgD8CaqlIbOwGDRCDM7+aCLDtht2vko08TDrpoBiZ kK0A== X-Gm-Message-State: AGi0PuapXggmG9qTorNrCzi02yhwC9RewtkEzcTTr/oafzE27vklt2Ds xY6RsuwnMReBVMRyWXzyD/c= X-Received: by 2002:aa7:8f29:: with SMTP id y9mr5726738pfr.19.1585892490028; Thu, 02 Apr 2020 22:41:30 -0700 (PDT) Received: from localhost.localdomain ([114.206.198.176]) by smtp.gmail.com with ESMTPSA id e6sm4568295pgu.44.2020.04.02.22.41.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 02 Apr 2020 22:41:29 -0700 (PDT) From: js1304@gmail.com X-Google-Original-From: iamjoonsoo.kim@lge.com To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Johannes Weiner , Michal Hocko , Hugh Dickins , Minchan Kim , Vlastimil Babka , Mel Gorman , kernel-team@lge.com, Joonsoo Kim Subject: [PATCH v5 07/10] mm/workingset: support to remember the previous owner of the page Date: Fri, 3 Apr 2020 14:40:45 +0900 Message-Id: <1585892447-32059-8-git-send-email-iamjoonsoo.kim@lge.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1585892447-32059-1-git-send-email-iamjoonsoo.kim@lge.com> References: <1585892447-32059-1-git-send-email-iamjoonsoo.kim@lge.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joonsoo Kim This patch supports to remember the previous owner of the page. Since there is not enough spare bits in shadow entry for this information, only a few bits of the memcg id of the page is stored. Although this information is insufficient, it would provide enough level of the ability to check the previous owner. This patch is for the preparation of the following patch, "mm/swap: do not readahead if the previous owner of the swap entry isn't me". Signed-off-by: Joonsoo Kim --- mm/workingset.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/mm/workingset.c b/mm/workingset.c index 59415e0..871b867 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -168,8 +168,20 @@ * refault distance will immediately activate the refaulting page. */ +/* + * memcg_tag will be used to check the previous owner of the page. + * Since we don't have enough spare bits in shadow entry, just a few + * bits are used to approximate the previous owner. + */ +#if BITS_PER_LONG == 32 +#define PAGE_MEMCG_TAG_SHIFT 4 +#else +#define PAGE_MEMCG_TAG_SHIFT 8 +#endif + #define EVICTION_SHIFT ((BITS_PER_LONG - BITS_PER_XA_VALUE) + \ - 1 + NODES_SHIFT + MEM_CGROUP_ID_SHIFT) + 1 + NODES_SHIFT + MEM_CGROUP_ID_SHIFT + \ + PAGE_MEMCG_TAG_SHIFT) #define EVICTION_MASK (~0UL >> EVICTION_SHIFT) /* @@ -182,11 +194,12 @@ */ static unsigned int bucket_order __read_mostly; -static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction, - bool workingset) +static void *pack_shadow(int memcgid, int page_memcg_tag, pg_data_t *pgdat, + unsigned long eviction, bool workingset) { eviction >>= bucket_order; eviction &= EVICTION_MASK; + eviction = (eviction << PAGE_MEMCG_TAG_SHIFT) | page_memcg_tag; eviction = (eviction << MEM_CGROUP_ID_SHIFT) | memcgid; eviction = (eviction << NODES_SHIFT) | pgdat->node_id; eviction = (eviction << 1) | workingset; @@ -194,11 +207,12 @@ static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction, return xa_mk_value(eviction); } -static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat, - unsigned long *evictionp, bool *workingsetp) +static void unpack_shadow(void *shadow, int *memcgidp, int *page_memcg_tagp, + pg_data_t **pgdat, unsigned long *evictionp, + bool *workingsetp) { unsigned long entry = xa_to_value(shadow); - int memcgid, nid; + int memcgid, page_memcg_tag, nid; bool workingset; workingset = entry & 1; @@ -207,8 +221,11 @@ static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat, entry >>= NODES_SHIFT; memcgid = entry & ((1UL << MEM_CGROUP_ID_SHIFT) - 1); entry >>= MEM_CGROUP_ID_SHIFT; + page_memcg_tag = entry & ((1UL << PAGE_MEMCG_TAG_SHIFT) - 1); + entry >>= PAGE_MEMCG_TAG_SHIFT; *memcgidp = memcgid; + *page_memcg_tagp = page_memcg_tag; *pgdat = NODE_DATA(nid); *evictionp = entry << bucket_order; *workingsetp = workingset; @@ -248,9 +265,9 @@ void *workingset_eviction(struct page *page, struct mem_cgroup *target_memcg) { struct pglist_data *pgdat = page_pgdat(page); bool file = page_is_file_cache(page); + int memcgid, page_memcg_tag; unsigned long eviction; struct lruvec *lruvec; - int memcgid; /* Page is fully exclusive and pins page->mem_cgroup */ VM_BUG_ON_PAGE(PageLRU(page), page); @@ -262,8 +279,11 @@ void *workingset_eviction(struct page *page, struct mem_cgroup *target_memcg) lruvec = mem_cgroup_lruvec(target_memcg, pgdat); /* XXX: target_memcg can be NULL, go through lruvec */ memcgid = mem_cgroup_id(lruvec_memcg(lruvec)); + page_memcg_tag = mem_cgroup_id(page_memcg(page)); + page_memcg_tag &= (1UL << PAGE_MEMCG_TAG_SHIFT) - 1; eviction = atomic_long_read(&lruvec->inactive_age[file]); - return pack_shadow(memcgid, pgdat, eviction, PageWorkingset(page)); + return pack_shadow(memcgid, page_memcg_tag, pgdat, eviction, + PageWorkingset(page)); } /** @@ -281,6 +301,7 @@ void workingset_refault(struct page *page, void *shadow) struct mem_cgroup *eviction_memcg; struct lruvec *eviction_lruvec; unsigned long refault_distance; + int memcgid, page_memcg_tag; struct pglist_data *pgdat; struct mem_cgroup *memcg; unsigned long eviction; @@ -288,9 +309,9 @@ void workingset_refault(struct page *page, void *shadow) unsigned long refault; unsigned long active; bool workingset; - int memcgid; - unpack_shadow(shadow, &memcgid, &pgdat, &eviction, &workingset); + unpack_shadow(shadow, &memcgid, &page_memcg_tag, + &pgdat, &eviction, &workingset); rcu_read_lock(); /* -- 2.7.4