forked from mirrors/linux
		
	The mm_struct always contains a cpumask bitmap, regardless of CONFIG_CPUMASK_OFFSTACK. That means the first step can be to simplify things, and simply have one bitmask at the end of the mm_struct for the mm_cpumask. This does necessitate moving everything else in mm_struct into an anonymous sub-structure, which can be randomized when struct randomization is enabled. The second step is to determine the correct size for the mm_struct slab object from the size of the mm_struct (excluding the CPU bitmap) and the size the cpumask. For init_mm we can simply allocate the maximum size this kernel is compiled for, since we only have one init_mm in the system, anyway. Pointer magic by Mike Galbraith, to evade -Wstringop-overflow getting confused by the dynamically sized array. Tested-by: Song Liu <songliubraving@fb.com> Signed-off-by: Rik van Riel <riel@surriel.com> Signed-off-by: Mike Galbraith <efault@gmx.de> Signed-off-by: Rik van Riel <riel@surriel.com> Acked-by: Dave Hansen <dave.hansen@intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: kernel-team@fb.com Cc: luto@kernel.org Link: http://lkml.kernel.org/r/20180716190337.26133-2-riel@surriel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
#include <linux/mm_types.h>
 | 
						|
#include <linux/rbtree.h>
 | 
						|
#include <linux/rwsem.h>
 | 
						|
#include <linux/spinlock.h>
 | 
						|
#include <linux/list.h>
 | 
						|
#include <linux/cpumask.h>
 | 
						|
 | 
						|
#include <linux/atomic.h>
 | 
						|
#include <linux/user_namespace.h>
 | 
						|
#include <asm/pgtable.h>
 | 
						|
#include <asm/mmu.h>
 | 
						|
 | 
						|
#ifndef INIT_MM_CONTEXT
 | 
						|
#define INIT_MM_CONTEXT(name)
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * For dynamically allocated mm_structs, there is a dynamically sized cpumask
 | 
						|
 * at the end of the structure, the size of which depends on the maximum CPU
 | 
						|
 * number the system can see. That way we allocate only as much memory for
 | 
						|
 * mm_cpumask() as needed for the hundreds, or thousands of processes that
 | 
						|
 * a system typically runs.
 | 
						|
 *
 | 
						|
 * Since there is only one init_mm in the entire system, keep it simple
 | 
						|
 * and size this cpu_bitmask to NR_CPUS.
 | 
						|
 */
 | 
						|
struct mm_struct init_mm = {
 | 
						|
	.mm_rb		= RB_ROOT,
 | 
						|
	.pgd		= swapper_pg_dir,
 | 
						|
	.mm_users	= ATOMIC_INIT(2),
 | 
						|
	.mm_count	= ATOMIC_INIT(1),
 | 
						|
	.mmap_sem	= __RWSEM_INITIALIZER(init_mm.mmap_sem),
 | 
						|
	.page_table_lock =  __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
 | 
						|
	.arg_lock	=  __SPIN_LOCK_UNLOCKED(init_mm.arg_lock),
 | 
						|
	.mmlist		= LIST_HEAD_INIT(init_mm.mmlist),
 | 
						|
	.user_ns	= &init_user_ns,
 | 
						|
	.cpu_bitmap	= { [BITS_TO_LONGS(NR_CPUS)] = 0},
 | 
						|
	INIT_MM_CONTEXT(init_mm)
 | 
						|
};
 |