2157 lines · 51.7 KB · C
RawDownload
/* *  linux/kernel/fork.c * *  Copyright (C) 1991, 1992  Linus Torvalds */ /* *  'fork.c' contains the help-routines for the 'fork' system call * (see also entry.S and others). * Fork is rather simple, once you get the hang of it, but the memory * management can be a bitch. See 'mm/memory.c': 'copy_page_range()' */ #include <linux/slab.h>#include <linux/init.h>#include <linux/unistd.h>#include <linux/module.h>#include <linux/vmalloc.h>#include <linux/completion.h>#include <linux/personality.h>#include <linux/mempolicy.h>#include <linux/sem.h>#include <linux/file.h>#include <linux/fdtable.h>#include <linux/iocontext.h>#include <linux/key.h>#include <linux/binfmts.h>#include <linux/mman.h>#include <linux/mmu_notifier.h>#include <linux/fs.h>#include <linux/mm.h>#include <linux/vmacache.h>#include <linux/nsproxy.h>#include <linux/capability.h>#include <linux/cpu.h>#include <linux/cgroup.h>#include <linux/security.h>#include <linux/hugetlb.h>#include <linux/seccomp.h>#include <linux/swap.h>#include <linux/syscalls.h>#include <linux/jiffies.h>#include <linux/futex.h>#include <linux/compat.h>#include <linux/kthread.h>#include <linux/task_io_accounting_ops.h>#include <linux/rcupdate.h>#include <linux/ptrace.h>#include <linux/mount.h>#include <linux/audit.h>#include <linux/memcontrol.h>#include <linux/ftrace.h>#include <linux/proc_fs.h>#include <linux/profile.h>#include <linux/rmap.h>#include <linux/ksm.h>#include <linux/acct.h>#include <linux/tsacct_kern.h>#include <linux/cn_proc.h>#include <linux/freezer.h>#include <linux/delayacct.h>#include <linux/taskstats_kern.h>#include <linux/random.h>#include <linux/tty.h>#include <linux/blkdev.h>#include <linux/fs_struct.h>#include <linux/magic.h>#include <linux/perf_event.h>#include <linux/posix-timers.h>#include <linux/user-return-notifier.h>#include <linux/oom.h>#include <linux/khugepaged.h>#include <linux/signalfd.h>#include <linux/uprobes.h>#include <linux/aio.h>#include <linux/compiler.h>#include <linux/sysctl.h>#include <linux/kcov.h> #include <asm/pgtable.h>#include <asm/pgalloc.h>#include <asm/uaccess.h>#include <asm/mmu_context.h>#include <asm/cacheflush.h>#include <asm/tlbflush.h> #include <trace/events/sched.h> #define CREATE_TRACE_POINTS#include <trace/events/task.h> /* * Minimum number of threads to boot the kernel */#define MIN_THREADS 20 /* * Maximum number of threads */#define MAX_THREADS FUTEX_TID_MASK /* * Protected counters by write_lock_irq(&tasklist_lock) */unsigned long total_forks;	/* Handle normal Linux uptimes. */int nr_threads;			/* The idle threads do not count.. */ int max_threads;		/* tunable limit on nr_threads */ DEFINE_PER_CPU(unsigned long, process_counts) = 0; __cacheline_aligned DEFINE_RWLOCK(tasklist_lock);  /* outer */ #ifdef CONFIG_PROVE_RCUint lockdep_tasklist_lock_is_held(void){	return lockdep_is_held(&tasklist_lock);}EXPORT_SYMBOL_GPL(lockdep_tasklist_lock_is_held);#endif /* #ifdef CONFIG_PROVE_RCU */ int nr_processes(void){	int cpu;	int total = 0; 	for_each_possible_cpu(cpu)		total += per_cpu(process_counts, cpu); 	return total;} void __weak arch_release_task_struct(struct task_struct *tsk){} #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATORstatic struct kmem_cache *task_struct_cachep; static inline struct task_struct *alloc_task_struct_node(int node){	return kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node);} static inline void free_task_struct(struct task_struct *tsk){	kmem_cache_free(task_struct_cachep, tsk);}#endif void __weak arch_release_thread_stack(unsigned long *stack){} #ifndef CONFIG_ARCH_THREAD_STACK_ALLOCATOR /* * Allocate pages if THREAD_SIZE is >= PAGE_SIZE, otherwise use a * kmemcache based allocator. */# if THREAD_SIZE >= PAGE_SIZEstatic unsigned long *alloc_thread_stack_node(struct task_struct *tsk,						  int node){	struct page *page = alloc_pages_node(node, THREADINFO_GFP,					     THREAD_SIZE_ORDER); 	return page ? page_address(page) : NULL;} static inline void free_thread_stack(unsigned long *stack){	__free_pages(virt_to_page(stack), THREAD_SIZE_ORDER);}# elsestatic struct kmem_cache *thread_stack_cache; static unsigned long *alloc_thread_stack_node(struct task_struct *tsk,						  int node){	return kmem_cache_alloc_node(thread_stack_cache, THREADINFO_GFP, node);} static void free_thread_stack(unsigned long *stack){	kmem_cache_free(thread_stack_cache, stack);} void thread_stack_cache_init(void){	thread_stack_cache = kmem_cache_create("thread_stack", THREAD_SIZE,					      THREAD_SIZE, 0, NULL);	BUG_ON(thread_stack_cache == NULL);}# endif#endif /* SLAB cache for signal_struct structures (tsk->signal) */static struct kmem_cache *signal_cachep; /* SLAB cache for sighand_struct structures (tsk->sighand) */struct kmem_cache *sighand_cachep; /* SLAB cache for files_struct structures (tsk->files) */struct kmem_cache *files_cachep; /* SLAB cache for fs_struct structures (tsk->fs) */struct kmem_cache *fs_cachep; /* SLAB cache for vm_area_struct structures */struct kmem_cache *vm_area_cachep; /* SLAB cache for mm_struct structures (tsk->mm) */static struct kmem_cache *mm_cachep; static void account_kernel_stack(unsigned long *stack, int account){	/* All stack pages are in the same zone and belong to the same memcg. */	struct page *first_page = virt_to_page(stack); 	mod_zone_page_state(page_zone(first_page), NR_KERNEL_STACK_KB,			    THREAD_SIZE / 1024 * account); 	memcg_kmem_update_page_stat(		first_page, MEMCG_KERNEL_STACK_KB,		account * (THREAD_SIZE / 1024));} void free_task(struct task_struct *tsk){	account_kernel_stack(tsk->stack, -1);	arch_release_thread_stack(tsk->stack);	free_thread_stack(tsk->stack);	rt_mutex_debug_task_free(tsk);	ftrace_graph_exit_task(tsk);	put_seccomp_filter(tsk);	arch_release_task_struct(tsk);	free_task_struct(tsk);}EXPORT_SYMBOL(free_task); static inline void free_signal_struct(struct signal_struct *sig){	taskstats_tgid_free(sig);	sched_autogroup_exit(sig);	kmem_cache_free(signal_cachep, sig);} static inline void put_signal_struct(struct signal_struct *sig){	if (atomic_dec_and_test(&sig->sigcnt))		free_signal_struct(sig);} void __put_task_struct(struct task_struct *tsk){	WARN_ON(!tsk->exit_state);	WARN_ON(atomic_read(&tsk->usage));	WARN_ON(tsk == current); 	cgroup_free(tsk);	task_numa_free(tsk);	security_task_free(tsk);	exit_creds(tsk);	delayacct_tsk_free(tsk);	put_signal_struct(tsk->signal); 	if (!profile_handoff_task(tsk))		free_task(tsk);}EXPORT_SYMBOL_GPL(__put_task_struct); void __init __weak arch_task_cache_init(void) { } /* * set_max_threads */static void set_max_threads(unsigned int max_threads_suggested){	u64 threads; 	/*	 * The number of threads shall be limited such that the thread	 * structures may only consume a small part of the available memory.	 */	if (fls64(totalram_pages) + fls64(PAGE_SIZE) > 64)		threads = MAX_THREADS;	else		threads = div64_u64((u64) totalram_pages * (u64) PAGE_SIZE,				    (u64) THREAD_SIZE * 8UL); 	if (threads > max_threads_suggested)		threads = max_threads_suggested; 	max_threads = clamp_t(u64, threads, MIN_THREADS, MAX_THREADS);} #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT/* Initialized by the architecture: */int arch_task_struct_size __read_mostly;#endif void __init fork_init(void){#ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR#ifndef ARCH_MIN_TASKALIGN#define ARCH_MIN_TASKALIGN	L1_CACHE_BYTES#endif	/* create a slab on which task_structs can be allocated */	task_struct_cachep = kmem_cache_create("task_struct",			arch_task_struct_size, ARCH_MIN_TASKALIGN,			SLAB_PANIC|SLAB_NOTRACK|SLAB_ACCOUNT, NULL);#endif 	/* do the arch specific task caches init */	arch_task_cache_init(); 	set_max_threads(MAX_THREADS); 	init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;	init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;	init_task.signal->rlim[RLIMIT_SIGPENDING] =		init_task.signal->rlim[RLIMIT_NPROC];} int __weak arch_dup_task_struct(struct task_struct *dst,					       struct task_struct *src){	*dst = *src;	return 0;} void set_task_stack_end_magic(struct task_struct *tsk){	unsigned long *stackend; 	stackend = end_of_stack(tsk);	*stackend = STACK_END_MAGIC;	/* for overflow detection */} static struct task_struct *dup_task_struct(struct task_struct *orig, int node){	struct task_struct *tsk;	unsigned long *stack;	int err; 	if (node == NUMA_NO_NODE)		node = tsk_fork_get_node(orig);	tsk = alloc_task_struct_node(node);	if (!tsk)		return NULL; 	stack = alloc_thread_stack_node(tsk, node);	if (!stack)		goto free_tsk; 	err = arch_dup_task_struct(tsk, orig);	if (err)		goto free_stack; 	tsk->stack = stack;#ifdef CONFIG_SECCOMP	/*	 * We must handle setting up seccomp filters once we're under	 * the sighand lock in case orig has changed between now and	 * then. Until then, filter must be NULL to avoid messing up	 * the usage counts on the error path calling free_task.	 */	tsk->seccomp.filter = NULL;#endif 	setup_thread_stack(tsk, orig);	clear_user_return_notifier(tsk);	clear_tsk_need_resched(tsk);	set_task_stack_end_magic(tsk); #ifdef CONFIG_CC_STACKPROTECTOR	tsk->stack_canary = get_random_int();#endif 	/*	 * One for us, one for whoever does the "release_task()" (usually	 * parent)	 */	atomic_set(&tsk->usage, 2);#ifdef CONFIG_BLK_DEV_IO_TRACE	tsk->btrace_seq = 0;#endif	tsk->splice_pipe = NULL;	tsk->task_frag.page = NULL;	tsk->wake_q.next = NULL; 	account_kernel_stack(stack, 1); 	kcov_task_init(tsk); 	return tsk; free_stack:	free_thread_stack(stack);free_tsk:	free_task_struct(tsk);	return NULL;} #ifdef CONFIG_MMUstatic int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm){	struct vm_area_struct *mpnt, *tmp, *prev, **pprev;	struct rb_node **rb_link, *rb_parent;	int retval;	unsigned long charge; 	uprobe_start_dup_mmap();	if (down_write_killable(&oldmm->mmap_sem)) {		retval = -EINTR;		goto fail_uprobe_end;	}	flush_cache_dup_mm(oldmm);	uprobe_dup_mmap(oldmm, mm);	/*	 * Not linked in yet - no deadlock potential:	 */	down_write_nested(&mm->mmap_sem, SINGLE_DEPTH_NESTING); 	/* No ordering required: file already has been exposed. */	RCU_INIT_POINTER(mm->exe_file, get_mm_exe_file(oldmm)); 	mm->total_vm = oldmm->total_vm;	mm->data_vm = oldmm->data_vm;	mm->exec_vm = oldmm->exec_vm;	mm->stack_vm = oldmm->stack_vm; 	rb_link = &mm->mm_rb.rb_node;	rb_parent = NULL;	pprev = &mm->mmap;	retval = ksm_fork(mm, oldmm);	if (retval)		goto out;	retval = khugepaged_fork(mm, oldmm);	if (retval)		goto out; 	prev = NULL;	for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) {		struct file *file; 		if (mpnt->vm_flags & VM_DONTCOPY) {			vm_stat_account(mm, mpnt->vm_flags, -vma_pages(mpnt));			continue;		}		charge = 0;		if (mpnt->vm_flags & VM_ACCOUNT) {			unsigned long len = vma_pages(mpnt); 			if (security_vm_enough_memory_mm(oldmm, len)) /* sic */				goto fail_nomem;			charge = len;		}		tmp = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);		if (!tmp)			goto fail_nomem;		*tmp = *mpnt;		INIT_LIST_HEAD(&tmp->anon_vma_chain);		retval = vma_dup_policy(mpnt, tmp);		if (retval)			goto fail_nomem_policy;		tmp->vm_mm = mm;		if (anon_vma_fork(tmp, mpnt))			goto fail_nomem_anon_vma_fork;		tmp->vm_flags &=			~(VM_LOCKED|VM_LOCKONFAULT|VM_UFFD_MISSING|VM_UFFD_WP);		tmp->vm_next = tmp->vm_prev = NULL;		tmp->vm_userfaultfd_ctx = NULL_VM_UFFD_CTX;		file = tmp->vm_file;		if (file) {			struct inode *inode = file_inode(file);			struct address_space *mapping = file->f_mapping; 			get_file(file);			if (tmp->vm_flags & VM_DENYWRITE)				atomic_dec(&inode->i_writecount);			i_mmap_lock_write(mapping);			if (tmp->vm_flags & VM_SHARED)				atomic_inc(&mapping->i_mmap_writable);			flush_dcache_mmap_lock(mapping);			/* insert tmp into the share list, just after mpnt */			vma_interval_tree_insert_after(tmp, mpnt,					&mapping->i_mmap);			flush_dcache_mmap_unlock(mapping);			i_mmap_unlock_write(mapping);		} 		/*		 * Clear hugetlb-related page reserves for children. This only		 * affects MAP_PRIVATE mappings. Faults generated by the child		 * are not guaranteed to succeed, even if read-only		 */		if (is_vm_hugetlb_page(tmp))			reset_vma_resv_huge_pages(tmp);

Lines 1–500 of 2157.