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.
*/
if (rep->ret)
return rep->ret;
- --buf->mapCount;
-
return 0;
}
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;
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)
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;
ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
} while (ret && errno == -EAGAIN);
+
if (ret)
return -errno;
#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.
*/
((__type *)(((char *) (__item)) - offsetof(__type, __field)))
+
typedef struct _drmBO{
drm_bo_type_t type;
unsigned handle;