set TASK_RUNNING in cond_resched()
PATCH 12/27 set TASK_RUNNING in cond_resched()
do_select() does set_current_state(TASK_INTERRUPTIBLE) then calls __pollwait() which calls __get_free_page() and the cond_resched() which I added to the pagecache reclaim code never returns.
The patch makes cond_resched() more useful by setting current->state to TASK_RUNNING before scheduling.
include/linux/sched.h | 3 ++- kernel/ksyms.c | 1 + kernel/sched.c | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-)
include/linux/sched.h renamed from include/linux/sched.h~cond_resched-fix +2 -1
@@ -837,10 +837,11 @@ static inline int need_resched(void)return unlikely (test_thread_flag (TIF_NEED_RESCHED )); } +extern void __cond_resched (void );static inline void cond_resched (void ) {if (need_resched ()) -schedule (); +__cond_resched (); }/* Reevaluate whether the task has signals pending delivery.
kernel/sched.c renamed from kernel/sched.c~cond_resched-fix +6 -0
@@ -1447,6 +1447,12 @@ asmlinkage long sys_sched_yield(void)return 0 ; } +void __cond_resched (void ) +{ +set_current_state (TASK_RUNNING ); +schedule (); +} +asmlinkage long sys_sched_get_priority_max (int policy) {int ret = -EINVAL ;
kernel/ksyms.c renamed from kernel/ksyms.c~cond_resched-fix +1 -0
@@ -473,6 +473,7 @@ EXPORT_SYMBOL(preempt_schedule);#endif EXPORT_SYMBOL (schedule_timeout);EXPORT_SYMBOL (sys_sched_yield); +EXPORT_SYMBOL (__cond_resched);EXPORT_SYMBOL (set_user_nice);EXPORT_SYMBOL (task_nice);EXPORT_SYMBOL_GPL (idle_cpu);
-