Dave Johnson writes: > Looks like more than preempt_schedule_irq are missing. > > I've got these in .sched.text: > > ffffffff8031ea70 T __sched_text_start > ffffffff8031eb88 T __down_interruptible > ffffffff8031ed18 T schedule > ffffffff8031f7e8 T preempt_schedule > ffffffff8031f8a8 T preempt_schedule_irq > ffffffff8031f9b0 T wait_for_completion > ffffffff8031fae0 T wait_for_completion_timeout > ffffffff8031fc58 T wait_for_completion_interruptible > ffffffff8031fdf0 T wait_for_completion_interruptible_timeout > ffffffff8031ff98 T interruptible_sleep_on > ffffffff80320070 T interruptible_sleep_on_timeout > ffffffff80320160 T sleep_on > ffffffff80320238 T sleep_on_timeout > ffffffff80320328 T cond_resched > ffffffff803203c0 T cond_resched_softirq > ffffffff80320478 T yield > ffffffff803204b8 T io_schedule > ffffffff80320548 T io_schedule_timeout > ffffffff803205d8 T console_conditional_schedule > ffffffff80320610 T schedule_timeout > ffffffff803206f0 t nanosleep_restart > ffffffff803207f0 T __wait_on_bit > ffffffff80320910 T out_of_line_wait_on_bit > ffffffff803209e0 T __wait_on_bit_lock > ffffffff80320b28 T out_of_line_wait_on_bit_lock > ffffffff80320bf8 T __down_read > ffffffff80320d00 T __down_write > ffffffff80320e10 T __lock_text_start > ffffffff80320e10 T __sched_text_end > > All of those should be in mfinfo[] with omit_fp 1 for those in > kernel/sched.c and 0 for elsewhere. Or am I missing something here? make that 0 and 1 not 0 and 1. Patch for these is below. -- Dave Johnson Starent Networks diff -Nru a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c --- a/arch/mips/kernel/process.c Thu Jun 30 16:11:58 2005 +++ b/arch/mips/kernel/process.c Thu Jun 30 16:11:58 2005 @@ -24,6 +24,7 @@ #include <linux/a.out.h> #include <linux/init.h> #include <linux/completion.h> +#include <linux/console.h> #include <asm/abi.h> #include <asm/bootinfo.h> @@ -279,28 +280,44 @@ /* arch/mips/kernel/semaphore.c */ { __down, 1 }, { __down_interruptible, 1 }, + /* kernel/printk.c */ + { console_conditional_schedule, 1 }, /* kernel/sched.c */ #ifdef CONFIG_PREEMPT { preempt_schedule, 0 }, + { preempt_schedule_irq, 0 }, #endif { wait_for_completion, 0 }, + { wait_for_completion_timeout, 0 }, + { wait_for_completion_interruptible, 0 }, + { wait_for_completion_interruptible_timeout, 0 }, { interruptible_sleep_on, 0 }, { interruptible_sleep_on_timeout, 0 }, { sleep_on, 0 }, { sleep_on_timeout, 0 }, + { cond_resched, 0 }, + { cond_resched_softirq, 0 }, { yield, 0 }, { io_schedule, 0 }, { io_schedule_timeout, 0 }, -#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT) - { __preempt_spin_lock, 0 }, - { __preempt_write_lock, 0 }, -#endif + /* kernel/wait.c */ + { __wait_on_bit, 1 }, + { out_of_line_wait_on_bit, 1 }, + { __wait_on_bit_lock, 1 }, + { out_of_line_wait_on_bit_lock, 1 }, /* kernel/timer.c */ { schedule_timeout, 1 }, -/* { nanosleep_restart, 1 }, */ + { nanosleep_restart, 1 }, +#ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM + /* lib/rwsem.c */ + { rwsem_down_read_failed, 1 }, + { rwsem_down_write_failed, 1 }, +#endif +#ifdef CONFIG_RWSEM_GENERIC_SPINLOCK /* lib/rwsem-spinlock.c */ { __down_read, 1 }, { __down_write, 1 }, +#endif }; static int mips_frame_info_initialized; diff -Nru a/include/linux/preempt.h b/include/linux/preempt.h --- a/include/linux/preempt.h Thu Jun 30 16:11:58 2005 +++ b/include/linux/preempt.h Thu Jun 30 16:11:58 2005 @@ -25,6 +25,7 @@ #ifdef CONFIG_PREEMPT asmlinkage void preempt_schedule(void); +asmlinkage void preempt_schedule_irq(void); #define preempt_disable() \ do { \ diff -Nru a/include/linux/timer.h b/include/linux/timer.h --- a/include/linux/timer.h Thu Jun 30 16:11:58 2005 +++ b/include/linux/timer.h Thu Jun 30 16:11:58 2005 @@ -99,4 +99,6 @@ extern void run_local_timers(void); extern void it_real_fn(unsigned long); +extern long nanosleep_restart(struct restart_block *restart); + #endif diff -Nru a/kernel/timer.c b/kernel/timer.c --- a/kernel/timer.c Thu Jun 30 16:11:58 2005 +++ b/kernel/timer.c Thu Jun 30 16:11:58 2005 @@ -1135,7 +1135,7 @@ return current->pid; } -static long __sched nanosleep_restart(struct restart_block *restart) +long __sched nanosleep_restart(struct restart_block *restart) { unsigned long expire = restart->arg0, now = jiffies; struct timespec __user *rmtp = (struct timespec __user *) restart->arg1;