Rust for Linux List
 help / color / mirror / Atom feed
From: "Onur Özkan" <work@onurozkan.dev>
To: Daniel Almeida <daniel.almeida@collabora.com>
Cc: linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org,
	dri-devel@lists.freedesktop.org, dakr@kernel.org,
	aliceryhl@google.com, airlied@gmail.com, simona@ffwll.ch,
	ojeda@kernel.org, boqun@kernel.org, gary@garyguo.net,
	bjorn3_gh@protonmail.com, lossin@kernel.org,
	a.hindborg@kernel.org, tmgross@umich.edu
Subject: Re: [PATCH v6 3/3] drm/tyr: put iomem behind the hardware gate
Date: Sat, 12 Sep 2026 14:10:07 +0300	[thread overview]
Message-ID: <20260912111011.5274-1-work@onurozkan.dev> (raw)
In-Reply-To: <39E7E24E-147C-4894-AD8F-095B60FDA955@collabora.com>

On Mon, 24 Aug 2026 14:05:11 -0300
Daniel Almeida <daniel.almeida@collabora.com> wrote:

> Hi Onur,
> 
> 
> While testing this patch, I came across the following splat:
> 
> 
> [   12.648287] WARNING: possible circular locking dependency detected
> [   12.648826] 7.1.0-rc5-g991a312b28c2 #1 Not tainted
> [   12.649245] ------------------------------------------------------
> [   12.649782] modprobe/167 is trying to acquire lock:
> [   12.650208] ffff0001f1713c80 (drivers/gpu/drm/tyr/reset/hw_gate.rs:42){+.+.}-{4:4}, at: rust_helper_mutex_lock+0x14/0x20
> [   12.651169] 
> [   12.651169] but task is already holding lock:
> [   12.651677] ffff0001f1713cc0 (drivers/gpu/drm/tyr/reset/hw_gate.rs:43){.+.+}-{0:0}, at: srcu_lock_acquire+0x4/0x40
> [   12.652588] 
> [   12.652588] which lock already depends on the new lock.
> [   12.652588] 
> [   12.653299] 
> [   12.653299] the existing dependency chain (in reverse order) is:
> [   12.653948] 
> [   12.653948] -> #1 (drivers/gpu/drm/tyr/reset/hw_gate.rs:43){.+.+}-{0:0}:
> [   12.654664]        srcu_lock_sync+0x30/0x3c
> [   12.655035]        __synchronize_srcu+0x58/0x180
> [   12.655441]        synchronize_srcu+0x20c/0x28c
> [   12.655838]        _RNvNtCs8XoewxZdfnt_3tyr5reset9run_reset+0x3c/0x1d4 [tyr]
> [   12.656469]        _RNvXNtCs8XoewxZdfnt_3tyr6driverNtB2_17TyrPlatformDriverNtNtCsbuTvttuFvbr_6kernel8platform6Driver5probe+0x254/0x470 [tyr]
> [   12.657573]        _RNvMs0_NtCsbuTvttuFvbr_6kernel8platformINtB5_7AdapterNtNtCs8XoewxZdfnt_3tyr6driver17TyrPlatformDriverE14probe_callbackBT_+0x44/0x10c [tyr]
> [   12.658812]        platform_probe+0x68/0xa4
> [   12.659182]        really_probe+0x198/0x42c
> [   12.659551]        __driver_probe_device+0xc8/0x190
> [   12.659979]        driver_probe_device+0x40/0x240
> [   12.660392]        __driver_attach+0xf8/0x294
> [   12.660775]        bus_for_each_dev+0xec/0x144
> [   12.661168]        driver_attach+0x24/0x30
> [   12.661528]        bus_add_driver+0x158/0x2a8
> [   12.661910]        driver_register+0x68/0x100
> [   12.662293]        __platform_driver_register+0x24/0x30
> [   12.662752]        init_module+0x70/0xfc4 [tyr]
> [   12.663157]        do_one_initcall+0x114/0x4b4
> [   12.663551]        do_init_module+0x54/0x220
> [   12.663927]        load_module+0x1754/0x1984
> [   12.664302]        __arm64_sys_init_module+0x184/0x23c
> [   12.664755]        invoke_syscall+0x48/0xf8
> [   12.665125]        el0_svc_common+0x90/0xdc
> [   12.665494]        do_el0_svc+0x1c/0x28
> [   12.665833]        el0_svc+0x54/0x258
> [   12.666159]        el0t_64_sync_handler+0x78/0x12c
> [   12.666582]        el0t_64_sync+0x198/0x19c
> [   12.666948] 
> [   12.666948] -> #0 (drivers/gpu/drm/tyr/reset/hw_gate.rs:42){+.+.}-{4:4}:
> [   12.667665]        __lock_acquire+0x18b4/0x3208
> [   12.668062]        lock_acquire+0x110/0x300
> [   12.668429]        __mutex_lock_common+0xec/0x1490
> [   12.668851]        mutex_lock_nested+0x2c/0x38
> [   12.669242]        rust_helper_mutex_lock+0x14/0x20
> [   12.669671]        _RNvMs0_NtNtCs8XoewxZdfnt_3tyr3mmu13address_spaceNtB5_19AddressSpaceManager13as_wait_ready+0x28/0x108 [tyr]
> [   12.670670]        _RNvMs0_NtNtCs8XoewxZdfnt_3tyr3mmu13address_spaceNtB5_19AddressSpaceManager11as_send_cmd+0x24/0xb0 [tyr]
> [   12.671645]        _RNvXs_NtNtCs8XoewxZdfnt_3tyr3mmu13address_spaceNtB4_19AddressSpaceManagerNtNtB8_4slot14SlotOperations8activate+0x2dc/0x3ac [tyr]
> [   12.672807]        _RNvMs0_NtCs8XoewxZdfnt_3tyr2fwNtB5_8Firmware3new+0x12d4/0x184c [tyr]
> [   12.673520]        _RNvXNtCs8XoewxZdfnt_3tyr6driverNtB2_17TyrPlatformDriverNtNtCsbuTvttuFvbr_6kernel8platform6Driver5probe+0x368/0x470 [tyr]
> [   12.674622]        _RNvMs0_NtCsbuTvttuFvbr_6kernel8platformINtB5_7AdapterNtNtCs8XoewxZdfnt_3tyr6driver17TyrPlatformDriverE14probe_callbackBT_+0x44/0x10c [tyr]
> [   12.675860]        platform_probe+0x68/0xa4
> [   12.676228]        really_probe+0x198/0x42c
> [   12.676596]        __driver_probe_device+0xc8/0x190
> [   12.677024]        driver_probe_device+0x40/0x240
> [   12.677437]        __driver_attach+0xf8/0x294
> [   12.677818]        bus_for_each_dev+0xec/0x144
> [   12.678210]        driver_attach+0x24/0x30
> [   12.678570]        bus_add_driver+0x158/0x2a8
> [   12.678951]        driver_register+0x68/0x100
> [   12.679334]        __platform_driver_register+0x24/0x30
> [   12.679792]        init_module+0x70/0xfc4 [tyr]
> [   12.680196]        do_one_initcall+0x114/0x4b4
> [   12.680589]        do_init_module+0x54/0x220
> [   12.680964]        load_module+0x1754/0x1984
> [   12.681338]        __arm64_sys_init_module+0x184/0x23c
> [   12.681790]        invoke_syscall+0x48/0xf8
> [   12.682159]        el0_svc_common+0x90/0xdc
> [   12.682529]        do_el0_svc+0x1c/0x28
> [   12.682868]        el0_svc+0x54/0x258
> [   12.683193]        el0t_64_sync_handler+0x78/0x12c
> [   12.683615]        el0t_64_sync+0x198/0x19c
> [   12.683982] 
> [   12.683982] other info that might help us debug this:
> [   12.683982] 
> [   12.684677]  Possible unsafe locking scenario:
> [   12.684677] 
> [   12.685192]        CPU0                    CPU1
> [   12.685586]        ----                    ----
> [   12.685981]   rlock(drivers/gpu/drm/tyr/reset/hw_gate.rs:43);
> [   12.686483]                                lock(drivers/gpu/drm/tyr/reset/hw_gate.rs:42);
> [   12.687196]                                lock(drivers/gpu/drm/tyr/reset/hw_gate.rs:43);
> [   12.687908]   lock(drivers/gpu/drm/tyr/reset/hw_gate.rs:42);
> [   12.688403] 
> [   12.688403]  *** DEADLOCK ***
> [   12.688403] 
> [   12.688917] 3 locks held by modprobe/167:
> [   12.689268]  #0: ffff0001f0ee3938 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xec/0x294
> [   12.690004]  #1: ffff0001f3573468 (drivers/gpu/drm/tyr/mmu.rs:76){+.+.}-{4:4}, at: rust_helper_mutex_lock+0x14/0x20
> [   12.690921]  #2: ffff0001f1713cc0 (drivers/gpu/drm/tyr/reset/hw_gate.rs:43){.+.+}-{0:0}, at: srcu_lock_acquire+0x4/0x40
> [   12.691869] 
> [   12.691869] stack backtrace:
> [   12.692250] CPU: 4 UID: 0 PID: 167 Comm: modprobe Not tainted 7.1.0-rc5-g991a312b28c2 #1 PREEMPT 
> [   12.692255] Hardware name: Radxa ROCK 5B (DT)
> [   12.692257] Call trace:
> [   12.692258]  show_stack+0x18/0x24 (C)
> [   12.692266]  dump_stack_lvl+0x40/0x9c
> [   12.692272]  dump_stack+0x18/0x24
> [   12.692278]  print_circular_bug+0x324/0x32c
> [   12.692283]  check_noncircular+0x15c/0x178
> [   12.692287]  __lock_acquire+0x18b4/0x3208
> [   12.692291]  lock_acquire+0x110/0x300
> [   12.692295]  __mutex_lock_common+0xec/0x1490
> [   12.692300]  mutex_lock_nested+0x2c/0x38
> [   12.692306]  rust_helper_mutex_lock+0x14/0x20
> [   12.692311]  _RNvMs0_NtNtCs8XoewxZdfnt_3tyr3mmu13address_spaceNtB5_19AddressSpaceManager13as_wait_ready+0x28/0x108 [tyr]
> [   12.692323]  _RNvMs0_NtNtCs8XoewxZdfnt_3tyr3mmu13address_spaceNtB5_19AddressSpaceManager11as_send_cmd+0x24/0xb0 [tyr]
> [   12.692334]  _RNvXs_NtNtCs8XoewxZdfnt_3tyr3mmu13address_spaceNtB4_19AddressSpaceManagerNtNtB8_4slot14SlotOperations8activate+0x2dc/0x3ac [tyr]
> [   12.692346]  _RNvMs0_NtCs8XoewxZdfnt_3tyr2fwNtB5_8Firmware3new+0x12d4/0x184c [tyr]
> [   12.692357]  _RNvXNtCs8XoewxZdfnt_3tyr6driverNtB2_17TyrPlatformDriverNtNtCsbuTvttuFvbr_6kernel8platform6Driver5probe+0x368/0x470 [tyr]
> [   12.692368]  _RNvMs0_NtCsbuTvttuFvbr_6kernel8platformINtB5_7AdapterNtNtCs8XoewxZdfnt_3tyr6driver17TyrPlatformDriverE14probe_callbackBT_+0x44/0x10c [tyr]
> [   12.692379]  platform_probe+0x68/0xa4
> [   12.692385]  really_probe+0x198/0x42c
> [   12.692389]  __driver_probe_device+0xc8/0x190
> [   12.692393]  driver_probe_device+0x40/0x240
> [   12.692398]  __driver_attach+0xf8/0x294
> [   12.692402]  bus_for_each_dev+0xec/0x144
> [   12.692409]  driver_attach+0x24/0x30
> [   12.692413]  bus_add_driver+0x158/0x2a8
> [   12.692416]  driver_register+0x68/0x100
> [   12.692420]  __platform_driver_register+0x24/0x30
> [   12.692426]  init_module+0x70/0xfc4 [tyr]
> [   12.692437]  do_one_initcall+0x114/0x4b4
> [   12.692443]  do_init_module+0x54/0x220
> [   12.692447]  load_module+0x1754/0x1984
> [   12.692451]  __arm64_sys_init_module+0x184/0x23c
> [   12.692458]  invoke_syscall+0x48/0xf8
> [   12.692464]  el0_svc_common+0x90/0xdc
> [   12.692470]  do_el0_svc+0x1c/0x28
> [   12.692476]  el0_svc+0x54/0x258
> [   12.692482]  el0t_64_sync_handler+0x78/0x12c
> [   12.692489]  el0t_64_sync+0x198/0x19c
> 
> I suggest that we take the gate only once per public AS operation, and pass
> &IoMem to the lower layers as needed. This has the side effect of making the
> whole AS op atomic w.r.t to resets, which does not appear to be the case today,
> as we nest calls to access(). Additionally, we can reintroduce the &mut self's
> that were removed to make this compile; which I'd prefer. This can probably be
> done by cloning the Arc<HwGate>, so it doesn't borrow self, i.e.:
> 
> let hw = self.hw.clone();
> let guard = hw.access(); // doesn't borrow self
> 
> -- Daniel
> 

Hi Daniel,

I fixed this in v7 [1] and tested on Orange Pi, the deadlock shouldn't happen
anymore.

[1]: https://lore.kernel.org/all/20260912-tyr-reset-impl-v7-0-077ce72084eb@onurozkan.dev

Thanks,
Onur

> 
> 

      reply	other threads:[~2026-09-12 11:10 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-19 18:45 [PATCH v6 0/3] drm/tyr: GPU reset infrastructure Onur Özkan
2026-08-19 18:45 ` [PATCH v6 1/3] drm/tyr: clear stale IRQ state before soft reset Onur Özkan
2026-08-19 18:45 ` [PATCH v6 2/3] drm/tyr: add GPU reset infrastructure Onur Özkan
2026-08-21 15:31   ` Daniel Almeida
2026-08-21 15:58     ` Onur Özkan
2026-08-21 16:12       ` Danilo Krummrich
2026-08-21 16:39       ` Daniel Almeida
2026-08-21 16:42         ` Onur Özkan
2026-08-21 17:01         ` Danilo Krummrich
2026-08-21 17:23           ` Daniel Almeida
2026-08-21 18:53             ` Danilo Krummrich
2026-08-19 18:45 ` [PATCH v6 3/3] drm/tyr: put iomem behind the hardware gate Onur Özkan
2026-08-24 17:05   ` Daniel Almeida
2026-09-12 11:10     ` Onur Özkan [this message]

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=20260912111011.5274-1-work@onurozkan.dev \
    --to=work@onurozkan.dev \
    --cc=a.hindborg@kernel.org \
    --cc=airlied@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun@kernel.org \
    --cc=dakr@kernel.org \
    --cc=daniel.almeida@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gary@garyguo.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lossin@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=simona@ffwll.ch \
    --cc=tmgross@umich.edu \
    /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