]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/guc: Kick G2H tasklet if no credits
authorMatthew Brost <matthew.brost@intel.com>
Tue, 14 Dec 2021 17:04:59 +0000 (09:04 -0800)
committerJohn Harrison <John.C.Harrison@Intel.com>
Thu, 16 Dec 2021 03:10:51 +0000 (19:10 -0800)
Let's be paranoid and kick the G2H tasklet, which dequeues messages, if
G2H credits are exhausted.

Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: John Harrison <John.C.Harrison@Intel.com>
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211214170500.28569-7-matthew.brost@intel.com
drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c

index 741be9abab68e1410257a5942d28b98e9e36ee1f..aa6dd6415202a1ebd0e81546abf49898938a863a 100644 (file)
@@ -591,12 +591,19 @@ static inline bool h2g_has_room(struct intel_guc_ct *ct, u32 len_dw)
 
 static int has_room_nb(struct intel_guc_ct *ct, u32 h2g_dw, u32 g2h_dw)
 {
+       bool h2g = h2g_has_room(ct, h2g_dw);
+       bool g2h = g2h_has_room(ct, g2h_dw);
+
        lockdep_assert_held(&ct->ctbs.send.lock);
 
-       if (unlikely(!h2g_has_room(ct, h2g_dw) || !g2h_has_room(ct, g2h_dw))) {
+       if (unlikely(!h2g || !g2h)) {
                if (ct->stall_time == KTIME_MAX)
                        ct->stall_time = ktime_get();
 
+               /* Be paranoid and kick G2H tasklet to free credits */
+               if (!g2h)
+                       tasklet_hi_schedule(&ct->receive_tasklet);
+
                if (unlikely(ct_deadlocked(ct)))
                        return -EPIPE;
                else