Date: Wed, 22 May 2002 10:54:57 +0200 From: Andy Sporner <sporner@nentec.de> To: freebsd-hackers <freebsd-hackers@FreeBSD.ORG> Subject: RFC- Kernel patches for process tracking (read more in body) Message-ID: <3CEB5CE1.8050002@nentec.de>
index | next in thread | raw e-mail
Hi hackers,
I had a need to track all processes including daemons that become owned
by init that started from a process for my statistics collection function of
my clustering software.
The basic idea is to add a structure to the 'proc' structure to keep current
and future data in and to be able to set (at least today) the application ID
into this structure via a shell command using a syscall().
Please give me comments on the patches.
*** /usr/src/sys/kern/kern_fork.c.orig Thu May 10 19:54:16 2001
--- /usr/src/sys/kern/kern_fork.c Thu Jan 10 16:50:25 2002
***************
*** 362,367 ****
--- 362,369 ----
crhold(p1->p_ucred);
uihold(p1->p_cred->p_uidinfo);
+ bcopy(&p1->p_csed, &p2->p_csed, sizeof(p2->p_csed));
+
if (p2->p_prison) {
p2->p_prison->pr_ref++;
p2->p_flag |= P_JAILED;
*** /usr/src/sys/sys/proc.h.orig Thu Jan 10 16:56:13 2002
--- /usr/src/sys/sys/proc.h Thu Jan 10 17:00:22 2002
***************
*** 53,58 ****
--- 53,59 ----
#endif
#include <sys/ucred.h>
#include <sys/event.h> /* For struct klist */
+ #include <sys/cse.h>
/*
* One structure allocated per session.
***************
*** 144,149 ****
--- 145,151 ----
char p_stat; /* S* process status. */
char p_pad1[3];
+ struct csed p_csed; /* Virtual Application Descriptor */
pid_t p_pid; /* Process identifier. */
LIST_ENTRY(proc) p_hash; /* Hash chain. */
LIST_ENTRY(proc) p_pglist; /* List of processes in pgrp. */
*** /usr/src/sys/conf/files.orig Thu Jan 10 17:07:21 2002
--- /usr/src/sys/conf/files Thu Jan 10 17:07:35 2002
***************
*** 575,580 ****
--- 575,581 ----
kern/subr_scanf.c standard
kern/subr_taskqueue.c standard
kern/subr_xxx.c standard
+ kern/sys_cse.c standard
kern/sys_generic.c standard
kern/sys_pipe.c standard
kern/sys_process.c standard
*** /usr/src/sys/kern/syscalls.master.orig Thu Jan 10 17:10:01 2002
--- /usr/src/sys/kern/syscalls.master Thu Jan 10 17:10:27 2002
***************
*** 520,522 ****
--- 520,523 ----
const struct kevent *changelist, int nchanges, \
struct kevent *eventlist, int nevents, \
const struct timespec *timeout); }
+ ZZZ STD BSD { int cse_set_id(int id_num, pid_t pid); }
(NOTE 'ZZZ' changed by install script to be the next available #)
(HERE IS 'sys_cse.c')
#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/proc.h>
#include <sys/uio.h>
#include <sys/kernel.h>
#include <sys/resourcevar.h>
#include <sys/sysctl.h>
#include <sys/sysent.h>
/*
* CSE system call.
*/
#ifndef _SYS_SYSPROTO_H_
struct cse_set_id_args {
int id_num;
pid_t pid;
};
#endif
int
cse_set_id(p, uap)
struct proc *p;
register struct cse_set_id_args *uap;
{
struct proc *px;
if ((px = pfind(uap->pid)) == NULL) {
return (ESRCH);
}
px->p_csed.cse_c_id = uap->id_num;
return (0);
}
(PATCHES TO 'PS' TO MAKE USE OF THIS)
*** /usr/src/bin/ps/ps.c.orig Wed Aug 1 07:06:23 2001
--- /usr/src/bin/ps/ps.c Thu Jan 10 18:34:12 2002
***************
*** 103,109 ****
static void usage __P((void));
static uid_t *getuids(const char *, int *);
! char dfmt[] = "pid tt state time command";
char jfmt[] = "user pid ppid pgid sess jobc state tt time command";
char lfmt[] = "uid pid ppid cpu pri nice vsz rss wchan state tt time
command"; char o1[] = "pid";
--- 103,109 ----
static void usage __P((void));
static uid_t *getuids(const char *, int *);
! char dfmt[] = "pid tt vapp state time command";
char jfmt[] = "user pid ppid pgid sess jobc state tt time command";
char lfmt[] = "uid pid ppid cpu pri nice vsz rss wchan state tt time
command"; char o1[] = "pid";
*** /usr/src/bin/ps/extern.h.orig Sat Aug 28 01:14:50 1999
--- /usr/src/bin/ps/extern.h Thu Jan 10 18:34:42 2002
***************
*** 59,64 ****
--- 59,65 ----
void maxrss __P((KINFO *, VARENT *));
void nlisterr __P((struct nlist *));
void p_rssize __P((KINFO *, VARENT *));
+ void p_vapp __P((KINFO *, VARENT *));
void pagein __P((KINFO *, VARENT *));
void parsefmt __P((char *));
void pcpu __P((KINFO *, VARENT *));
*** /usr/src/bin/ps/keyword.c.orig Wed Feb 14 19:55:31 2001
--- /usr/src/bin/ps/keyword.c Thu Jan 10 18:33:40 2002
***************
*** 185,190 ****
--- 185,191 ----
{"upr", "UPR", NULL, 0, pvar, NULL, 3, POFF(p_usrpri), CHAR, "d"},
{"user", "USER", NULL, LJUST|DSIZ, uname, s_uname, USERLEN},
{"usrpri", "", "upr"},
+ {"vapp", "VAPP", NULL, 0, p_vapp, NULL, 2},
{"vsize", "", "vsz"},
{"vsz", "VSZ", NULL, 0, vsize, NULL, 5},
{"wchan", "WCHAN", NULL, LJUST, wchan, NULL, 6},
*** /usr/src/bin/ps/print.c.orig Wed Sep 20 04:16:11 2000
--- /usr/src/bin/ps/print.c Thu Jan 10 18:33:13 2002
***************
*** 48,53 ****
--- 48,54 ----
#include <sys/ucred.h>
#include <sys/user.h>
#include <sys/sysctl.h>
+ #include <sys/cse.h>
#include <vm/vm.h>
#include <err.h>
***************
*** 446,451 ****
--- 447,468 ----
v = ve->var;
(void)printf("%*ld", v->width,
(long)pgtok(KI_EPROC(k)->e_vm.vm_rssize))+ }
+
+ void
+ p_vapp(k, ve) /* doesn't account for text */
+ KINFO *k;
+ VARENT *ve;
+ {
+ VAR *v;
+ struct proc *p;
+ struct csed *c;
+
+ p = KI_PROC(k);
+ c = &p->p_csed;
+
+ v = ve->var;
+ (void)printf("%*ld", v->width, c->cse_c_id);
}
void
(USERLAND CODE)
#include <sys/types.h>
#include <sys/syscall.h>
#include <sys/signal.h>
#include <stdio.h>
#include "cse.h"
void sigsys_handler(int signum);
/*
*
* main(int argc, char **argv)
*
* parameters:
* 0 'cse'
* 1 set_id
* 2 pid
* 3 appid
*/
int main(int argc, char **argv)
{
int mon_status;
int need_flush;
signal (SIGSYS, sigsys_handler);
if (argc < 3) {
fprintf(stderr, "Insufficient parameters...\n");
exit (1);
} /* if */
if (syscall(SYS_cse_set_id, atoi(argv[3]), atoi(argv[2])) == -1) {
fprintf(stderr, "Failured to set id\n");
exit(1);
} /* if */
exit (0);
} /* main() */
void sigsys_handler(int signum)
{
fprintf(stderr, "Sorry, no kernel support for this function\n");
exit(1);
} /* sigsys_handler() */
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3CEB5CE1.8050002>
