xref: /OK3568_Linux_fs/kernel/ipc/mq_sysctl.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  Copyright (C) 2007 IBM Corporation
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Author: Cedric Le Goater <clg@fr.ibm.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/nsproxy.h>
9*4882a593Smuzhiyun #include <linux/ipc_namespace.h>
10*4882a593Smuzhiyun #include <linux/sysctl.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifdef CONFIG_PROC_SYSCTL
get_mq(struct ctl_table * table)13*4882a593Smuzhiyun static void *get_mq(struct ctl_table *table)
14*4882a593Smuzhiyun {
15*4882a593Smuzhiyun 	char *which = table->data;
16*4882a593Smuzhiyun 	struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
17*4882a593Smuzhiyun 	which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
18*4882a593Smuzhiyun 	return which;
19*4882a593Smuzhiyun }
20*4882a593Smuzhiyun 
proc_mq_dointvec(struct ctl_table * table,int write,void * buffer,size_t * lenp,loff_t * ppos)21*4882a593Smuzhiyun static int proc_mq_dointvec(struct ctl_table *table, int write,
22*4882a593Smuzhiyun 			    void *buffer, size_t *lenp, loff_t *ppos)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun 	struct ctl_table mq_table;
25*4882a593Smuzhiyun 	memcpy(&mq_table, table, sizeof(mq_table));
26*4882a593Smuzhiyun 	mq_table.data = get_mq(table);
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	return proc_dointvec(&mq_table, write, buffer, lenp, ppos);
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun 
proc_mq_dointvec_minmax(struct ctl_table * table,int write,void * buffer,size_t * lenp,loff_t * ppos)31*4882a593Smuzhiyun static int proc_mq_dointvec_minmax(struct ctl_table *table, int write,
32*4882a593Smuzhiyun 		void *buffer, size_t *lenp, loff_t *ppos)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	struct ctl_table mq_table;
35*4882a593Smuzhiyun 	memcpy(&mq_table, table, sizeof(mq_table));
36*4882a593Smuzhiyun 	mq_table.data = get_mq(table);
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	return proc_dointvec_minmax(&mq_table, write, buffer,
39*4882a593Smuzhiyun 					lenp, ppos);
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun #else
42*4882a593Smuzhiyun #define proc_mq_dointvec NULL
43*4882a593Smuzhiyun #define proc_mq_dointvec_minmax NULL
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun static int msg_max_limit_min = MIN_MSGMAX;
47*4882a593Smuzhiyun static int msg_max_limit_max = HARD_MSGMAX;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
50*4882a593Smuzhiyun static int msg_maxsize_limit_max = HARD_MSGSIZEMAX;
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun static struct ctl_table mq_sysctls[] = {
53*4882a593Smuzhiyun 	{
54*4882a593Smuzhiyun 		.procname	= "queues_max",
55*4882a593Smuzhiyun 		.data		= &init_ipc_ns.mq_queues_max,
56*4882a593Smuzhiyun 		.maxlen		= sizeof(int),
57*4882a593Smuzhiyun 		.mode		= 0644,
58*4882a593Smuzhiyun 		.proc_handler	= proc_mq_dointvec,
59*4882a593Smuzhiyun 	},
60*4882a593Smuzhiyun 	{
61*4882a593Smuzhiyun 		.procname	= "msg_max",
62*4882a593Smuzhiyun 		.data		= &init_ipc_ns.mq_msg_max,
63*4882a593Smuzhiyun 		.maxlen		= sizeof(int),
64*4882a593Smuzhiyun 		.mode		= 0644,
65*4882a593Smuzhiyun 		.proc_handler	= proc_mq_dointvec_minmax,
66*4882a593Smuzhiyun 		.extra1		= &msg_max_limit_min,
67*4882a593Smuzhiyun 		.extra2		= &msg_max_limit_max,
68*4882a593Smuzhiyun 	},
69*4882a593Smuzhiyun 	{
70*4882a593Smuzhiyun 		.procname	= "msgsize_max",
71*4882a593Smuzhiyun 		.data		= &init_ipc_ns.mq_msgsize_max,
72*4882a593Smuzhiyun 		.maxlen		= sizeof(int),
73*4882a593Smuzhiyun 		.mode		= 0644,
74*4882a593Smuzhiyun 		.proc_handler	= proc_mq_dointvec_minmax,
75*4882a593Smuzhiyun 		.extra1		= &msg_maxsize_limit_min,
76*4882a593Smuzhiyun 		.extra2		= &msg_maxsize_limit_max,
77*4882a593Smuzhiyun 	},
78*4882a593Smuzhiyun 	{
79*4882a593Smuzhiyun 		.procname	= "msg_default",
80*4882a593Smuzhiyun 		.data		= &init_ipc_ns.mq_msg_default,
81*4882a593Smuzhiyun 		.maxlen		= sizeof(int),
82*4882a593Smuzhiyun 		.mode		= 0644,
83*4882a593Smuzhiyun 		.proc_handler	= proc_mq_dointvec_minmax,
84*4882a593Smuzhiyun 		.extra1		= &msg_max_limit_min,
85*4882a593Smuzhiyun 		.extra2		= &msg_max_limit_max,
86*4882a593Smuzhiyun 	},
87*4882a593Smuzhiyun 	{
88*4882a593Smuzhiyun 		.procname	= "msgsize_default",
89*4882a593Smuzhiyun 		.data		= &init_ipc_ns.mq_msgsize_default,
90*4882a593Smuzhiyun 		.maxlen		= sizeof(int),
91*4882a593Smuzhiyun 		.mode		= 0644,
92*4882a593Smuzhiyun 		.proc_handler	= proc_mq_dointvec_minmax,
93*4882a593Smuzhiyun 		.extra1		= &msg_maxsize_limit_min,
94*4882a593Smuzhiyun 		.extra2		= &msg_maxsize_limit_max,
95*4882a593Smuzhiyun 	},
96*4882a593Smuzhiyun 	{}
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun static struct ctl_table mq_sysctl_dir[] = {
100*4882a593Smuzhiyun 	{
101*4882a593Smuzhiyun 		.procname	= "mqueue",
102*4882a593Smuzhiyun 		.mode		= 0555,
103*4882a593Smuzhiyun 		.child		= mq_sysctls,
104*4882a593Smuzhiyun 	},
105*4882a593Smuzhiyun 	{}
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun static struct ctl_table mq_sysctl_root[] = {
109*4882a593Smuzhiyun 	{
110*4882a593Smuzhiyun 		.procname	= "fs",
111*4882a593Smuzhiyun 		.mode		= 0555,
112*4882a593Smuzhiyun 		.child		= mq_sysctl_dir,
113*4882a593Smuzhiyun 	},
114*4882a593Smuzhiyun 	{}
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
mq_register_sysctl_table(void)117*4882a593Smuzhiyun struct ctl_table_header *mq_register_sysctl_table(void)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun 	return register_sysctl_table(mq_sysctl_root);
120*4882a593Smuzhiyun }
121