Message ID | 1247149862.12784.6.camel@twins |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
On Thu, 2009-07-09 at 16:31 +0200, Peter Zijlstra wrote: > On Thu, 2009-07-09 at 09:18 -0500, Matt Mackall wrote: > > > > Sorry if I was unclear. I'm suggesting setting the count so the existing > > PREEMPT_ACTIVE test here fires: > > > > int __sched _cond_resched(void) > > { > > if (need_resched() && !(preempt_count() & PREEMPT_ACTIVE) && > > system_state == SYSTEM_RUNNING) { > > __cond_resched(); > > return 1; > > } > > return 0; > > } > > Right, /me read preempt and thought a simple preempt inc but didn't read > the code. Shame on me. > > So something like (utterly untested and such) Yeah, that's what I had in mind. Probably throw in a define: /* for disabling scheduling in early boot */ #define PREEMPT_EARLY (1 + PREEMPT_ACTIVE) and slap a comment on the sub_preempt_count(). Does anything actually use scheduler_running yet? Perhaps my tree is old. Also, might_sleep's use of system_state probably bears revisiting.
On Thu, 2009-07-09 at 09:43 -0500, Matt Mackall wrote: > Yeah, that's what I had in mind. Probably throw in a define: > > /* for disabling scheduling in early boot */ > #define PREEMPT_EARLY (1 + PREEMPT_ACTIVE) > > and slap a comment on the sub_preempt_count(). Right, and visit all the other arch init code ;-) I'll wait to see if Ingo has anything to say about it and then complete this thing. > Does anything actually use scheduler_running yet? Perhaps my tree is > old. # git grep scheduler_running kernel/sched.c:static __read_mostly int scheduler_running; kernel/sched.c: scheduler_running = 1; kernel/sched_rt.c: if (unlikely(!scheduler_running)) kernel/sched_rt.c: if (unlikely(!scheduler_running)) If memory serves there used to be more, but I think that migrated into kernel/sched_clock.c, which has sched_clock_running. > Also, might_sleep's use of system_state probably bears revisiting. Yeah, all that code is from long before we had scheduler_running (which was introduced around CFS/.23). -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 2009-07-09 at 16:51 +0200, Peter Zijlstra wrote: > > Does anything actually use scheduler_running yet? Perhaps my tree is > > old. > > # git grep scheduler_running > kernel/sched.c:static __read_mostly int scheduler_running; > kernel/sched.c: scheduler_running = 1; > kernel/sched_rt.c: if (unlikely(!scheduler_running)) > kernel/sched_rt.c: if (unlikely(!scheduler_running)) > > If memory serves there used to be more, but I think that migrated into > kernel/sched_clock.c, which has sched_clock_running. The static in the first line makes that a bit of a head-scratcher? Oh, I see: it's living in sin. Going to avert my eyes for now.
On Thu, 9 Jul 2009, Peter Zijlstra wrote: > > So something like (utterly untested and such) This looks like a good patch. Please make it so - who knows what other uses of cond_resched() we have in module init routines that might have deadlocks without it. The netpoll case got fixed, but please just do this. I'd like to do my system_state movement too (the thing is, when you load drivers as modules you _will_ have "system_state == SYSTEM_RUNNING", so any initcall that depends on it being "early boot" is already broken), but there's no way that patch is appropriate for post-rc2. This one, however, looks appropriate (modulo getting some testing, of course) Linus -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index b078352..7b5dbce 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h @@ -49,7 +49,7 @@ struct thread_info { .exec_domain = &default_exec_domain, \ .flags = 0, \ .cpu = 0, \ - .preempt_count = 1, \ + .preempt_count = 1 + PREEMPT_ACTIVE, \ .addr_limit = KERNEL_DS, \ .restart_block = { \ .fn = do_no_restart_syscall, \ diff --git a/kernel/sched.c b/kernel/sched.c index fd3ac58..8e81162 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -6599,8 +6599,7 @@ static void __cond_resched(void) int __sched _cond_resched(void) { - if (need_resched() && !(preempt_count() & PREEMPT_ACTIVE) && - system_state == SYSTEM_RUNNING) { + if (need_resched() && !(preempt_count() & PREEMPT_ACTIVE)) { __cond_resched(); return 1; } @@ -9422,6 +9421,7 @@ void __init sched_init(void) perf_counter_init(); scheduler_running = 1; + sub_preempt_count(PREEMPT_ACTIVE); } #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP