* [PATCH] dma-buf/test: add KUnit case for dma_fence_dedup_array() empty input
@ 2026-06-30 6:04 Baineng Shou
2026-06-30 6:13 ` sashiko-bot
2026-06-30 8:29 ` Christian König
0 siblings, 2 replies; 4+ messages in thread
From: Baineng Shou @ 2026-06-30 6:04 UTC (permalink / raw)
To: sumit.semwal, christian.koenig
Cc: linux-media, dri-devel, linaro-mm-sig, linux-kernel, phasta,
tursulin, akash.goel, Baineng Shou
Add a KUnit case verifying that dma_fence_dedup_array() returns 0,
not 1, when called with num_fences == 0. This locks down the
contract documented in the kernel-doc and prevents a regression
of commit 77a9298741f8 ("dma-fence: Make dma_fence_dedup_array()
robust against 0-count input").
Suggested-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Baineng Shou <shoubaineng@gmail.com>
---
drivers/dma-buf/st-dma-fence-unwrap.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/dma-buf/st-dma-fence-unwrap.c b/drivers/dma-buf/st-dma-fence-unwrap.c
index 4e7ee25372ba..72dea6091d58 100644
--- a/drivers/dma-buf/st-dma-fence-unwrap.c
+++ b/drivers/dma-buf/st-dma-fence-unwrap.c
@@ -370,6 +370,15 @@ static void test_unwrap_merge_seqno(struct kunit *test)
dma_fence_put(f1);
}
+static void test_dedup_empty(struct kunit *test)
+{
+ struct dma_fence *fence[1] = { NULL };
+ int ret;
+
+ ret = dma_fence_dedup_array(fence, 0);
+ KUNIT_EXPECT_EQ(test, ret, 0);
+}
+
static void test_unwrap_merge_order(struct kunit *test)
{
struct dma_fence *fence, *f1, *f2, *a1, *a2, *c1, *c2;
@@ -595,6 +604,7 @@ static struct kunit_case dma_fence_unwrap_cases[] = {
KUNIT_CASE(test_unwrap_merge_order),
KUNIT_CASE(test_unwrap_merge_complex),
KUNIT_CASE(test_unwrap_merge_complex_seqno),
+ KUNIT_CASE(test_dedup_empty),
{}
};
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] dma-buf/test: add KUnit case for dma_fence_dedup_array() empty input
2026-06-30 6:04 [PATCH] dma-buf/test: add KUnit case for dma_fence_dedup_array() empty input Baineng Shou
@ 2026-06-30 6:13 ` sashiko-bot
2026-06-30 8:29 ` Christian König
1 sibling, 0 replies; 4+ messages in thread
From: sashiko-bot @ 2026-06-30 6:13 UTC (permalink / raw)
To: Baineng Shou; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
New issues:
- [Medium] The newly added test_dedup_empty KUnit test will unconditionally fail, breaking CI.
Pre-existing issues:
- [Critical] dma_fence_dedup_array() incorrectly returns 1 for an empty array, causing uninitialized memory dereference in amdgpu_userq_wait_return_fence_info().
--
commit 693b63d34624f1aa69f2c97819d4a6d6655ec6bc
Author: Baineng Shou <shoubaineng@gmail.com>
dma-buf/test: add KUnit case for dma_fence_dedup_array() empty input
This commit adds a KUnit test case to verify that dma_fence_dedup_array()
returns 0 when provided with an empty array. The test aims to ensure the
documented contract is enforced and prevents future regressions.
> diff --git a/drivers/dma-buf/st-dma-fence-unwrap.c b/drivers/dma-buf/st-dma-fence-unwrap.c
> index 4e7ee25372ba6..72dea6091d583 100644
> --- a/drivers/dma-buf/st-dma-fence-unwrap.c
> +++ b/drivers/dma-buf/st-dma-fence-unwrap.c
[ ... ]
> @@ -370,6 +370,15 @@ static void test_unwrap_merge_seqno(struct kunit *test)
> dma_fence_put(f1);
> }
>
> +static void test_dedup_empty(struct kunit *test)
> +{
> + struct dma_fence *fence[1] = { NULL };
> + int ret;
> +
> + ret = dma_fence_dedup_array(fence, 0);
> + KUNIT_EXPECT_EQ(test, ret, 0);
[Severity: Medium]
Will this test fail unconditionally on the current tree?
Looking at dma_fence_dedup_array() in drivers/dma-buf/dma-fence-unwrap.c,
there is no early return for an empty array:
int dma_fence_dedup_array(struct dma_fence **fences, int num_fences)
{
int i, j;
sort(fences, num_fences, sizeof(*fences), fence_cmp, NULL);
j = 0;
for (i = 1; i < num_fences; i++) {
...
}
return ++j;
}
The loop condition i < num_fences is skipped when num_fences is 0, but the
function ends with return ++j, which returns 1. Since this patch adds a
KUnit expectation for 0, won't this cause CI to break until the corresponding
fix for dma_fence_dedup_array() is actually applied to the tree?
[Severity: Critical]
This is a pre-existing issue, but does dma_fence_dedup_array() returning 1
for empty arrays cause an uninitialized memory dereference in other
subsystems?
For example, in drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c:
amdgpu_userq_wait_return_fence_info() uses kmalloc_array for the fences array
and eventually calls dma_fence_dedup_array:
num_fences = dma_fence_dedup_array(fences, num_fences);
waitq = amdgpu_userq_get(userq_mgr, wait_info->waitq_id);
if (!waitq) {
...
for (i = 0, cnt = 0; i < num_fences; i++) {
struct amdgpu_userq_fence_driver *fence_drv;
struct amdgpu_userq_fence *userq_fence;
u32 index;
userq_fence = to_amdgpu_userq_fence(fences[i]);
If an unprivileged user triggers a path via ioctl where 0 fences are populated
but dma_fence_dedup_array() is called with num_fences = 0, returning 1 will
cause the subsequent loop to iterate once. Will this dereference an
uninitialized garbage pointer from kmalloc_array() when to_amdgpu_userq_fence()
evaluates fences[i]?
> +}
> +
> static void test_unwrap_merge_order(struct kunit *test)
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260630060436.1527498-1-shoubaineng@gmail.com?part=1
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] dma-buf/test: add KUnit case for dma_fence_dedup_array() empty input
2026-06-30 6:04 [PATCH] dma-buf/test: add KUnit case for dma_fence_dedup_array() empty input Baineng Shou
2026-06-30 6:13 ` sashiko-bot
@ 2026-06-30 8:29 ` Christian König
2026-06-30 8:49 ` 寿柏能
1 sibling, 1 reply; 4+ messages in thread
From: Christian König @ 2026-06-30 8:29 UTC (permalink / raw)
To: Baineng Shou, sumit.semwal
Cc: linux-media, dri-devel, linaro-mm-sig, linux-kernel, phasta,
tursulin, akash.goel
On 6/30/26 08:04, Baineng Shou wrote:
> Add a KUnit case verifying that dma_fence_dedup_array() returns 0,
> not 1, when called with num_fences == 0. This locks down the
> contract documented in the kernel-doc and prevents a regression
> of commit 77a9298741f8 ("dma-fence: Make dma_fence_dedup_array()
> robust against 0-count input").
>
> Suggested-by: Christian König <christian.koenig@amd.com>
> Signed-off-by: Baineng Shou <shoubaineng@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Going to push this to drm-misc-next later today. I also pinged our intern to write a cleanup patch whic consistently use size_t for the number of array elements in the code.
Thanks,
Christian.
> ---
> drivers/dma-buf/st-dma-fence-unwrap.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/drivers/dma-buf/st-dma-fence-unwrap.c b/drivers/dma-buf/st-dma-fence-unwrap.c
> index 4e7ee25372ba..72dea6091d58 100644
> --- a/drivers/dma-buf/st-dma-fence-unwrap.c
> +++ b/drivers/dma-buf/st-dma-fence-unwrap.c
> @@ -370,6 +370,15 @@ static void test_unwrap_merge_seqno(struct kunit *test)
> dma_fence_put(f1);
> }
>
> +static void test_dedup_empty(struct kunit *test)
> +{
> + struct dma_fence *fence[1] = { NULL };
> + int ret;
> +
> + ret = dma_fence_dedup_array(fence, 0);
> + KUNIT_EXPECT_EQ(test, ret, 0);
> +}
> +
> static void test_unwrap_merge_order(struct kunit *test)
> {
> struct dma_fence *fence, *f1, *f2, *a1, *a2, *c1, *c2;
> @@ -595,6 +604,7 @@ static struct kunit_case dma_fence_unwrap_cases[] = {
> KUNIT_CASE(test_unwrap_merge_order),
> KUNIT_CASE(test_unwrap_merge_complex),
> KUNIT_CASE(test_unwrap_merge_complex_seqno),
> + KUNIT_CASE(test_dedup_empty),
> {}
> };
>
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] dma-buf/test: add KUnit case for dma_fence_dedup_array() empty input
2026-06-30 8:29 ` Christian König
@ 2026-06-30 8:49 ` 寿柏能
0 siblings, 0 replies; 4+ messages in thread
From: 寿柏能 @ 2026-06-30 8:49 UTC (permalink / raw)
To: Christian König
Cc: sumit.semwal, linux-media, dri-devel, linaro-mm-sig, linux-kernel,
phasta, tursulin, akash.goel
[-- Attachment #1: Type: text/plain, Size: 2199 bytes --]
Thanks Christian! size_t is a nice fit. It removes the negative-input
concern Philipp raised in one shot. Looking forward to seeing
the cleanup land.
Regards,
Baineng
Christian König <christian.koenig@amd.com> 于2026年6月30日周二 16:29写道:
> On 6/30/26 08:04, Baineng Shou wrote:
> > Add a KUnit case verifying that dma_fence_dedup_array() returns 0,
> > not 1, when called with num_fences == 0. This locks down the
> > contract documented in the kernel-doc and prevents a regression
> > of commit 77a9298741f8 ("dma-fence: Make dma_fence_dedup_array()
> > robust against 0-count input").
> >
> > Suggested-by: Christian König <christian.koenig@amd.com>
> > Signed-off-by: Baineng Shou <shoubaineng@gmail.com>
>
> Reviewed-by: Christian König <christian.koenig@amd.com>
>
> Going to push this to drm-misc-next later today. I also pinged our intern
> to write a cleanup patch whic consistently use size_t for the number of
> array elements in the code.
>
> Thanks,
> Christian.
>
> > ---
> > drivers/dma-buf/st-dma-fence-unwrap.c | 10 ++++++++++
> > 1 file changed, 10 insertions(+)
> >
> > diff --git a/drivers/dma-buf/st-dma-fence-unwrap.c
> b/drivers/dma-buf/st-dma-fence-unwrap.c
> > index 4e7ee25372ba..72dea6091d58 100644
> > --- a/drivers/dma-buf/st-dma-fence-unwrap.c
> > +++ b/drivers/dma-buf/st-dma-fence-unwrap.c
> > @@ -370,6 +370,15 @@ static void test_unwrap_merge_seqno(struct kunit
> *test)
> > dma_fence_put(f1);
> > }
> >
> > +static void test_dedup_empty(struct kunit *test)
> > +{
> > + struct dma_fence *fence[1] = { NULL };
> > + int ret;
> > +
> > + ret = dma_fence_dedup_array(fence, 0);
> > + KUNIT_EXPECT_EQ(test, ret, 0);
> > +}
> > +
> > static void test_unwrap_merge_order(struct kunit *test)
> > {
> > struct dma_fence *fence, *f1, *f2, *a1, *a2, *c1, *c2;
> > @@ -595,6 +604,7 @@ static struct kunit_case dma_fence_unwrap_cases[] = {
> > KUNIT_CASE(test_unwrap_merge_order),
> > KUNIT_CASE(test_unwrap_merge_complex),
> > KUNIT_CASE(test_unwrap_merge_complex_seqno),
> > + KUNIT_CASE(test_dedup_empty),
> > {}
> > };
> >
>
>
[-- Attachment #2: Type: text/html, Size: 2986 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-07-01 7:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-30 6:04 [PATCH] dma-buf/test: add KUnit case for dma_fence_dedup_array() empty input Baineng Shou
2026-06-30 6:13 ` sashiko-bot
2026-06-30 8:29 ` Christian König
2026-06-30 8:49 ` 寿柏能
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.