⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysctl.c

📁 linux 2.6.19 kernel source code before patching
💻 C
📖 第 1 页 / 共 4 页
字号:
		.ctl_name	= KERN_MAX_LOCK_DEPTH,		.procname	= "max_lock_depth",		.data		= &max_lock_depth,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#endif#ifdef CONFIG_PROC_FS	{		.ctl_name       = CTL_UNNUMBERED,		.procname       = "maps_protect",		.data           = &maps_protect,		.maxlen         = sizeof(int),		.mode           = 0644,		.proc_handler   = &proc_dointvec,	},#endif	{ .ctl_name = 0 }};/* Constants for minimum and maximum testing in vm_table.   We use these as one-element integer vectors. */static int zero;static int one_hundred = 100;static ctl_table vm_table[] = {	{		.ctl_name	= VM_OVERCOMMIT_MEMORY,		.procname	= "overcommit_memory",		.data		= &sysctl_overcommit_memory,		.maxlen		= sizeof(sysctl_overcommit_memory),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= VM_PANIC_ON_OOM,		.procname	= "panic_on_oom",		.data		= &sysctl_panic_on_oom,		.maxlen		= sizeof(sysctl_panic_on_oom),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= VM_OVERCOMMIT_RATIO,		.procname	= "overcommit_ratio",		.data		= &sysctl_overcommit_ratio,		.maxlen		= sizeof(sysctl_overcommit_ratio),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= VM_PAGE_CLUSTER,		.procname	= "page-cluster", 		.data		= &page_cluster,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= VM_DIRTY_BACKGROUND,		.procname	= "dirty_background_ratio",		.data		= &dirty_background_ratio,		.maxlen		= sizeof(dirty_background_ratio),		.mode		= 0644,		.proc_handler	= &proc_dointvec_minmax,		.strategy	= &sysctl_intvec,		.extra1		= &zero,		.extra2		= &one_hundred,	},	{		.ctl_name	= VM_DIRTY_RATIO,		.procname	= "dirty_ratio",		.data		= &vm_dirty_ratio,		.maxlen		= sizeof(vm_dirty_ratio),		.mode		= 0644,		.proc_handler	= &proc_dointvec_minmax,		.strategy	= &sysctl_intvec,		.extra1		= &zero,		.extra2		= &one_hundred,	},	{		.ctl_name	= VM_DIRTY_WB_CS,		.procname	= "dirty_writeback_centisecs",		.data		= &dirty_writeback_interval,		.maxlen		= sizeof(dirty_writeback_interval),		.mode		= 0644,		.proc_handler	= &dirty_writeback_centisecs_handler,	},	{		.ctl_name	= VM_DIRTY_EXPIRE_CS,		.procname	= "dirty_expire_centisecs",		.data		= &dirty_expire_interval,		.maxlen		= sizeof(dirty_expire_interval),		.mode		= 0644,		.proc_handler	= &proc_dointvec_userhz_jiffies,	},	{		.ctl_name	= VM_NR_PDFLUSH_THREADS,		.procname	= "nr_pdflush_threads",		.data		= &nr_pdflush_threads,		.maxlen		= sizeof nr_pdflush_threads,		.mode		= 0444 /* read-only*/,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= VM_SWAPPINESS,		.procname	= "swappiness",		.data		= &vm_swappiness,		.maxlen		= sizeof(vm_swappiness),		.mode		= 0644,		.proc_handler	= &proc_dointvec_minmax,		.strategy	= &sysctl_intvec,		.extra1		= &zero,		.extra2		= &one_hundred,	},#ifdef CONFIG_HUGETLB_PAGE	 {		.ctl_name	= VM_HUGETLB_PAGES,		.procname	= "nr_hugepages",		.data		= &max_huge_pages,		.maxlen		= sizeof(unsigned long),		.mode		= 0644,		.proc_handler	= &hugetlb_sysctl_handler,		.extra1		= (void *)&hugetlb_zero,		.extra2		= (void *)&hugetlb_infinity,	 },	 {		.ctl_name	= VM_HUGETLB_GROUP,		.procname	= "hugetlb_shm_group",		.data		= &sysctl_hugetlb_shm_group,		.maxlen		= sizeof(gid_t),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	 },#endif	{		.ctl_name	= VM_LOWMEM_RESERVE_RATIO,		.procname	= "lowmem_reserve_ratio",		.data		= &sysctl_lowmem_reserve_ratio,		.maxlen		= sizeof(sysctl_lowmem_reserve_ratio),		.mode		= 0644,		.proc_handler	= &lowmem_reserve_ratio_sysctl_handler,		.strategy	= &sysctl_intvec,	},	{		.ctl_name	= VM_DROP_PAGECACHE,		.procname	= "drop_caches",		.data		= &sysctl_drop_caches,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= drop_caches_sysctl_handler,		.strategy	= &sysctl_intvec,	},	{		.ctl_name	= VM_MIN_FREE_KBYTES,		.procname	= "min_free_kbytes",		.data		= &min_free_kbytes,		.maxlen		= sizeof(min_free_kbytes),		.mode		= 0644,		.proc_handler	= &min_free_kbytes_sysctl_handler,		.strategy	= &sysctl_intvec,		.extra1		= &zero,	},	{		.ctl_name	= VM_PERCPU_PAGELIST_FRACTION,		.procname	= "percpu_pagelist_fraction",		.data		= &percpu_pagelist_fraction,		.maxlen		= sizeof(percpu_pagelist_fraction),		.mode		= 0644,		.proc_handler	= &percpu_pagelist_fraction_sysctl_handler,		.strategy	= &sysctl_intvec,		.extra1		= &min_percpu_pagelist_fract,	},#ifdef CONFIG_MMU	{		.ctl_name	= VM_MAX_MAP_COUNT,		.procname	= "max_map_count",		.data		= &sysctl_max_map_count,		.maxlen		= sizeof(sysctl_max_map_count),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},#endif	{		.ctl_name	= VM_LAPTOP_MODE,		.procname	= "laptop_mode",		.data		= &laptop_mode,		.maxlen		= sizeof(laptop_mode),		.mode		= 0644,		.proc_handler	= &proc_dointvec_jiffies,		.strategy	= &sysctl_jiffies,	},	{		.ctl_name	= VM_BLOCK_DUMP,		.procname	= "block_dump",		.data		= &block_dump,		.maxlen		= sizeof(block_dump),		.mode		= 0644,		.proc_handler	= &proc_dointvec,		.strategy	= &sysctl_intvec,		.extra1		= &zero,	},	{		.ctl_name	= VM_VFS_CACHE_PRESSURE,		.procname	= "vfs_cache_pressure",		.data		= &sysctl_vfs_cache_pressure,		.maxlen		= sizeof(sysctl_vfs_cache_pressure),		.mode		= 0644,		.proc_handler	= &proc_dointvec,		.strategy	= &sysctl_intvec,		.extra1		= &zero,	},#ifdef HAVE_ARCH_PICK_MMAP_LAYOUT	{		.ctl_name	= VM_LEGACY_VA_LAYOUT,		.procname	= "legacy_va_layout",		.data		= &sysctl_legacy_va_layout,		.maxlen		= sizeof(sysctl_legacy_va_layout),		.mode		= 0644,		.proc_handler	= &proc_dointvec,		.strategy	= &sysctl_intvec,		.extra1		= &zero,	},#endif#ifdef CONFIG_NUMA	{		.ctl_name	= VM_ZONE_RECLAIM_MODE,		.procname	= "zone_reclaim_mode",		.data		= &zone_reclaim_mode,		.maxlen		= sizeof(zone_reclaim_mode),		.mode		= 0644,		.proc_handler	= &proc_dointvec,		.strategy	= &sysctl_intvec,		.extra1		= &zero,	},	{		.ctl_name	= VM_MIN_UNMAPPED,		.procname	= "min_unmapped_ratio",		.data		= &sysctl_min_unmapped_ratio,		.maxlen		= sizeof(sysctl_min_unmapped_ratio),		.mode		= 0644,		.proc_handler	= &sysctl_min_unmapped_ratio_sysctl_handler,		.strategy	= &sysctl_intvec,		.extra1		= &zero,		.extra2		= &one_hundred,	},	{		.ctl_name	= VM_MIN_SLAB,		.procname	= "min_slab_ratio",		.data		= &sysctl_min_slab_ratio,		.maxlen		= sizeof(sysctl_min_slab_ratio),		.mode		= 0644,		.proc_handler	= &sysctl_min_slab_ratio_sysctl_handler,		.strategy	= &sysctl_intvec,		.extra1		= &zero,		.extra2		= &one_hundred,	},#endif#ifdef CONFIG_SMP	{		.ctl_name	= CTL_UNNUMBERED,		.procname	= "stat_interval",		.data		= &sysctl_stat_interval,		.maxlen		= sizeof(sysctl_stat_interval),		.mode		= 0644,		.proc_handler	= &proc_dointvec_jiffies,		.strategy	= &sysctl_jiffies,	},#endif#if defined(CONFIG_X86_32) || \   (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))	{		.ctl_name	= VM_VDSO_ENABLED,		.procname	= "vdso_enabled",		.data		= &vdso_enabled,		.maxlen		= sizeof(vdso_enabled),		.mode		= 0644,		.proc_handler	= &proc_dointvec,		.strategy	= &sysctl_intvec,		.extra1		= &zero,	},#endif	{ .ctl_name = 0 }};#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)static ctl_table binfmt_misc_table[] = {	{ .ctl_name = 0 }};#endifstatic ctl_table fs_table[] = {	{		.ctl_name	= FS_NRINODE,		.procname	= "inode-nr",		.data		= &inodes_stat,		.maxlen		= 2*sizeof(int),		.mode		= 0444,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= FS_STATINODE,		.procname	= "inode-state",		.data		= &inodes_stat,		.maxlen		= 7*sizeof(int),		.mode		= 0444,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= FS_NRFILE,		.procname	= "file-nr",		.data		= &files_stat,		.maxlen		= 3*sizeof(int),		.mode		= 0444,		.proc_handler	= &proc_nr_files,	},	{		.ctl_name	= FS_MAXFILE,		.procname	= "file-max",		.data		= &files_stat.max_files,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= FS_DENTRY,		.procname	= "dentry-state",		.data		= &dentry_stat,		.maxlen		= 6*sizeof(int),		.mode		= 0444,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= FS_OVERFLOWUID,		.procname	= "overflowuid",		.data		= &fs_overflowuid,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_minmax,		.strategy	= &sysctl_intvec,		.extra1		= &minolduid,		.extra2		= &maxolduid,	},	{		.ctl_name	= FS_OVERFLOWGID,		.procname	= "overflowgid",		.data		= &fs_overflowgid,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_minmax,		.strategy	= &sysctl_intvec,		.extra1		= &minolduid,		.extra2		= &maxolduid,	},	{		.ctl_name	= FS_LEASES,		.procname	= "leases-enable",		.data		= &leases_enable,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#ifdef CONFIG_DNOTIFY	{		.ctl_name	= FS_DIR_NOTIFY,		.procname	= "dir-notify-enable",		.data		= &dir_notify_enable,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#endif#ifdef CONFIG_MMU	{		.ctl_name	= FS_LEASE_TIME,		.procname	= "lease-break-time",		.data		= &lease_break_time,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},	{		.ctl_name	= FS_AIO_NR,		.procname	= "aio-nr",		.data		= &aio_nr,		.maxlen		= sizeof(aio_nr),		.mode		= 0444,		.proc_handler	= &proc_doulongvec_minmax,	},	{		.ctl_name	= FS_AIO_MAX_NR,		.procname	= "aio-max-nr",		.data		= &aio_max_nr,		.maxlen		= sizeof(aio_max_nr),		.mode		= 0644,		.proc_handler	= &proc_doulongvec_minmax,	},#ifdef CONFIG_INOTIFY_USER	{		.ctl_name	= FS_INOTIFY,		.procname	= "inotify",		.mode		= 0555,		.child		= inotify_table,	},#endif	#endif	{		.ctl_name	= KERN_SETUID_DUMPABLE,		.procname	= "suid_dumpable",		.data		= &suid_dumpable,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec,	},#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)	{		.ctl_name	= CTL_UNNUMBERED,		.procname	= "binfmt_misc",		.mode		= 0555,		.child		= binfmt_misc_table,	},#endif	{ .ctl_name = 0 }};static ctl_table debug_table[] = {	{ .ctl_name = 0 }};static ctl_table dev_table[] = {	{ .ctl_name = 0 }};static DEFINE_SPINLOCK(sysctl_lock);/* called under sysctl_lock */static int use_table(struct ctl_table_header *p){	if (unlikely(p->unregistering))		return 0;	p->used++;	return 1;}/* called under sysctl_lock */static void unuse_table(struct ctl_table_header *p){	if (!--p->used)		if (unlikely(p->unregistering))			complete(p->unregistering);}/* called under sysctl_lock, will reacquire if has to wait */static void start_unregistering(struct ctl_table_header *p){	/*	 * if p->used is 0, nobody will ever touch that entry again;	 * we'll eliminate all paths to it before dropping sysctl_lock	 */	if (unlikely(p->used)) {		struct completion wait;		init_completion(&wait);		p->unregistering = &wait;		spin_unlock(&sysctl_lock);		wait_for_completion(&wait);		spin_lock(&sysctl_lock);	}	/*	 * do not remove from the list until nobody holds it; walking the	 * list in do_sysctl() relies on that.	 */	list_del_init(&p->ctl_entry);}void sysctl_head_finish(struct ctl_table_header *head){	if (!head)		return;	spin_lock(&sysctl_lock);	unuse_table(head);	spin_unlock(&sysctl_lock);}struct ctl_table_header *sysctl_head_next(struct ctl_table_header *prev){	struct ctl_table_header *head;	struct list_head *tmp;	spin_lock(&sysctl_lock);	if (prev) {		tmp = &prev->ctl_entry;		unuse_table(prev);		goto next;	}	tmp = &root_table_header.ctl_entry;	for (;;) {		head = list_entry(tmp, struct ctl_table_header, ctl_entry);		if (!use_table(head))			goto next;		spin_unlock(&sysctl_lock);		return head;	next:		tmp = tmp->next;		if (tmp == &root_table_header.ctl_entry)			break;	}	spin_unlock(&sysctl_lock);	return NULL;}#ifdef CONFIG_SYSCTL_SYSCALLint do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp,	       void __user *newval, size_t newlen){	struct ctl_table_header *head;	int error = -ENOTDIR;	if (nlen <= 0 || nlen >= CTL_MAXNAME)		return -ENOTDIR;	if (oldval) {		int old_len;		if (!oldlenp || get_user(old_len, oldlenp))			return -EFAULT;	}	for (head = sysctl_head_next(NULL); head;			head = sysctl_head_next(head)) {		error = parse_table(name, nlen, oldval, oldlenp, 					newval, newlen, head->ctl_table);		if (error != -ENOTDIR) {			sysctl_head_finish(head);			break;		}	}	return error;}asmlinkage long sys_sysctl(struct __sysctl_args __user *args){	struct __sysctl_args tmp;	int error;	if (copy_from_user(&tmp, args, sizeof(tmp)))		return -EFAULT;	lock_kernel();	error = do_sysctl(tmp.name, tmp.nlen, tmp.oldval, tmp.oldlenp,			  tmp.newval, tmp.newlen);	unlock_kernel();	return error;}#endif /* CONFIG_SYSCTL_SYSCALL *//* * sysctl_perm does NOT grant the superuser all rights automatically, because * some sysctl variables are readonly even to root. */static int test_perm(int mode, int op){	if (!current->euid)		mode >>= 6;	else if (in_egroup_p(0))		mode >>= 3;	if ((mode & op & 0007) == op)		return 0;	return -EACCES;}int sysctl_perm(ctl_table *table, int op){	int error;	error = security_sysctl(table, op);	if (error)		return error;	return test_perm(table->mode, op);}#ifdef CONFIG_SYSCTL_SYSCALLstatic int parse_table(int __user *name, int nlen,		       void __user *oldval, size_t __user *oldlenp,		       void __user *newval, size_t newlen,		       ctl_table *table){	int n;repeat:	if (!nlen)		return -ENOTDIR;	if (get_user(n, name))		return -EFAULT;	for ( ; table->ctl_name || table->procname; table++) {		if (!table->ctl_name)			continue;		if (n == table->ctl_name) {			int error;			if (table->child) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -