static __always_inline void __mwait(u32 eax, u32 ecx)
 {
-       x86_idle_clear_cpu_buffers();
-
        /*
         * Use the instruction mnemonic with implicit operands, as the LLVM
         * assembler fails to assemble the mnemonic with explicit operands:
  */
 static __always_inline void __sti_mwait(u32 eax, u32 ecx)
 {
-       x86_idle_clear_cpu_buffers();
 
        asm volatile("sti; mwait" :: "a" (eax), "c" (ecx));
 }
  */
 static __always_inline void mwait_idle_with_hints(u32 eax, u32 ecx)
 {
+       if (need_resched())
+               return;
+
+       x86_idle_clear_cpu_buffers();
+
        if (static_cpu_has_bug(X86_BUG_MONITOR) || !current_set_polling_and_test()) {
                const void *addr = ¤t_thread_info()->flags;
 
                alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR, [addr] "a" (addr));
                __monitor(addr, 0, 0);
 
-               if (!need_resched()) {
-                       if (ecx & 1) {
-                               __mwait(eax, ecx);
-                       } else {
-                               __sti_mwait(eax, ecx);
-                               raw_local_irq_disable();
-                       }
+               if (need_resched())
+                       goto out;
+
+               if (ecx & 1) {
+                       __mwait(eax, ecx);
+               } else {
+                       __sti_mwait(eax, ecx);
+                       raw_local_irq_disable();
                }
        }
+
+out:
        current_clr_polling();
 }
 
 
  */
 static __cpuidle void mwait_idle(void)
 {
+       if (need_resched())
+               return;
+
+       x86_idle_clear_cpu_buffers();
+
        if (!current_set_polling_and_test()) {
                const void *addr = ¤t_thread_info()->flags;
 
                alternative_input("", "clflush (%[addr])", X86_BUG_CLFLUSH_MONITOR, [addr] "a" (addr));
                __monitor(addr, 0, 0);
-               if (!need_resched()) {
-                       __sti_mwait(0, 0);
-                       raw_local_irq_disable();
-               }
+               if (need_resched())
+                       goto out;
+
+               __sti_mwait(0, 0);
+               raw_local_irq_disable();
        }
+
+out:
        __current_clr_polling();
 }