linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Zi Yan <ziy@nvidia.com>,
	"Matthew Wilcox (Oracle)" <willy@infradead.org>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.11 11/23] XArray: Fix splitting to non-zero orders
Date: Thu, 15 Apr 2021 16:48:18 +0200	[thread overview]
Message-ID: <20210415144413.508495936@linuxfoundation.org> (raw)
In-Reply-To: <20210415144413.146131392@linuxfoundation.org>

From: Matthew Wilcox (Oracle) <willy@infradead.org>

[ Upstream commit 3012110d71f41410932924e1d188f9eb57f1f824 ]

Splitting an order-4 entry into order-2 entries would leave the array
containing pointers to 000040008000c000 instead of 000044448888cccc.
This is a one-character fix, but enhance the test suite to check this
case.

Reported-by: Zi Yan <ziy@nvidia.com>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 lib/test_xarray.c | 26 ++++++++++++++------------
 lib/xarray.c      |  4 ++--
 2 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/lib/test_xarray.c b/lib/test_xarray.c
index 8294f43f4981..8b1c318189ce 100644
--- a/lib/test_xarray.c
+++ b/lib/test_xarray.c
@@ -1530,24 +1530,24 @@ static noinline void check_store_range(struct xarray *xa)
 
 #ifdef CONFIG_XARRAY_MULTI
 static void check_split_1(struct xarray *xa, unsigned long index,
-							unsigned int order)
+				unsigned int order, unsigned int new_order)
 {
-	XA_STATE(xas, xa, index);
-	void *entry;
-	unsigned int i = 0;
+	XA_STATE_ORDER(xas, xa, index, new_order);
+	unsigned int i;
 
 	xa_store_order(xa, index, order, xa, GFP_KERNEL);
 
 	xas_split_alloc(&xas, xa, order, GFP_KERNEL);
 	xas_lock(&xas);
 	xas_split(&xas, xa, order);
+	for (i = 0; i < (1 << order); i += (1 << new_order))
+		__xa_store(xa, index + i, xa_mk_index(index + i), 0);
 	xas_unlock(&xas);
 
-	xa_for_each(xa, index, entry) {
-		XA_BUG_ON(xa, entry != xa);
-		i++;
+	for (i = 0; i < (1 << order); i++) {
+		unsigned int val = index + (i & ~((1 << new_order) - 1));
+		XA_BUG_ON(xa, xa_load(xa, index + i) != xa_mk_index(val));
 	}
-	XA_BUG_ON(xa, i != 1 << order);
 
 	xa_set_mark(xa, index, XA_MARK_0);
 	XA_BUG_ON(xa, !xa_get_mark(xa, index, XA_MARK_0));
@@ -1557,14 +1557,16 @@ static void check_split_1(struct xarray *xa, unsigned long index,
 
 static noinline void check_split(struct xarray *xa)
 {
-	unsigned int order;
+	unsigned int order, new_order;
 
 	XA_BUG_ON(xa, !xa_empty(xa));
 
 	for (order = 1; order < 2 * XA_CHUNK_SHIFT; order++) {
-		check_split_1(xa, 0, order);
-		check_split_1(xa, 1UL << order, order);
-		check_split_1(xa, 3UL << order, order);
+		for (new_order = 0; new_order < order; new_order++) {
+			check_split_1(xa, 0, order, new_order);
+			check_split_1(xa, 1UL << order, order, new_order);
+			check_split_1(xa, 3UL << order, order, new_order);
+		}
 	}
 }
 #else
diff --git a/lib/xarray.c b/lib/xarray.c
index 5fa51614802a..ed775dee1074 100644
--- a/lib/xarray.c
+++ b/lib/xarray.c
@@ -1011,7 +1011,7 @@ void xas_split_alloc(struct xa_state *xas, void *entry, unsigned int order,
 
 	do {
 		unsigned int i;
-		void *sibling;
+		void *sibling = NULL;
 		struct xa_node *node;
 
 		node = kmem_cache_alloc(radix_tree_node_cachep, gfp);
@@ -1021,7 +1021,7 @@ void xas_split_alloc(struct xa_state *xas, void *entry, unsigned int order,
 		for (i = 0; i < XA_CHUNK_SIZE; i++) {
 			if ((i & mask) == 0) {
 				RCU_INIT_POINTER(node->slots[i], entry);
-				sibling = xa_mk_sibling(0);
+				sibling = xa_mk_sibling(i);
 			} else {
 				RCU_INIT_POINTER(node->slots[i], sibling);
 			}
-- 
2.30.2




  parent reply	other threads:[~2021-04-15 15:15 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-15 14:48 [PATCH 5.11 00/23] 5.11.15-rc1 review Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 01/23] interconnect: core: fix error return code of icc_link_destroy() Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 02/23] gfs2: Flag a withdraw if init_threads() fails Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 03/23] KVM: arm64: Hide system instruction access to Trace registers Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 04/23] KVM: arm64: Disable guest access to trace filter controls Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 05/23] drm/imx: imx-ldb: fix out of bounds array access warning Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 06/23] gfs2: report "already frozen/thawed" errors Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 07/23] ftrace: Check if pages were allocated before calling free_pages() Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 08/23] tools/kvm_stat: Add restart delay Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 09/23] drm/tegra: dc: Dont set PLL clock to 0Hz Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 10/23] gpu: host1x: Use different lock classes for each client Greg Kroah-Hartman
2021-04-15 14:48 ` Greg Kroah-Hartman [this message]
2021-04-15 14:48 ` [PATCH 5.11 12/23] radix tree test suite: Fix compilation Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 13/23] block: only update parent bi_status when bio fail Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 14/23] radix tree test suite: Register the main thread with the RCU library Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 15/23] idr test suite: Take RCU read lock in idr_find_test_1 Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 16/23] idr test suite: Create anchor before launching throbber Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 17/23] null_blk: fix command timeout completion handling Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 18/23] io_uring: dont mark S_ISBLK async work as unbounded Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 19/23] riscv,entry: fix misaligned base for excp_vect_table Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 20/23] block: dont ignore REQ_NOWAIT for direct IO Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 21/23] netfilter: x_tables: fix compat match/target pad out-of-bound write Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 22/23] perf map: Tighten snprintf() string precision to pass gcc check on some 32-bit arches Greg Kroah-Hartman
2021-04-15 14:48 ` [PATCH 5.11 23/23] net: sfp: cope with SFPs that set both LOS normal and LOS inverted Greg Kroah-Hartman
2021-04-15 22:42 ` [PATCH 5.11 00/23] 5.11.15-rc1 review Shuah Khan
2021-04-16  1:02 ` Naresh Kamboju
2021-04-16 17:31 ` Fox Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210415144413.508495936@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=willy@infradead.org \
    --cc=ziy@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).