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