forked from mirrors/linux
		
	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: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/n/tip-h5j0c1r3e3fk015m30h8f1zx@git.kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									f27dde8dee
								
							
						
					
					
						commit
						a787870924
					
				
					 32 changed files with 85 additions and 48 deletions
				
			
		| 
						 | 
				
			
			@ -3,3 +3,4 @@ generic-y += clkdev.h
 | 
			
		|||
 | 
			
		||||
generic-y += exec.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,3 +46,4 @@ generic-y += ucontext.h
 | 
			
		|||
generic-y += user.h
 | 
			
		||||
generic-y += vga.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,3 +33,4 @@ generic-y += timex.h
 | 
			
		|||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += types.h
 | 
			
		||||
generic-y += unaligned.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,3 +50,4 @@ generic-y += unaligned.h
 | 
			
		|||
generic-y += user.h
 | 
			
		||||
generic-y += vga.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,3 +3,4 @@ generic-y	+= clkdev.h
 | 
			
		|||
generic-y	+= exec.h
 | 
			
		||||
generic-y	+= trace_clock.h
 | 
			
		||||
generic-y	+= param.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,3 +44,4 @@ generic-y += ucontext.h
 | 
			
		|||
generic-y += unaligned.h
 | 
			
		||||
generic-y += user.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,3 +56,4 @@ generic-y += ucontext.h
 | 
			
		|||
generic-y += user.h
 | 
			
		||||
generic-y += vga.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,3 +11,4 @@ generic-y += module.h
 | 
			
		|||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += vga.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,3 +2,4 @@
 | 
			
		|||
generic-y += clkdev.h
 | 
			
		||||
generic-y += exec.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,3 +6,4 @@ generic-y += mmu.h
 | 
			
		|||
generic-y += module.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,3 +53,4 @@ generic-y += types.h
 | 
			
		|||
generic-y += ucontext.h
 | 
			
		||||
generic-y += unaligned.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,4 +3,5 @@ generic-y += clkdev.h
 | 
			
		|||
generic-y += exec.h
 | 
			
		||||
generic-y += kvm_para.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
generic-y += vtime.h
 | 
			
		||||
| 
						 | 
				
			
			@ -3,3 +3,4 @@ generic-y += clkdev.h
 | 
			
		|||
generic-y += exec.h
 | 
			
		||||
generic-y += module.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,3 +31,4 @@ generic-y += trace_clock.h
 | 
			
		|||
generic-y += types.h
 | 
			
		||||
generic-y += word-at-a-time.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,3 +52,4 @@ generic-y += unaligned.h
 | 
			
		|||
generic-y += user.h
 | 
			
		||||
generic-y += vga.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,3 +3,4 @@ generic-y += clkdev.h
 | 
			
		|||
generic-y += exec.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += syscalls.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,5 +11,6 @@ generic-y += sections.h
 | 
			
		|||
generic-y += segment.h
 | 
			
		||||
generic-y += serial.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
generic-y += ucontext.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,3 +2,4 @@
 | 
			
		|||
generic-y += clkdev.h
 | 
			
		||||
generic-y += exec.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,3 +67,4 @@ generic-y += ucontext.h
 | 
			
		|||
generic-y += user.h
 | 
			
		||||
generic-y += word-at-a-time.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 \
 | 
			
		|||
	  div64.h irq_regs.h kdebug.h kvm_para.h local64.h local.h param.h \
 | 
			
		||||
	  poll.h xor.h clkdev.h exec.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,4 +2,5 @@
 | 
			
		|||
generic-y += clkdev.h
 | 
			
		||||
generic-y += rwsem.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
generic-y += vtime.h
 | 
			
		||||
| 
						 | 
				
			
			@ -2,3 +2,4 @@
 | 
			
		|||
 | 
			
		||||
generic-y += clkdev.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,3 +4,4 @@ header-y +=
 | 
			
		|||
generic-y += clkdev.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,3 +34,4 @@ generic-y += termios.h
 | 
			
		|||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += ucontext.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,3 +16,4 @@ generic-y += serial.h
 | 
			
		|||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += types.h
 | 
			
		||||
generic-y += word-at-a-time.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,3 +38,4 @@ generic-y += termios.h
 | 
			
		|||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += types.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
 | 
			
		|||
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 += trace_clock.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,3 +60,4 @@ generic-y += unaligned.h
 | 
			
		|||
generic-y += user.h
 | 
			
		||||
generic-y += vga.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,3 +5,4 @@ genhdr-y += unistd_64.h
 | 
			
		|||
genhdr-y += unistd_x32.h
 | 
			
		||||
 | 
			
		||||
generic-y += clkdev.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,3 +28,4 @@ generic-y += termios.h
 | 
			
		|||
generic-y += topology.h
 | 
			
		||||
generic-y += trace_clock.h
 | 
			
		||||
generic-y += xor.h
 | 
			
		||||
generic-y += preempt.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										54
									
								
								include/asm-generic/preempt.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								include/asm-generic/preempt.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
#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 ¤t_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 @@
 | 
			
		|||
 * preempt_count (used for kernel preemption, interrupt count, etc.)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/thread_info.h>
 | 
			
		||||
#include <linux/linkage.h>
 | 
			
		||||
#include <linux/list.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -16,53 +15,7 @@
 | 
			
		|||
 */
 | 
			
		||||
#define PREEMPT_NEED_RESCHED	0x80000000
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 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 ¤t_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);
 | 
			
		||||
}
 | 
			
		||||
#include <asm/preempt.h>
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER)
 | 
			
		||||
  extern void add_preempt_count(int val);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue