Thanks - agreed, a lock shape reads better here, and v4 will use one.

To be clear about why it isn't a plain mutex: admission runs in hard IRQ
context (mana_gd_intr() -> mana_gd_process_eqe() ->
mana_schedule_serv_work()), and mana_gd_remove() can be entered on the
service work's own stack (its rescan exit calls
pci_stop_and_remove_bus_device()), so cancel_work_sync() is out and
remove() can only wait until the work has stopped touching gc, not for
it to finish. v4 expresses this with a small gc-embedded spinlock
(hardirq-safe, never held across sleeps) plus a waitqueue for the
drain, replacing the flag protocol.

v4 will also fix the two real issues the AI review flagged, which the
lock alone does not address:

- GC_REMOVING currently stays latched if a rescan exit bails out early
  (no parent bus) without removing the device; v4 checks for that
  before closing admission, so service is never permanently disabled
  on a bound device.

- mana_gd_shutdown() now drains as well, since it tears down the same
  hardware paths remove() does.


Reply via email to