mirror of https://gitee.com/openkylin/linux.git
drm/etnaviv: restore ETNA_PREP_NOSYNC behaviour
This reverts commit cd34db4a52
(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>
This commit is contained in:
parent
d79fd1ccf2
commit
46a269da7e
|
@ -411,16 +411,20 @@ int etnaviv_gem_cpu_prep(struct drm_gem_object *obj, u32 op,
|
|||
struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
|
||||
struct drm_device *dev = obj->dev;
|
||||
bool write = !!(op & ETNA_PREP_WRITE);
|
||||
unsigned long remain =
|
||||
op & ETNA_PREP_NOSYNC ? 0 : etnaviv_timeout_to_jiffies(timeout);
|
||||
long lret;
|
||||
int ret;
|
||||
|
||||
lret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv,
|
||||
write, true, remain);
|
||||
if (lret < 0)
|
||||
return lret;
|
||||
else if (lret == 0)
|
||||
return remain == 0 ? -EBUSY : -ETIMEDOUT;
|
||||
if (op & ETNA_PREP_NOSYNC) {
|
||||
if (!reservation_object_test_signaled_rcu(etnaviv_obj->resv,
|
||||
write))
|
||||
return -EBUSY;
|
||||
} else {
|
||||
unsigned long remain = etnaviv_timeout_to_jiffies(timeout);
|
||||
|
||||
ret = reservation_object_wait_timeout_rcu(etnaviv_obj->resv,
|
||||
write, true, remain);
|
||||
if (ret <= 0)
|
||||
return ret == 0 ? -ETIMEDOUT : ret;
|
||||
}
|
||||
|
||||
if (etnaviv_obj->flags & ETNA_BO_CACHED) {
|
||||
if (!etnaviv_obj->sgt) {
|
||||
|
|
Loading…
Reference in New Issue