Skip to content

Commit 27ce65f

Browse files
committed
Revert "nouveau: rip out busy fence waits"
This reverts commit d45bb9c. Just got a report that this causes some suspend/resume issues, so back it out and I'll investigate it later. Reported-by: Mike Galbraith <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
1 parent 4eb3997 commit 27ce65f

File tree

6 files changed

+34
-6
lines changed

6 files changed

+34
-6
lines changed

drivers/gpu/drm/nouveau/nouveau_bo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict,
898898
* Without this the operation can timeout and we'll fallback to a
899899
* software copy, which might take several minutes to finish.
900900
*/
901-
nouveau_fence_wait(fence, false);
901+
nouveau_fence_wait(fence, false, false);
902902
ret = ttm_bo_move_accel_cleanup(bo, &fence->base, evict, false,
903903
new_reg);
904904
nouveau_fence_unref(&fence);

drivers/gpu/drm/nouveau/nouveau_chan.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ nouveau_channel_idle(struct nouveau_channel *chan)
7272

7373
ret = nouveau_fence_new(&fence, chan);
7474
if (!ret) {
75-
ret = nouveau_fence_wait(fence, false);
75+
ret = nouveau_fence_wait(fence, false, false);
7676
nouveau_fence_unref(&fence);
7777
}
7878

drivers/gpu/drm/nouveau/nouveau_dmem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ static void nouveau_dmem_page_free(struct page *page)
128128
static void nouveau_dmem_fence_done(struct nouveau_fence **fence)
129129
{
130130
if (fence) {
131-
nouveau_fence_wait(*fence, false);
131+
nouveau_fence_wait(*fence, true, false);
132132
nouveau_fence_unref(fence);
133133
} else {
134134
/*

drivers/gpu/drm/nouveau/nouveau_fence.c

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,39 @@ nouveau_fence_wait_legacy(struct dma_fence *f, bool intr, long wait)
311311
return timeout - t;
312312
}
313313

314+
static int
315+
nouveau_fence_wait_busy(struct nouveau_fence *fence, bool intr)
316+
{
317+
int ret = 0;
318+
319+
while (!nouveau_fence_done(fence)) {
320+
if (time_after_eq(jiffies, fence->timeout)) {
321+
ret = -EBUSY;
322+
break;
323+
}
324+
325+
__set_current_state(intr ?
326+
TASK_INTERRUPTIBLE :
327+
TASK_UNINTERRUPTIBLE);
328+
329+
if (intr && signal_pending(current)) {
330+
ret = -ERESTARTSYS;
331+
break;
332+
}
333+
}
334+
335+
__set_current_state(TASK_RUNNING);
336+
return ret;
337+
}
338+
314339
int
315-
nouveau_fence_wait(struct nouveau_fence *fence, bool intr)
340+
nouveau_fence_wait(struct nouveau_fence *fence, bool lazy, bool intr)
316341
{
317342
long ret;
318343

344+
if (!lazy)
345+
return nouveau_fence_wait_busy(fence, intr);
346+
319347
ret = dma_fence_wait_timeout(&fence->base, intr, 15 * HZ);
320348
if (ret < 0)
321349
return ret;

drivers/gpu/drm/nouveau/nouveau_fence.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ void nouveau_fence_unref(struct nouveau_fence **);
2323

2424
int nouveau_fence_emit(struct nouveau_fence *);
2525
bool nouveau_fence_done(struct nouveau_fence *);
26-
int nouveau_fence_wait(struct nouveau_fence *, bool intr);
26+
int nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
2727
int nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive, bool intr);
2828

2929
struct nouveau_fence_chan {

drivers/gpu/drm/nouveau/nouveau_gem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
928928
}
929929

930930
if (sync) {
931-
if (!(ret = nouveau_fence_wait(fence, false))) {
931+
if (!(ret = nouveau_fence_wait(fence, false, false))) {
932932
if ((ret = dma_fence_get_status(&fence->base)) == 1)
933933
ret = 0;
934934
}

0 commit comments

Comments
 (0)