From: Jiri Slaby <jirislaby@kernel.org>
To: phasta@kernel.org,
"Christian König" <ckoenig.leichtzumerken@gmail.com>,
tursulin@ursulin.net, matthew.brost@intel.com,
sumit.semwal@linaro.org
Cc: dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org
Subject: Re: [PATCH 1/9] dma-buf: add dma_fence_was_initialized function v2
Date: Fri, 28 Aug 2026 09:29:00 +0200 [thread overview]
Message-ID: <0df59c80-ae58-47d3-a96b-e878a17766a7@kernel.org> (raw)
In-Reply-To: <5dd4248bccb446ef390e7149649632657db4aaae.camel@mailbox.org>
On 19. 08. 26, 14:51, Philipp Stanner wrote:
> On Wed, 2026-08-19 at 14:33 +0200, Philipp Stanner wrote:
>
>
> […]
>
>>
>> Regardless, looking at the code again, I would say that this might be a
>> race, but I don't know enough about QXL to say for sure.
>>
>> dma_fence_init() is (of course) not ordered:
>>
>>
>> static void
>> __dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,
>> spinlock_t *lock, u64 context, u64 seqno, unsigned long flags)
>> {
>> BUG_ON(!ops || !ops->get_driver_name || !ops->get_timeline_name);
>>
>> kref_init(&fence->refcount);
>> /*
>> * While it is counter intuitive to protect a constant function pointer
>> * table by RCU it allows modules to wait for an RCU grace period
>> * before they unload, to make sure that nobody is executing their
>> * functions any more.
>> */
>> RCU_INIT_POINTER(fence->ops, ops);
>> INIT_LIST_HEAD(&fence->cb_list);
>> fence->context = context;
>> fence->seqno = seqno;
>> fence->flags = flags | BIT(DMA_FENCE_FLAG_INITIALIZED_BIT);
>>
>> (Should this maybe be set_bit() btw?)
>>
>>
>> The fact that QXL could run into qxl_release_free() with an
>> uninitialized fence hints at the fact that this might race, so
>> DMA_FENCE_FLAG_INITIALIZED_BIT could be set / read before kref_init()
>> ran.
>>
>>
>> Maybe one way to verify / debug that would be to move
>> spin_unlock(&qdev->release_idr_lock) downwards so it also guards
>> dma_fence_was_initialized(), and also lock the initialization of the
>> fence (in qxl_release_fence_buffer_objects() ?) with said lock.
>>
>> If that's possible. Just brainstorming a bit for ways how to debug.
>>
>> QXL does a few tricky things with the release->base.ops pointer.
>> qxl_release_alloc() sets it to NULL, and only
>> qxl_release_fence_buffer_objects() then actually sets it. So this could
>> be the race? Setting of the ops pointer got replaced by setting of the
>> fence-flag.
>>
>>
>> P.
>
> Could you test something like this? (not even compile-tested, just an idea)
It makes the system dead during early boot :P.
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
> index 87797bea91cb..df1aa48b2809 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -1075,7 +1075,6 @@ __dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,
> INIT_LIST_HEAD(&fence->cb_list);
> fence->context = context;
> fence->seqno = seqno;
> - fence->flags = flags | BIT(DMA_FENCE_FLAG_INITIALIZED_BIT);
> if (lock) {
> fence->extern_lock = lock;
> } else {
> @@ -1084,6 +1083,8 @@ __dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,
This missing piece was here:
- fence->flags |= BIT(DMA_FENCE_FLAG_INLINE_LOCK_BIT);
+ flags |= BIT(DMA_FENCE_FLAG_INLINE_LOCK_BIT);
> }
> fence->error = 0;
>
> + smp_mb();
> + fence->flags = flags | BIT(DMA_FENCE_FLAG_INITIALIZED_BIT);
> trace_dma_fence_init(fence);
> }
But it does not help either...
> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
> index b52ab692b22e..40ffdcafaac1 100644
> --- a/include/linux/dma-fence.h
> +++ b/include/linux/dma-fence.h
> @@ -292,7 +292,12 @@ void dma_fence_describe(struct dma_fence *fence, struct seq_file *seq);
> */
> static inline bool dma_fence_was_initialized(struct dma_fence *fence)
> {
> - return fence && test_bit(DMA_FENCE_FLAG_INITIALIZED_BIT, &fence->flags);
> + bool init;
> +
> + init = fence && test_bit(DMA_FENCE_FLAG_INITIALIZED_BIT, &fence->flags);
> + smp_mb();
> +
> + return init;
> }
>
> /**
--
js
suse labs
next prev parent reply other threads:[~2026-08-28 7:29 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-20 10:54 Independence for dma_fences! v6 Christian König
2026-01-20 10:54 ` [PATCH 1/9] dma-buf: add dma_fence_was_initialized function v2 Christian König
2026-01-20 11:33 ` Tvrtko Ursulin
2026-07-13 8:58 ` Jiri Slaby
2026-07-14 7:53 ` Philipp Stanner
2026-07-14 8:43 ` Philipp Stanner
2026-08-19 8:59 ` Jiri Slaby
2026-08-19 12:33 ` Philipp Stanner
2026-08-19 12:51 ` Philipp Stanner
2026-08-28 7:29 ` Jiri Slaby [this message]
2026-08-28 7:46 ` Jiri Slaby
2026-08-28 8:32 ` Jiri Slaby
2026-09-02 6:52 ` Philipp Stanner
2026-09-02 6:56 ` Jiri Slaby
2026-09-02 7:03 ` Philipp Stanner
2026-09-02 10:47 ` Jiri Slaby
2026-01-20 10:54 ` [PATCH 2/9] dma-buf: protected fence ops by RCU v5 Christian König
2026-01-20 10:54 ` [PATCH 3/9] dma-buf: detach fence ops on signal v2 Christian König
2026-01-20 10:54 ` [PATCH 4/9] dma-buf: abstract fence locking Christian König
2026-01-20 10:54 ` [PATCH 5/9] dma-buf: inline spinlock for fence protection v4 Christian König
2026-01-20 11:41 ` Tvrtko Ursulin
2026-01-21 8:48 ` Christian König
2026-01-21 9:03 ` Tvrtko Ursulin
2026-01-27 4:56 ` kernel test robot
2026-01-20 10:54 ` [PATCH 6/9] dma-buf/selftests: test RCU ops and inline lock v2 Christian König
2026-01-20 10:54 ` [PATCH 7/9] dma-buf: use inline lock for the stub fence v2 Christian König
2026-01-21 9:29 ` Philipp Stanner
2026-01-20 10:54 ` [PATCH 8/9] dma-buf: use inline lock for the dma-fence-array Christian König
2026-01-20 10:54 ` [PATCH 9/9] dma-buf: use inline lock for the dma-fence-chain Christian König
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0df59c80-ae58-47d3-a96b-e878a17766a7@kernel.org \
--to=jirislaby@kernel.org \
--cc=ckoenig.leichtzumerken@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=matthew.brost@intel.com \
--cc=phasta@kernel.org \
--cc=sumit.semwal@linaro.org \
--cc=tursulin@ursulin.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox