Thanks for the review.

On the service-gating concern: I will keep GC_IN_SERVICE set on the
failed-resume rescan exit, so the existing gate is preserved until the
old device is removed.  A freshly probed device starts with clear flags,
so the bit naturally resets across the rescan, and no second service or
tx-timeout work can be admitted while mana_serv_rescan() tears the device
down.

On the lock scope: agreed that holding the driver-core device lock across
mana_gd_suspend() + the msleep() + mana_gd_resume() is far too broad.
Narrowing it is not as simple as swapping in a driver-private mutex,
though.  A mutex embedded in struct gdma_context cannot itself protect the
drvdata lookup, which happens before such a lock can be taken, and
mana_gd_remove() cannot take-then-free-then-release a lock that lives
inside the object being freed.  What this race actually needs is a drain
boundary: close admission of new reset work, wait for the already-admitted
work to finish, and only then clear drvdata and tear the context down.

I am aligning this with Long Li's in-flight series "[PATCH net v4 0/7]
net: mana: HW channel reliability and hardening fixes", which is
establishing the HWC teardown lifecycle model (the setup_active state and
explicit destroy ordering), so that the reset/remove rework follows the
same HWC lifecycle and teardown ordering, rather than introducing an
independent synchronization scheme that could conflict with that work.

I will send a reworked version once that direction is settled.


Reply via email to