lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <malwmirqnpuxqkqrobcmzfkmmxipoyzwfs2nwc5fbpxlt2r2ej@wchmjtaljvw3>
Date: Tue, 3 Feb 2026 12:26:44 -0500
From: "Liam R. Howlett" <Liam.Howlett@...cle.com>
To: Andrew Morton <akpm@...ux-foundation.org>
Cc: maple-tree@...ts.infradead.org, linux-mm@...ck.org,
        linux-kernel@...r.kernel.org, Suren Baghdasaryan <surenb@...gle.com>,
        Matthew Wilcox <willy@...radead.org>,
        Sidhartha Kumar <sidhartha.kumar@...cle.com>,
        Vlastimil Babka <vbabka@...e.cz>, Alice Ryhl <aliceryhl@...gle.com>,
        Kuninori Morimoto <kuninori.morimoto.gx@...esas.com>,
        Geert Uytterhoeven <geert@...ux-m68k.org>,
        Arnd Bergmann <arnd@...db.de>, Christian Kujau <lists@...dbynature.de>,
        SeongJae Park <sj@...nel.org>
Subject: Re: [PATCH v3 21/30] maple_tree: Add cp_is_new_root() helper


Andrew,

Please apply this fix to remove warnings on older compilers.  I've compiled the
lot against gcc 8.1 and 9.3 with only this fix needed.

Thanks again, SJ, for looking at these patches!

Regards,
Liam

-------------------------------------------------------------------------------
diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index 42038e42a4c7e..22cbaba72931f 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -3361,7 +3361,7 @@ static inline bool cp_is_new_root(struct maple_copy *cp, struct ma_state *mas)
                 * read-side operations that can view it until it is insert into
                 * the tree after an rcu_assign_pointer() call.
                 */
-               RCU_INIT_POINTER(cp->slot[0], mt_mk_node(cp->dst[0].node, mt));
+               ma_init_slot(cp->slot[0], cp->dst[0].node, mt);
                cp->height++;
        }
        WARN_ON_ONCE(cp->dst[0].node != mte_to_node(

-------------------------------------------------------------------------------

* Liam R. Howlett <Liam.Howlett@...cle.com> [260130 16:00]:
> Add a helper to do what is needed when the maple copy node contains a
> new root node.  This is useful for future commits and is
> self-documenting code.
> 
> Signed-off-by: Liam R. Howlett <Liam.Howlett@...cle.com>
> ---
>  lib/maple_tree.c | 70 ++++++++++++++++++++++++++----------------------
>  1 file changed, 38 insertions(+), 32 deletions(-)
> 
> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> index 5280fa6d2d6ec..42038e42a4c7e 100644
> --- a/lib/maple_tree.c
> +++ b/lib/maple_tree.c
> @@ -3337,6 +3337,43 @@ static void mas_spanning_rebalance(struct ma_state *mas,
>  	mas_spanning_rebalance_loop(mas, mast, count);
>  }
>  
> +static inline bool cp_is_new_root(struct maple_copy *cp, struct ma_state *mas)
> +{
> +	if (cp->min || cp->max != ULONG_MAX)
> +		return false;
> +
> +	if (cp->d_count != 1) {
> +		enum maple_type mt = maple_arange_64;
> +
> +		if (!mt_is_alloc(mas->tree))
> +			mt = maple_range_64;
> +
> +		cp->data = cp->d_count;
> +		cp->s_count = 0;
> +		dst_setup(cp, mas, mt);
> +		init_cp_src(cp);
> +		node_copy(mas, cp->src[0].node, 0, cp->data, cp->max, maple_copy,
> +			  cp->dst[0].node, 0, mt);
> +		node_finalise(cp->dst[0].node, mt, cp->end + 1);
> +		/*
> +		 * Warning, see cp_leaf_init() comment and rcu_assign_pointer()
> +		 * documentation.  Since this is a new root, there are no
> +		 * read-side operations that can view it until it is insert into
> +		 * the tree after an rcu_assign_pointer() call.
> +		 */
> +		RCU_INIT_POINTER(cp->slot[0], mt_mk_node(cp->dst[0].node, mt));
> +		cp->height++;
> +	}
> +	WARN_ON_ONCE(cp->dst[0].node != mte_to_node(
> +				mt_slot_locked(mas->tree, cp->slot, 0)));
> +	cp->dst[0].node->parent = ma_parent_ptr(mas_tree_parent(mas));
> +	mas->min = 0;
> +	mas->max = ULONG_MAX;
> +	mas->depth = 0;
> +	mas->node = mas_root_locked(mas);
> +	return true;
> +}
> +
>  /*
>   * spanning_ascend() - See if a spanning store operation has to keep walking up
>   * the tree
> @@ -3359,39 +3396,8 @@ static bool spanning_ascend(struct maple_copy *cp, struct ma_state *mas,
>  	}
>  
>  	cp_dst_to_slots(cp, l_wr_mas->mas->min, r_wr_mas->mas->max, mas);
> -	if (!cp->min && cp->max == ULONG_MAX) {
> -		/* New root */
> -		if (cp->d_count != 1) {
> -			enum maple_type mt = maple_arange_64;
> -
> -			if (!mt_is_alloc(mas->tree))
> -				mt = maple_range_64;
> -
> -			cp->data = cp->d_count;
> -			cp->s_count = 0;
> -			dst_setup(cp, mas, mt);
> -			init_cp_src(cp);
> -			node_copy(mas, cp->src[0].node, 0, cp->data, cp->max, maple_copy,
> -				  cp->dst[0].node, 0, mt);
> -			node_finalise(cp->dst[0].node, mt, cp->end + 1);
> -			/*
> -			 * Warning, see cp_leaf_init() comment and rcu_assign_pointer()
> -			 * documentation.  Since this is a new root, there are no
> -			 * read-side operations that can view it until it is insert into
> -			 * the tree after an rcu_assign_pointer() call.
> -			 */
> -			ma_init_slot(&cp->slot[0], cp->dst[0].node, mt);
> -			cp->height++;
> -		}
> -		WARN_ON_ONCE(cp->dst[0].node != mte_to_node(
> -				mt_slot_locked(mas->tree, cp->slot, 0)));
> -		cp->dst[0].node->parent = ma_parent_ptr(mas_tree_parent(mas));
> -		mas->min = 0;
> -		mas->max = ULONG_MAX;
> -		mas->depth = 0;
> -		mas->node = mas_root_locked(mas);
> +	if (cp_is_new_root(cp, mas))
>  		return false;
> -	}
>  
>  	/* Converged and has a single destination */
>  	if ((cp->d_count == 1) &&
> -- 
> 2.47.3
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ