thread_info: Add update_thread_flag() helpers
There are a number of bits of code sprinkled around the kernel to set a thread flag if a certain condition is true, and clear it otherwise. To help make those call sites terser and less cumbersome, this patch adds a new family of thread flag manipulators update*_thread_flag([...,] flag, cond) which do the equivalent of: if (cond) set*_thread_flag([...,] flag); else clear*_thread_flag([...,] flag); Signed-off-by: Dave Martin <Dave.Martin@arm.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>hifive-unleashed-5.1
parent
d8ad71fa38
commit
93ee37c2a6
|
@ -1578,6 +1578,12 @@ static inline void clear_tsk_thread_flag(struct task_struct *tsk, int flag)
|
||||||
clear_ti_thread_flag(task_thread_info(tsk), flag);
|
clear_ti_thread_flag(task_thread_info(tsk), flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void update_tsk_thread_flag(struct task_struct *tsk, int flag,
|
||||||
|
bool value)
|
||||||
|
{
|
||||||
|
update_ti_thread_flag(task_thread_info(tsk), flag, value);
|
||||||
|
}
|
||||||
|
|
||||||
static inline int test_and_set_tsk_thread_flag(struct task_struct *tsk, int flag)
|
static inline int test_and_set_tsk_thread_flag(struct task_struct *tsk, int flag)
|
||||||
{
|
{
|
||||||
return test_and_set_ti_thread_flag(task_thread_info(tsk), flag);
|
return test_and_set_ti_thread_flag(task_thread_info(tsk), flag);
|
||||||
|
|
|
@ -60,6 +60,15 @@ static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
|
||||||
clear_bit(flag, (unsigned long *)&ti->flags);
|
clear_bit(flag, (unsigned long *)&ti->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void update_ti_thread_flag(struct thread_info *ti, int flag,
|
||||||
|
bool value)
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
set_ti_thread_flag(ti, flag);
|
||||||
|
else
|
||||||
|
clear_ti_thread_flag(ti, flag);
|
||||||
|
}
|
||||||
|
|
||||||
static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
|
static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
|
||||||
{
|
{
|
||||||
return test_and_set_bit(flag, (unsigned long *)&ti->flags);
|
return test_and_set_bit(flag, (unsigned long *)&ti->flags);
|
||||||
|
@ -79,6 +88,8 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
|
||||||
set_ti_thread_flag(current_thread_info(), flag)
|
set_ti_thread_flag(current_thread_info(), flag)
|
||||||
#define clear_thread_flag(flag) \
|
#define clear_thread_flag(flag) \
|
||||||
clear_ti_thread_flag(current_thread_info(), flag)
|
clear_ti_thread_flag(current_thread_info(), flag)
|
||||||
|
#define update_thread_flag(flag, value) \
|
||||||
|
update_ti_thread_flag(current_thread_info(), flag, value)
|
||||||
#define test_and_set_thread_flag(flag) \
|
#define test_and_set_thread_flag(flag) \
|
||||||
test_and_set_ti_thread_flag(current_thread_info(), flag)
|
test_and_set_ti_thread_flag(current_thread_info(), flag)
|
||||||
#define test_and_clear_thread_flag(flag) \
|
#define test_and_clear_thread_flag(flag) \
|
||||||
|
|
Loading…
Reference in New Issue