Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp21543pxy; Tue, 4 May 2021 17:34:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwjcBPyUob1jpHjq+fTJ/HNzo4N1AkmtmPFxadj18smn/HqZqBo6MK6Bp4azf9MC3JD1c1N X-Received: by 2002:a50:fe04:: with SMTP id f4mr28732357edt.29.1620174851401; Tue, 04 May 2021 17:34:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620174851; cv=none; d=google.com; s=arc-20160816; b=C9+XPfPeFjWQAPUH1v7KLBNj3BUB7G22ldjqb65PQcLUAVE+Vlic3DqkRrPtMDaIaa JZuGA7fydDvgnsgUPpe2HZr+lG08G3yoz+sgZ9gipZTuCJmyEP2IZpWr+j9wL1eDlsXn OM/60UXXhFE3CKK+Wq1icxxAflJnpRf7KJuZ5a7bnGJpUWYqE5z2IAl/e70b/lV/WYb1 FEL62TjKT2cavZ21Ik50JEAP8e5IC9wHDJQDwNfc6yTRX6J3oKI7sXurX3Veqsr6KMQI SI2s781a4Oxr96dahd6mBeI0IHvmT5YLveNMkPxI/yhr64HTw4WpGQdu5PEcoTBbIaCl kulg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=AtYBZoGelCArEWAD6QrtXNLnADDOEuNW/NHuVvEJa74=; b=L2oGWnnPcK6V0/4APyozpiMqPmAXzyTXDFoywtYhL3PrrNbaTQ7oLxvLrSlXOoYxld nIqNJUZWm6Sk9wLWTQW2SopWx0YvB2vZr0wnh/EK64iPm7dFYhShQMVo64GwP8rImekn QRVHYdLOHYlA7FqL5K8RAsVCwSnPGym9ViQHKbXeD+5Gbvd2OE/O34pO9Hu5sx5pamV0 HemIVvyum6IyH85QD6CsndL+kAnLYmDZUnujXzHk5WI7hOyOJA0kdM46VdvJPLII1hUg UO/vKAlZs503j9JK3HaYeJRLcZhCppyFMfIX0YhZ1lhfSFypT84tWh6KhBR2efKaAdqw 5rUg== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j7si3906926ejn.636.2021.05.04.17.33.48; Tue, 04 May 2021 17:34:11 -0700 (PDT) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231348AbhEEAdW (ORCPT + 99 others); Tue, 4 May 2021 20:33:22 -0400 Received: from mga04.intel.com ([192.55.52.120]:19816 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231177AbhEEAdU (ORCPT ); Tue, 4 May 2021 20:33:20 -0400 IronPort-SDR: CduZpVemIEzKeRwaddUi07K33mB3RhW0O0gokckv5W78QQfhmrhJjVokVN/RawK8crBibm86Xa 6ZStwABT1pTw== X-IronPort-AV: E=McAfee;i="6200,9189,9974"; a="196058585" X-IronPort-AV: E=Sophos;i="5.82,273,1613462400"; d="scan'208";a="196058585" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 May 2021 17:32:25 -0700 IronPort-SDR: Iqxtos5fBejOav42mmvTJRDDIz1U5Vp7QaFm+HjYB+C39Wrj+ro+IYxYBe5DN6g/vXjOtSpPYM b0fjED5YE9tg== X-IronPort-AV: E=Sophos;i="5.82,273,1613462400"; d="scan'208";a="429490755" Received: from rpedgeco-mobl3.amr.corp.intel.com (HELO localhost.intel.com) ([10.209.26.68]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 May 2021 17:32:24 -0700 From: Rick Edgecombe To: dave.hansen@intel.com, luto@kernel.org, peterz@infradead.org, linux-mm@kvack.org, x86@kernel.org, akpm@linux-foundation.org, linux-hardening@vger.kernel.org, kernel-hardening@lists.openwall.com Cc: ira.weiny@intel.com, rppt@kernel.org, dan.j.williams@intel.com, linux-kernel@vger.kernel.org, Rick Edgecombe Subject: [PATCH RFC 1/9] list: Support getting most recent element in list_lru Date: Tue, 4 May 2021 17:30:24 -0700 Message-Id: <20210505003032.489164-2-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210505003032.489164-1-rick.p.edgecombe@intel.com> References: <20210505003032.489164-1-rick.p.edgecombe@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In future patches, some functionality will use list_lru that also needs to keep track of the most recently used element on a node. Since this information is already contained within list_lru, add a function to get it so that an additional list is not needed in the caller. Do not support memcg aware list_lru's since it is not needed by the intended caller. Signed-off-by: Rick Edgecombe --- include/linux/list_lru.h | 13 +++++++++++++ mm/list_lru.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/include/linux/list_lru.h b/include/linux/list_lru.h index 9dcaa3e582c9..4bde44a5024b 100644 --- a/include/linux/list_lru.h +++ b/include/linux/list_lru.h @@ -103,6 +103,19 @@ bool list_lru_add(struct list_lru *lru, struct list_head *item); */ bool list_lru_del(struct list_lru *lru, struct list_head *item); +/** + * list_lru_get_mru: gets and removes the tail from one of the node lists + * @list_lru: the lru pointer + * @nid: the node id + * + * This function removes the most recently added item from one of the node + * id specified. This function should not be used if the list_lru is memcg + * aware. + * + * Return value: The element removed + */ +struct list_head *list_lru_get_mru(struct list_lru *lru, int nid); + /** * list_lru_count_one: return the number of objects currently held by @lru * @lru: the lru pointer. diff --git a/mm/list_lru.c b/mm/list_lru.c index 6f067b6b935f..fd5b19dcfc72 100644 --- a/mm/list_lru.c +++ b/mm/list_lru.c @@ -156,6 +156,34 @@ bool list_lru_del(struct list_lru *lru, struct list_head *item) } EXPORT_SYMBOL_GPL(list_lru_del); +struct list_head *list_lru_get_mru(struct list_lru *lru, int nid) +{ + struct list_lru_node *nlru = &lru->node[nid]; + struct list_lru_one *l = &nlru->lru; + struct list_head *ret; + + /* This function does not attempt to search through the memcg lists */ + if (list_lru_memcg_aware(lru)) { + WARN_ONCE(1, "list_lru: %s not supported on memcg aware list_lrus", __func__); + return NULL; + } + + spin_lock(&nlru->lock); + if (list_empty(&l->list)) { + ret = NULL; + } else { + /* Get tail */ + ret = l->list.prev; + list_del_init(ret); + + l->nr_items--; + nlru->nr_items--; + } + spin_unlock(&nlru->lock); + + return ret; +} + void list_lru_isolate(struct list_lru_one *list, struct list_head *item) { list_del_init(item); -- 2.30.2