Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cef0184c authored by KOSAKI Motohiro's avatar KOSAKI Motohiro Committed by Linus Torvalds
Browse files

mqueue: separate mqueue default value from maximum value



Commit b231cca4 ("message queues: increase range limits") changed
mqueue default value when attr parameter is specified NULL from hard
coded value to fs.mqueue.{msg,msgsize}_max sysctl value.

This made large side effect.  When user need to use two mqueue
applications 1) using !NULL attr parameter and it require big message
size and 2) using NULL attr parameter and only need small size message,
app (1) require to raise fs.mqueue.msgsize_max and app (2) consume large
memory size even though it doesn't need.

Doug Ledford propsed to switch back it to static hard coded value.
However it also has a compatibility problem.  Some applications might
started depend on the default value is tunable.

The solution is to separate default value from maximum value.

Signed-off-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
Acked-by: default avatarDoug Ledford <dledford@redhat.com>
Acked-by: default avatarJoe Korty <joe.korty@ccur.com>
Cc: Amerigo Wang <amwang@redhat.com>
Acked-by: default avatarSerge E. Hallyn <serue@us.ibm.com>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: Manfred Spraul <manfred@colorfullife.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent fd1f87d2
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -225,6 +225,13 @@ a queue must be less or equal then msg_max.
maximum  message size value (it is every  message queue's attribute set during
maximum  message size value (it is every  message queue's attribute set during
its creation).
its creation).


/proc/sys/fs/mqueue/msg_default is  a read/write  file for setting/getting the
default number of messages in a queue value if attr parameter of mq_open(2) is
NULL. If it exceed msg_max, the default value is initialized msg_max.

/proc/sys/fs/mqueue/msgsize_default is a read/write file for setting/getting
the default message size value if attr parameter of mq_open(2) is NULL. If it
exceed msgsize_max, the default value is initialized msgsize_max.


4. /proc/sys/fs/epoll - Configuration options for the epoll interface
4. /proc/sys/fs/epoll - Configuration options for the epoll interface
--------------------------------------------------------
--------------------------------------------------------
+2 −0
Original line number Original line Diff line number Diff line
@@ -62,6 +62,8 @@ struct ipc_namespace {
	unsigned int    mq_queues_max;   /* initialized to DFLT_QUEUESMAX */
	unsigned int    mq_queues_max;   /* initialized to DFLT_QUEUESMAX */
	unsigned int    mq_msg_max;      /* initialized to DFLT_MSGMAX */
	unsigned int    mq_msg_max;      /* initialized to DFLT_MSGMAX */
	unsigned int    mq_msgsize_max;  /* initialized to DFLT_MSGSIZEMAX */
	unsigned int    mq_msgsize_max;  /* initialized to DFLT_MSGSIZEMAX */
	unsigned int    mq_msg_default;
	unsigned int    mq_msgsize_default;


	/* user_ns which owns the ipc ns */
	/* user_ns which owns the ipc ns */
	struct user_namespace *user_ns;
	struct user_namespace *user_ns;
+18 −0
Original line number Original line Diff line number Diff line
@@ -73,6 +73,24 @@ static ctl_table mq_sysctls[] = {
		.extra1		= &msg_maxsize_limit_min,
		.extra1		= &msg_maxsize_limit_min,
		.extra2		= &msg_maxsize_limit_max,
		.extra2		= &msg_maxsize_limit_max,
	},
	},
	{
		.procname	= "msg_default",
		.data		= &init_ipc_ns.mq_msg_default,
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= proc_mq_dointvec_minmax,
		.extra1		= &msg_max_limit_min,
		.extra2		= &msg_max_limit_max,
	},
	{
		.procname	= "msgsize_default",
		.data		= &init_ipc_ns.mq_msgsize_default,
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= proc_mq_dointvec_minmax,
		.extra1		= &msg_maxsize_limit_min,
		.extra2		= &msg_maxsize_limit_max,
	},
	{}
	{}
};
};


+6 −3
Original line number Original line Diff line number Diff line
@@ -145,9 +145,10 @@ static struct inode *mqueue_get_inode(struct super_block *sb,
		info->qsize = 0;
		info->qsize = 0;
		info->user = NULL;	/* set when all is ok */
		info->user = NULL;	/* set when all is ok */
		memset(&info->attr, 0, sizeof(info->attr));
		memset(&info->attr, 0, sizeof(info->attr));
		info->attr.mq_maxmsg = min(ipc_ns->mq_msg_max, DFLT_MSG);
		info->attr.mq_maxmsg = min(ipc_ns->mq_msg_max,
		info->attr.mq_msgsize =
					   ipc_ns->mq_msg_default);
			min(ipc_ns->mq_msgsize_max, DFLT_MSGSIZE);
		info->attr.mq_msgsize = min(ipc_ns->mq_msgsize_max,
					    ipc_ns->mq_msgsize_default);
		if (attr) {
		if (attr) {
			info->attr.mq_maxmsg = attr->mq_maxmsg;
			info->attr.mq_maxmsg = attr->mq_maxmsg;
			info->attr.mq_msgsize = attr->mq_msgsize;
			info->attr.mq_msgsize = attr->mq_msgsize;
@@ -1261,6 +1262,8 @@ int mq_init_ns(struct ipc_namespace *ns)
	ns->mq_queues_max    = DFLT_QUEUESMAX;
	ns->mq_queues_max    = DFLT_QUEUESMAX;
	ns->mq_msg_max       = DFLT_MSGMAX;
	ns->mq_msg_max       = DFLT_MSGMAX;
	ns->mq_msgsize_max   = DFLT_MSGSIZEMAX;
	ns->mq_msgsize_max   = DFLT_MSGSIZEMAX;
	ns->mq_msg_default   = DFLT_MSG;
	ns->mq_msgsize_default  = DFLT_MSGSIZE;


	ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns);
	ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns);
	if (IS_ERR(ns->mq_mnt)) {
	if (IS_ERR(ns->mq_mnt)) {