summaryrefslogtreecommitdiff
path: root/libdrm
diff options
context:
space:
mode:
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2006-09-05 19:36:45 +0200
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2006-09-05 19:36:45 +0200
commite3f54ecdd9d266607afd7d8b62960b2154b63e9d (patch)
tree54697b5de7468b353e12d6c812b34e0dcb0f772a /libdrm
parent604215396847a7964fd7d68aa89d4f778b3bf22b (diff)
Multithreaded application note.
Diffstat (limited to 'libdrm')
-rw-r--r--libdrm/xf86drm.c26
-rw-r--r--libdrm/xf86mm.h13
2 files changed, 16 insertions, 23 deletions
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 6d087427..dd97e26e 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -2751,17 +2751,6 @@ int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
int ret = 0;
/*
- * At the moment, we don't allow recursive mapping of a buffer, since
- * the first mapping may have to be unmapped before this one to succeed.
- * This might result in a deadlock. We need a DRM mutex mechanism!!
- */
-
- if (buf->mapCount) {
- drmMsg("Recursive mapping is currently not allowed.\n");
- return -EAGAIN;
- }
-
- /*
* Make sure we have a virtual address of the buffer.
*/
@@ -2827,8 +2816,6 @@ int drmBOUnmap(int fd, drmBO *buf)
if (rep->ret)
return rep->ret;
- --buf->mapCount;
-
return 0;
}
@@ -2840,11 +2827,6 @@ int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask,
drm_bo_arg_reply_t *rep = &arg.rep;
int ret = 0;
- if (buf->mapCount) {
- drmMsg("Cannot validate while buffer is mapped.\n");
- return -EAGAIN;
- }
-
arg.handled = 0;
req->handle = buf->handle;
req->mask = flags;
@@ -2853,10 +2835,12 @@ int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask,
req->op = drm_bo_validate;
req->next = 0;
+
do{
ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
} while (ret && errno == -EAGAIN);
+
if (ret)
return ret;
if (!arg.handled)
@@ -3008,11 +2992,6 @@ int drmBOValidateList(int fd, drmBOList *list)
if (prevNext)
*prevNext = (unsigned long) arg;
- if (node->buf->mapCount) {
- drmMsg("Cannot validate while buffer is mapped.\n");
- return -EAGAIN;
- }
-
req->next = 0;
prevNext = &req->next;
arg->handled = 0;
@@ -3030,6 +3009,7 @@ int drmBOValidateList(int fd, drmBOList *list)
ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
} while (ret && errno == -EAGAIN);
+
if (ret)
return -errno;
diff --git a/libdrm/xf86mm.h b/libdrm/xf86mm.h
index 623f4d58..43ea71b8 100644
--- a/libdrm/xf86mm.h
+++ b/libdrm/xf86mm.h
@@ -32,6 +32,18 @@
#include "drm.h"
/*
+ * Note on multithreaded applications using this interface.
+ * Libdrm is not threadsafe, so common buffer, TTM, and fence objects need to
+ * be protected using an external mutex.
+ *
+ * Note: Don't protect the following functions, as it may lead to deadlocks:
+ * drmBOUnmap(), drmFenceBuffers().
+ * The kernel is synchronizing and refcounting buffer maps.
+ * User space only needs to refcount object usage within the same application.
+ */
+
+
+/*
* List macros heavily inspired by the Linux kernel
* list handling. No list looping yet.
*/
@@ -82,6 +94,7 @@ typedef struct _drmMMListHead
((__type *)(((char *) (__item)) - offsetof(__type, __field)))
+
typedef struct _drmBO{
drm_bo_type_t type;
unsigned handle;