]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/gt: Use spin_lock_irqsave() in interruptible context
authorKrzysztof Karas <krzysztof.karas@intel.com>
Thu, 16 Jan 2025 10:40:46 +0000 (10:40 +0000)
committerAndi Shyti <andi.shyti@linux.intel.com>
Thu, 13 Feb 2025 17:39:29 +0000 (18:39 +0100)
spin_lock/unlock() functions used in interrupt contexts could
result in a deadlock, as seen in GitLab issue #13399,
which occurs when interrupt comes in while holding a lock.

Try to remedy the problem by saving irq state before spin lock
acquisition.

v2: add irqs' state save/restore calls to all locks/unlocks in
 signal_irq_work() execution (Maciej)

v3: use with spin_lock_irqsave() in guc_lrc_desc_unpin() instead
 of other lock/unlock calls and add Fixes and Cc tags (Tvrtko);
 change title and commit message

Fixes: 2f2cc53b5fe7 ("drm/i915/guc: Close deregister-context race against CT-loss")
Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13399
Signed-off-by: Krzysztof Karas <krzysztof.karas@intel.com>
Cc: <stable@vger.kernel.org> # v6.9+
Reviewed-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/pusppq5ybyszau2oocboj3mtj5x574gwij323jlclm5zxvimmu@mnfg6odxbpsv
drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

index cc05bd9e43b4958a38cea6629dcf73e2a60cc07c..3fce5c00014448b79183f19bfeec91a8bf08167d 100644 (file)
@@ -3449,10 +3449,10 @@ static inline int guc_lrc_desc_unpin(struct intel_context *ce)
         */
        ret = deregister_context(ce, ce->guc_id.id);
        if (ret) {
-               spin_lock(&ce->guc_state.lock);
+               spin_lock_irqsave(&ce->guc_state.lock, flags);
                set_context_registered(ce);
                clr_context_destroyed(ce);
-               spin_unlock(&ce->guc_state.lock);
+               spin_unlock_irqrestore(&ce->guc_state.lock, flags);
                /*
                 * As gt-pm is awake at function entry, intel_wakeref_put_async merely decrements
                 * the wakeref immediately but per function spec usage call this after unlock.