]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
drm/nouveau/disp/nv50-: Set lock_core in curs507a_prepare
authorLyude Paul <lyude@redhat.com>
Fri, 19 Dec 2025 21:52:02 +0000 (16:52 -0500)
committerLyude Paul <lyude@redhat.com>
Tue, 13 Jan 2026 22:42:33 +0000 (17:42 -0500)
commit9e9bc6be0fa0b6b6b73f4f831f3b77716d0a8d9e
tree9091b7ab4493aea904f960df82e121df4417e7bf
parentdc2d5ddb193e363187bae2ad358245642d2721fb
drm/nouveau/disp/nv50-: Set lock_core in curs507a_prepare

For a while, I've been seeing a strange issue where some (usually not all)
of the display DMA channels will suddenly hang, particularly when there is
a visible cursor on the screen that is being frequently updated, and
especially when said cursor happens to go between two screens. While this
brings back lovely memories of fixing Intel Skylake bugs, I would quite
like to fix it :).

It turns out the problem that's happening here is that we're managing to
reach nv50_head_flush_set() in our atomic commit path without actually
holding nv50_disp->mutex. This means that cursor updates happening in
parallel (along with any other atomic updates that need to use the core
channel) will race with eachother, which eventually causes us to corrupt
the pushbuffer - leading to a plethora of various GSP errors, usually:

  nouveau 0000:c1:00.0: gsp: Xid:56 CMDre 00000000 00000218 00102680 00000004 00800003
  nouveau 0000:c1:00.0: gsp: Xid:56 CMDre 00000000 0000021c 00040509 00000004 00000001
  nouveau 0000:c1:00.0: gsp: Xid:56 CMDre 00000000 00000000 00000000 00000001 00000001

The reason this is happening is because generally we check whether we need
to set nv50_atom->lock_core at the end of nv50_head_atomic_check().
However, curs507a_prepare is called from the fb_prepare callback, which
happens after the atomic check phase. As a result, this can lead to commits
that both touch the core channel but also don't grab nv50_disp->mutex.

So, fix this by making sure that we set nv50_atom->lock_core in
cus507a_prepare().

Reviewed-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Lyude Paul <lyude@redhat.com>
Fixes: 1590700d94ac ("drm/nouveau/kms/nv50-: split each resource type into their own source files")
Cc: <stable@vger.kernel.org> # v4.18+
Link: https://patch.msgid.link/20251219215344.170852-2-lyude@redhat.com
drivers/gpu/drm/nouveau/dispnv50/curs507a.c