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
					
				| @ -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 New Issue
	
	Block a user