diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2017-05-18 12:36:14 -0400 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2017-06-03 07:25:41 -0400 |
commit | 46a269da7e8a1ab6510ea5c88b2732925e5efc79 (patch) | |
tree | d7097629b56c6a05fc753cd41631661b0c4c86b7 | |
parent | d79fd1ccf2cd76adba2121a62bae996bc4beccfe (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.c | 24 |
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) { |