Messages in this thread Patch in this message | | | Date | Thu, 21 Nov 2013 12:41:44 +0100 (CET) | From | Thomas Gleixner <> | Subject | Re: [patch 4/6] ia64: Use preempt_schedule_irq |
| |
On Wed, 20 Nov 2013, Thomas Gleixner wrote: > On Wed, 20 Nov 2013, Tony Luck wrote: > > asmlinkage void __sched preempt_schedule_irq(void) > > { > > schedule(); > > } > > > > Or is life more complicated than that? > > Hmm, I think I fubared that and you decided to ignore my patch :) > > Let me look at it tomorrow morning with full awake brain cells.
Ok, wrapped my brain around it. I tripped over the magic asm foo which has a single need_resched check and schedule point for both sys call return and interrupt return.
So you need the schedule_preempt_irq() for kernel preemption from interrupt return while on a normal syscall preemption a schedule would be sufficient. But using schedule_preempt_irq() is not harmful here in any way. It just sets the preempt_active bit also in cases where it would not be required.
Even on preempt=n kernels adding the preempt_active bit is completely harmless. So instead of having an extra function, moving the existing one out of the ifdef PREEMPT looks like the sanest thing to do.
Peter, Ingo ?
Thanks,
tglx ------ diff --git a/kernel/sched/core.c b/kernel/sched/core.c index c180860..0c59642 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -2660,6 +2660,7 @@ asmlinkage void __sched notrace preempt_schedule(void) } while (need_resched()); } EXPORT_SYMBOL(preempt_schedule); +#endif /* CONFIG_PREEMPT */ /* * this is the entry point to schedule() from kernel preemption @@ -2693,8 +2694,6 @@ asmlinkage void __sched preempt_schedule_irq(void) exception_exit(prev_state); } -#endif /* CONFIG_PREEMPT */ - int default_wake_function(wait_queue_t *curr, unsigned mode, int wake_flags, void *key) {
| |