 621934ee7e
			
		
	
	
	621934ee7e
	
	
	
		
			
			Updated patch adding a variant of RCU that permits sleeping in read-side critical sections. SRCU is as follows: o Each use of SRCU creates its own srcu_struct, and each srcu_struct has its own set of grace periods. This is critical, as it prevents one subsystem with a blocking reader from holding up SRCU grace periods for other subsystems. o The SRCU primitives (srcu_read_lock(), srcu_read_unlock(), and synchronize_srcu()) all take a pointer to a srcu_struct. o The SRCU primitives must be called from process context. o srcu_read_lock() returns an int that must be passed to the matching srcu_read_unlock(). Realtime RCU avoids the need for this by storing the state in the task struct, but SRCU needs to allow a given code path to pass through multiple SRCU domains -- storing state in the task struct would therefore require either arbitrary space in the task struct or arbitrary limits on SRCU nesting. So I kicked the state-storage problem up to the caller. Of course, it is not permitted to call synchronize_srcu() while in an SRCU read-side critical section. o There is no call_srcu(). It would not be hard to implement one, but it seems like too easy a way to OOM the system. (Hey, we have enough trouble with call_rcu(), which does -not- permit readers to sleep!!!) So, if you want it, please tell me why... [josht@us.ibm.com: sparse notation] Signed-off-by: Paul E. McKenney <paulmck@us.ibm.com> Signed-off-by: Josh Triplett <josh@freedesktop.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			2.9 KiB
			
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.9 KiB
			
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| #
 | |
| # Makefile for the linux kernel.
 | |
| #
 | |
| 
 | |
| obj-y     = sched.o fork.o exec_domain.o panic.o printk.o profile.o \
 | |
| 	    exit.o itimer.o time.o softirq.o resource.o \
 | |
| 	    sysctl.o capability.o ptrace.o timer.o user.o \
 | |
| 	    signal.o sys.o kmod.o workqueue.o pid.o \
 | |
| 	    rcupdate.o extable.o params.o posix-timers.o \
 | |
| 	    kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \
 | |
| 	    hrtimer.o rwsem.o latency.o nsproxy.o srcu.o
 | |
| 
 | |
| obj-$(CONFIG_STACKTRACE) += stacktrace.o
 | |
| obj-y += time/
 | |
| obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o
 | |
| obj-$(CONFIG_LOCKDEP) += lockdep.o
 | |
| ifeq ($(CONFIG_PROC_FS),y)
 | |
| obj-$(CONFIG_LOCKDEP) += lockdep_proc.o
 | |
| endif
 | |
| obj-$(CONFIG_FUTEX) += futex.o
 | |
| ifeq ($(CONFIG_COMPAT),y)
 | |
| obj-$(CONFIG_FUTEX) += futex_compat.o
 | |
| endif
 | |
| obj-$(CONFIG_RT_MUTEXES) += rtmutex.o
 | |
| obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o
 | |
| obj-$(CONFIG_RT_MUTEX_TESTER) += rtmutex-tester.o
 | |
| obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
 | |
| obj-$(CONFIG_SMP) += cpu.o spinlock.o
 | |
| obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o
 | |
| obj-$(CONFIG_PROVE_LOCKING) += spinlock.o
 | |
| obj-$(CONFIG_UID16) += uid16.o
 | |
| obj-$(CONFIG_MODULES) += module.o
 | |
| obj-$(CONFIG_KALLSYMS) += kallsyms.o
 | |
| obj-$(CONFIG_STACK_UNWIND) += unwind.o
 | |
| obj-$(CONFIG_PM) += power/
 | |
| obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
 | |
| obj-$(CONFIG_KEXEC) += kexec.o
 | |
| obj-$(CONFIG_COMPAT) += compat.o
 | |
| obj-$(CONFIG_CPUSETS) += cpuset.o
 | |
| obj-$(CONFIG_IKCONFIG) += configs.o
 | |
| obj-$(CONFIG_STOP_MACHINE) += stop_machine.o
 | |
| obj-$(CONFIG_AUDIT) += audit.o auditfilter.o
 | |
| obj-$(CONFIG_AUDITSYSCALL) += auditsc.o
 | |
| obj-$(CONFIG_KPROBES) += kprobes.o
 | |
| obj-$(CONFIG_SYSFS) += ksysfs.o
 | |
| obj-$(CONFIG_DETECT_SOFTLOCKUP) += softlockup.o
 | |
| obj-$(CONFIG_GENERIC_HARDIRQS) += irq/
 | |
| obj-$(CONFIG_SECCOMP) += seccomp.o
 | |
| obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o
 | |
| obj-$(CONFIG_RELAY) += relay.o
 | |
| obj-$(CONFIG_UTS_NS) += utsname.o
 | |
| obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 | |
| obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
 | |
| 
 | |
| ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y)
 | |
| # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
 | |
| # needed for x86 only.  Why this used to be enabled for all architectures is beyond
 | |
| # me.  I suspect most platforms don't need this, but until we know that for sure
 | |
| # I turn this off for IA-64 only.  Andreas Schwab says it's also needed on m68k
 | |
| # to get a correct value for the wait-channel (WCHAN in ps). --davidm
 | |
| CFLAGS_sched.o := $(PROFILING) -fno-omit-frame-pointer
 | |
| endif
 | |
| 
 | |
| $(obj)/configs.o: $(obj)/config_data.h
 | |
| 
 | |
| # config_data.h contains the same information as ikconfig.h but gzipped.
 | |
| # Info from config_data can be extracted from /proc/config*
 | |
| targets += config_data.gz
 | |
| $(obj)/config_data.gz: .config FORCE
 | |
| 	$(call if_changed,gzip)
 | |
| 
 | |
| quiet_cmd_ikconfiggz = IKCFG   $@
 | |
|       cmd_ikconfiggz = (echo "static const char kernel_config_data[] = MAGIC_START"; cat $< | scripts/bin2c; echo "MAGIC_END;") > $@
 | |
| targets += config_data.h
 | |
| $(obj)/config_data.h: $(obj)/config_data.gz FORCE
 | |
| 	$(call if_changed,ikconfiggz)
 |