From: Marek Czernohous <mczernohous@gmail.com>
To: nouveau@lists.freedesktop.org
Cc: Lyude Paul <lyude@redhat.com>, Danilo Krummrich <dakr@kernel.org>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 0/3] drm/nouveau: nv04 FIFO cleanup + recovery for Tesla
Date: Thu, 6 Aug 2026 11:59:57 +0200 [thread overview]
Message-ID: <20260806095957.1908908-1-mczernohous@gmail.com> (raw)
In-Reply-To: <20260806085228.1848994-1-mczernohous@gmail.com>
Both findings are correct, thank you.
I checked them against mainline rather than against my downstream tree:
1) nouveau_channel_del() frees the fence context first and only drops the
kill subscription later, among the nvif object teardown calls. The
subscribed handler reaches nouveau_fence_context_kill(chan->fence), so
a kill delivered in that window takes fctx->lock and walks
fctx->pending on a context that context_del() has already freed.
2) nouveau_channel_init() arms the subscription right after mapping userd
and creates the fence context at the end of the same function. The
backends publish the pointer before the context is usable:
fctx = chan->fence = kzalloc_obj(*fctx);
if (!fctx)
return -ENOMEM;
nouveau_fence_context_new(chan, &fctx->base);
and it is nouveau_fence_context_new() that runs spin_lock_init(&fctx->lock)
and INIT_LIST_HEAD(&fctx->pending). The NULL check in
nouveau_channel_kill() does not cover that window: chan->fence is
non-NULL and unusable, so the handler locks something that was never
initialised and walks a list head whose next pointer is still the NULL
left by kzalloc().
Both are unreachable below Fermi today, which is exactly why they belong
in this series: 2/3 lowers the gate to NV50 and 3/3 adds the caller that
kills Tesla channels. This series is what makes them reachable, so
shipping it without them would trade a recoverable fault for a
use-after-free.
I should have carried the first one from the start. It has been running
on the reference machine since 2026-07-25, and my v2 cover letter
described that same ordering and then dismissed it as "most of that
window is harmless". That judgement was wrong.
v3 will put both in front of the subscription change, as 1/5 and 2/5,
with the remaining three unchanged apart from the rebase.
WARNING: multiple messages have this Message-ID (diff)
From: Marek Czernohous <mczernohous@gmail.com>
To: nouveau@lists.freedesktop.org
Cc: Danilo Krummrich <dakr@kernel.org>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 0/3] drm/nouveau: nv04 FIFO cleanup + recovery for Tesla
Date: Thu, 6 Aug 2026 11:59:57 +0200 [thread overview]
Message-ID: <20260806095957.1908908-1-mczernohous@gmail.com> (raw)
In-Reply-To: <20260806085228.1848994-1-mczernohous@gmail.com>
Both findings are correct, thank you.
I checked them against mainline rather than against my downstream tree:
1) nouveau_channel_del() frees the fence context first and only drops the
kill subscription later, among the nvif object teardown calls. The
subscribed handler reaches nouveau_fence_context_kill(chan->fence), so
a kill delivered in that window takes fctx->lock and walks
fctx->pending on a context that context_del() has already freed.
2) nouveau_channel_init() arms the subscription right after mapping userd
and creates the fence context at the end of the same function. The
backends publish the pointer before the context is usable:
fctx = chan->fence = kzalloc_obj(*fctx);
if (!fctx)
return -ENOMEM;
nouveau_fence_context_new(chan, &fctx->base);
and it is nouveau_fence_context_new() that runs spin_lock_init(&fctx->lock)
and INIT_LIST_HEAD(&fctx->pending). The NULL check in
nouveau_channel_kill() does not cover that window: chan->fence is
non-NULL and unusable, so the handler locks something that was never
initialised and walks a list head whose next pointer is still the NULL
left by kzalloc().
Both are unreachable below Fermi today, which is exactly why they belong
in this series: 2/3 lowers the gate to NV50 and 3/3 adds the caller that
kills Tesla channels. This series is what makes them reachable, so
shipping it without them would trade a recoverable fault for a
use-after-free.
I should have carried the first one from the start. It has been running
on the reference machine since 2026-07-25, and my v2 cover letter
described that same ordering and then dismissed it as "most of that
window is harmless". That judgement was wrong.
v3 will put both in front of the subscription change, as 1/5 and 2/5,
with the remaining three unchanged apart from the rebase.
next prev parent reply other threads:[~2026-08-06 10:00 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-06 8:52 [PATCH v2 0/3] drm/nouveau: nv04 FIFO cleanup + recovery for Tesla Marek Czernohous
2026-08-06 8:52 ` Marek Czernohous
2026-08-06 8:52 ` [PATCH v2 1/3] drm/nouveau/fifo/nv04: filter benign CACHE_ERROR from Mesa NV50 bind probe Marek Czernohous
2026-08-06 8:52 ` Marek Czernohous
2026-08-06 8:52 ` [PATCH v2 2/3] drm/nouveau: subscribe to channel-kill events on NV50 and newer Marek Czernohous
2026-08-06 8:52 ` Marek Czernohous
2026-08-06 9:20 ` sashiko-bot
2026-08-06 8:52 ` [PATCH v2 3/3] drm/nouveau/fifo: add recovery path for Tesla cache_error/dma_pusher Marek Czernohous
2026-08-06 8:52 ` Marek Czernohous
2026-08-06 9:29 ` sashiko-bot
2026-08-06 9:59 ` Marek Czernohous [this message]
2026-08-06 9:59 ` [PATCH v2 0/3] drm/nouveau: nv04 FIFO cleanup + recovery for Tesla Marek Czernohous
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=20260806095957.1908908-1-mczernohous@gmail.com \
--to=mczernohous@gmail.com \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lyude@redhat.com \
--cc=nouveau@lists.freedesktop.org \
/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 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.