Buffer object wait IOCTL operation.
Remove option to wait for fence / buffers and block signals.main
parent
a6b8e3eaf4
commit
550f51b4bf
|
@ -299,7 +299,8 @@ int drm_fence_buffer_objects(drm_file_t * priv,
|
||||||
* Wait until the buffer is idle.
|
* Wait until the buffer is idle.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int drm_bo_wait(drm_buffer_object_t * bo, int lazy, int no_wait)
|
static int drm_bo_wait(drm_buffer_object_t * bo, int lazy, int ignore_signals,
|
||||||
|
int no_wait)
|
||||||
{
|
{
|
||||||
|
|
||||||
drm_fence_object_t *fence = bo->fence;
|
drm_fence_object_t *fence = bo->fence;
|
||||||
|
@ -317,7 +318,7 @@ static int drm_bo_wait(drm_buffer_object_t * bo, int lazy, int no_wait)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
ret =
|
ret =
|
||||||
drm_fence_object_wait(dev, fence, lazy, !lazy,
|
drm_fence_object_wait(dev, fence, lazy, ignore_signals,
|
||||||
bo->fence_flags);
|
bo->fence_flags);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -351,7 +352,7 @@ static int drm_bo_evict(drm_buffer_object_t * bo, int tt, int no_wait)
|
||||||
if (!tt && !bo->vram)
|
if (!tt && !bo->vram)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = drm_bo_wait(bo, 0, no_wait);
|
ret = drm_bo_wait(bo, 0, 0, no_wait);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -805,7 +806,7 @@ static int drm_buffer_object_map(drm_file_t * priv, uint32_t handle,
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (atomic_inc_and_test(&bo->mapped)) {
|
if (atomic_inc_and_test(&bo->mapped)) {
|
||||||
ret = drm_bo_wait(bo, 0, no_wait);
|
ret = drm_bo_wait(bo, 0, 0, no_wait);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
atomic_dec(&bo->mapped);
|
atomic_dec(&bo->mapped);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -926,7 +927,7 @@ static int drm_bo_move_buffer(drm_buffer_object_t * bo, uint32_t new_flags,
|
||||||
* Wait for outstanding fences.
|
* Wait for outstanding fences.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = drm_bo_wait(bo, 0, no_wait);
|
ret = drm_bo_wait(bo, 0, 0, no_wait);
|
||||||
|
|
||||||
if (ret == -EINTR)
|
if (ret == -EINTR)
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
@ -1073,6 +1074,34 @@ static int drm_bo_handle_info(drm_file_t * priv, uint32_t handle,
|
||||||
(void)drm_bo_busy(bo);
|
(void)drm_bo_busy(bo);
|
||||||
drm_bo_fill_rep_arg(bo, rep);
|
drm_bo_fill_rep_arg(bo, rep);
|
||||||
mutex_unlock(&bo->mutex);
|
mutex_unlock(&bo->mutex);
|
||||||
|
drm_bo_usage_deref_unlocked(bo->dev, bo);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int drm_bo_handle_wait(drm_file_t * priv, uint32_t handle,
|
||||||
|
uint32_t hint, drm_bo_arg_reply_t * rep)
|
||||||
|
{
|
||||||
|
drm_buffer_object_t *bo;
|
||||||
|
int no_wait = hint & DRM_BO_HINT_DONT_BLOCK;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
bo = drm_lookup_buffer_object(priv, handle, 1);
|
||||||
|
if (!bo) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
mutex_lock(&bo->mutex);
|
||||||
|
ret = drm_bo_wait_unfenced(bo, no_wait, 0);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
ret = drm_bo_wait(bo, hint & DRM_BO_HINT_WAIT_LAZY,
|
||||||
|
0, no_wait);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
drm_bo_fill_rep_arg(bo, rep);
|
||||||
|
out:
|
||||||
|
mutex_unlock(&bo->mutex);
|
||||||
|
drm_bo_usage_deref_unlocked(bo->dev, bo);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1348,6 +1377,13 @@ int drm_bo_ioctl(DRM_IOCTL_ARGS)
|
||||||
case drm_bo_info:
|
case drm_bo_info:
|
||||||
rep.ret = drm_bo_handle_info(priv, req->handle, &rep);
|
rep.ret = drm_bo_handle_info(priv, req->handle, &rep);
|
||||||
break;
|
break;
|
||||||
|
case drm_bo_wait_idle:
|
||||||
|
rep.ret = drm_bo_handle_wait(priv, req->handle,
|
||||||
|
req->hint, &rep);
|
||||||
|
break;
|
||||||
|
case drm_bo_ref_fence:
|
||||||
|
rep.ret = -EINVAL;
|
||||||
|
DRM_ERROR("Function is not implemented yet.\n");
|
||||||
default:
|
default:
|
||||||
rep.ret = -EINVAL;
|
rep.ret = -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -1386,7 +1422,7 @@ static void drm_bo_force_clean(drm_device_t * dev)
|
||||||
if (nice_mode) {
|
if (nice_mode) {
|
||||||
unsigned long _end = jiffies + 3 * DRM_HZ;
|
unsigned long _end = jiffies + 3 * DRM_HZ;
|
||||||
do {
|
do {
|
||||||
ret = drm_bo_wait(entry, 0, 0);
|
ret = drm_bo_wait(entry, 0, 1, 0);
|
||||||
} while ((ret == -EINTR) &&
|
} while ((ret == -EINTR) &&
|
||||||
!time_after_eq(jiffies, _end));
|
!time_after_eq(jiffies, _end));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -567,9 +567,7 @@ int drm_fence_ioctl(DRM_IOCTL_ARGS)
|
||||||
ret =
|
ret =
|
||||||
drm_fence_object_wait(dev, fence,
|
drm_fence_object_wait(dev, fence,
|
||||||
arg.flags & DRM_FENCE_FLAG_WAIT_LAZY,
|
arg.flags & DRM_FENCE_FLAG_WAIT_LAZY,
|
||||||
arg.
|
0,
|
||||||
flags &
|
|
||||||
DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS,
|
|
||||||
arg.type);
|
arg.type);
|
||||||
break;
|
break;
|
||||||
case drm_fence_emit:
|
case drm_fence_emit:
|
||||||
|
|
|
@ -726,7 +726,7 @@ typedef struct drm_ttm_arg {
|
||||||
#define DRM_BO_HINT_DONT_BLOCK 0x00000002
|
#define DRM_BO_HINT_DONT_BLOCK 0x00000002
|
||||||
/* Don't place this buffer on the unfenced list.*/
|
/* Don't place this buffer on the unfenced list.*/
|
||||||
#define DRM_BO_HINT_DONT_FENCE 0x00000004
|
#define DRM_BO_HINT_DONT_FENCE 0x00000004
|
||||||
|
#define DRM_BO_HINT_WAIT_LAZY 0x00000008
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -759,7 +759,9 @@ typedef struct drm_bo_arg_request {
|
||||||
drm_bo_destroy,
|
drm_bo_destroy,
|
||||||
drm_bo_reference,
|
drm_bo_reference,
|
||||||
drm_bo_unreference,
|
drm_bo_unreference,
|
||||||
drm_bo_info
|
drm_bo_info,
|
||||||
|
drm_bo_wait_idle,
|
||||||
|
drm_bo_ref_fence
|
||||||
} op;
|
} op;
|
||||||
} drm_bo_arg_request_t;
|
} drm_bo_arg_request_t;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue