static bool g2h_has_room(struct xe_guc_ct *ct, u32 g2h_len)
 {
-       lockdep_assert_held(&ct->lock);
+       if (!g2h_len)
+               return true;
+
+       lockdep_assert_held(&ct->fast_lock);
 
        return ct->ctbs.g2h.info.space > g2h_len;
 }
        ct->ctbs.h2g.info.space -= cmd_len;
 }
 
-static void g2h_reserve_space(struct xe_guc_ct *ct, u32 g2h_len, u32 num_g2h)
+static void __g2h_reserve_space(struct xe_guc_ct *ct, u32 g2h_len, u32 num_g2h)
 {
        XE_BUG_ON(g2h_len > ct->ctbs.g2h.info.space);
 
        if (g2h_len) {
-               spin_lock_irq(&ct->fast_lock);
+               lockdep_assert_held(&ct->fast_lock);
+
                ct->ctbs.g2h.info.space -= g2h_len;
                ct->g2h_outstanding += num_g2h;
-               spin_unlock_irq(&ct->fast_lock);
        }
 }
 
                }
        }
 
+       if (g2h_len)
+               spin_lock_irq(&ct->fast_lock);
 retry:
        ret = has_room(ct, len + GUC_CTB_HDR_LEN, g2h_len);
        if (unlikely(ret))
-               goto out;
+               goto out_unlock;
 
        ret = h2g_write(ct, action, len, g2h_fence ? g2h_fence->seqno : 0,
                        !!g2h_fence);
        if (unlikely(ret)) {
                if (ret == -EAGAIN)
                        goto retry;
-               goto out;
+               goto out_unlock;
        }
 
-       g2h_reserve_space(ct, g2h_len, num_g2h);
+       __g2h_reserve_space(ct, g2h_len, num_g2h);
        xe_guc_notify(ct_to_guc(ct));
+out_unlock:
+       if (g2h_len)
+               spin_unlock_irq(&ct->fast_lock);
 out:
        return ret;
 }