|
@@ -2479,34 +2479,98 @@ static inline int tsk_is_polling(struct task_struct *p)
|
|
|
{
|
|
|
return task_thread_info(p)->status & TS_POLLING;
|
|
|
}
|
|
|
-static inline void current_set_polling(void)
|
|
|
+static inline void __current_set_polling(void)
|
|
|
{
|
|
|
current_thread_info()->status |= TS_POLLING;
|
|
|
}
|
|
|
|
|
|
-static inline void current_clr_polling(void)
|
|
|
+static inline bool __must_check current_set_polling_and_test(void)
|
|
|
+{
|
|
|
+ __current_set_polling();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Polling state must be visible before we test NEED_RESCHED,
|
|
|
+ * paired by resched_task()
|
|
|
+ */
|
|
|
+ smp_mb();
|
|
|
+
|
|
|
+ return unlikely(tif_need_resched());
|
|
|
+}
|
|
|
+
|
|
|
+static inline void __current_clr_polling(void)
|
|
|
{
|
|
|
current_thread_info()->status &= ~TS_POLLING;
|
|
|
- smp_mb__after_clear_bit();
|
|
|
+}
|
|
|
+
|
|
|
+static inline bool __must_check current_clr_polling_and_test(void)
|
|
|
+{
|
|
|
+ __current_clr_polling();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Polling state must be visible before we test NEED_RESCHED,
|
|
|
+ * paired by resched_task()
|
|
|
+ */
|
|
|
+ smp_mb();
|
|
|
+
|
|
|
+ return unlikely(tif_need_resched());
|
|
|
}
|
|
|
#elif defined(TIF_POLLING_NRFLAG)
|
|
|
static inline int tsk_is_polling(struct task_struct *p)
|
|
|
{
|
|
|
return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG);
|
|
|
}
|
|
|
-static inline void current_set_polling(void)
|
|
|
+
|
|
|
+static inline void __current_set_polling(void)
|
|
|
{
|
|
|
set_thread_flag(TIF_POLLING_NRFLAG);
|
|
|
}
|
|
|
|
|
|
-static inline void current_clr_polling(void)
|
|
|
+static inline bool __must_check current_set_polling_and_test(void)
|
|
|
+{
|
|
|
+ __current_set_polling();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Polling state must be visible before we test NEED_RESCHED,
|
|
|
+ * paired by resched_task()
|
|
|
+ *
|
|
|
+ * XXX: assumes set/clear bit are identical barrier wise.
|
|
|
+ */
|
|
|
+ smp_mb__after_clear_bit();
|
|
|
+
|
|
|
+ return unlikely(tif_need_resched());
|
|
|
+}
|
|
|
+
|
|
|
+static inline void __current_clr_polling(void)
|
|
|
{
|
|
|
clear_thread_flag(TIF_POLLING_NRFLAG);
|
|
|
}
|
|
|
+
|
|
|
+static inline bool __must_check current_clr_polling_and_test(void)
|
|
|
+{
|
|
|
+ __current_clr_polling();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Polling state must be visible before we test NEED_RESCHED,
|
|
|
+ * paired by resched_task()
|
|
|
+ */
|
|
|
+ smp_mb__after_clear_bit();
|
|
|
+
|
|
|
+ return unlikely(tif_need_resched());
|
|
|
+}
|
|
|
+
|
|
|
#else
|
|
|
static inline int tsk_is_polling(struct task_struct *p) { return 0; }
|
|
|
-static inline void current_set_polling(void) { }
|
|
|
-static inline void current_clr_polling(void) { }
|
|
|
+static inline void __current_set_polling(void) { }
|
|
|
+static inline void __current_clr_polling(void) { }
|
|
|
+
|
|
|
+static inline bool __must_check current_set_polling_and_test(void)
|
|
|
+{
|
|
|
+ return unlikely(tif_need_resched());
|
|
|
+}
|
|
|
+static inline bool __must_check current_clr_polling_and_test(void)
|
|
|
+{
|
|
|
+ return unlikely(tif_need_resched());
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
/*
|