]> Zhao Yanbai Git Server - minix.git/commitdiff
vm/ipc: only report signals when it matters to ipc
authorBen Gras <ben@minix3.org>
Thu, 4 Aug 2011 23:52:03 +0000 (23:52 +0000)
committerBen Gras <ben@minix3.org>
Fri, 5 Aug 2011 20:52:32 +0000 (20:52 +0000)
. ipc wants to know about processes that get
  signals, so that it can break blocking ipc operations
. doing it for every single signal is wasteful
  and causes the annoying 'no slot for signals' message
. this fix tells vm on a per-process basis it (ipc)
  wants to be notified, i.e. only when it does any ipc calls
. move ipc config to separate config file while we're at it

12 files changed:
commands/service/service.c
common/include/minix/com.h
common/include/minix/vm.h
etc/system.conf
lib/libc/other/_vm_query_exit.c
servers/ipc/Makefile
servers/ipc/ipc.conf [new file with mode: 0644]
servers/ipc/main.c
servers/vm/main.c
servers/vm/proto.h
servers/vm/queryexit.c
servers/vm/vmproc.h

index 0eab47002944808902ff39993603f49815479360..68314c8f6c066e116071d6609994dc0a49a9cded 100644 (file)
@@ -1074,6 +1074,7 @@ struct
        { "GETREF",             VM_GETREF },
        { "RS_SET_PRIV",        VM_RS_SET_PRIV },
        { "QUERY_EXIT",         VM_QUERY_EXIT },
+       { "WATCH_EXIT",         VM_WATCH_EXIT },
        { "NOTIFY_SIG",         VM_NOTIFY_SIG },
        { "INFO",               VM_INFO },
        { "RS_UPDATE",          VM_RS_UPDATE },
index 342bd0ba1deab899865812a14a7f5439307ae3e1..25ee69a56763543faf1472589c26fce1c652d92f 100644 (file)
 #              define VM_RS_MEM_PIN        0   /* pin memory */
 #              define VM_RS_MEM_MAKE_VM    1   /* make VM instance */
 
+#define VM_WATCH_EXIT          (VM_RQ_BASE+43)
+#      define VM_WE_EP         m1_i1
+
 /* Total. */
-#define NR_VM_CALLS                            43
+#define NR_VM_CALLS                            44
 #define VM_CALL_MASK_SIZE                      BITMAP_CHUNKS(NR_VM_CALLS)
 
 /* not handled as a normal VM call, thus at the end of the reserved rage */
index 63bc3592596b6629fa01ddadadf08e1cee30f906..6ce0d5c7e5654a8ec963eaabdcadcefc2725b4da 100644 (file)
@@ -26,7 +26,8 @@ _PROTOTYPE( int vm_notify_sig, (endpoint_t ep, endpoint_t ipc_ep));
 _PROTOTYPE( int vm_set_priv, (int procnr, void *buf));
 _PROTOTYPE( int vm_update, (endpoint_t src_e, endpoint_t dst_e));
 _PROTOTYPE( int vm_memctl, (endpoint_t ep, int req));
-_PROTOTYPE( int vm_query_exit, (int *endpt));
+_PROTOTYPE( int vm_query_exit, (endpoint_t *endpt));
+_PROTOTYPE( int vm_watch_exit, (endpoint_t ep));
 _PROTOTYPE( int vm_forgetblock, (u64_t id));
 _PROTOTYPE( void vm_forgetblocks, (void));
 _PROTOTYPE( int vm_yield_block_get_block, (u64_t yieldid, u64_t getid,
index d620d08739be632e8ef53853e27506f201e73945..655fe27396afc98d9af4f21768eb34f9f7a6cbc9 100644 (file)
@@ -520,25 +520,6 @@ service amddev
        uid     0;
 };
 
-service ipc
-{
-       system
-               UMAP            # 14
-               VIRCOPY         # 15
-               ;
-       uid     0;
-       ipc
-               SYSTEM USER pm rs log tty ds vm
-               ;
-       vm
-               REMAP
-               SHM_UNMAP
-               GETPHYS
-               GETREF
-               QUERY_EXIT
-               ;
-};
-
 service osscore
 {
        system
index c6e85f17cccac090ee499fe5870f7e3b5e3de5d1..6d07617ef89d6e571e07c34161a8c03974911cea 100644 (file)
@@ -22,3 +22,14 @@ PUBLIC int vm_query_exit(int *endpt)
        *endpt = m.VM_QUERY_RET_PT;
        return (m.VM_QUERY_IS_MORE ? 1 : 0);
 }
+
+PUBLIC int vm_watch_exit(endpoint_t ep)
+{
+       message m;
+       int r;
+
+       memset(&m, 0, sizeof(m));
+       m.VM_WE_EP = ep;
+       return _syscall(VM_PROC_NR, VM_WATCH_EXIT, &m);
+}
+
index 89225c7d26c7fefd5d794ad064c4134bc1368f90..ccda5f1ca67d5e74fa4bafdeb3b813cd9af9d5b9 100644 (file)
@@ -8,5 +8,8 @@ LDADD+= -lsys
 MAN=
 
 BINDIR?= /usr/sbin
+FILES=ipc.conf
+FILESNAME=ipc
+FILESDIR= /etc/system.conf.d
 
 .include <minix.service.mk>
diff --git a/servers/ipc/ipc.conf b/servers/ipc/ipc.conf
new file mode 100644 (file)
index 0000000..a4cc015
--- /dev/null
@@ -0,0 +1,19 @@
+service ipc
+{
+       system
+               UMAP            # 14
+               VIRCOPY         # 15
+               ;
+       uid     0;
+       ipc
+               SYSTEM USER pm rs log tty ds vm
+               ;
+       vm
+               REMAP
+               SHM_UNMAP
+               GETPHYS
+               GETREF
+               QUERY_EXIT
+               WATCH_EXIT
+               ;
+};
index 05a72c1605bfc3c7064962cdd44d7a3e10341cba..76928ca9186fd666ef1df9be8e29c4ab219aba28 100644 (file)
@@ -64,6 +64,14 @@ PUBLIC int main(int argc, char *argv[])
 
                /* dispatch messages */
                for (i = 0; i < SIZE(ipc_calls); i++) {
+                       /* If any process does an IPC call,
+                        * we have to know about it exiting.
+                        * Tell VM to watch it for us.
+                        */
+                       if(vm_watch_exit(m.m_source) != OK) {
+                               printf("IPC: watch failed on %d\n", m.m_source);
+                       }
+
                        if (ipc_calls[i].type == call_type) {
                                int result;
 
index 925eb8628baa4ae95669138e3df08639c2f3dcb7..576522319e5f465e25512919c09d1919fdd7f53c 100644 (file)
@@ -365,6 +365,7 @@ PRIVATE int sef_cb_init_fresh(int type, sef_init_info_t *info)
        CALLMAP(VM_GETREF, do_get_refcount);
        CALLMAP(VM_INFO, do_info);
        CALLMAP(VM_QUERY_EXIT, do_query_exit);
+       CALLMAP(VM_WATCH_EXIT, do_watch_exit);
        CALLMAP(VM_FORGETBLOCKS, do_forgetblocks);
        CALLMAP(VM_FORGETBLOCK, do_forgetblock);
        CALLMAP(VM_YIELDBLOCKGETBLOCK, do_yieldblockgetblock);
index 813906ec0e560e3bcf7fb9ff276cdfe63448e0e6..506e59d78e2e43f033b1e46e4808d4ca9991263b 100644 (file)
@@ -207,5 +207,6 @@ _PROTOTYPE(int do_rs_memctl, (message *m));
 
 /* queryexit.c */
 _PROTOTYPE(int do_query_exit, (message *m));
+_PROTOTYPE(int do_watch_exit, (message *m));
 _PROTOTYPE(int do_notify_sig, (message *m));
 _PROTOTYPE(void init_query_exit, (void));
index d5ae1249127d983eb50c51eee2e7d55140dbd74a..3774c793677c8fbd3bb1061a2485ea8cf27b2414 100644 (file)
@@ -67,10 +67,19 @@ PUBLIC int do_query_exit(message *m)
  *===========================================================================*/
 PUBLIC int do_notify_sig(message *m)
 {
-       int i, avails = 0;
+       int i, avails = 0, p;
        endpoint_t ep = m->VM_NOTIFY_SIG_ENDPOINT;
        endpoint_t ipc_ep = m->VM_NOTIFY_SIG_IPC;
        int r;
+       struct vmproc *vmp;
+       int pslot;
+
+       if(vm_isokendpt(ep, &pslot) != OK) return ESRCH;
+       vmp = &vmproc[pslot];
+
+       /* Only record the event if we've been asked to report it. */
+       if(!(vmp->vm_flags & VMF_WATCHEXIT))
+               return OK;
 
        for (i = 0; i < NR_PROCS; i++) {
                /* its signal is already here */
@@ -80,7 +89,7 @@ PUBLIC int do_notify_sig(message *m)
                        avails++;
        }
        if (!avails) {
-               /* no slot for signals, impossible */
+               /* no slot for signals, unlikely */
                printf("VM: no slot for signals!\n");
                return ENOMEM;
        }
@@ -106,6 +115,21 @@ out:
        return OK;
 }
 
+/*===========================================================================*
+ *                             do_watch_exit                                *
+ *===========================================================================*/
+PUBLIC int do_watch_exit(message *m)
+{
+       endpoint_t e = m->VM_WE_EP;
+       struct vmproc *vmp;
+       int p;
+       if(vm_isokendpt(e, &p) != OK) return ESRCH;
+       vmp = &vmproc[p];
+       vmp->vm_flags |= VMF_WATCHEXIT;
+
+       return OK;
+}
+
 /*===========================================================================*
  *                             init_query_exit                              *
  *===========================================================================*/
index 0b7956bb7fde7ee0e66588dc0e0a3c4d87a012ba..8dd0ed62e90b4c86e89bc7739a1aa3f3ddb5e1a8 100644 (file)
@@ -65,5 +65,6 @@ struct vmproc {
 #define VMF_HAS_DMA    0x010   /* Process directly or indirectly granted
                                 * DMA buffers.
                                 */
+#define VMF_WATCHEXIT  0x020   /* Store in queryexit table */
 
 #endif