Commit a7878709 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

sched, arch: Create asm/preempt.h

In order to prepare to per-arch implementations of preempt_count move
the required bits into an asm-generic header and use this for all
archs.
Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/n/tip-h5j0c1r3e3fk015m30h8f1zx@git.kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent f27dde8d
...@@ -3,3 +3,4 @@ generic-y += clkdev.h ...@@ -3,3 +3,4 @@ generic-y += clkdev.h
generic-y += exec.h generic-y += exec.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
...@@ -46,3 +46,4 @@ generic-y += ucontext.h ...@@ -46,3 +46,4 @@ generic-y += ucontext.h
generic-y += user.h generic-y += user.h
generic-y += vga.h generic-y += vga.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -33,3 +33,4 @@ generic-y += timex.h ...@@ -33,3 +33,4 @@ generic-y += timex.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += types.h generic-y += types.h
generic-y += unaligned.h generic-y += unaligned.h
generic-y += preempt.h
...@@ -50,3 +50,4 @@ generic-y += unaligned.h ...@@ -50,3 +50,4 @@ generic-y += unaligned.h
generic-y += user.h generic-y += user.h
generic-y += vga.h generic-y += vga.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -3,3 +3,4 @@ generic-y += clkdev.h ...@@ -3,3 +3,4 @@ generic-y += clkdev.h
generic-y += exec.h generic-y += exec.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += param.h generic-y += param.h
generic-y += preempt.h
...@@ -44,3 +44,4 @@ generic-y += ucontext.h ...@@ -44,3 +44,4 @@ generic-y += ucontext.h
generic-y += unaligned.h generic-y += unaligned.h
generic-y += user.h generic-y += user.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -56,3 +56,4 @@ generic-y += ucontext.h ...@@ -56,3 +56,4 @@ generic-y += ucontext.h
generic-y += user.h generic-y += user.h
generic-y += vga.h generic-y += vga.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -11,3 +11,4 @@ generic-y += module.h ...@@ -11,3 +11,4 @@ generic-y += module.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += vga.h generic-y += vga.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -2,3 +2,4 @@ ...@@ -2,3 +2,4 @@
generic-y += clkdev.h generic-y += clkdev.h
generic-y += exec.h generic-y += exec.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
...@@ -6,3 +6,4 @@ generic-y += mmu.h ...@@ -6,3 +6,4 @@ generic-y += mmu.h
generic-y += module.h generic-y += module.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -53,3 +53,4 @@ generic-y += types.h ...@@ -53,3 +53,4 @@ generic-y += types.h
generic-y += ucontext.h generic-y += ucontext.h
generic-y += unaligned.h generic-y += unaligned.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -3,4 +3,5 @@ generic-y += clkdev.h ...@@ -3,4 +3,5 @@ generic-y += clkdev.h
generic-y += exec.h generic-y += exec.h
generic-y += kvm_para.h generic-y += kvm_para.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
generic-y += vtime.h generic-y += vtime.h
\ No newline at end of file
...@@ -3,3 +3,4 @@ generic-y += clkdev.h ...@@ -3,3 +3,4 @@ generic-y += clkdev.h
generic-y += exec.h generic-y += exec.h
generic-y += module.h generic-y += module.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
...@@ -31,3 +31,4 @@ generic-y += trace_clock.h ...@@ -31,3 +31,4 @@ generic-y += trace_clock.h
generic-y += types.h generic-y += types.h
generic-y += word-at-a-time.h generic-y += word-at-a-time.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -52,3 +52,4 @@ generic-y += unaligned.h ...@@ -52,3 +52,4 @@ generic-y += unaligned.h
generic-y += user.h generic-y += user.h
generic-y += vga.h generic-y += vga.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -3,3 +3,4 @@ generic-y += clkdev.h ...@@ -3,3 +3,4 @@ generic-y += clkdev.h
generic-y += exec.h generic-y += exec.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += syscalls.h generic-y += syscalls.h
generic-y += preempt.h
...@@ -11,5 +11,6 @@ generic-y += sections.h ...@@ -11,5 +11,6 @@ generic-y += sections.h
generic-y += segment.h generic-y += segment.h
generic-y += serial.h generic-y += serial.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
generic-y += ucontext.h generic-y += ucontext.h
generic-y += xor.h generic-y += xor.h
...@@ -2,3 +2,4 @@ ...@@ -2,3 +2,4 @@
generic-y += clkdev.h generic-y += clkdev.h
generic-y += exec.h generic-y += exec.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
...@@ -67,3 +67,4 @@ generic-y += ucontext.h ...@@ -67,3 +67,4 @@ generic-y += ucontext.h
generic-y += user.h generic-y += user.h
generic-y += word-at-a-time.h generic-y += word-at-a-time.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -4,3 +4,4 @@ generic-y += word-at-a-time.h auxvec.h user.h cputime.h emergency-restart.h \ ...@@ -4,3 +4,4 @@ generic-y += word-at-a-time.h auxvec.h user.h cputime.h emergency-restart.h \
div64.h irq_regs.h kdebug.h kvm_para.h local64.h local.h param.h \ div64.h irq_regs.h kdebug.h kvm_para.h local64.h local.h param.h \
poll.h xor.h clkdev.h exec.h poll.h xor.h clkdev.h exec.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
...@@ -2,4 +2,5 @@ ...@@ -2,4 +2,5 @@
generic-y += clkdev.h generic-y += clkdev.h
generic-y += rwsem.h generic-y += rwsem.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
generic-y += vtime.h generic-y += vtime.h
\ No newline at end of file
...@@ -2,3 +2,4 @@ ...@@ -2,3 +2,4 @@
generic-y += clkdev.h generic-y += clkdev.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
...@@ -4,3 +4,4 @@ header-y += ...@@ -4,3 +4,4 @@ header-y +=
generic-y += clkdev.h generic-y += clkdev.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -34,3 +34,4 @@ generic-y += termios.h ...@@ -34,3 +34,4 @@ generic-y += termios.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += ucontext.h generic-y += ucontext.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -16,3 +16,4 @@ generic-y += serial.h ...@@ -16,3 +16,4 @@ generic-y += serial.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += types.h generic-y += types.h
generic-y += word-at-a-time.h generic-y += word-at-a-time.h
generic-y += preempt.h
...@@ -38,3 +38,4 @@ generic-y += termios.h ...@@ -38,3 +38,4 @@ generic-y += termios.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += types.h generic-y += types.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -3,3 +3,4 @@ generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h ...@@ -3,3 +3,4 @@ generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h
generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h exec.h generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h exec.h
generic-y += switch_to.h clkdev.h generic-y += switch_to.h clkdev.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += preempt.h
...@@ -60,3 +60,4 @@ generic-y += unaligned.h ...@@ -60,3 +60,4 @@ generic-y += unaligned.h
generic-y += user.h generic-y += user.h
generic-y += vga.h generic-y += vga.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
...@@ -5,3 +5,4 @@ genhdr-y += unistd_64.h ...@@ -5,3 +5,4 @@ genhdr-y += unistd_64.h
genhdr-y += unistd_x32.h genhdr-y += unistd_x32.h
generic-y += clkdev.h generic-y += clkdev.h
generic-y += preempt.h
...@@ -28,3 +28,4 @@ generic-y += termios.h ...@@ -28,3 +28,4 @@ generic-y += termios.h
generic-y += topology.h generic-y += topology.h
generic-y += trace_clock.h generic-y += trace_clock.h
generic-y += xor.h generic-y += xor.h
generic-y += preempt.h
#ifndef __ASM_PREEMPT_H
#define __ASM_PREEMPT_H
#include <linux/thread_info.h>
/*
* We mask the PREEMPT_NEED_RESCHED bit so as not to confuse all current users
* that think a non-zero value indicates we cannot preempt.
*/
static __always_inline int preempt_count(void)
{
return current_thread_info()->preempt_count & ~PREEMPT_NEED_RESCHED;
}
static __always_inline int *preempt_count_ptr(void)
{
return &current_thread_info()->preempt_count;
}
/*
* We now loose PREEMPT_NEED_RESCHED and cause an extra reschedule; however the
* alternative is loosing a reschedule. Better schedule too often -- also this
* should be a very rare operation.
*/
static __always_inline void preempt_count_set(int pc)
{
*preempt_count_ptr() = pc;
}
/*
* We fold the NEED_RESCHED bit into the preempt count such that
* preempt_enable() can decrement and test for needing to reschedule with a
* single instruction.
*
* We invert the actual bit, so that when the decrement hits 0 we know we both
* need to resched (the bit is cleared) and can resched (no preempt count).
*/
static __always_inline void set_preempt_need_resched(void)
{
*preempt_count_ptr() &= ~PREEMPT_NEED_RESCHED;
}
static __always_inline void clear_preempt_need_resched(void)
{
*preempt_count_ptr() |= PREEMPT_NEED_RESCHED;
}
static __always_inline bool test_preempt_need_resched(void)
{
return !(*preempt_count_ptr() & PREEMPT_NEED_RESCHED);
}
#endif /* __ASM_PREEMPT_H */
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
* preempt_count (used for kernel preemption, interrupt count, etc.) * preempt_count (used for kernel preemption, interrupt count, etc.)
*/ */
#include <linux/thread_info.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/list.h> #include <linux/list.h>
...@@ -16,53 +15,7 @@ ...@@ -16,53 +15,7 @@
*/ */
#define PREEMPT_NEED_RESCHED 0x80000000 #define PREEMPT_NEED_RESCHED 0x80000000
/* #include <asm/preempt.h>
* We mask the PREEMPT_NEED_RESCHED bit so as not to confuse all current users
* that think a non-zero value indicates we cannot preempt.
*/
static __always_inline int preempt_count(void)
{
return current_thread_info()->preempt_count & ~PREEMPT_NEED_RESCHED;
}
static __always_inline int *preempt_count_ptr(void)
{
return &current_thread_info()->preempt_count;
}
/*
* We now loose PREEMPT_NEED_RESCHED and cause an extra reschedule; however the
* alternative is loosing a reschedule. Better schedule too often -- also this
* should be a very rare operation.
*/
static __always_inline void preempt_count_set(int pc)
{
*preempt_count_ptr() = pc;
}
/*
* We fold the NEED_RESCHED bit into the preempt count such that
* preempt_enable() can decrement and test for needing to reschedule with a
* single instruction.
*
* We invert the actual bit, so that when the decrement hits 0 we know we both
* need to resched (the bit is cleared) and can resched (no preempt count).
*/
static __always_inline void set_preempt_need_resched(void)
{
*preempt_count_ptr() &= ~PREEMPT_NEED_RESCHED;
}
static __always_inline void clear_preempt_need_resched(void)
{
*preempt_count_ptr() |= PREEMPT_NEED_RESCHED;
}
static __always_inline bool test_preempt_need_resched(void)
{
return !(*preempt_count_ptr() & PREEMPT_NEED_RESCHED);
}
#if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER) #if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER)
extern void add_preempt_count(int val); extern void add_preempt_count(int val);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment