Skip to content

Commit 46a269d

Browse files
committed
drm/etnaviv: restore ETNA_PREP_NOSYNC behaviour
This reverts commit cd34db4 (drm/etnaviv: Remove manual call to reservation_object_test_signaled_rcu before wait), as the patch to turn reservation_object_wait_timeout_rcu() into reservation_object_test_signaled_rcu() with a 0 timeout has been reverted. This causes the driver to call into the fence wait, even with a timeout of 0 The etnaviv BO cache depends on ETNA_PREP_NOSYNC to be wait-free, even if the BO has attached fences, so restore the behaviour for this flag. Signed-off-by: Lucas Stach <[email protected]>
1 parent d79fd1c commit 46a269d

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

drivers/gpu/drm/etnaviv/etnaviv_gem.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -411,16 +411,20 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
411411
struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
412412
struct drm_device *dev = obj->dev;
413413
bool write = !!(op & ETNA_PREP_WRITE);
414-
unsigned long remain =
415-
op & ETNA_PREP_NOSYNC ? 0 : etnaviv_timeout_to_jiffies(timeout);
416-
long lret;
417-
418-
lret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv,
419-
write, true, remain);
420-
if (lret < 0)
421-
return lret;
422-
else if (lret == 0)
423-
return remain == 0 ? -EBUSY : -ETIMEDOUT;
414+
int ret;
415+
416+
if (op & ETNA_PREP_NOSYNC) {
417+
if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv,
418+
write))
419+
return -EBUSY;
420+
} else {
421+
unsigned long remain = etnaviv_timeout_to_jiffies(timeout);
422+
423+
ret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv,
424+
write, true, remain);
425+
if (ret <= 0)
426+
return ret == 0 ? -ETIMEDOUT : ret;
427+
}
424428

425429
if (etnaviv_obj->flags & ETNA_BO_CACHED) {
426430
if (!etnaviv_obj->sgt) {

0 commit comments

Comments
 (0)