Add signal mask save/restore to the checkpoint code. Reorder the file
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 26 Feb 2005 20:32:37 +0000 (20:32 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 26 Feb 2005 20:32:37 +0000 (20:32 +0000)
descriptor checkpointing code to accomodate future non-regular-file work.
Add a file descriptor type field to the structured data written out to the
checkpoint file for future use.

Submitted-by: "Kamal R. Prasad" <kamalpr@yahoo.com>
With-further-work-by: Matt Dillon
sys/kern/imgact_elf.c
sys/kern/kern_checkpoint.c
sys/sys/ckpt.h

index fb3d2e3..bb7ade7 100644 (file)
@@ -27,7 +27,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/imgact_elf.c,v 1.73.2.13 2002/12/28 19:49:41 dillon Exp $
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/imgact_elf.c,v 1.73.2.13 2002/12/28 19:49:41 dillon Exp $
- * $DragonFly: src/sys/kern/imgact_elf.c,v 1.24 2004/11/18 13:09:30 dillon Exp $
+ * $DragonFly: src/sys/kern/imgact_elf.c,v 1.25 2005/02/26 20:32:36 dillon Exp $
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -966,8 +966,15 @@ cb_put_fp(vm_map_entry_t entry, void *closure)
         * is mapped all over the place).  Instead we rely on the fact
         * that a checkpoint-restored program does not mmap() the checkpt
         * vnode NOCORE, so its contents will be written out to the
         * is mapped all over the place).  Instead we rely on the fact
         * that a checkpoint-restored program does not mmap() the checkpt
         * vnode NOCORE, so its contents will be written out to the
-        * checkpoint file itself.  This is necessary because the 'old'
-        * checkpoint file is typically destroyed when a new one is created.
+        * new checkpoint file.  This is necessary because the 'old'
+        * checkpoint file is typically destroyed when a new one is created
+        * and thus cannot be used to restore the new checkpoint.
+        *
+        * Theoretically we could create a chain of checkpoint files and
+        * operate the checkpointing operation kinda like an incremental
+        * checkpoint, but a checkpoint restore would then likely wind up
+        * referencing many prior checkpoint files and that is a bit over
+        * the top for the purpose of the checkpoint API.
         */
        if (entry->object.vm_object->type == OBJT_VNODE) {
                vp = (struct vnode *)entry->object.vm_object->handle;
         */
        if (entry->object.vm_object->type == OBJT_VNODE) {
                vp = (struct vnode *)entry->object.vm_object->handle;
@@ -1271,6 +1278,7 @@ elf_putsigs(struct proc *p, elf_buf_t target)
                bcopy(p->p_procsig, &csi->csi_procsig, sizeof(struct procsig));
                bcopy(p->p_procsig->ps_sigacts, &csi->csi_sigacts, sizeof(struct sigacts));
                bcopy(&p->p_realtimer, &csi->csi_itimerval, sizeof(struct itimerval));
                bcopy(p->p_procsig, &csi->csi_procsig, sizeof(struct procsig));
                bcopy(p->p_procsig->ps_sigacts, &csi->csi_sigacts, sizeof(struct sigacts));
                bcopy(&p->p_realtimer, &csi->csi_itimerval, sizeof(struct itimerval));
+               bcopy(&p->p_sigmask, &csi->csi_sigmask, sizeof(sigset_t));
                csi->csi_sigparent = p->p_sigparent;
        }
        return(error);
                csi->csi_sigparent = p->p_sigparent;
        }
        return(error);
@@ -1295,16 +1303,29 @@ elf_putfiles(struct proc *p, elf_buf_t target)
        }
 
        /*
        }
 
        /*
-        * ignore STDIN/STDERR/STDOUT
+        * ignore STDIN/STDERR/STDOUT.
         */
        for (i = 3; error == 0 && i < p->p_fd->fd_nfiles; i++) {
                if ((fp = p->p_fd->fd_ofiles[i]) == NULL)
                        continue;
         */
        for (i = 3; error == 0 && i < p->p_fd->fd_nfiles; i++) {
                if ((fp = p->p_fd->fd_ofiles[i]) == NULL)
                        continue;
+               /* 
+                * XXX Only checkpoint vnodes for now.
+                */
                if (fp->f_type != DTYPE_VNODE)
                        continue;
                if (fp->f_type != DTYPE_VNODE)
                        continue;
-               cfi = target_reserve(target, sizeof(struct ckpt_fileinfo), &error);
-               if (cfi) {
-                       cfi->cfi_index = -1;
+               cfi = target_reserve(target, sizeof(struct ckpt_fileinfo),
+                                       &error);
+               if (cfi == NULL)
+                       continue;
+               cfi->cfi_index = -1;
+               cfi->cfi_type = fp->f_type;
+               cfi->cfi_flags = fp->f_flag;
+               cfi->cfi_offset = fp->f_offset;
+               /* f_count and f_msgcount should not be saved/restored */
+               /* XXX save cred info */
+
+               switch(fp->f_type) {
+               case DTYPE_VNODE:
                        vp = (struct vnode *)fp->f_data;
                        /*
                         * it looks like a bug in ptrace is marking 
                        vp = (struct vnode *)fp->f_data;
                        /*
                         * it looks like a bug in ptrace is marking 
@@ -1313,13 +1334,14 @@ elf_putfiles(struct proc *p, elf_buf_t target)
                         * further panics from truss
                         */
                        if (vp == NULL || vp->v_mount == NULL)
                         * further panics from truss
                         */
                        if (vp == NULL || vp->v_mount == NULL)
-                               continue;
+                               break;
                        cfh->cfh_nfiles++;
                        cfi->cfi_index = i;
                        cfh->cfh_nfiles++;
                        cfi->cfi_index = i;
-                       cfi->cfi_flags = fp->f_flag;
-                       cfi->cfi_offset = fp->f_offset;
                        cfi->cfi_fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
                        error = VFS_VPTOFH(vp, &cfi->cfi_fh.fh_fid);
                        cfi->cfi_fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
                        error = VFS_VPTOFH(vp, &cfi->cfi_fh.fh_fid);
+                       break;
+               default:
+                       break;
                }
        }
        return(error);
                }
        }
        return(error);
index 8b036aa..1feb333 100644 (file)
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/kern/kern_checkpoint.c,v 1.1 2004/11/23 06:32:32 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_checkpoint.c,v 1.2 2005/02/26 20:32:36 dillon Exp $
  */
 
 #include <sys/types.h>
  */
 
 #include <sys/types.h>
@@ -248,8 +248,10 @@ ckpt_thaw_proc(struct proc *p, struct file *fp)
                goto done;
 
        /* fetch signal disposition */
                goto done;
 
        /* fetch signal disposition */
-       if ((error = elf_getsigs(p, fp)) != 0)
+       if ((error = elf_getsigs(p, fp)) != 0) {
+               printf("failure in recovering signals\n");
                goto done;
                goto done;
+       }
 
        /* fetch open files */
        if ((error = elf_getfiles(p, fp)) != 0)
 
        /* fetch open files */
        if ((error = elf_getfiles(p, fp)) != 0)
@@ -462,6 +464,8 @@ elf_getsigs(struct proc *p, struct file *fp)
        p->p_procsig->ps_sigacts = tmpsigacts;
        bcopy(&csi->csi_sigacts, p->p_procsig->ps_sigacts, sizeof(struct sigacts));
        bcopy(&csi->csi_itimerval, &p->p_realtimer, sizeof(struct itimerval));
        p->p_procsig->ps_sigacts = tmpsigacts;
        bcopy(&csi->csi_sigacts, p->p_procsig->ps_sigacts, sizeof(struct sigacts));
        bcopy(&csi->csi_itimerval, &p->p_realtimer, sizeof(struct itimerval));
+       SIG_CANTMASK(csi->csi_sigmask);
+       bcopy(&csi->csi_sigmask, &p->p_sigmask, sizeof(sigset_t));
        p->p_sigparent = csi->csi_sigparent;
  done:
        if (csi)
        p->p_sigparent = csi->csi_sigparent;
  done:
        if (csi)
@@ -597,8 +601,11 @@ elf_getfiles(struct proc *p, struct file *fp)
                goto done;
 
        /*
                goto done;
 
        /*
-        * Close all descriptors >= 3.  These descriptors are from the
+        * Close all file descriptors >= 3.  These descriptors are from the
         * checkpt(1) program itself and should not be retained.
         * checkpt(1) program itself and should not be retained.
+        *
+        * XXX we need a flag so a checkpoint restore can opt to supply the
+        * descriptors, or the non-regular-file descripors.
         */
        for (i = 3; i < p->p_fd->fd_nfiles; ++i)
                kern_close(i);
         */
        for (i = 3; i < p->p_fd->fd_nfiles; ++i)
                kern_close(i);
index cc19a52..d9ea83a 100644 (file)
@@ -22,7 +22,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/sys/ckpt.h,v 1.5 2005/02/17 14:00:09 joerg Exp $
+ * $DragonFly: src/sys/sys/ckpt.h,v 1.6 2005/02/26 20:32:37 dillon Exp $
  */
 #ifndef _SYS_CKPT_H_
 #define _SYS_CKPT_H_
  */
 #ifndef _SYS_CKPT_H_
 #define _SYS_CKPT_H_
@@ -49,7 +49,8 @@ struct ckpt_fileinfo {
        u_int           cfi_flags;      /* saved f_flag */
        off_t           cfi_offset;     /* saved f_offset */
        fhandle_t       cfi_fh;
        u_int           cfi_flags;      /* saved f_flag */
        off_t           cfi_offset;     /* saved f_offset */
        fhandle_t       cfi_fh;
-       int             cfi_reserved[8];
+       int             cfi_type;
+       int             cfi_reserved[7];
 };
 
 struct ckpt_siginfo {
 };
 
 struct ckpt_siginfo {
@@ -58,7 +59,8 @@ struct ckpt_siginfo {
        struct sigacts  csi_sigacts;
        struct itimerval csi_itimerval;
        int             csi_sigparent;
        struct sigacts  csi_sigacts;
        struct itimerval csi_itimerval;
        int             csi_sigparent;
-       int             csi_reserved[8];
+       sigset_t        csi_sigmask;
+       int             csi_reserved[6];
 };
 
 struct vn_hdr {
 };
 
 struct vn_hdr {