Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 11:00:18 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/include/linux: interval_tree.h
            interval_tree_generic.h rbtree.h

Log Message:
Touch up the rbtree/intervaltree stubs.

Doesn't work at all yet, but maybe it will help.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 \
    src/sys/external/bsd/drm2/include/linux/interval_tree.h
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/include/linux/interval_tree_generic.h
cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/rbtree.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/include/linux/interval_tree.h
diff -u src/sys/external/bsd/drm2/include/linux/interval_tree.h:1.11 src/sys/external/bsd/drm2/include/linux/interval_tree.h:1.12
--- src/sys/external/bsd/drm2/include/linux/interval_tree.h:1.11	Sun Dec 19 01:48:30 2021
+++ src/sys/external/bsd/drm2/include/linux/interval_tree.h	Sun Dec 19 11:00:18 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: interval_tree.h,v 1.11 2021/12/19 01:48:30 riastradh Exp $	*/
+/*	$NetBSD: interval_tree.h,v 1.12 2021/12/19 11:00:18 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -29,6 +29,14 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+/*
+ * XXX WARNING: This does not actually implement interval trees -- it
+ * only implements trees of intervals.  In particular, it does not
+ * support finding all intervals that contain a given point, or that
+ * intersect with a given interval.  Another way to look at it is that
+ * this is an interval tree restricted to nonoverlapping intervals.
+ */
+
 #ifndef	_LINUX_INTERVAL_TREE_H_
 #define	_LINUX_INTERVAL_TREE_H_
 

Index: src/sys/external/bsd/drm2/include/linux/interval_tree_generic.h
diff -u src/sys/external/bsd/drm2/include/linux/interval_tree_generic.h:1.2 src/sys/external/bsd/drm2/include/linux/interval_tree_generic.h:1.3
--- src/sys/external/bsd/drm2/include/linux/interval_tree_generic.h:1.2	Sun Dec 19 01:51:27 2021
+++ src/sys/external/bsd/drm2/include/linux/interval_tree_generic.h	Sun Dec 19 11:00:18 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: interval_tree_generic.h,v 1.2 2021/12/19 01:51:27 riastradh Exp $	*/
+/*	$NetBSD: interval_tree_generic.h,v 1.3 2021/12/19 11:00:18 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@ static inline int							      \
 PREFIX##__compare_key(void *__cookie, const void *__vn, const void *__vk)     \
 {									      \
 	const T *__n = __vn;						      \
-	const T *__k = __vk;						      \
+	const KT *__k = __vk;						      \
 	const KT __nstart = START(__n), __nlast = LAST(__n);		      \
 									      \
 	if (__nlast < *__k)						      \
@@ -77,7 +77,7 @@ static const rb_tree_ops_t PREFIX##__rbt
 QUAL void								      \
 PREFIX##_init(struct rb_root_cached *__root)				      \
 {									      \
-	rb_tree_init(&__root->rbrc_tree, &PREFIX##__rbtree_ops);	      \
+	rb_tree_init(&__root->rb_root.rbr_tree, &PREFIX##__rbtree_ops);	      \
 }									      \
 									      \
 QUAL void								      \
@@ -85,14 +85,14 @@ PREFIX##_insert(T *__node, struct rb_roo
 {									      \
 	T *__collision __diagused;					      \
 									      \
-	__collision = rb_tree_insert_node(&__root->rbrc_tree, __node);	      \
+	__collision = rb_tree_insert_node(&__root->rb_root.rbr_tree, __node); \
 	KASSERT(__collision == __node);					      \
 }									      \
 									      \
 QUAL void								      \
 PREFIX##_remove(T *__node, struct rb_root_cached *__root)		      \
 {									      \
-	rb_tree_remove_node(&__root->rbrc_tree, __node);		      \
+	rb_tree_remove_node(&__root->rb_root.rbr_tree, __node);		      \
 }									      \
 									      \
 QUAL T *								      \
@@ -100,7 +100,7 @@ PREFIX##_iter_first(struct rb_root_cache
 {									      \
 	T *__node;							      \
 									      \
-	__node = rb_tree_find_node_geq(&__root->rbrc_tree, &__start);	      \
+	__node = rb_tree_find_node_geq(&__root->rb_root.rbr_tree, &__start);  \
 	if (__node == NULL)						      \
 		return NULL;						      \
 	KASSERT(START(__node) <= __start);				      \

Index: src/sys/external/bsd/drm2/include/linux/rbtree.h
diff -u src/sys/external/bsd/drm2/include/linux/rbtree.h:1.8 src/sys/external/bsd/drm2/include/linux/rbtree.h:1.9
--- src/sys/external/bsd/drm2/include/linux/rbtree.h:1.8	Sun Dec 19 01:48:30 2021
+++ src/sys/external/bsd/drm2/include/linux/rbtree.h	Sun Dec 19 11:00:18 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: rbtree.h,v 1.8 2021/12/19 01:48:30 riastradh Exp $	*/
+/*	$NetBSD: rbtree.h,v 1.9 2021/12/19 11:00:18 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -34,6 +34,8 @@
 
 #include <sys/rbtree.h>
 
+#include <lib/libkern/libkern.h>
+
 struct rb_root {
 	struct rb_tree	rbr_tree;
 };
@@ -42,6 +44,13 @@ struct rb_root_cached {
 	struct rb_root	rb_root; /* Linux API name */
 };
 
+#define	rb_entry(P, T, F) container_of(P, T, F)
+#define	rb_entry_safe(P, T, F)						      \
+({									      \
+	__typeof__(P) __p = (P);					      \
+	__p ? container_of(__p, T, F) : NULL;				      \
+})
+
 static inline bool
 RB_EMPTY_ROOT(struct rb_root *root)
 {
@@ -49,6 +58,16 @@ RB_EMPTY_ROOT(struct rb_root *root)
 	return RB_TREE_MIN(&root->rbr_tree) == NULL;
 }
 
+static inline struct rb_node *
+rb_first_cached(struct rb_root_cached *root)
+{
+	char *vnode = RB_TREE_MIN(&root->rb_root.rbr_tree);
+
+	if (vnode)
+		vnode += root->rb_root.rbr_tree.rbt_ops->rbto_node_offset;
+	return (struct rb_node *)vnode;
+}
+
 static inline void
 rb_erase(struct rb_node *rbnode, struct rb_root *root)
 {
@@ -64,6 +83,25 @@ rb_erase_cached(struct rb_node *rbnode, 
 	rb_erase(rbnode, &root->rb_root);
 }
 
+static inline void
+rb_replace_node(struct rb_node *old, struct rb_node *new, struct rb_root *root)
+{
+	void *vold = (char *)old - root->rbr_tree.rbt_ops->rbto_node_offset;
+	void *vnew = (char *)new - root->rbr_tree.rbt_ops->rbto_node_offset;
+	void *collision __diagused;
+
+	rb_tree_remove_node(&root->rbr_tree, vold);
+	collision = rb_tree_insert_node(&root->rbr_tree, vnew);
+	KASSERT(collision == vnew);
+}
+
+static inline void
+rb_replace_node_cached(struct rb_node *old, struct rb_node *new,
+    struct rb_root_cached *root)
+{
+	rb_replace_node(old, new, &root->rb_root);
+}
+
 /*
  * XXX This is not actually postorder, but I can't fathom why you would
  * want postorder for an ordered tree; different insertion orders lead

Reply via email to