xref: /linux-6.15/ipc/mq_sysctl.c (revision 2bc4657c)
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 
16bdc8e5f8SSerge E. Hallyn /*
17bdc8e5f8SSerge E. Hallyn  * Define the ranges various user-specified maximum values can
18bdc8e5f8SSerge E. Hallyn  * be set to.
19bdc8e5f8SSerge E. Hallyn  */
20bdc8e5f8SSerge E. Hallyn #define MIN_MSGMAX	1		/* min value for msg_max */
21bdc8e5f8SSerge E. Hallyn #define MAX_MSGMAX	HARD_MSGMAX	/* max value for msg_max */
22bdc8e5f8SSerge E. Hallyn #define MIN_MSGSIZEMAX	128		/* min value for msgsize_max */
23bdc8e5f8SSerge E. Hallyn #define MAX_MSGSIZEMAX	(8192*128)	/* max value for msgsize_max */
24bdc8e5f8SSerge E. Hallyn 
25f26ec5baSGeert Uytterhoeven #ifdef CONFIG_PROC_SYSCTL
26bdc8e5f8SSerge E. Hallyn static void *get_mq(ctl_table *table)
27bdc8e5f8SSerge E. Hallyn {
28bdc8e5f8SSerge E. Hallyn 	char *which = table->data;
29bdc8e5f8SSerge E. Hallyn 	struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
30bdc8e5f8SSerge E. Hallyn 	which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
31bdc8e5f8SSerge E. Hallyn 	return which;
32bdc8e5f8SSerge E. Hallyn }
33bdc8e5f8SSerge E. Hallyn 
348d65af78SAlexey Dobriyan static int proc_mq_dointvec(ctl_table *table, int write,
35bdc8e5f8SSerge E. Hallyn 	void __user *buffer, size_t *lenp, loff_t *ppos)
36bdc8e5f8SSerge E. Hallyn {
37bdc8e5f8SSerge E. Hallyn 	struct ctl_table mq_table;
38bdc8e5f8SSerge E. Hallyn 	memcpy(&mq_table, table, sizeof(mq_table));
39bdc8e5f8SSerge E. Hallyn 	mq_table.data = get_mq(table);
40bdc8e5f8SSerge E. Hallyn 
418d65af78SAlexey Dobriyan 	return proc_dointvec(&mq_table, write, buffer, lenp, ppos);
42bdc8e5f8SSerge E. Hallyn }
43bdc8e5f8SSerge E. Hallyn 
44bdc8e5f8SSerge E. Hallyn static int proc_mq_dointvec_minmax(ctl_table *table, int write,
458d65af78SAlexey Dobriyan 	void __user *buffer, size_t *lenp, loff_t *ppos)
46bdc8e5f8SSerge E. Hallyn {
47bdc8e5f8SSerge E. Hallyn 	struct ctl_table mq_table;
48bdc8e5f8SSerge E. Hallyn 	memcpy(&mq_table, table, sizeof(mq_table));
49bdc8e5f8SSerge E. Hallyn 	mq_table.data = get_mq(table);
50bdc8e5f8SSerge E. Hallyn 
518d65af78SAlexey Dobriyan 	return proc_dointvec_minmax(&mq_table, write, buffer,
52bdc8e5f8SSerge E. Hallyn 					lenp, ppos);
53bdc8e5f8SSerge E. Hallyn }
54bdc8e5f8SSerge E. Hallyn #else
55bdc8e5f8SSerge E. Hallyn #define proc_mq_dointvec NULL
56bdc8e5f8SSerge E. Hallyn #define proc_mq_dointvec_minmax NULL
57bdc8e5f8SSerge E. Hallyn #endif
58bdc8e5f8SSerge E. Hallyn 
59bdc8e5f8SSerge E. Hallyn static int msg_max_limit_min = MIN_MSGMAX;
60bdc8e5f8SSerge E. Hallyn static int msg_max_limit_max = MAX_MSGMAX;
61bdc8e5f8SSerge E. Hallyn 
62bdc8e5f8SSerge E. Hallyn static int msg_maxsize_limit_min = MIN_MSGSIZEMAX;
63bdc8e5f8SSerge E. Hallyn static int msg_maxsize_limit_max = MAX_MSGSIZEMAX;
64bdc8e5f8SSerge E. Hallyn 
65bdc8e5f8SSerge E. Hallyn static ctl_table mq_sysctls[] = {
66bdc8e5f8SSerge E. Hallyn 	{
67bdc8e5f8SSerge E. Hallyn 		.procname	= "queues_max",
68bdc8e5f8SSerge E. Hallyn 		.data		= &init_ipc_ns.mq_queues_max,
69bdc8e5f8SSerge E. Hallyn 		.maxlen		= sizeof(int),
70bdc8e5f8SSerge E. Hallyn 		.mode		= 0644,
71bdc8e5f8SSerge E. Hallyn 		.proc_handler	= proc_mq_dointvec,
72bdc8e5f8SSerge E. Hallyn 	},
73bdc8e5f8SSerge E. Hallyn 	{
74bdc8e5f8SSerge E. Hallyn 		.procname	= "msg_max",
75bdc8e5f8SSerge E. Hallyn 		.data		= &init_ipc_ns.mq_msg_max,
76bdc8e5f8SSerge E. Hallyn 		.maxlen		= sizeof(int),
77bdc8e5f8SSerge E. Hallyn 		.mode		= 0644,
78bdc8e5f8SSerge E. Hallyn 		.proc_handler	= proc_mq_dointvec_minmax,
79bdc8e5f8SSerge E. Hallyn 		.extra1		= &msg_max_limit_min,
80bdc8e5f8SSerge E. Hallyn 		.extra2		= &msg_max_limit_max,
81bdc8e5f8SSerge E. Hallyn 	},
82bdc8e5f8SSerge E. Hallyn 	{
83bdc8e5f8SSerge E. Hallyn 		.procname	= "msgsize_max",
84bdc8e5f8SSerge E. Hallyn 		.data		= &init_ipc_ns.mq_msgsize_max,
85bdc8e5f8SSerge E. Hallyn 		.maxlen		= sizeof(int),
86bdc8e5f8SSerge E. Hallyn 		.mode		= 0644,
87bdc8e5f8SSerge E. Hallyn 		.proc_handler	= proc_mq_dointvec_minmax,
88bdc8e5f8SSerge E. Hallyn 		.extra1		= &msg_maxsize_limit_min,
89bdc8e5f8SSerge E. Hallyn 		.extra2		= &msg_maxsize_limit_max,
90bdc8e5f8SSerge E. Hallyn 	},
91*2bc4657cSEric W. Biederman 	{}
92bdc8e5f8SSerge E. Hallyn };
93bdc8e5f8SSerge E. Hallyn 
94bdc8e5f8SSerge E. Hallyn static ctl_table mq_sysctl_dir[] = {
95bdc8e5f8SSerge E. Hallyn 	{
96bdc8e5f8SSerge E. Hallyn 		.procname	= "mqueue",
97bdc8e5f8SSerge E. Hallyn 		.mode		= 0555,
98bdc8e5f8SSerge E. Hallyn 		.child		= mq_sysctls,
99bdc8e5f8SSerge E. Hallyn 	},
100*2bc4657cSEric W. Biederman 	{}
101bdc8e5f8SSerge E. Hallyn };
102bdc8e5f8SSerge E. Hallyn 
103bdc8e5f8SSerge E. Hallyn static ctl_table mq_sysctl_root[] = {
104bdc8e5f8SSerge E. Hallyn 	{
105bdc8e5f8SSerge E. Hallyn 		.procname	= "fs",
106bdc8e5f8SSerge E. Hallyn 		.mode		= 0555,
107bdc8e5f8SSerge E. Hallyn 		.child		= mq_sysctl_dir,
108bdc8e5f8SSerge E. Hallyn 	},
109*2bc4657cSEric W. Biederman 	{}
110bdc8e5f8SSerge E. Hallyn };
111bdc8e5f8SSerge E. Hallyn 
112bdc8e5f8SSerge E. Hallyn struct ctl_table_header *mq_register_sysctl_table(void)
113bdc8e5f8SSerge E. Hallyn {
114bdc8e5f8SSerge E. Hallyn 	return register_sysctl_table(mq_sysctl_root);
115bdc8e5f8SSerge E. Hallyn }
116