public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
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);





      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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox