Module Name: src
Committed By: riastradh
Date: Sun Dec 19 01:16:36 UTC 2021
Modified Files:
src/sys/external/bsd/drm2/dist/drm: drm_prime.c
Log Message:
Redo drm prime trees with our rbtree abstraction.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/external/bsd/drm2/dist/drm/drm_prime.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/drm_prime.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_prime.c:1.10 src/sys/external/bsd/drm2/dist/drm/drm_prime.c:1.11
--- src/sys/external/bsd/drm2/dist/drm/drm_prime.c:1.10 Sat Dec 18 23:44:57 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_prime.c Sun Dec 19 01:16:36 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_prime.c,v 1.10 2021/12/18 23:44:57 riastradh Exp $ */
+/* $NetBSD: drm_prime.c,v 1.11 2021/12/19 01:16:36 riastradh Exp $ */
/*
* Copyright © 2012 Red Hat
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_prime.c,v 1.10 2021/12/18 23:44:57 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_prime.c,v 1.11 2021/12/19 01:16:36 riastradh Exp $");
#include <linux/export.h>
#include <linux/dma-buf.h>
@@ -199,11 +199,81 @@ struct drm_prime_member {
struct rb_node handle_rb;
};
+#ifdef __NetBSD__
+static int
+compare_dmabufs(void *cookie, const void *va, const void *vb)
+{
+ const struct drm_prime_member *ma = va;
+ const struct drm_prime_member *mb = vb;
+
+ if (ma->dma_buf < mb->dma_buf)
+ return -1;
+ if (ma->dma_buf > mb->dma_buf)
+ return +1;
+ return 0;
+}
+
+static int
+compare_dmabuf_key(void *cookie, const void *vm, const void *vk)
+{
+ const struct drm_prime_member *m = vm;
+ const struct dma_buf *const *kp = vk;
+
+ if (m->dma_buf < *kp)
+ return -1;
+ if (m->dma_buf > *kp)
+ return +1;
+ return 0;
+}
+
+static int
+compare_handles(void *cookie, const void *va, const void *vb)
+{
+ const struct drm_prime_member *ma = va;
+ const struct drm_prime_member *mb = vb;
+
+ if (ma->handle < mb->handle)
+ return -1;
+ if (ma->handle > mb->handle)
+ return +1;
+ return 0;
+}
+
+static int
+compare_handle_key(void *cookie, const void *vm, const void *vk)
+{
+ const struct drm_prime_member *m = vm;
+ const uint32_t *kp = vk;
+
+ if (m->handle < *kp)
+ return -1;
+ if (m->handle > *kp)
+ return +1;
+ return 0;
+}
+
+static const rb_tree_ops_t dmabuf_ops = {
+ .rbto_compare_nodes = compare_dmabufs,
+ .rbto_compare_key = compare_dmabuf_key,
+ .rbto_node_offset = offsetof(struct drm_prime_member, dmabuf_rb),
+};
+
+static const rb_tree_ops_t handle_ops = {
+ .rbto_compare_nodes = compare_handles,
+ .rbto_compare_key = compare_handle_key,
+ .rbto_node_offset = offsetof(struct drm_prime_member, handle_rb),
+};
+#endif
+
static int drm_prime_add_buf_handle(struct drm_prime_file_private *prime_fpriv,
struct dma_buf *dma_buf, uint32_t handle)
{
struct drm_prime_member *member;
+#ifdef __NetBSD__
+ struct drm_prime_member *collision __diagused;
+#else
struct rb_node **p, *rb;
+#endif
member = kmalloc(sizeof(*member), GFP_KERNEL);
if (!member)
@@ -213,6 +283,11 @@ static int drm_prime_add_buf_handle(stru
member->dma_buf = dma_buf;
member->handle = handle;
+#ifdef __NetBSD__
+ collision = rb_tree_insert_node(&prime_fpriv->dmabufs.rbr_tree,
+ member);
+ KASSERT(collision == NULL);
+#else
rb = NULL;
p = &prime_fpriv->dmabufs.rb_node;
while (*p) {
@@ -227,7 +302,13 @@ static int drm_prime_add_buf_handle(stru
}
rb_link_node(&member->dmabuf_rb, rb, p);
rb_insert_color(&member->dmabuf_rb, &prime_fpriv->dmabufs);
+#endif
+#ifdef __NetBSD__
+ collision = rb_tree_insert_node(&prime_fpriv->handles.rbr_tree,
+ member);
+ KASSERT(collision == NULL);
+#else
rb = NULL;
p = &prime_fpriv->handles.rb_node;
while (*p) {
@@ -242,6 +323,7 @@ static int drm_prime_add_buf_handle(stru
}
rb_link_node(&member->handle_rb, rb, p);
rb_insert_color(&member->handle_rb, &prime_fpriv->handles);
+#endif
return 0;
}
@@ -249,6 +331,9 @@ static int drm_prime_add_buf_handle(stru
static struct dma_buf *drm_prime_lookup_buf_by_handle(struct drm_prime_file_private *prime_fpriv,
uint32_t handle)
{
+#ifdef __NetBSD__
+ return rb_tree_find_node(&prime_fpriv->handles.rbr_tree, &handle);
+#else
struct rb_node *rb;
rb = prime_fpriv->handles.rb_node;
@@ -265,12 +350,22 @@ static struct dma_buf *drm_prime_lookup_
}
return NULL;
+#endif
}
static int drm_prime_lookup_buf_handle(struct drm_prime_file_private *prime_fpriv,
struct dma_buf *dma_buf,
uint32_t *handle)
{
+#ifdef __NetBSD__
+ struct drm_prime_member *member;
+
+ member = rb_tree_find_node(&prime_fpriv->dmabufs.rbr_tree, &dma_buf);
+ if (member == NULL)
+ return -ENOENT;
+ *handle = member->handle;
+ return 0;
+#else
struct rb_node *rb;
rb = prime_fpriv->dmabufs.rb_node;
@@ -289,11 +384,21 @@ static int drm_prime_lookup_buf_handle(s
}
return -ENOENT;
+#endif
}
void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
struct dma_buf *dma_buf)
{
+#ifdef __NetBSD__
+ struct drm_prime_member *member;
+
+ member = rb_tree_find_node(&prime_fpriv->dmabufs.rbr_tree, &dma_buf);
+ if (member != NULL) {
+ rb_tree_remove_node(&prime_fpriv->handles.rbr_tree, member);
+ rb_tree_remove_node(&prime_fpriv->dmabufs.rbr_tree, member);
+ }
+#else
struct rb_node *rb;
rb = prime_fpriv->dmabufs.rb_node;
@@ -315,17 +420,30 @@ void drm_prime_remove_buf_handle_locked(
}
#endif
}
+#endif
}
void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv)
{
+#ifdef __NetBSD__
+ linux_mutex_init(&prime_fpriv->lock);
+#else
mutex_init(&prime_fpriv->lock);
+#endif
+#ifdef __NetBSD__
+ rb_tree_init(&prime_fpriv->dmabufs.rbr_tree, &dmabuf_ops);
+ rb_tree_init(&prime_fpriv->handles.rbr_tree, &handle_ops);
+#else
prime_fpriv->dmabufs = RB_ROOT;
prime_fpriv->handles = RB_ROOT;
+#endif
}
void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv)
{
+#ifdef __NetBSD__ /* XXX post-merge linux doesn't destroy it's lock now? */
+ linux_mutex_destroy(&prime_fpriv->lock);
+#endif
/* by now drm_gem_release should've made sure the list is empty */
WARN_ON(!RB_EMPTY_ROOT(&prime_fpriv->dmabufs));
}