From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 609E7C43217 for ; Fri, 24 Dec 2021 06:23:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E614A6B0098; Fri, 24 Dec 2021 01:23:35 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id E10416B0099; Fri, 24 Dec 2021 01:23:35 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CD70D6B009B; Fri, 24 Dec 2021 01:23:35 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0160.hostedemail.com [216.40.44.160]) by kanga.kvack.org (Postfix) with ESMTP id BC4D96B0098 for ; Fri, 24 Dec 2021 01:23:35 -0500 (EST) Received: from smtpin21.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 85D4E181AC9C6 for ; Fri, 24 Dec 2021 06:23:35 +0000 (UTC) X-FDA: 78951696390.21.4414110 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf01.hostedemail.com (Postfix) with ESMTP id EDE8A4003C for ; Fri, 24 Dec 2021 06:23:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=/Q0isz8WI1dRYHiEBg5IDdHPmjAQ8SBD2o3pbSMjbLk=; b=vsFGvk9HVnwrk27KUtLShPyqZC Dd+LiQt6FXHbproD4RJOQZuDp0lFhlkswFqp6qjer1YaU6lO0PqK7EPQeVdP4iD1Z8nQR5aBfOhHT rSnMTREbhd+LRZnZah80G+Fh5IR6JzqyNB4bDVKtWb8HvLHCG0GAsuFHwx2Sa1RWv5QcZ9c4j6x9g J15NZIPM6iWi+cn7rI87uZ/T5Khga9GQ+NtedNQUZ2px6jXgCC6fvLVVM94L7BNd9t+0R0tIfoqwW NETCfZZCd0amaOhDmBJSGAYW8R/tR4rKSRww10fN8/0qsf+HfrCMR+bqyGRuUBjhyVj9WgukNaqNS Y6NcwRHg==; Received: from p4fdb0b85.dip0.t-ipconnect.de ([79.219.11.133] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1n0dzA-00Dn9k-Kd; Fri, 24 Dec 2021 06:23:25 +0000 From: Christoph Hellwig To: Andrew Morton , Konrad Rzeszutek Wilk Cc: Hugh Dickins , Seth Jennings , Dan Streetman , Vitaly Wool , Matthew Wilcox , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH 12/13] frontswap: remove support for multiple ops Date: Fri, 24 Dec 2021 07:22:45 +0100 Message-Id: <20211224062246.1258487-13-hch@lst.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211224062246.1258487-1-hch@lst.de> References: <20211224062246.1258487-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=vsFGvk9H; dmarc=none; spf=none (imf01.hostedemail.com: domain of BATV+afcec93cc8ffef6ccdbc+6697+infradead.org+hch@bombadil.srs.infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=BATV+afcec93cc8ffef6ccdbc+6697+infradead.org+hch@bombadil.srs.infradead.org X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: EDE8A4003C X-Stat-Signature: 5htxs9u875rrwmz5npzypju7x4myw4em X-HE-Tag: 1640327006-956932 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: There is only a single instance of frontswap ops in the kernel, so simplify the frontswap code by removing support for multiple operations. Signed-off-by: Christoph Hellwig --- include/linux/frontswap.h | 3 +-- mm/frontswap.c | 50 ++++++++++----------------------------- mm/zswap.c | 8 +++++-- 3 files changed, 19 insertions(+), 42 deletions(-) diff --git a/include/linux/frontswap.h b/include/linux/frontswap.h index c5b2848d22404..a631bac12220c 100644 --- a/include/linux/frontswap.h +++ b/include/linux/frontswap.h @@ -13,10 +13,9 @@ struct frontswap_ops { int (*load)(unsigned, pgoff_t, struct page *); /* load a page */ void (*invalidate_page)(unsigned, pgoff_t); /* page no longer needed */ void (*invalidate_area)(unsigned); /* swap type just swapoff'ed */ - struct frontswap_ops *next; /* private pointer to next ops */ }; =20 -extern void frontswap_register_ops(struct frontswap_ops *ops); +int frontswap_register_ops(const struct frontswap_ops *ops); =20 extern void frontswap_init(unsigned type, unsigned long *map); extern int __frontswap_store(struct page *page); diff --git a/mm/frontswap.c b/mm/frontswap.c index 35040fa4eba83..6f69b044a8cc7 100644 --- a/mm/frontswap.c +++ b/mm/frontswap.c @@ -27,10 +27,7 @@ DEFINE_STATIC_KEY_FALSE(frontswap_enabled_key); * may be registered, but implementations can never deregister. This * is a simple singly-linked list of all registered implementations. */ -static struct frontswap_ops *frontswap_ops __read_mostly; - -#define for_each_frontswap_ops(ops) \ - for ((ops) =3D frontswap_ops; (ops); (ops) =3D (ops)->next) +static const struct frontswap_ops *frontswap_ops __read_mostly; =20 #ifdef CONFIG_DEBUG_FS /* @@ -97,18 +94,14 @@ static inline void inc_frontswap_invalidates(void) { = } /* * Register operations for frontswap */ -void frontswap_register_ops(struct frontswap_ops *ops) +int frontswap_register_ops(const struct frontswap_ops *ops) { - /* - * Setting frontswap_ops must happen after the ops->init() calls - * above; cmpxchg implies smp_mb() which will ensure the init is - * complete at this point. - */ - do { - ops->next =3D frontswap_ops; - } while (cmpxchg(&frontswap_ops, ops->next, ops) !=3D ops->next); + if (frontswap_ops) + return -EINVAL; =20 + frontswap_ops =3D ops; static_branch_inc(&frontswap_enabled_key); + return 0; } =20 /* @@ -117,7 +110,6 @@ void frontswap_register_ops(struct frontswap_ops *ops= ) void frontswap_init(unsigned type, unsigned long *map) { struct swap_info_struct *sis =3D swap_info[type]; - struct frontswap_ops *ops; =20 VM_BUG_ON(sis =3D=3D NULL); =20 @@ -133,9 +125,7 @@ void frontswap_init(unsigned type, unsigned long *map= ) * p->frontswap set to something valid to work properly. */ frontswap_map_set(sis, map); - - for_each_frontswap_ops(ops) - ops->init(type); + frontswap_ops->init(type); } =20 static bool __frontswap_test(struct swap_info_struct *sis, @@ -174,7 +164,6 @@ int __frontswap_store(struct page *page) int type =3D swp_type(entry); struct swap_info_struct *sis =3D swap_info[type]; pgoff_t offset =3D swp_offset(entry); - struct frontswap_ops *ops; =20 VM_BUG_ON(!frontswap_ops); VM_BUG_ON(!PageLocked(page)); @@ -188,16 +177,10 @@ int __frontswap_store(struct page *page) */ if (__frontswap_test(sis, offset)) { __frontswap_clear(sis, offset); - for_each_frontswap_ops(ops) - ops->invalidate_page(type, offset); + frontswap_ops->invalidate_page(type, offset); } =20 - /* Try to store in each implementation, until one succeeds. */ - for_each_frontswap_ops(ops) { - ret =3D ops->store(type, offset, page); - if (!ret) /* successful store */ - break; - } + ret =3D frontswap_ops->store(type, offset, page); if (ret =3D=3D 0) { __frontswap_set(sis, offset); inc_frontswap_succ_stores(); @@ -220,7 +203,6 @@ int __frontswap_load(struct page *page) int type =3D swp_type(entry); struct swap_info_struct *sis =3D swap_info[type]; pgoff_t offset =3D swp_offset(entry); - struct frontswap_ops *ops; =20 VM_BUG_ON(!frontswap_ops); VM_BUG_ON(!PageLocked(page)); @@ -230,11 +212,7 @@ int __frontswap_load(struct page *page) return -1; =20 /* Try loading from each implementation, until one succeeds. */ - for_each_frontswap_ops(ops) { - ret =3D ops->load(type, offset, page); - if (!ret) /* successful load */ - break; - } + ret =3D frontswap_ops->load(type, offset, page); if (ret =3D=3D 0) inc_frontswap_loads(); return ret; @@ -247,7 +225,6 @@ int __frontswap_load(struct page *page) void __frontswap_invalidate_page(unsigned type, pgoff_t offset) { struct swap_info_struct *sis =3D swap_info[type]; - struct frontswap_ops *ops; =20 VM_BUG_ON(!frontswap_ops); VM_BUG_ON(sis =3D=3D NULL); @@ -255,8 +232,7 @@ void __frontswap_invalidate_page(unsigned type, pgoff= _t offset) if (!__frontswap_test(sis, offset)) return; =20 - for_each_frontswap_ops(ops) - ops->invalidate_page(type, offset); + frontswap_ops->invalidate_page(type, offset); __frontswap_clear(sis, offset); inc_frontswap_invalidates(); } @@ -268,7 +244,6 @@ void __frontswap_invalidate_page(unsigned type, pgoff= _t offset) void __frontswap_invalidate_area(unsigned type) { struct swap_info_struct *sis =3D swap_info[type]; - struct frontswap_ops *ops; =20 VM_BUG_ON(!frontswap_ops); VM_BUG_ON(sis =3D=3D NULL); @@ -276,8 +251,7 @@ void __frontswap_invalidate_area(unsigned type) if (sis->frontswap_map =3D=3D NULL) return; =20 - for_each_frontswap_ops(ops) - ops->invalidate_area(type); + frontswap_ops->invalidate_area(type); atomic_set(&sis->frontswap_pages, 0); bitmap_zero(sis->frontswap_map, sis->max); } diff --git a/mm/zswap.c b/mm/zswap.c index 7944e3e57e781..cdf6950fcb2e3 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -1378,7 +1378,7 @@ static void zswap_frontswap_init(unsigned type) zswap_trees[type] =3D tree; } =20 -static struct frontswap_ops zswap_frontswap_ops =3D { +static const struct frontswap_ops zswap_frontswap_ops =3D { .store =3D zswap_frontswap_store, .load =3D zswap_frontswap_load, .invalidate_page =3D zswap_frontswap_invalidate_page, @@ -1475,11 +1475,15 @@ static int __init init_zswap(void) if (!shrink_wq) goto fallback_fail; =20 - frontswap_register_ops(&zswap_frontswap_ops); + ret =3D frontswap_register_ops(&zswap_frontswap_ops); + if (ret) + goto destroy_wq; if (zswap_debugfs_init()) pr_warn("debugfs initialization failed\n"); return 0; =20 +destroy_wq: + destroy_workqueue(shrink_wq); fallback_fail: if (pool) zswap_pool_destroy(pool); --=20 2.30.2