Skip to content

Commit

Permalink
drm/v3d: Use drm_gem_lock_reservations()/drm_gem_unlock_reservations()
Browse files Browse the repository at this point in the history
Now that we have core helpers, this gets rid of a lot of boilerplate.

Signed-off-by: Eric Anholt <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
Acked-by: Rob Herring <[email protected]>
  • Loading branch information
anholt committed Mar 14, 2019
1 parent 7edc3e3 commit c2b3e61
Showing 1 changed file with 6 additions and 50 deletions.
56 changes: 6 additions & 50 deletions drivers/gpu/drm/v3d/v3d_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,12 +210,8 @@ v3d_unlock_bo_reservations(struct v3d_bo **bos,
int bo_count,
struct ww_acquire_ctx *acquire_ctx)
{
int i;

for (i = 0; i < bo_count; i++)
ww_mutex_unlock(&bos[i]->base.resv->lock);

ww_acquire_fini(acquire_ctx);
drm_gem_unlock_reservations((struct drm_gem_object **)bos, bo_count,
acquire_ctx);
}

/* Takes the reservation lock on all the BOs being referenced, so that
Expand All @@ -230,52 +226,12 @@ v3d_lock_bo_reservations(struct v3d_bo **bos,
int bo_count,
struct ww_acquire_ctx *acquire_ctx)
{
int contended_lock = -1;
int i, ret;

ww_acquire_init(acquire_ctx, &reservation_ww_class);

retry:
if (contended_lock != -1) {
struct v3d_bo *bo = bos[contended_lock];

ret = ww_mutex_lock_slow_interruptible(&bo->base.resv->lock,
acquire_ctx);
if (ret) {
ww_acquire_done(acquire_ctx);
return ret;
}
}

for (i = 0; i < bo_count; i++) {
if (i == contended_lock)
continue;

ret = ww_mutex_lock_interruptible(&bos[i]->base.resv->lock,
acquire_ctx);
if (ret) {
int j;

for (j = 0; j < i; j++)
ww_mutex_unlock(&bos[j]->base.resv->lock);

if (contended_lock != -1 && contended_lock >= i) {
struct v3d_bo *bo = bos[contended_lock];

ww_mutex_unlock(&bo->base.resv->lock);
}

if (ret == -EDEADLK) {
contended_lock = i;
goto retry;
}

ww_acquire_done(acquire_ctx);
return ret;
}
}

ww_acquire_done(acquire_ctx);
ret = drm_gem_lock_reservations((struct drm_gem_object **)bos,
bo_count, acquire_ctx);
if (ret)
return ret;

/* Reserve space for our shared (read-only) fence references,
* before we commit the CL to the hardware.
Expand Down

0 comments on commit c2b3e61

Please sign in to comment.