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