Module Name:    src
Committed By:   riastradh
Date:           Mon Aug 27 07:36:07 UTC 2018

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core: client.h
            object.h
        src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine: dma.h
        src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core:
            nouveau_nvkm_core_client.c nouveau_nvkm_core_object.c
        src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma:
            nouveau_nvkm_engine_dma_base.c nouveau_nvkm_engine_dma_user.c

Log Message:
Use our rbtree, which conveniently has find/insert/remove operations.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h \
    src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h
cvs rdiff -u -r1.2 -r1.3 \
    
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c
cvs rdiff -u -r1.3 -r1.4 \
    
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c
cvs rdiff -u -r1.2 -r1.3 \
    
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c
 \
    
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c

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/dist/drm/nouveau/include/nvkm/core/client.h
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h:1.3 src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h:1.3	Mon Aug 27 07:35:22 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/client.h	Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: client.h,v 1.3 2018/08/27 07:35:22 riastradh Exp $	*/
+/*	$NetBSD: client.h,v 1.4 2018/08/27 07:36:07 riastradh Exp $	*/
 
 #ifndef __NVKM_CLIENT_H__
 #define __NVKM_CLIENT_H__
@@ -11,8 +11,13 @@ struct nvkm_client {
 	u32 debug;
 
 	struct nvkm_client_notify *notify[16];
+#ifdef __NetBSD__
+	struct rb_tree objtree;
+	struct rb_tree dmatree;
+#else
 	struct rb_root objroot;
 	struct rb_root dmaroot;
+#endif
 
 	bool super;
 	void *data;
@@ -21,6 +26,8 @@ struct nvkm_client {
 	struct nvkm_vm *vm;
 };
 
+extern const rb_tree_ops_t nvkm_client_dmatree_ops;
+
 bool nvkm_client_insert(struct nvkm_client *, struct nvkm_object *);
 void nvkm_client_remove(struct nvkm_client *, struct nvkm_object *);
 struct nvkm_object *nvkm_client_search(struct nvkm_client *, u64 object);
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h:1.3 src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h:1.3	Mon Aug 27 07:35:56 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h	Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: object.h,v 1.3 2018/08/27 07:35:56 riastradh Exp $	*/
+/*	$NetBSD: object.h,v 1.4 2018/08/27 07:36:07 riastradh Exp $	*/
 
 #ifndef __NVKM_OBJECT_H__
 #define __NVKM_OBJECT_H__
@@ -21,6 +21,7 @@ struct nvkm_object {
 	u64 token;
 	u64 object;
 	struct rb_node node;
+	bool on_tree;
 };
 
 struct nvkm_object_func {

Index: src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h:1.2	Mon Aug 27 04:58:30 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/engine/dma.h	Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: dma.h,v 1.2 2018/08/27 04:58:30 riastradh Exp $	*/
+/*	$NetBSD: dma.h,v 1.3 2018/08/27 07:36:07 riastradh Exp $	*/
 
 #ifndef __NVKM_DMA_H__
 #define __NVKM_DMA_H__
@@ -16,6 +16,7 @@ struct nvkm_dmaobj {
 	u64 limit;
 
 	struct rb_node rb;
+	bool on_tree;
 	u64 handle; /*XXX HANDLE MERGE */
 };
 

Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c:1.2	Mon Aug 27 04:58:30 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_client.c	Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: nouveau_nvkm_core_client.c,v 1.2 2018/08/27 04:58:30 riastradh Exp $	*/
+/*	$NetBSD: nouveau_nvkm_core_client.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $	*/
 
 /*
  * Copyright 2012 Red Hat Inc.
@@ -24,7 +24,7 @@
  * Authors: Ben Skeggs
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_client.c,v 1.2 2018/08/27 04:58:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_client.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $");
 
 #include <core/client.h>
 #include <core/device.h>
@@ -213,13 +213,29 @@ nvkm_client_object_func = {
 void
 nvkm_client_remove(struct nvkm_client *client, struct nvkm_object *object)
 {
+#ifdef __NetBSD__
+	if (object->on_tree) {
+		rb_tree_remove_node(&client->objtree, object);
+		object->on_tree = false;
+	}
+#else
 	if (!RB_EMPTY_NODE(&object->node))
 		rb_erase(&object->node, &client->objroot);
+#endif
 }
 
 bool
 nvkm_client_insert(struct nvkm_client *client, struct nvkm_object *object)
 {
+#ifdef __NetBSD__
+	struct nvkm_object *collision;
+
+	collision = rb_tree_insert_node(&client->objtree, object);
+	if (collision != object)
+		return false;
+	object->on_tree = true;
+	return true;
+#else
 	struct rb_node **ptr = &client->objroot.rb_node;
 	struct rb_node *parent = NULL;
 
@@ -239,11 +255,15 @@ nvkm_client_insert(struct nvkm_client *c
 	rb_link_node(&object->node, parent, ptr);
 	rb_insert_color(&object->node, &client->objroot);
 	return true;
+#endif
 }
 
 struct nvkm_object *
 nvkm_client_search(struct nvkm_client *client, u64 handle)
 {
+#ifdef __NetBSD__
+	return rb_tree_find_node(&client->objtree, &handle);
+#else
 	struct rb_node *node = client->objroot.rb_node;
 	while (node) {
 		struct nvkm_object *object =
@@ -257,6 +277,7 @@ nvkm_client_search(struct nvkm_client *c
 			return object;
 	}
 	return NULL;
+#endif
 }
 
 int
@@ -292,6 +313,40 @@ nvkm_client_del(struct nvkm_client **pcl
 	}
 }
 
+#ifdef __NetBSD__
+static int
+compare_object_nodes(void *cookie, const void *va, const void *vb)
+{
+	const struct nvkm_object *oa = va;
+	const struct nvkm_object *ob = vb;
+
+	if (oa->object < ob->object)
+		return -1;
+	if (oa->object > ob->object)
+		return +1;
+	return 0;
+}
+
+static int
+compare_object_key(void *cookie, const void *vo, const void *vk)
+{
+	const struct nvkm_object *o = vo;
+	const u64 *k = vk;
+
+	if (o->object < *k)
+		return -1;
+	if (o->object > *k)
+		return +1;
+	return 0;
+}
+
+static const rb_tree_ops_t nvkm_client_objtree_ops = {
+	.rbto_compare_nodes = compare_object_nodes,
+	.rbto_compare_key = compare_object_key,
+	.rbto_node_offset = offsetof(struct nvkm_object, node),
+};
+#endif
+
 int
 nvkm_client_new(const char *name, u64 device, const char *cfg,
 		const char *dbg, struct nvkm_client **pclient)
@@ -307,7 +362,12 @@ nvkm_client_new(const char *name, u64 de
 	snprintf(client->name, sizeof(client->name), "%s", name);
 	client->device = device;
 	client->debug = nvkm_dbgopt(dbg, "CLIENT");
+#ifdef __NetBSD__
+	rb_tree_init(&client->objtree, &nvkm_client_objtree_ops);
+	rb_tree_init(&client->dmatree, &nvkm_client_dmatree_ops);
+#else
 	client->objroot = RB_ROOT;
 	client->dmaroot = RB_ROOT;
+#endif
 	return 0;
 }

Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c:1.3 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c:1.3	Mon Aug 27 07:35:56 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c	Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: nouveau_nvkm_core_object.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $	*/
+/*	$NetBSD: nouveau_nvkm_core_object.c,v 1.4 2018/08/27 07:36:07 riastradh Exp $	*/
 
 /*
  * Copyright 2012 Red Hat Inc.
@@ -24,7 +24,7 @@
  * Authors: Ben Skeggs
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_object.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_object.c,v 1.4 2018/08/27 07:36:07 riastradh Exp $");
 
 #include <core/object.h>
 #include <core/client.h>
@@ -238,7 +238,11 @@ nvkm_object_ctor(const struct nvkm_objec
 	object->handle = oclass->handle;
 	INIT_LIST_HEAD(&object->head);
 	INIT_LIST_HEAD(&object->tree);
+#ifdef __NetBSD__
+	object->on_tree = false;
+#else
 	RB_CLEAR_NODE(&object->node);
+#endif
 	WARN_ON(oclass->engine && !object->engine);
 }
 

Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c:1.2	Mon Aug 27 04:58:31 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_base.c	Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: nouveau_nvkm_engine_dma_base.c,v 1.2 2018/08/27 04:58:31 riastradh Exp $	*/
+/*	$NetBSD: nouveau_nvkm_engine_dma_base.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $	*/
 
 /*
  * Copyright 2012 Red Hat Inc.
@@ -24,7 +24,7 @@
  * Authors: Ben Skeggs
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_dma_base.c,v 1.2 2018/08/27 04:58:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_dma_base.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $");
 
 #include "priv.h"
 
@@ -33,9 +33,46 @@ __KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm
 
 #include <nvif/class.h>
 
+#ifdef __NetBSD__
+static int
+compare_dmaobj_nodes(void *cookie, const void *va, const void *vb)
+{
+	const struct nvkm_dmaobj *da = va;
+	const struct nvkm_dmaobj *db = vb;
+
+	if (da->handle < db->handle)
+		return -1;
+	if (da->handle > db->handle)
+		return +1;
+	return 0;
+}
+
+static int
+compare_dmaobj_key(void *cookie, const void *vo, const void *vk)
+{
+	const struct nvkm_dmaobj *d = vo;
+	const u64 *k = vk;
+
+	if (d->handle < *k)
+		return -1;
+	if (d->handle > *k)
+		return +1;
+	return 0;
+}
+
+const rb_tree_ops_t nvkm_client_dmatree_ops = {
+	.rbto_compare_nodes = compare_dmaobj_nodes,
+	.rbto_compare_key = compare_dmaobj_key,
+	.rbto_node_offset = offsetof(struct nvkm_dmaobj, rb),
+};
+#endif
+
 struct nvkm_dmaobj *
 nvkm_dma_search(struct nvkm_dma *dma, struct nvkm_client *client, u64 object)
 {
+#ifdef __NetBSD__
+	return rb_tree_find_node(&client->dmatree, &object);
+#else
 	struct rb_node *node = client->dmaroot.rb_node;
 	while (node) {
 		struct nvkm_dmaobj *dmaobj =
@@ -49,6 +86,7 @@ nvkm_dma_search(struct nvkm_dma *dma, st
 			return dmaobj;
 	}
 	return NULL;
+#endif
 }
 
 static int
@@ -59,8 +97,12 @@ nvkm_dma_oclass_new(struct nvkm_device *
 	struct nvkm_dma *dma = nvkm_dma(oclass->engine);
 	struct nvkm_dmaobj *dmaobj = NULL;
 	struct nvkm_client *client = oclass->client;
+#ifdef __NetBSD__
+	struct nvkm_dmaobj *collision;
+#else
 	struct rb_node **ptr = &client->dmaroot.rb_node;
 	struct rb_node *parent = NULL;
+#endif
 	int ret;
 
 	ret = dma->func->class_new(dma, oclass, data, size, &dmaobj);
@@ -71,6 +113,12 @@ nvkm_dma_oclass_new(struct nvkm_device *
 
 	dmaobj->handle = oclass->object;
 
+#ifdef __NetBSD__
+	collision = rb_tree_insert_node(&client->dmatree, dmaobj);
+	if (collision != dmaobj)
+		/* XXX Don't we have to free this?  */
+		return -EEXIST;
+#else
 	while (*ptr) {
 		struct nvkm_dmaobj *obj = container_of(*ptr, typeof(*obj), rb);
 		parent = *ptr;
@@ -85,6 +133,7 @@ nvkm_dma_oclass_new(struct nvkm_device *
 
 	rb_link_node(&dmaobj->rb, parent, ptr);
 	rb_insert_color(&dmaobj->rb, &client->dmaroot);
+#endif
 	return 0;
 }
 
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c:1.2	Mon Aug 27 04:58:31 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/dma/nouveau_nvkm_engine_dma_user.c	Mon Aug 27 07:36:07 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: nouveau_nvkm_engine_dma_user.c,v 1.2 2018/08/27 04:58:31 riastradh Exp $	*/
+/*	$NetBSD: nouveau_nvkm_engine_dma_user.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $	*/
 
 /*
  * Copyright 2012 Red Hat Inc.
@@ -24,7 +24,7 @@
  * Authors: Ben Skeggs
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_dma_user.c,v 1.2 2018/08/27 04:58:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_engine_dma_user.c,v 1.3 2018/08/27 07:36:07 riastradh Exp $");
 
 #include "user.h"
 
@@ -48,8 +48,15 @@ static void *
 nvkm_dmaobj_dtor(struct nvkm_object *base)
 {
 	struct nvkm_dmaobj *dmaobj = nvkm_dmaobj(base);
+#ifdef __NetBSD__
+	if (dmaobj->on_tree) {
+		rb_tree_remove_node(&dmaobj->object.client->dmatree, dmaobj);
+		dmaobj->on_tree = false;
+	}
+#else
 	if (!RB_EMPTY_NODE(&dmaobj->rb))
 		rb_erase(&dmaobj->rb, &dmaobj->object.client->dmaroot);
+#endif
 	return dmaobj;
 }
 
@@ -79,7 +86,9 @@ nvkm_dmaobj_ctor(const struct nvkm_dmaob
 	nvkm_object_ctor(&nvkm_dmaobj_func, oclass, &dmaobj->object);
 	dmaobj->func = func;
 	dmaobj->dma = dma;
+#ifndef __NetBSD__
 	RB_CLEAR_NODE(&dmaobj->rb);
+#endif
 
 	nvif_ioctl(parent, "create dma size %d\n", *psize);
 	if (nvif_unpack(args->v0, 0, 0, true)) {

Reply via email to