]> Zhao Yanbai Git Server - minix.git/commitdiff
Annotations and tweaks for live update 64/3164/1
authorDavid van Moolenbroek <david@minix3.org>
Mon, 10 Aug 2015 16:06:10 +0000 (18:06 +0200)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 17 Sep 2015 17:13:38 +0000 (17:13 +0000)
This change is necessary for instrumentation-aided state transfer.

Change-Id: I24be938009f02e302a15083f9a7a11824975e42b

14 files changed:
minix/fs/pfs/pfs.c
minix/fs/procfs/service.c
minix/lib/libminixfs/cache.c
minix/lib/libvtreefs/inode.h
minix/servers/pm/mproc.h
minix/servers/rs/exec.c
minix/servers/rs/glo.h
minix/servers/rs/main.c
minix/servers/vfs/exec.c
minix/servers/vfs/glo.h
minix/servers/vfs/main.c
minix/servers/vm/glo.h
minix/servers/vm/main.c
sys/lib/libsa/subr_prf.c

index 1ff8977cde89b55561b427c29f7765ad23ea612a..0a5b0ca082cdf73109fd0cdde6fe570a3d5eec47 100644 (file)
@@ -198,8 +198,10 @@ pfs_putnode(ino_t ino_nr, unsigned int count)
                return EINVAL;
 
        /* For pipes, free the inode data buffer. */
-       if (rip->i_data != NULL)
+       if (rip->i_data != NULL) {
                free(rip->i_data);
+               rip->i_data = NULL;
+       }
 
        /* Return the inode to the free list. */
        rip->i_free = TRUE;
index a76bf31080390be63718f500a33f01a0e6b99ad9..bd695e1dd82778b51e78deb344aa65ade68de95e 100644 (file)
@@ -19,10 +19,11 @@ struct policies {
        enum policy supported;
 };
 
-static struct {
+typedef struct {
        struct rproc proc[NR_SYS_PROCS];
        struct rprocpub pub[NR_SYS_PROCS];
-} rproc;
+} ixfer_rproc_t;
+static ixfer_rproc_t rproc;
 
 static struct policies policies[NR_SYS_PROCS];
 
index ffb7aadc59ac5f31603664d62953282cba4663b8..b54b800af32dd843627a1085d87f5c5f616632dd 100644 (file)
@@ -66,6 +66,8 @@ static fsblkcnt_t fs_btotal = 0, fs_bused = 0;
 
 static int quiet = 0;
 
+typedef struct buf *noxfer_buf_ptr_t; /* annotation for temporary buf ptrs */
+
 void lmfs_setquiet(int q) { quiet = q; }
 
 static int fs_bufs_heuristic(int minbufs, fsblkcnt_t btotal,
@@ -988,7 +990,7 @@ void lmfs_readahead(dev_t dev, block64_t base_block, unsigned int nblocks,
  * However, the caller must also not rely on all or even any of the blocks to
  * be present in the cache afterwards--failures are (deliberately!) ignored.
  */
-  static struct buf *bufq[LMFS_MAX_PREFETCH]; /* static because of size only */
+  static noxfer_buf_ptr_t bufq[LMFS_MAX_PREFETCH]; /* static for size only */
   struct buf *bp;
   unsigned int count;
   int r;
@@ -1131,7 +1133,7 @@ void lmfs_flushdev(dev_t dev)
 /* Flush all dirty blocks for one device. */
 
   register struct buf *bp;
-  static struct buf **dirty;
+  static noxfer_buf_ptr_t *dirty;
   static unsigned int dirtylistsize = 0;
   unsigned int ndirty;
 
index 3340cca322cb9c3dedbc8e2bf5e5eaf3e7da9cd7..d8c84cd6636c699253cade013d92fd8bbfc93e45 100644 (file)
@@ -1,6 +1,13 @@
 #ifndef _VTREEFS_INODE_H
 #define _VTREEFS_INODE_H
 
+/*
+ * Callback data can be a pointer or a (cast) integer value.  For now, we
+ * instruct the state transfer framework that it should translate only
+ * recognized pointers.
+ */
+typedef cbdata_t cixfer_cbdata_t;
+
 /*
  * The inodes that are active, form a fully connected tree.  Each node except
  * the root node has a parent and a tail queue of children, where each child
@@ -27,7 +34,7 @@ struct inode {
        unsigned int i_count;           /* reference count */
        index_t i_index;                /* index number in parent / NO_INDEX */
        int i_indexed;                  /* number of indexed entries */
-       cbdata_t i_cbdata;              /* callback data */
+       cixfer_cbdata_t i_cbdata;       /* callback data */
        unsigned short i_flags;         /* I_DELETED or 0 */
 
        /* Tree structure */
index b99a54cfb3302d2e21ab99551d2735c9bbe7d5e2..aadc3466fa7ea757d28854da2d1d130fad5e2077 100644 (file)
@@ -13,6 +13,8 @@
 /* Needs to be included here, for 'ps' etc */
 #include "const.h"
 
+typedef struct sigaction ixfer_sigaction;
+
 EXTERN struct mproc {
   char mp_exitstatus;          /* storage for status when process exits */
   char mp_sigstatus;           /* storage for signal # for killed procs */
@@ -45,7 +47,7 @@ EXTERN struct mproc {
   sigset_t mp_sigpending;      /* pending signals to be handled */
   sigset_t mp_ksigpending;     /* bitmap for pending signals from the kernel */
   sigset_t mp_sigtrace;                /* signals to hand to tracer first */
-  struct sigaction mp_sigact[_NSIG]; /* as in sigaction(2) */
+  ixfer_sigaction mp_sigact[_NSIG]; /* as in sigaction(2) */
 #ifdef __ACK__
   char mp_padding[60];         /* align structure with new libc */
 #endif
index 1e2c75d91ab65b782aeb8255190edcdd39ec200f..feb3df4dcdf4efd0d300a7f79384297b95cfe55b 100644 (file)
@@ -19,6 +19,8 @@ static struct exec_loaders {
        { NULL }
 };
 
+extern struct minix_kerninfo *_minix_kerninfo;
+
 int srv_execve(int proc_e, char *exec, size_t exec_len, char **argv,
        char **envp)
 {
@@ -73,7 +75,7 @@ static int do_exec(int proc_e, char *exec, size_t exec_len, char *progname,
 
        memset(&execi, 0, sizeof(execi));
 
-       execi.stack_high = kinfo.user_sp;
+       execi.stack_high = _minix_kerninfo->kinfo->user_sp;
        execi.stack_size = DEFAULT_STACK_LIMIT;
        execi.proc_e = proc_e;
        execi.hdr = exec;
index 938e55f97a1c8366abb2671ab87a1b6ac49576d5..da65c1efa6e61f455b6175bb97e1cd11b996b597 100644 (file)
@@ -54,7 +54,5 @@ EXTERN unsigned system_hz;
 
 EXTERN struct machine machine;         /* machine info */
 
-EXTERN struct kinfo kinfo;     /* kernel information */
-
 #endif /* RS_GLO_H */
 
index 28e491b8df6e1a8e091af2a5509c805f9006070c..5805b9fc29d2e32247a8610aa3a78f7bbb088f64 100644 (file)
@@ -53,9 +53,6 @@ int main(void)
   if (OK != (s=sys_getmachine(&machine)))
          panic("couldn't get machine info: %d", s);
 
-  if (OK != (s=sys_getkinfo(&kinfo)))
-         panic("couldn't get kernel kinfo: %d", s);
-
   /* Main loop - get work and do it, forever. */         
   while (TRUE) {              
       /* Perform sensitive background operations when RS is idle. */
index 1eef3821dbd33861f5fbe0ce23602d5bd77e14a5..90e19c057ce7af9eda9027281d555e163192cd8d 100644 (file)
@@ -82,6 +82,8 @@ static const struct exec_loaders exec_loaders[] = {
 #define lock_exec() lock_proc(fproc_addr(VM_PROC_NR))
 #define unlock_exec() unlock_proc(fproc_addr(VM_PROC_NR))
 
+extern struct minix_kerninfo *_minix_kerninfo;
+
 /*===========================================================================*
  *                             get_read_vp                                  *
  *===========================================================================*/
@@ -213,7 +215,7 @@ int pm_exec(vir_bytes path, size_t path_len, vir_bytes frame, size_t frame_len,
 
   /* passed from exec() libc code */
   execi.userflags = 0;
-  execi.args.stack_high = kinfo.user_sp;
+  execi.args.stack_high = _minix_kerninfo->kinfo->user_sp;
   execi.args.stack_size = DEFAULT_STACK_LIMIT;
 
   fp->text_size = 0;
index 3fbdb05eab1afafe36b4a4b362a2eea38f1631f8..6be3b66e98e2eac73dbb4ac02c214b06b6fb92a9 100644 (file)
@@ -43,6 +43,4 @@ EXTERN int err_code;          /* temporary storage for error number */
 /* Data initialized elsewhere. */
 extern int (* const call_vec[])(void);
 
-EXTERN struct kinfo kinfo;     /* kernel information */
-
 #endif
index c8036c8300f7ba688518acfe1bc61e0f27fd7ccf..68db53b6e708a928cfb1074ae8dfa6e97a47c61f 100644 (file)
@@ -65,9 +65,6 @@ int main(void)
 
   printf("Started VFS: %d worker thread(s)\n", NR_WTHREADS);
 
-  if (OK != (sys_getkinfo(&kinfo)))
-       panic("couldn't get kernel kinfo");
-
   /* This is the main loop that gets work, processes it, and sends replies. */
   while (TRUE) {
        yield_all();    /* let other threads run */
index d808aa213d392cf90f88ab992b9d5a02b498281d..e5fa4541bec634bf5a624316d8b44f12c539bdfd 100644 (file)
@@ -1,3 +1,5 @@
+#ifndef _VM_GLO_H
+#define _VM_GLO_H
 
 #include <minix/sys_config.h>
 #include <minix/type.h>
@@ -19,7 +21,8 @@ EXTERN struct vmproc vmproc[VMP_NR];
 
 long enable_filemap;
 
-EXTERN kinfo_t kernel_boot_info;
+typedef kinfo_t ixfer_kinfo_t;
+EXTERN ixfer_kinfo_t kernel_boot_info;
 
 #if SANITYCHECKS
 EXTERN int nocheck;
@@ -41,3 +44,5 @@ EXTERN  mem_type_t mem_type_anon,       /* anonymous memory */
 /* total number of memory pages */
 EXTERN int total_pages;
 EXTERN int num_vm_instances;
+
+#endif /* !_VM_GLO_H */
index b25a1320f2d4def14a4b39df442258863fc192ef..b6b305698ff138dfdc1a9ed65f26172f167d3e5a 100644 (file)
@@ -262,7 +262,7 @@ static int sef_cb_init_fresh(int type, sef_init_info_t *info)
 
 static struct vmproc *init_proc(endpoint_t ep_nr)
 {
-       static struct boot_image *ip;
+       struct boot_image *ip;
 
        for (ip = &kernel_boot_info.boot_procs[0];
                ip < &kernel_boot_info.boot_procs[NR_BOOT_PROCS]; ip++) {
@@ -429,7 +429,7 @@ void init_vm(void)
 {
        int s, i;
        static struct memory mem_chunks[NR_MEMS];
-       static struct boot_image *ip;
+       struct boot_image *ip;
        extern void __minix_init(void);
        multiboot_module_t *mod;
        vir_bytes kern_dyn, kern_static;
index d6fc0defc2bb60d877f98a14194be57b83058377..b43b61146923f64c61fad452c28de207b340385b 100644 (file)
@@ -174,6 +174,9 @@ vsnprintf(char *buf, size_t size, const char *fmt, va_list ap)
        if (sbuf){ /* handle case where sbuf == NULL */
                *sbuf = '\0';
        }
+#if defined(_MINIX_MAGIC)
+       sbuf = ebuf = NULL; /* leave no dangling pointers */
+#endif
        return scount;
 #else /* __minix is not defined */
        *sbuf = '\0';