diff options
author | Andi Kleen <ak@suse.de> | 2006-06-26 07:59:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 13:48:21 -0400 |
commit | 495ab9c045e1b0e5c82951b762257fe1c9d81564 (patch) | |
tree | f95c376015d340794f64f36fd52f8fa80a1daab7 /kernel/sched.c | |
parent | d9005b52de7bc9b20afa93e06d3e15843bafc12f (diff) |
[PATCH] i386/x86-64/ia64: Move polling flag into thread_info_status
During some profiling I noticed that default_idle causes a lot of
memory traffic. I think that is caused by the atomic operations
to clear/set the polling flag in thread_info. There is actually
no reason to make this atomic - only the idle thread does it
to itself, other CPUs only read it. So I moved it into ti->status.
Converted i386/x86-64/ia64 for now because that was the easiest
way to fix ACPI which also manipulates these flags in its idle
function.
Cc: Nick Piggin <npiggin@novell.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Len Brown <len.brown@intel.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index f06d059edef5..7d1027a4dd21 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -818,6 +818,11 @@ static void deactivate_task(struct task_struct *p, runqueue_t *rq) | |||
818 | * the target CPU. | 818 | * the target CPU. |
819 | */ | 819 | */ |
820 | #ifdef CONFIG_SMP | 820 | #ifdef CONFIG_SMP |
821 | |||
822 | #ifndef tsk_is_polling | ||
823 | #define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) | ||
824 | #endif | ||
825 | |||
821 | static void resched_task(task_t *p) | 826 | static void resched_task(task_t *p) |
822 | { | 827 | { |
823 | int cpu; | 828 | int cpu; |
@@ -833,9 +838,9 @@ static void resched_task(task_t *p) | |||
833 | if (cpu == smp_processor_id()) | 838 | if (cpu == smp_processor_id()) |
834 | return; | 839 | return; |
835 | 840 | ||
836 | /* NEED_RESCHED must be visible before we test POLLING_NRFLAG */ | 841 | /* NEED_RESCHED must be visible before we test polling */ |
837 | smp_mb(); | 842 | smp_mb(); |
838 | if (!test_tsk_thread_flag(p, TIF_POLLING_NRFLAG)) | 843 | if (!tsk_is_polling(p)) |
839 | smp_send_reschedule(cpu); | 844 | smp_send_reschedule(cpu); |
840 | } | 845 | } |
841 | #else | 846 | #else |