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