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;
|