OSDN Git Service

staging: android/sync: Signal fences if timeline is destroyed
authorTomasz Figa <tfiga@chromium.org>
Wed, 22 Feb 2017 09:23:05 +0000 (18:23 +0900)
committerFiroz Khan <firozk@codeaurora.org>
Thu, 31 Jan 2019 07:10:26 +0000 (12:40 +0530)
The original implementation of sw_sync in 3.14 kernel signaled all
active fences with error status on timeline release. However, after the
conversion to use DMA-buf fence code under the hood, the behavior was
(most likely by mistake) changed and the fences are being left active,
with their users possibly getting stuck in sync_wait().

There is indeed a sign of this not being an intentional behavior change,
as timeline retained its ->destroyed field, which is being set in
sync_timeline_destroy(). However there is no code checking it anymore.

Let's fix this by adding a check for timeline->destroyed in
android_fence_signaled(), so if the fence is neither signaled nor in
error state and timeline was destroyed, it will end up in -ENOENT error
state.

Change-Id: I0313b12b37e9d391d5caf218f381fa4b07a2a5e5
Signed-off-by: Tomasz Figa <tfiga@chromium.org>
Git-commit: 85839014db07d3c675d5a8f2f9f94f2aeb33fc5e
Git-repo: https://chromium.googlesource.com/chromiumos/third_party/kernel
Signed-off-by: Firoz Khan <firozk@codeaurora.org>
drivers/staging/android/sync.c

index 5238d67..39b9974 100644 (file)
@@ -451,6 +451,8 @@ static bool android_fence_signaled(struct fence *fence)
        int ret;
 
        ret = parent->ops->has_signaled(pt);
+       if (!ret && parent->destroyed)
+               ret = -ENOENT;
        if (ret < 0)
                fence->status = ret;
        return ret;