return test_bit(flag, (unsigned long *)&ti->flags);
 }
 
+/*
+ * This may be used in noinstr code, and needs to be __always_inline to prevent
+ * inadvertent instrumentation.
+ */
+static __always_inline unsigned long read_ti_thread_flags(struct thread_info *ti)
+{
+       return READ_ONCE(ti->flags);
+}
+
 #define set_thread_flag(flag) \
        set_ti_thread_flag(current_thread_info(), flag)
 #define clear_thread_flag(flag) \
        test_and_clear_ti_thread_flag(current_thread_info(), flag)
 #define test_thread_flag(flag) \
        test_ti_thread_flag(current_thread_info(), flag)
+#define read_thread_flags() \
+       read_ti_thread_flags(current_thread_info())
+
+#define read_task_thread_flags(t) \
+       read_ti_thread_flags(task_thread_info(t))
 
 #ifdef CONFIG_GENERIC_ENTRY
 #define set_syscall_work(fl) \