From: Nadia Derbey <Nadia.Derbey@bull.net>
To: Solofo.Ramangalahy@bull.net
Cc: linux-kernel@vger.kernel.org
Subject: Re: [RFC -mm 5/6] sysv ipc: deconnect msgmnb and msgmni deactivation and reactivation
Date: Tue, 10 Jun 2008 09:05:45 +0200 [thread overview]
Message-ID: <484E27C9.6030106@bull.net> (raw)
In-Reply-To: <20080606060958.710882773@bull.net>
Solofo.Ramangalahy@bull.net wrote:
> From: Solofo Ramangalahy <Solofo.Ramangalahy@bull.net>
>
> The msgmnb and msgmni values are coupled for deactivation and
> reactivation of value computation.
>
> The uncoupling of msgmn{b,i} for deactivation/reactivation of
> recomputation adds flexibility and testability.
>
> . Flexibility was discussed during the msgmni series development and
> ended up with reactivation by negative value on /proc.
>
> . Testability allows to experiment with the automatic computation of
> msgmn{b,i} values. For example, if current algorithm does not fit
> application needs.
>
>
> Signed-off-by: Solofo Ramangalahy <Solofo.Ramangalahy@bull.net>
>
> ---
> include/linux/ipc_namespace.h | 3 +-
> ipc/ipc_sysctl.c | 45 ++++++++++++++++++++++++++++++++----------
> ipc/ipcns_notifier.c | 9 --------
> ipc/msg.c | 6 +++++
> 4 files changed, 43 insertions(+), 20 deletions(-)
>
> Index: b/include/linux/ipc_namespace.h
> ===================================================================
> --- a/include/linux/ipc_namespace.h
> +++ b/include/linux/ipc_namespace.h
> @@ -34,7 +34,9 @@ struct ipc_namespace {
>
> int msg_ctlmax;
> int msg_ctlmnb;
> + bool msg_ctlmnb_activated; /* recompute_msgmnb activation */
> int msg_ctlmni;
> + bool msg_ctlmni_activated; /* recompute_msgmni activation */
> atomic_t msg_bytes;
> atomic_t msg_hdrs;
>
> @@ -53,7 +55,6 @@ extern atomic_t nr_ipc_ns;
> #define INIT_IPC_NS(ns) .ns = &init_ipc_ns,
>
> extern int register_ipcns_notifier(struct ipc_namespace *);
> -extern int cond_register_ipcns_notifier(struct ipc_namespace *);
> extern int unregister_ipcns_notifier(struct ipc_namespace *);
> extern int ipcns_notify(unsigned long);
>
> Index: b/ipc/msg.c
> ===================================================================
> --- a/ipc/msg.c
> +++ b/ipc/msg.c
> @@ -91,6 +91,8 @@ void recompute_msgmni(struct ipc_namespa
> unsigned long allowed;
> int nb_ns;
>
> + if (!ns->msg_ctlmni_activated)
> + return;
> si_meminfo(&i);
> allowed = (((i.totalram - i.totalhigh) / MSG_MEM_SCALE) * i.mem_unit)
> / ns->msg_ctlmnb;
> @@ -116,6 +118,8 @@ void recompute_msgmni(struct ipc_namespa
> */
> void recompute_msgmnb(struct ipc_namespace *ns)
> {
> + if (!ns->msg_ctlmnb_activated)
> + return;
> ns->msg_ctlmnb =
> min(MSGMNB * num_online_cpus(), MSGMNB * MSG_CPU_SCALE);
> }
> @@ -123,6 +127,8 @@ void recompute_msgmnb(struct ipc_namespa
> void msg_init_ns(struct ipc_namespace *ns)
> {
> ns->msg_ctlmax = MSGMAX;
> + ns->msg_ctlmnb_activated = true;
> + ns->msg_ctlmni_activated = true;
> recompute_msgmnb(ns);
>
> recompute_msgmni(ns);
> Index: b/ipc/ipc_sysctl.c
> ===================================================================
> --- a/ipc/ipc_sysctl.c
> +++ b/ipc/ipc_sysctl.c
> @@ -33,18 +33,42 @@ static void *get_ipc(ctl_table *table)
> * add/remove or ipc namespace creation/removal.
> * They can come back to a recomputable state by being set to a <0 value.
> */
> -static void tunable_set_callback(int val)
> +static void tunable_set_callback(int val, ctl_table *table)
> {
> - if (val >= 0)
> - unregister_ipcns_notifier(current->nsproxy->ipc_ns);
> - else {
> + int tunable = table->ctl_name;
> +
> + if (val >= 0) {
> + switch (tunable) {
> + case KERN_MSGMNB:
> + current->nsproxy->ipc_ns->msg_ctlmnb_activated = false;
> + break;
> + case KERN_MSGMNI:
> + current->nsproxy->ipc_ns->msg_ctlmni_activated = false;
> + break;
> + default:
> + printk(KERN_ERR "ipc: unexpected value %s\n",
> + table->procname);
> + break;
> + }
> + } else {
> /*
> * Re-enable automatic recomputing only if not already
> * enabled.
> */
> - recompute_msgmnb(current->nsproxy->ipc_ns);
> - recompute_msgmni(current->nsproxy->ipc_ns);
> - cond_register_ipcns_notifier(current->nsproxy->ipc_ns);
> + switch (tunable) {
> + case KERN_MSGMNB:
> + current->nsproxy->ipc_ns->msg_ctlmnb_activated = true;
> + recompute_msgmnb(current->nsproxy->ipc_ns);
> + /* fall through */
You shouldn't be falling through here: if you do that, re-enablng msgmnb
will re-enable msgmni too.
> + case KERN_MSGMNI:
> + current->nsproxy->ipc_ns->msg_ctlmni_activated = true;
> + recompute_msgmni(current->nsproxy->ipc_ns);
> + break;
> + default:
> + printk(KERN_ERR "ipc: unexpected value %s\n",
> + table->procname);
> + break;
> + }
> }
> }
>
> @@ -72,7 +96,8 @@ static int proc_ipc_callback_dointvec(ct
> rc = proc_dointvec(&ipc_table, write, filp, buffer, lenp, ppos);
>
> if (write && !rc && lenp_bef == *lenp)
> - tunable_set_callback(*((int *)(ipc_table.data)));
> + BUG_ON(table == NULL);
> + tunable_set_callback(*((int *)(ipc_table.data)), table);
>
> return rc;
> }
> @@ -148,8 +173,8 @@ static int sysctl_ipc_registered_data(ct
> * Tunable has successfully been changed from userland
> */
> int *data = get_ipc(table);
> -
> - tunable_set_callback(*data);
> + BUG_ON(table == NULL);
> + tunable_set_callback(*data, table);
> }
>
> return rc;
> Index: b/ipc/ipcns_notifier.c
> ===================================================================
> --- a/ipc/ipcns_notifier.c
> +++ b/ipc/ipcns_notifier.c
> @@ -65,15 +65,6 @@ int register_ipcns_notifier(struct ipc_n
> return blocking_notifier_chain_register(&ipcns_chain, &ns->ipcns_nb);
> }
>
> -int cond_register_ipcns_notifier(struct ipc_namespace *ns)
> -{
> - memset(&ns->ipcns_nb, 0, sizeof(ns->ipcns_nb));
> - ns->ipcns_nb.notifier_call = ipcns_callback;
> - ns->ipcns_nb.priority = IPCNS_CALLBACK_PRI;
> - return blocking_notifier_chain_cond_register(&ipcns_chain,
> - &ns->ipcns_nb);
> -}
> -
> int unregister_ipcns_notifier(struct ipc_namespace *ns)
> {
> return blocking_notifier_chain_unregister(&ipcns_chain,
>
Doing this, we are completly loosing the benefits of the notification
chains: since the the notifier blocks remain registered + we are
unconditionally adding a test at the top of each recompute routine. But
the other choice would hve been to define another notifier chain
dedicated to msgmnb. I'm not convinced about what is the best solution?
Regards,
Nadia
next prev parent reply other threads:[~2008-06-10 7:05 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-06 6:09 [RFC -mm 0/6] sysv ipc: scale msgmnb with the number of cpus Solofo.Ramangalahy
2008-06-06 6:09 ` [RFC -mm 1/6] sysv ipc: scale msgmnb to " Solofo.Ramangalahy
2008-06-06 6:09 ` [RFC -mm 2/6] sysv ipc: recompute msgmnb (and msgmni) on cpu hotplug addition and removal Solofo.Ramangalahy
2008-06-06 6:09 ` [RFC -mm 3/6] sysv ipc: do not recompute msgmni anymore if explicitely set by user Solofo.Ramangalahy
2008-06-06 6:09 ` [RFC -mm 4/6] sysv ipc: re-enable msgmnb automatic recomputing if set to negative Solofo.Ramangalahy
2008-06-06 6:10 ` [RFC -mm 5/6] sysv ipc: deconnect msgmnb and msgmni deactivation and reactivation Solofo.Ramangalahy
2008-06-10 7:05 ` Nadia Derbey [this message]
2008-06-06 6:10 ` [RFC -mm 6/6] sysv ipc: documentation for msgmnb scaling wrt. cpus Solofo.Ramangalahy
2008-06-06 8:23 ` [RFC -mm 0/6] sysv ipc: scale msgmnb with the number of cpus Nick Piggin
2008-06-06 10:20 ` Solofo.Ramangalahy
2008-06-10 6:56 ` Nadia Derbey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=484E27C9.6030106@bull.net \
--to=nadia.derbey@bull.net \
--cc=Solofo.Ramangalahy@bull.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox