From e3f54ecdd9d266607afd7d8b62960b2154b63e9d Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Tue, 5 Sep 2006 19:36:45 +0200 Subject: Multithreaded application note. --- libdrm/xf86drm.c | 26 +++----------------------- libdrm/xf86mm.h | 13 +++++++++++++ 2 files changed, 16 insertions(+), 23 deletions(-) (limited to 'libdrm') diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c index 6d087427..dd97e26e 100644 --- a/libdrm/xf86drm.c +++ b/libdrm/xf86drm.c @@ -2750,17 +2750,6 @@ int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint, drm_bo_arg_reply_t *rep = &arg.rep; 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 @@ -31,6 +31,18 @@ #include #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; -- cgit v1.2.3