aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2017-05-18 12:36:14 -0400
committerLucas Stach <l.stach@pengutronix.de>2017-06-03 07:25:41 -0400
commit46a269da7e8a1ab6510ea5c88b2732925e5efc79 (patch)
treed7097629b56c6a05fc753cd41631661b0c4c86b7
parentd79fd1ccf2cd76adba2121a62bae996bc4beccfe (diff)
drm/etnaviv: restore ETNA_PREP_NOSYNC behaviour
This reverts commit cd34db4a526c (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 <l.stach@pengutronix.de>
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
index fd56f92f3469..f0efc5db793f 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
@@ -411,16 +411,20 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
411 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj); 411 struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
412 struct drm_device *dev = obj->dev; 412 struct drm_device *dev = obj->dev;
413 bool write = !!(op & ETNA_PREP_WRITE); 413 bool write = !!(op & ETNA_PREP_WRITE);
414 unsigned long remain = 414 int ret;
415 op & ETNA_PREP_NOSYNC ? 0 : etnaviv_timeout_to_jiffies(timeout); 415
416 long lret; 416 if (op & ETNA_PREP_NOSYNC) {
417 417 if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv,
418 lret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv, 418 write))
419 write, true, remain); 419 return -EBUSY;
420 if (lret < 0) 420 } else {
421 return lret; 421 unsigned long remain = etnaviv_timeout_to_jiffies(timeout);
422 else if (lret == 0) 422
423 return remain == 0 ? -EBUSY : -ETIMEDOUT; 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 }
424 428
425 if (etnaviv_obj->flags & ETNA_BO_CACHED) { 429 if (etnaviv_obj->flags & ETNA_BO_CACHED) {
426 if (!etnaviv_obj->sgt) { 430 if (!etnaviv_obj->sgt) {