Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Now that SYSVSHM is modularized, reattach the linkages f...



details:   https://anonhg.NetBSD.org/src/rev/4421e75c1cd2
branches:  trunk
changeset: 341407:4421e75c1cd2
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Thu Nov 05 00:10:47 2015 +0000

description:
Now that SYSVSHM is modularized, reattach the linkages from uvm so that
we can correctly clean up on process exit or fork.

Without this, firefox attaches to a shared memory segment but doesn't
detach before exit.  Thus once firefox causes an autoload for sysv_ipc
it cannot be unloaded since the segment still retains references.

diffstat:

 sys/kern/sysv_shm.c |  12 ++++++++++--
 sys/sys/shm.h       |   5 ++++-
 sys/uvm/uvm_map.c   |  35 ++++++++++++++++++-----------------
 3 files changed, 32 insertions(+), 20 deletions(-)

diffs (148 lines):

diff -r 46d90fb4d81d -r 4421e75c1cd2 sys/kern/sysv_shm.c
--- a/sys/kern/sysv_shm.c       Thu Nov 05 00:02:59 2015 +0000
+++ b/sys/kern/sysv_shm.c       Thu Nov 05 00:10:47 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sysv_shm.c,v 1.128 2015/05/13 01:16:15 pgoyette Exp $  */
+/*     $NetBSD: sysv_shm.c,v 1.129 2015/11/05 00:10:47 pgoyette Exp $  */
 
 /*-
  * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.128 2015/05/13 01:16:15 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.129 2015/11/05 00:10:47 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_sysv.h"
@@ -990,6 +990,10 @@
 
        kern_has_sysvshm = 1;
 
+       /* Load the callback function pointers for the uvm subsystem */
+       uvm_shmexit = shmexit;
+       uvm_shmfork = shmfork;
+
        sysvipcinit();
 }
 
@@ -1006,6 +1010,10 @@
                return 1;
        }
 
+       /* Clear the callback function pointers for the uvm subsystem */
+       uvm_shmexit = NULL;
+       uvm_shmfork = NULL;
+
        /* Destroy all condvars */
        for (i = 0; i < shminfo.shmmni; i++)
                cv_destroy(&shm_cv[i]);
diff -r 46d90fb4d81d -r 4421e75c1cd2 sys/sys/shm.h
--- a/sys/sys/shm.h     Thu Nov 05 00:02:59 2015 +0000
+++ b/sys/sys/shm.h     Thu Nov 05 00:10:47 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: shm.h,v 1.49 2015/05/13 01:16:15 pgoyette Exp $        */
+/*     $NetBSD: shm.h,v 1.50 2015/11/05 00:10:48 pgoyette Exp $        */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -178,6 +178,9 @@
 void   shmexit(struct vmspace *);
 int    shmctl1(struct lwp *, int, int, struct shmid_ds *);
 
+extern void (*uvm_shmexit)(struct vmspace *);
+extern void (*uvm_shmfork)(struct vmspace *, struct vmspace *);
+
 #define SYSCTL_FILL_SHM(src, dst) do { \
        SYSCTL_FILL_PERM((src).shm_perm, (dst).shm_perm); \
        (dst).shm_segsz = (src).shm_segsz; \
diff -r 46d90fb4d81d -r 4421e75c1cd2 sys/uvm/uvm_map.c
--- a/sys/uvm/uvm_map.c Thu Nov 05 00:02:59 2015 +0000
+++ b/sys/uvm/uvm_map.c Thu Nov 05 00:10:47 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_map.c,v 1.335 2015/09/24 14:35:15 christos Exp $   */
+/*     $NetBSD: uvm_map.c,v 1.336 2015/11/05 00:10:48 pgoyette Exp $   */
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.335 2015/09/24 14:35:15 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.336 2015/11/05 00:10:48 pgoyette Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -90,9 +90,7 @@
 #include "opt_user_va0_disable_default.h"
 #endif
 
-#ifdef SYSVSHM
 #include <sys/shm.h>
-#endif
 
 #include <uvm/uvm.h>
 #include <uvm/uvm_readahead.h>
@@ -299,6 +297,15 @@
        (ROOT_ENTRY(map) == (entry) \
            ? NULL : (struct vm_map_entry *)RB_FATHER(&(entry)->rb_node))
 
+/*
+ * These get filled in if/when SYSVSHM shared memory code is loaded
+ *
+ * We do this with function pointers rather the #ifdef SYSVSHM so the
+ * SYSVSHM code can be loaded and unloaded
+ */
+void (*uvm_shmexit)(struct vmspace *) = NULL;
+void (*uvm_shmfork)(struct vmspace *, struct vmspace *) = NULL;
+
 static int
 uvm_map_compare_nodes(void *ctx, const void *nparent, const void *nkey)
 {
@@ -4071,14 +4078,11 @@
                 * vm space!
                 */
 
-#ifdef SYSVSHM
                /*
                 * SYSV SHM semantics require us to kill all segments on an exec
                 */
-
-               if (ovm->vm_shm)
-                       shmexit(ovm);
-#endif
+               if (uvm_shmexit && ovm->vm_shm)
+                       (*uvm_shmexit)(ovm);
 
                /*
                 * POSIX 1003.1b -- "lock future mappings" is revoked
@@ -4170,11 +4174,10 @@
 
        map->flags |= VM_MAP_DYING;
        pmap_remove_all(map->pmap);
-#ifdef SYSVSHM
+
        /* Get rid of any SYSV shared memory segments. */
-       if (vm->vm_shm != NULL)
-               shmexit(vm);
-#endif
+       if (uvm_shmexit && vm->vm_shm != NULL)
+               (*uvm_shmexit)(vm);
 
        if (map->nentries) {
                uvm_unmap_remove(map, vm_map_min(map), vm_map_max(map),
@@ -4456,10 +4459,8 @@
        pmap_update(old_map->pmap);
        vm_map_unlock(old_map);
 
-#ifdef SYSVSHM
-       if (vm1->vm_shm)
-               shmfork(vm1, vm2);
-#endif
+       if (uvm_shmfork && vm1->vm_shm)
+               (*uvm_shmfork)(vm1, vm2);
 
 #ifdef PMAP_FORK
        pmap_fork(vm1->vm_map.pmap, vm2->vm_map.pmap);



Home | Main Index | Thread Index | Old Index