When the array is empty because everything is signaled we can't use add_fence() to add something because that would filter the signaled fence again.
Signed-off-by: Christian König christian.koenig@amd.com Fixes: 519f490db07e ("dma-buf/sync-file: fix warning about fence containers") --- drivers/dma-buf/sync_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c index b8dea4ec123b..514d213261df 100644 --- a/drivers/dma-buf/sync_file.c +++ b/drivers/dma-buf/sync_file.c @@ -262,7 +262,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a, }
if (index == 0) - add_fence(fences, &index, dma_fence_get_stub()); + fences[index++] = dma_fence_get_stub();
if (num_fences > index) { struct dma_fence **tmp;
A bug inside the new sync-file merge code created empty dma_fence_array instances.
Warn about that and handle those without crashing.
Signed-off-by: Christian König christian.koenig@amd.com --- drivers/dma-buf/dma-fence-array.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c index 52b85d292383..5c8a7084577b 100644 --- a/drivers/dma-buf/dma-fence-array.c +++ b/drivers/dma-buf/dma-fence-array.c @@ -159,6 +159,8 @@ struct dma_fence_array *dma_fence_array_create(int num_fences, struct dma_fence_array *array; size_t size = sizeof(*array);
+ WARN_ON(!num_fences || !fences); + /* Allocate the callback structures behind the array. */ size += num_fences * sizeof(struct dma_fence_array_cb); array = kzalloc(size, GFP_KERNEL); @@ -231,6 +233,9 @@ struct dma_fence *dma_fence_array_first(struct dma_fence *head) if (!array) return head;
+ if (!array->num_fences) + return NULL; + return array->fences[0]; } EXPORT_SYMBOL(dma_fence_array_first);
On Tue, Mar 29, 2022 at 09:00:01AM +0200, Christian König wrote:
A bug inside the new sync-file merge code created empty dma_fence_array instances.
Warn about that and handle those without crashing.
Signed-off-by: Christian König christian.koenig@amd.com
drivers/dma-buf/dma-fence-array.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c index 52b85d292383..5c8a7084577b 100644 --- a/drivers/dma-buf/dma-fence-array.c +++ b/drivers/dma-buf/dma-fence-array.c @@ -159,6 +159,8 @@ struct dma_fence_array *dma_fence_array_create(int num_fences, struct dma_fence_array *array; size_t size = sizeof(*array);
- WARN_ON(!num_fences || !fences);
WARN_ON and then dying randomly is kinda not nice, I'd wrap this in an
if (WARN_ON) return NULL;
with that: Reviewed-by: Daniel Vetter daniel.vetter@ffwll.ch
- /* Allocate the callback structures behind the array. */ size += num_fences * sizeof(struct dma_fence_array_cb); array = kzalloc(size, GFP_KERNEL);
@@ -231,6 +233,9 @@ struct dma_fence *dma_fence_array_first(struct dma_fence *head) if (!array) return head;
- if (!array->num_fences)
return NULL;
- return array->fences[0];
} EXPORT_SYMBOL(dma_fence_array_first); -- 2.25.1
On Tue, Mar 29, 2022 at 10:48:10AM +0200, Daniel Vetter wrote:
On Tue, Mar 29, 2022 at 09:00:01AM +0200, Christian König wrote:
A bug inside the new sync-file merge code created empty dma_fence_array instances.
Warn about that and handle those without crashing.
Signed-off-by: Christian König christian.koenig@amd.com
drivers/dma-buf/dma-fence-array.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c index 52b85d292383..5c8a7084577b 100644 --- a/drivers/dma-buf/dma-fence-array.c +++ b/drivers/dma-buf/dma-fence-array.c @@ -159,6 +159,8 @@ struct dma_fence_array *dma_fence_array_create(int num_fences, struct dma_fence_array *array; size_t size = sizeof(*array);
- WARN_ON(!num_fences || !fences);
WARN_ON and then dying randomly is kinda not nice, I'd wrap this in an
if (WARN_ON) return NULL;
with that: Reviewed-by: Daniel Vetter daniel.vetter@ffwll.ch
Uh strike that, you handle it gracefully with the check below.
- /* Allocate the callback structures behind the array. */ size += num_fences * sizeof(struct dma_fence_array_cb); array = kzalloc(size, GFP_KERNEL);
@@ -231,6 +233,9 @@ struct dma_fence *dma_fence_array_first(struct dma_fence *head) if (!array) return head;
Maybe add a comment here that this is just defensive programming, like
/* No fences isn't allowed and splats in create, but be defensive */
Either way Reviewed-by: Daniel Vetter daniel.vetter@ffwll.ch I guess, coffee not quite yet working. -Daniel
- if (!array->num_fences)
return NULL;
- return array->fences[0];
} EXPORT_SYMBOL(dma_fence_array_first); -- 2.25.1
-- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch
For the series,
Reviewed-by: Thomas Hellström thomas.hellstrom@linux.intel.com
On 3/29/22 09:00, Christian König wrote:
When the array is empty because everything is signaled we can't use add_fence() to add something because that would filter the signaled fence again.
Signed-off-by: Christian König christian.koenig@amd.com Fixes: 519f490db07e ("dma-buf/sync-file: fix warning about fence containers")
drivers/dma-buf/sync_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c index b8dea4ec123b..514d213261df 100644 --- a/drivers/dma-buf/sync_file.c +++ b/drivers/dma-buf/sync_file.c @@ -262,7 +262,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a, } if (index == 0)
add_fence(fences, &index, dma_fence_get_stub());
fences[index++] = dma_fence_get_stub();
if (num_fences > index) { struct dma_fence **tmp;
On Tue, Mar 29, 2022 at 09:00:00AM +0200, Christian König wrote:
When the array is empty because everything is signaled we can't use add_fence() to add something because that would filter the signaled fence again.
Signed-off-by: Christian König christian.koenig@amd.com Fixes: 519f490db07e ("dma-buf/sync-file: fix warning about fence containers")
drivers/dma-buf/sync_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c index b8dea4ec123b..514d213261df 100644 --- a/drivers/dma-buf/sync_file.c +++ b/drivers/dma-buf/sync_file.c @@ -262,7 +262,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a, } if (index == 0)
add_fence(fences, &index, dma_fence_get_stub());
fences[index++] = dma_fence_get_stub();
Uh idiot me wondered about this and somehow convinced myself that adding a random fences instead of a singalled stub is ok. I should have checked more carefully :-/
Reviewed-by: Daniel Vetter daniel.vetter@ffwll.ch
if (num_fences > index) { struct dma_fence **tmp; -- 2.25.1
Am 29.03.22 um 10:46 schrieb Daniel Vetter:
On Tue, Mar 29, 2022 at 09:00:00AM +0200, Christian König wrote:
When the array is empty because everything is signaled we can't use add_fence() to add something because that would filter the signaled fence again.
Signed-off-by: Christian König christian.koenig@amd.com Fixes: 519f490db07e ("dma-buf/sync-file: fix warning about fence containers")
drivers/dma-buf/sync_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c index b8dea4ec123b..514d213261df 100644 --- a/drivers/dma-buf/sync_file.c +++ b/drivers/dma-buf/sync_file.c @@ -262,7 +262,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a, } if (index == 0)
add_fence(fences, &index, dma_fence_get_stub());
fences[index++] = dma_fence_get_stub();
Uh idiot me wondered about this and somehow convinced myself that adding a random fences instead of a singalled stub is ok. I should have checked more carefully :-/
Well idiot me wanted to clean that up fully and move all of that into sync_file_set_fence(), but then I though "Na, that patch is for next-fixes, don't make it too complicate" and then changed the code anyway just out of habit.
Cheers, Christian.
Reviewed-by: Daniel Vetter daniel.vetter@ffwll.ch
if (num_fences > index) { struct dma_fence **tmp; -- 2.25.1
linaro-mm-sig@lists.linaro.org