From: Jay Lan <jlan@engr.sgi.com>
To: Badari Pulavarty <pbadari@us.ibm.com>
Cc: guillaume.thouvenin@bull.net, akpm@osdl.org,
linux-kernel@vger.kernel.org, erikj@sgi.com,
John Hesterberg <jh@sgi.com>
Subject: Re: exit notifier for 2.6.12-mm2
Date: Fri, 01 Jul 2005 18:24:01 -0700 [thread overview]
Message-ID: <42C5ECB1.1050608@engr.sgi.com> (raw)
In-Reply-To: <1120150372.13376.136.camel@dyn9047017102.beaverton.ibm.com>
CSA needs a hook at do_exit(), but this patch does not fit our needs.
1) the exit_connector() is invoked too earlier. Accounting data are
updated later in the do_exit() routine.
--> acct_update_integrals(tsk);
--> update_mem_hiwater(tsk);
group_dead = atomic_dec_and_test(&tsk->signal->live);
if (group_dead)
--> acct_process(code); <--- BSD accounting hook here
exit_mm(tsk);
The exit_connector() should be at least after exit_mm(tsk) to be
useful for accounting packages.
2) The hook should allow CSA to do a little processing, similar to the
BSD hook. In current design, both BSD and CSA write to disk file of
accounting data from the kernel. If there is a plan to move that
function to user space, we need to send the data to user land.
Sending the accounting data through the connector remains just
an idea AFAIK. I am not comfortable with built-in unreliable
delivery in connector to trust serious system accounting data
to this machnism. And we could fail in allocating memory for
the data at exit time also.
I would be interested in knowing who need this patch and how they
are going to use this patch.
Thanks,
- jay
Badari Pulavarty wrote:
> Hi,
>
> Here is the patch to add exit-notifier to the current connector
> infrastructure in -mm tree. Its directly derived from Guillaume's
> fork notifier.
>
> BTW, I have no direct need for it, heard that few people wanted it.
>
> Thanks,
> Badari
>
>
>
>
> ------------------------------------------------------------------------
>
> diff -Narup -X /usr/src/dontdiff linux-2.6.12/drivers/connector/Kconfig linux-2.6.12.exit/drivers/connector/Kconfig
> --- linux-2.6.12/drivers/connector/Kconfig 2005-06-29 16:29:03.000000000 -0700
> +++ linux-2.6.12.exit/drivers/connector/Kconfig 2005-06-29 15:44:39.000000000 -0700
> @@ -21,4 +21,14 @@ config FORK_CONNECTOR
> The fork connector can be enable/disable by sending a message to the
> connector with the corresponding group id.
>
> +config EXIT_CONNECTOR
> + bool "Enable exit connector"
> + select CONNECTOR
> + default y
> + ---help---
> + It adds a connector in kernel/exit.c:do_exit() function. When a exit
> + occurs, netlink is used to transfer information about the process and
> + its parent. This information can be used by a user space application.
> + The exit connector can be enable/disable by sending a message to the
> + connector with the corresponding group id.
> endmenu
> diff -Narup -X /usr/src/dontdiff linux-2.6.12/drivers/connector/Makefile linux-2.6.12.exit/drivers/connector/Makefile
> --- linux-2.6.12/drivers/connector/Makefile 2005-06-29 16:29:03.000000000 -0700
> +++ linux-2.6.12.exit/drivers/connector/Makefile 2005-06-29 15:44:59.000000000 -0700
> @@ -1,3 +1,4 @@
> obj-$(CONFIG_CONNECTOR) += cn.o
> obj-$(CONFIG_FORK_CONNECTOR) += cn_fork.o
> +obj-$(CONFIG_EXIT_CONNECTOR) += cn_exit.o
> cn-objs := cn_queue.o connector.o
> diff -Narup -X /usr/src/dontdiff linux-2.6.12/drivers/connector/cn_exit.c linux-2.6.12.exit/drivers/connector/cn_exit.c
> --- linux-2.6.12/drivers/connector/cn_exit.c 1969-12-31 16:00:00.000000000 -0800
> +++ linux-2.6.12.exit/drivers/connector/cn_exit.c 2005-06-29 16:23:05.000000000 -0700
> @@ -0,0 +1,166 @@
> +/*
> + * cn_exit.c - Exit connector
> + *
> + * Copyright (C) 2005 IBM Corporation
> + * Author: Badari Pulavarty <pbadari@us.ibm.com>
> + *
> + * derived from connector/cn_fork.c - Copyright (C) 2005 BULL SA.
> + *
> + * This module implements the exit connector. It allows to send a
> + * netlink datagram, when enabled, from the do_exit() routine. The
> + * message can be read by a user space application. By this way,
> + * the user space application is alerted when a exit occurs.
> + *
> + * It uses the userspace <-> kernelspace connector that works on top of
> + * the netlink protocol. The exit connector is enabled or disabled by
> + * sending a message to the connector. The unique sequence number of
> + * messages can be used to check if a message is lost.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + */
> +
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +
> +#include <linux/cn_exit.h>
> +
> +#define CN_EXIT_INFO_SIZE sizeof(struct cn_exit_msg)
> +#define CN_EXIT_MSG_SIZE (sizeof(struct cn_msg) + CN_EXIT_INFO_SIZE)
> +
> +static int cn_exit_enable = 0;
> +struct cb_id cb_exit_id = { CN_IDX_EXIT, CN_VAL_EXIT };
> +
> +/* exit_counts is used as the sequence number of the netlink message */
> +static DEFINE_PER_CPU(unsigned long, exit_counts);
> +
> +/**
> + * exit_connector - send information about exit through a connector
> + * @pid: Process ID
> + * @ptid: Process thread ID
> + * @code: Process exit code
> + *
> + * It sends information to a user space application through the
> + * connector when a new process is created.
> + */
> +void exit_connector(pid_t pid, pid_t ptid, long code)
> +{
> + if (cn_exit_enable) {
> + struct cn_msg *msg;
> + struct cn_exit_msg *exitmsg;
> + __u8 buffer[CN_EXIT_MSG_SIZE];
> +
> + msg = (struct cn_msg *)buffer;
> +
> + memcpy(&msg->id, &cb_exit_id, sizeof(msg->id));
> +
> + msg->ack = 0; /* not used */
> + msg->seq = get_cpu_var(exit_counts)++;
> +
> + msg->len = CN_EXIT_INFO_SIZE;
> + exitmsg = (struct cn_exit_msg *)msg->data;
> + exitmsg->type = EXIT_CN_MSG_P;
> + exitmsg->cpu = smp_processor_id();
> + exitmsg->u.s.pid = pid;
> + exitmsg->u.s.ptid = ptid;
> + exitmsg->u.s.code = code;
> +
> + put_cpu_var(exit_counts);
> +
> + /* If cn_netlink_send() failed, the data is not send */
> + cn_netlink_send(msg, CN_IDX_EXIT, GFP_KERNEL);
> + }
> +}
> +
> +/**
> + * cn_exit_send_status - send a message with the status
> + *
> + * It sends information about the status of the exit connector
> + * to a user space application through the connector. The status
> + * is stored in the global variable "cn_exit_enable".
> + */
> +static inline void cn_exit_send_status(void)
> +{
> + struct cn_msg *msg;
> + struct cn_exit_msg *exitmsg;
> + __u8 buffer[CN_EXIT_MSG_SIZE];
> +
> + msg = (struct cn_msg *)buffer;
> +
> + memcpy(&msg->id, &cb_exit_id, sizeof(msg->id));
> +
> + msg->ack = 0; /* not used */
> + msg->seq = 0; /* not used */
> +
> + msg->len = CN_EXIT_INFO_SIZE;
> + exitmsg = (struct cn_exit_msg *)msg->data;
> + exitmsg->type = EXIT_CN_MSG_S;
> + exitmsg->u.status = cn_exit_enable;
> +
> + cn_netlink_send(msg, CN_IDX_EXIT, GFP_KERNEL);
> +}
> +
> +/**
> + * cn_exit_callback - enable or disable the exit connector
> + * @data: message send by the connector
> + *
> + * The callback allows to enable or disable the sending of information
> + * about exit in the do_exit() routine. To enable the exit, the user
> + * space application must send the integer 1 in the data part of the
> + * message. To disable the exit connector, it must send the integer 0.
> + */
> +static void cn_exit_callback(void *data)
> +{
> + struct cn_msg *msg = data;
> + int action;
> +
> + if (cn_already_initialized && (msg->len == sizeof(cn_exit_enable))) {
> + memcpy(&action, msg->data, sizeof(cn_exit_enable));
> + switch (action) {
> + case EXIT_CN_START:
> + cn_exit_enable = 1;
> + break;
> + case EXIT_CN_STOP:
> + cn_exit_enable = 0;
> + break;
> + case EXIT_CN_STATUS:
> + cn_exit_send_status();
> + break;
> + }
> + }
> +}
> +
> +/**
> + * cn_exit_init - initialization entry point
> + *
> + * This routine will be run at kernel boot time because this driver is
> + * built in the kernel. It adds the connector callback to the connector
> + * driver.
> + */
> +int __init cn_exit_init(void)
> +{
> + int err;
> +
> + err = cn_add_callback(&cb_exit_id, "cn_exit", &cn_exit_callback);
> + if (err) {
> + printk(KERN_WARNING "Failed to register cn_exit\n");
> + return -EINVAL;
> + }
> +
> + printk(KERN_NOTICE "cn_exit is registered\n");
> + return 0;
> +}
> +
> +__initcall(cn_exit_init);
> diff -Narup -X /usr/src/dontdiff linux-2.6.12/include/linux/cn_exit.h linux-2.6.12.exit/include/linux/cn_exit.h
> --- linux-2.6.12/include/linux/cn_exit.h 1969-12-31 16:00:00.000000000 -0800
> +++ linux-2.6.12.exit/include/linux/cn_exit.h 2005-06-29 16:30:46.000000000 -0700
> @@ -0,0 +1,65 @@
> +/*
> + * cn_exit.h - Exit connector
> + *
> + * Copyright (C) 2005 IBM Corporation
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + */
> +
> +#ifndef CN_EXIT_H
> +#define CN_EXIT_H
> +
> +#include <linux/types.h>
> +#include <linux/connector.h>
> +
> +#define EXIT_CN_STOP 0
> +#define EXIT_CN_START 1
> +#define EXIT_CN_STATUS 2
> +
> +#define EXIT_CN_MSG_P 0 /* Message about processes */
> +#define EXIT_CN_MSG_S 1 /* Message about exit connector's state */
> +
> +/*
> + * The exit connector sends information to a user-space
> + * application. From the user's point of view, the process
> + * ID is the thread group ID and thread ID is the internal
> + * kernel "pid". So, fields are assigned as follow:
> + */
> +struct cn_exit_msg {
> + int type; /* 0: information about processes
> + 1: exit connector's state */
> + int cpu; /* ID of the cpu where the exit occurred */
> + union {
> + struct {
> + pid_t pid; /* process ID */
> + pid_t ptid; /* process thread ID */
> + pid_t code; /* process exit code */
> + } s;
> + int status;
> + } u;
> +};
> +
> +/* Code above is only inside the kernel */
> +#ifdef __KERNEL__
> +#ifdef CONFIG_EXIT_CONNECTOR
> +extern void exit_connector(pid_t pid, pid_t ptid, long code);
> +#else
> +static inline void exit_connector(pid_t ppid, pid_t ptid, long code)
> +{
> + return;
> +}
> +#endif /* CONFIG_EXIT_CONNECTOR */
> +#endif /* __KERNEL__ */
> +#endif /* CN_EXIT_H */
> diff -Narup -X /usr/src/dontdiff linux-2.6.12/include/linux/connector.h linux-2.6.12.exit/include/linux/connector.h
> --- linux-2.6.12/include/linux/connector.h 2005-06-29 16:29:07.000000000 -0700
> +++ linux-2.6.12.exit/include/linux/connector.h 2005-06-29 16:03:19.000000000 -0700
> @@ -29,6 +29,9 @@
> #define CN_IDX_FORK 0xfeed /* fork events */
> #define CN_VAL_FORK 0xbeef
>
> +#define CN_IDX_EXIT 0xfeec /* exit events */
> +#define CN_VAL_EXIT 0xceef
> +
> /*
> * Maximum connector's message size.
> */
> diff -Narup -X /usr/src/dontdiff linux-2.6.12/kernel/exit.c linux-2.6.12.exit/kernel/exit.c
> --- linux-2.6.12/kernel/exit.c 2005-06-29 16:29:07.000000000 -0700
> +++ linux-2.6.12.exit/kernel/exit.c 2005-06-29 16:07:50.000000000 -0700
> @@ -803,6 +803,7 @@ fastcall NORET_TYPE void do_exit(long co
> if (tsk->io_context)
> exit_io_context();
>
> + exit_connector(tsk->tgid, tsk->pid, code);
> if (unlikely(current->ptrace & PT_TRACE_EXIT)) {
> current->ptrace_message = code;
> ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP);
prev parent reply other threads:[~2005-07-02 1:26 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-06-30 16:52 exit notifier for 2.6.12-mm2 Badari Pulavarty
2005-07-02 1:24 ` Jay Lan [this message]
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=42C5ECB1.1050608@engr.sgi.com \
--to=jlan@engr.sgi.com \
--cc=akpm@osdl.org \
--cc=erikj@sgi.com \
--cc=guillaume.thouvenin@bull.net \
--cc=jh@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pbadari@us.ibm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.