Module Name: src Committed By: pooka Date: Fri Jan 14 13:11:08 UTC 2011
Modified Files: src/sys/rump/include/rump: rumpuser.h src/sys/rump/librump/rumpkern: signals.c Log Message: Support SIGMODEL_RAISE for non-local clients. To generate a diff of this commit: cvs rdiff -u -r1.62 -r1.63 src/sys/rump/include/rump/rumpuser.h cvs rdiff -u -r1.6 -r1.7 src/sys/rump/librump/rumpkern/signals.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/rump/include/rump/rumpuser.h diff -u src/sys/rump/include/rump/rumpuser.h:1.62 src/sys/rump/include/rump/rumpuser.h:1.63 --- src/sys/rump/include/rump/rumpuser.h:1.62 Wed Jan 12 12:51:47 2011 +++ src/sys/rump/include/rump/rumpuser.h Fri Jan 14 13:11:08 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.h,v 1.62 2011/01/12 12:51:47 pooka Exp $ */ +/* $NetBSD: rumpuser.h,v 1.63 2011/01/14 13:11:08 pooka Exp $ */ /* * Copyright (c) 2007 Antti Kantee. All Rights Reserved. @@ -36,7 +36,7 @@ #include <stdint.h> #endif -#define RUMPUSER_VERSION 9 +#define RUMPUSER_VERSION 10 int rumpuser_getversion(void); int rumpuser_daemonize_begin(void); @@ -229,6 +229,7 @@ int rumpuser_sp_copyout(void *, const void *, void *, size_t); int rumpuser_sp_copyoutstr(void *, const void *, void *, size_t *); int rumpuser_sp_anonmmap(void *, size_t, void **); +int rumpuser_sp_raise(void *, int); void rumpuser_sp_fini(void); #endif /* _RUMP_RUMPUSER_H_ */ Index: src/sys/rump/librump/rumpkern/signals.c diff -u src/sys/rump/librump/rumpkern/signals.c:1.6 src/sys/rump/librump/rumpkern/signals.c:1.7 --- src/sys/rump/librump/rumpkern/signals.c:1.6 Sat Jan 8 14:01:04 2011 +++ src/sys/rump/librump/rumpkern/signals.c Fri Jan 14 13:11:08 2011 @@ -1,7 +1,7 @@ -/* $NetBSD: signals.c,v 1.6 2011/01/08 14:01:04 pooka Exp $ */ +/* $NetBSD: signals.c,v 1.7 2011/01/14 13:11:08 pooka Exp $ */ -/* - * Copyright (c) 2010 Antti Kantee. All Rights Reserved. +/*- + * Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: signals.c,v 1.6 2011/01/08 14:01:04 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: signals.c,v 1.7 2011/01/14 13:11:08 pooka Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -37,6 +37,7 @@ #include <rump/rump.h> #include <rump/rumpuser.h> +#include "rump_private.h" #include "rumpkern_if_priv.h" const struct filterops sig_filtops = { @@ -45,10 +46,24 @@ sigset_t sigcantmask; +static void +pgrp_apply(struct pgrp *pgrp, int signo, void (*apply)(struct proc *p, int)) +{ + struct proc *p; + + KASSERT(mutex_owned(proc_lock)); + + LIST_FOREACH(p, &pgrp->pg_members, p_pglist) { + mutex_enter(p->p_lock); + apply(p, signo); + mutex_exit(p->p_lock); + } +} + /* RUMP_SIGMODEL_PANIC */ static void -rumpsig_panic(pid_t target, int signo) +rumpsig_panic(struct proc *p, int signo) { switch (signo) { @@ -63,7 +78,7 @@ /* RUMP_SIGMODEL_IGNORE */ static void -rumpsig_ignore(pid_t target, int signo) +rumpsig_ignore(struct proc *p, int signo) { return; @@ -72,57 +87,39 @@ /* RUMP_SIGMODEL_HOST */ static void -rumpsig_host(pid_t target, int signo) +rumpsig_host(struct proc *p, int signo) { int error; - rumpuser_kill(target, signo, &error); + rumpuser_kill(p->p_pid, signo, &error); } /* RUMP_SIGMODEL_RAISE */ static void -rumpsig_raise(pid_t target, int signo) +rumpsig_raise(struct proc *p, int signo) { - int error; + int error = 0; - rumpuser_kill(RUMPUSER_PID_SELF, signo, &error); + if (RUMP_LOCALPROC_P(p)) { + rumpuser_kill(RUMPUSER_PID_SELF, signo, &error); + } else { + rumpuser_sp_raise(p->p_vmspace->vm_map.pmap, signo); + } } static void -rumpsig_record(pid_t target, int sig) +rumpsig_record(struct proc *p, int signo) { - struct proc *p = NULL; - struct pgrp *pgrp = NULL; - - /* well this is a little silly */ - mutex_enter(proc_lock); - if (target >= 0) - p = proc_find_raw(target); - else - pgrp = pgrp_find(target); - if (p) { - mutex_enter(p->p_lock); - if (!sigismember(&p->p_sigctx.ps_sigignore, sig)) { - sigaddset(&p->p_sigpend.sp_set, sig); - } - mutex_exit(p->p_lock); - } else if (pgrp) { - LIST_FOREACH(p, &pgrp->pg_members, p_pglist) { - mutex_enter(p->p_lock); - if (!sigismember(&p->p_sigctx.ps_sigignore, sig)) { - sigaddset(&p->p_sigpend.sp_set, sig); - } - mutex_exit(p->p_lock); - } + if (!sigismember(&p->p_sigctx.ps_sigignore, signo)) { + sigaddset(&p->p_sigpend.sp_set, signo); } - mutex_exit(proc_lock); } -typedef void (*rumpsig_fn)(pid_t pid, int sig); +typedef void (*rumpsig_fn)(struct proc *, int); -rumpsig_fn rumpsig = rumpsig_panic; +static rumpsig_fn rumpsig = rumpsig_panic; /* * Set signal delivery model. It would be nice if we could @@ -160,28 +157,28 @@ psignal(struct proc *p, int sig) { - rumpsig(p->p_pid, sig); + rumpsig(p, sig); } void pgsignal(struct pgrp *pgrp, int sig, int checktty) { - rumpsig(-pgrp->pg_id, sig); + pgrp_apply(pgrp, sig, rumpsig); } void kpsignal(struct proc *p, ksiginfo_t *ksi, void *data) { - rumpsig(p->p_pid, ksi->ksi_signo); + rumpsig(p, ksi->ksi_signo); } void kpgsignal(struct pgrp *pgrp, ksiginfo_t *ksi, void *data, int checkctty) { - rumpsig(-pgrp->pg_id, ksi->ksi_signo); + pgrp_apply(pgrp, ksi->ksi_signo, rumpsig); } int