Re: git: deeaf9c4d85d - stable/13 - rb_tree: pass parent to RB_INSERT_COLOR
- In reply to: Doug Moore : "git: deeaf9c4d85d - stable/13 - rb_tree: pass parent to RB_INSERT_COLOR"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 15 Dec 2022 10:27:20 UTC
Hello Doug,
On Wed, 12 Oct 2022 03:00:23 GMT
Doug Moore <dougm@FreeBSD.org> wrote:
> The branch stable/13 has been updated by dougm:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=deeaf9c4d85d937d3c935291e913ae614a28f824
>
> commit deeaf9c4d85d937d3c935291e913ae614a28f824
> Author: Doug Moore <dougm@FreeBSD.org>
> AuthorDate: 2022-09-13 06:11:47 +0000
> Commit: Doug Moore <dougm@FreeBSD.org>
> CommitDate: 2022-10-12 02:42:55 +0000
>
> rb_tree: pass parent to RB_INSERT_COLOR
>
> Change RB_COLOR_INSERT to take a parent parameter, to avoid looking up
> a value already available. Make adjustments to a linux rbtree header,
> which invokes it.
>
> Reviewed by: alc, hselasky
> Differential Revision: https://reviews.freebsd.org/D36114
>
> (cherry picked from commit 4893472c9a18cd8ce3b68d0c54084ef6f0285d0f)
> ---
> sys/compat/linuxkpi/common/include/linux/rbtree.h | 11 ++++++++---
> sys/sys/tree.h | 18 ++++++++++--------
> 2 files changed, 18 insertions(+), 11 deletions(-)
>
> diff --git a/sys/compat/linuxkpi/common/include/linux/rbtree.h b/sys/compat/linuxkpi/common/include/linux/rbtree.h
> index 1f337d59545c..37537d4b2724 100644
> --- a/sys/compat/linuxkpi/common/include/linux/rbtree.h
> +++ b/sys/compat/linuxkpi/common/include/linux/rbtree.h
> @@ -74,8 +74,11 @@ RB_PROTOTYPE(linux_root, rb_node, __entry, panic_cmp);
> #define RB_EMPTY_NODE(node) (RB_PARENT(node, __entry) == node)
> #define RB_CLEAR_NODE(node) RB_SET_PARENT(node, node, __entry)
>
> -#define rb_insert_color(node, root) \
> - linux_root_RB_INSERT_COLOR((struct linux_root *)(root), (node))
> +#define rb_insert_color(node, root) do { \
> + if (rb_parent(node)) \
> + linux_root_RB_INSERT_COLOR((struct linux_root *)(root), \
> + rb_parent(node), (node)); \
> +} while (0)
> #define rb_erase(node, root) \
> linux_root_RB_REMOVE((struct linux_root *)(root), (node))
> #define rb_next(node) RB_NEXT(linux_root, NULL, (node))
> @@ -145,7 +148,9 @@ static inline void
> rb_insert_color_cached(struct rb_node *node, struct rb_root_cached *root,
> bool leftmost)
> {
> - linux_root_RB_INSERT_COLOR((struct linux_root *)&root->rb_root, node);
> + if (rb_parent(node))
> + linux_root_RB_INSERT_COLOR((struct linux_root *)&root->rb_root,
> + rb_parent(node), node);
> if (leftmost)
> root->rb_leftmost = node;
> }
> diff --git a/sys/sys/tree.h b/sys/sys/tree.h
> index 6a64498f6deb..c0cd65f41acb 100644
> --- a/sys/sys/tree.h
> +++ b/sys/sys/tree.h
> @@ -422,7 +422,8 @@ struct { \
> #define RB_PROTOTYPE_RANK(name, type, attr)
> #endif
> #define RB_PROTOTYPE_INSERT_COLOR(name, type, attr) \
> - attr void name##_RB_INSERT_COLOR(struct name *, struct type *)
> + attr void name##_RB_INSERT_COLOR(struct name *, \
> + struct type *, struct type *)
> #define RB_PROTOTYPE_REMOVE_COLOR(name, type, attr) \
> attr void name##_RB_REMOVE_COLOR(struct name *, \
> struct type *, struct type *)
> @@ -491,7 +492,8 @@ name##_RB_RANK(struct type *elm) \
>
> #define RB_GENERATE_INSERT_COLOR(name, type, field, attr) \
> attr void \
> -name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
> +name##_RB_INSERT_COLOR(struct name *head, \
> + struct type *parent, struct type *elm) \
> { \
> /* \
> * Initially, elm is a leaf. Either its parent was previously \
> @@ -503,12 +505,11 @@ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
> * uninitialized 'child', and a later iteration can only happen \
> * when a value has been assigned to 'child' in the previous \
> * one. \
> - */ \
> - struct type *child, *child_up, *gpar, *parent; \
> + */ \
> + struct type *child, *child_up, *gpar; \
> __uintptr_t elmdir, sibdir; \
> \
> - gpar = _RB_UP(elm, field); \
> - while ((parent = gpar) != NULL) { \
> + do { \
> /* the rank of the tree rooted at elm grew */ \
> gpar = _RB_UP(parent, field); \
> elmdir = RB_RIGHT(parent, field) == elm ? _RB_R : _RB_L; \
> @@ -584,7 +585,7 @@ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \
> RB_AUGMENT(elm); \
> RB_AUGMENT(parent); \
> break; \
> - } \
> + } while ((parent = gpar) != NULL); \
> }
>
> #ifndef RB_STRICT_HST
> @@ -774,7 +775,8 @@ name##_RB_INSERT(struct name *head, struct type *elm) \
> } \
> RB_SET(elm, parent, field); \
> *tmpp = elm; \
> - name##_RB_INSERT_COLOR(head, elm); \
> + if (parent != NULL) \
> + name##_RB_INSERT_COLOR(head, parent, elm); \
> RB_UPDATE_AUGMENT(elm, field); \
> return (NULL); \
> }
This breaks drm-kmod for stable/13
So it means that drm-kmod compiled for 13.1 will not work (either
won't load or more likely freeze the machine) on stable/13 and more
importantly 13.2
We've succefully succeeded in keeping compatibility between 13.0 and
13.1 for drm-kmod and I'd really like that it also works on 13.2
Cheers,
--
Emmanuel Vadot <manu@bidouilliste.com> <manu@freebsd.org>