On 2014/9/23 18:55, Tetsuo Handa wrote: > Zefan Li wrote: >> Tetsuo reported a hard-to-reproduce kernel crash on RHEL6, which happend > > s/happend/happened/ > >> @@ -1972,6 +1973,14 @@ static inline void memalloc_noio_restore(unsigned int flags) >> TASK_PFA_TEST(NO_NEW_PRIVS, no_new_privs) >> TASK_PFA_SET(NO_NEW_PRIVS, no_new_privs) >> >> +TASK_PFA_TEST(SPREAD_PAGE, spread_page) >> +TASK_PFA_SET(SPREAD_PAGE, spread_page) >> +TASK_PFA_CLEAR(SPREAD_PAGE, spread_page) >> + >> +TASK_PFA_TEST(SPREAD_SLAB, spread_slab) >> +TASK_PFA_SET(SPREAD_SLAB, spread_slab) >> +TASK_PFA_CLEAR(SPREAD_SLAB, spread_slab) >> + > > I wonder how adding 3 macro lines differs from 3 inlined functions. > Personally, from LXR (source code browser) point of view, inlined functions > are more friendly than macros. Also, I wonder about the cost of extracting > macros in a file which is likely included by every file but referenced > by few files. Speak of SPREAD_PAGE and SPREAD_SLAB, they should be defined > as inlined functions in include/linux/cpuset.h rather than as macros in > include/linux/sched.h ? > . Though tsk->atomic_flags were newly introduced in 3.17 merge window, we already have 3 flags, and we may see more flags added. Those macros make the code easier to read, and emacs and cscope can also understand them. I'd vote for this: TASK_PFA_TEST(NO_NEW_PRIVS, no_new_privs) TASK_PFA_SET(NO_NEW_PRIVS, no_new_privs) TASK_PFA_TEST(SPREAD_PAGE, spread_page) TASK_PFA_SET(SPREAD_PAGE, spread_page) TASK_PFA_CLEAR(SPREAD_PAGE, spread_page) TASK_PFA_TEST(SPREAD_SLAB, spread_slab) TASK_PFA_SET(SPREAD_SLAB, spread_slab) TASK_PFA_CLEAR(SPREAD_SLAB, spread_slab) over this: static inline bool task_no_new_privs(struct task_struct *p) { return test_bit(PFA_NO_NEW_PRIVS, &p->atomic_flags); } static inline void task_set_new_privs(struct task_struct *p) { set_bit(PFA_NO_NEW_PRIVS, &p->atomic_flags); } static inline bool task_spread_page(struct task_struct *p) { return test_bit(PFA_SPREAD_PAGE, &p->atomic_flags); } static inline void task_set_spread_page(struct task_struct *p) { set_bit(PFA_SPREAD_PAGE, &p->atomic_flags); } static inline void task_clear_spread_page(struct task_struct *p) { clear_bit(PFA_SPREAD_PAGE, &p->atomic_flags); } static inline bool task_spread_slab(struct task_struct *p) { return test_bit(PFA_SPREAD_SLAB, &p->atomic_flags); } static inline void task_set_spread_slab(struct task_struct *p) { set_bit(PFA_SPREAD_SLAB, &p->atomic_flags); } static inline void task_clear_spread_slab(struct task_struct *p) { clear_bit(PFA_SPREAD_SLAB, &p->atomic_flags); } -- To unsubscribe from this list: send the line "unsubscribe cgroups" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html