Commit 7cec540a authored by Rafael Antognolli's avatar Rafael Antognolli Committed by Sumit Semwal

dma-buf/sync_file: Increment refcount of fence when all are signaled.

When we merge several fences, if all of them are signaled already, we
still keep one of them. So instead of using add_fence(), which will not
increase the refcount of signaled fences, we should explicitly call
fence_get() for the fence we are keeping.

This patch fixes a kernel panic that can be triggered by creating a fence
that is expired (or increasing the timeline until it expires), then
creating a merged fence out of it, and deleting the merged fence. This
will make the original expired fence's refcount go to zero.

Testcase: igt/sw_sync/sync_expired_merge
Signed-off-by: default avatarRafael Antognolli <rafael.antognolli@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: default avatarSumit Semwal <sumit.semwal@linaro.org>
Link: http://patchwork.freedesktop.org/patch/msgid/1473966865-4508-1-git-send-email-rafael.antognolli@intel.com
parent 699fbeea
...@@ -253,10 +253,8 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a, ...@@ -253,10 +253,8 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
for (; i_b < b_num_fences; i_b++) for (; i_b < b_num_fences; i_b++)
add_fence(fences, &i, b_fences[i_b]); add_fence(fences, &i, b_fences[i_b]);
if (i == 0) { if (i == 0)
add_fence(fences, &i, a_fences[0]); fences[i++] = fence_get(a_fences[0]);
i++;
}
if (num_fences > i) { if (num_fences > i) {
nfences = krealloc(fences, i * sizeof(*fences), nfences = krealloc(fences, i * sizeof(*fences),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment