Source-Changes-HG archive

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

[src/trunk]: src/sys Create a new sysv_ipc module to contain the SYSVSHM, SYS...



details:   https://anonhg.NetBSD.org/src/rev/c66011dffc76
branches:  trunk
changeset: 808299:c66011dffc76
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Wed May 13 02:06:25 2015 +0000

description:
Create a new sysv_ipc module to contain the SYSVSHM, SYSVSEM, and
SYSVMSG options.  Move associated variables out of param.c and into
the module's source file.

diffstat:

 sys/conf/param.c              |    6 +-
 sys/kern/sysv_ipc.c           |  196 +++++++++++++++++++++++++++++++++++++++--
 sys/modules/sysv_ipc/Makefile |   13 ++
 3 files changed, 203 insertions(+), 12 deletions(-)

diffs (279 lines):

diff -r 0af1ca3e681f -r c66011dffc76 sys/conf/param.c
--- a/sys/conf/param.c  Wed May 13 01:23:10 2015 +0000
+++ b/sys/conf/param.c  Wed May 13 02:06:25 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: param.c,v 1.64 2012/06/09 02:31:14 christos Exp $      */
+/*     $NetBSD: param.c,v 1.65 2015/05/13 02:06:25 pgoyette Exp $      */
 
 /*
  * Copyright (c) 1980, 1986, 1989 Regents of the University of California.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: param.c,v 1.64 2012/06/09 02:31:14 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: param.c,v 1.65 2015/05/13 02:06:25 pgoyette Exp $");
 
 #include "opt_hz.h"
 #include "opt_rtc_offset.h"
@@ -148,6 +148,7 @@
 #endif
 int    mcllowat = MCLLOWAT;
 
+#if XXX_PRG
 /*
  * Values in support of System V compatible shared memory.     XXX
  */
@@ -208,6 +209,7 @@
        MSGSEG          /* number of message segments */
 };
 #endif
+#endif /* XXX_PRG */
 
 /*
  * Actual network mbuf sizes (read-only), for netstat.
diff -r 0af1ca3e681f -r c66011dffc76 sys/kern/sysv_ipc.c
--- a/sys/kern/sysv_ipc.c       Wed May 13 01:23:10 2015 +0000
+++ b/sys/kern/sysv_ipc.c       Wed May 13 02:06:25 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sysv_ipc.c,v 1.27 2015/05/13 01:23:10 pgoyette Exp $   */
+/*     $NetBSD: sysv_ipc.c,v 1.28 2015/05/13 02:06:25 pgoyette Exp $   */
 
 /*-
  * Copyright (c) 1998, 2007 The NetBSD Foundation, Inc.
@@ -30,10 +30,15 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysv_ipc.c,v 1.27 2015/05/13 01:23:10 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysv_ipc.c,v 1.28 2015/05/13 02:06:25 pgoyette Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_sysv.h"
-#include "opt_compat_netbsd.h"
+#endif
+
+#include <sys/syscall.h>
+#include <sys/syscallargs.h>
+#include <sys/syscallvar.h>
 #include <sys/param.h>
 #include <sys/kernel.h>
 #include <sys/proc.h>
@@ -49,22 +54,193 @@
 #endif
 #include <sys/systm.h>
 #include <sys/kmem.h>
+#include <sys/module.h>
 #include <sys/mount.h>
 #include <sys/vnode.h>
 #include <sys/stat.h>
 #include <sys/sysctl.h>
 #include <sys/kauth.h>
 
-#ifdef COMPAT_50
-#include <compat/sys/ipc.h>
+static int (*kern_sysvipc50_sysctl_p)(SYSCTLFN_ARGS);
+
+/*
+ * Values in support of System V compatible shared memory.     XXX
+ * (originally located in sys/conf/param.c)
+ */
+#ifdef SYSVSHM
+#if !defined(SHMMAX) && defined(SHMMAXPGS)
+#define        SHMMAX  SHMMAXPGS       /* shminit() performs a `*= PAGE_SIZE' */
+#elif !defined(SHMMAX)
+#define SHMMAX 0
+#endif
+#ifndef        SHMMIN
+#define        SHMMIN  1
+#endif
+#ifndef        SHMMNI
+#define        SHMMNI  128             /* <64k, see IPCID_TO_IX in ipc.h */
+#endif
+#ifndef        SHMSEG
+#define        SHMSEG  128
+#endif
+
+struct shminfo shminfo = {
+       SHMMAX,
+       SHMMIN,
+       SHMMNI,
+       SHMSEG,
+       0
+};
+#endif
+
+/*
+ * Values in support of System V compatible semaphores.
+ */
+#ifdef SYSVSEM
+struct seminfo seminfo = {
+       SEMMAP,         /* # of entries in semaphore map */
+       SEMMNI,         /* # of semaphore identifiers */
+       SEMMNS,         /* # of semaphores in system */
+       SEMMNU,         /* # of undo structures in system */
+       SEMMSL,         /* max # of semaphores per id */
+       SEMOPM,         /* max # of operations per semop call */
+       SEMUME,         /* max # of undo entries per process */
+       SEMUSZ,         /* size in bytes of undo structure */
+       SEMVMX,         /* semaphore maximum value */
+       SEMAEM          /* adjust on exit max value */
+};
+#endif
+
+/*
+ * Values in support of System V compatible messages.
+ */
+#ifdef SYSVMSG
+struct msginfo msginfo = {
+       MSGMAX,         /* max chars in a message */
+       MSGMNI,         /* # of message queue identifiers */
+       MSGMNB,         /* max chars in a queue */
+       MSGTQL,         /* max messages in system */
+       MSGSSZ,         /* size of a message segment */
+                       /* (must be small power of 2 greater than 4) */
+       MSGSEG          /* number of message segments */
+};
+#endif
+
+MODULE(MODULE_CLASS_EXEC, sysv_ipc, NULL);
+ 
+#ifdef _MODULE
+SYSCTL_SETUP_PROTO(sysctl_ipc_setup);
+SYSCTL_SETUP_PROTO(sysctl_ipc_shm_setup);
+SYSCTL_SETUP_PROTO(sysctl_ipc_sem_setup);
+SYSCTL_SETUP_PROTO(sysctl_ipc_msg_setup);
+
+static struct sysctllog *sysctl_sysvipc_clog = NULL;
 #endif
 
-static int (*kern_sysvipc50_sysctl_p)(SYSCTLFN_ARGS)
-#ifdef COMPAT_50
-               = sysctl_kern_sysvipc50;
-#else
-               = NULL;
+static const struct syscall_package sysvipc_syscalls[] = {
+       { SYS___shmctl50, 0, (sy_call_t *)sys___shmctl50 },
+       { SYS_shmat, 0, (sy_call_t *)sys_shmat },
+       { SYS_shmdt, 0, (sy_call_t *)sys_shmdt },
+       { SYS_shmget, 0, (sy_call_t *)sys_shmget },
+       { SYS_____semctl50, 0, (sy_call_t *)sys_____semctl50 },
+       { SYS_semget, 0, (sy_call_t *)sys_semget },
+       { SYS_semop, 0, (sy_call_t *)sys_semop },
+       { SYS_semconfig, 0, (sy_call_t *)sys_semconfig },
+       { SYS___msgctl50, 0, (sy_call_t *)sys___msgctl50 },
+       { SYS_msgget, 0, (sy_call_t *)sys_msgget },
+       { SYS_msgsnd, 0, (sy_call_t *)sys_msgsnd },
+       { SYS_msgrcv, 0, (sy_call_t *)sys_msgrcv },
+       { 0, 0, NULL }
+};
+
+static int
+sysv_ipc_modcmd(modcmd_t cmd, void *arg)
+{
+       int error = 0;
+
+       switch (cmd) {
+       case MODULE_CMD_INIT:
+               /* Link the system calls */
+               error = syscall_establish(NULL, sysvipc_syscalls);
+
+               /* Initialize all sysctl sub-trees */
+#ifdef _MODULE
+               sysctl_ipc_setup(&sysctl_sysvipc_clog);
+#ifdef SYSVMSG
+               sysctl_ipc_msg_setup(&sysctl_sysvipc_clog);
+#endif
+#ifdef SYSVSHM
+               sysctl_ipc_shm_setup(&sysctl_sysvipc_clog);
+#endif
+#ifdef SYSVSEM
+               sysctl_ipc_sem_setup(&sysctl_sysvipc_clog);
+#endif
+               /* Assume no compat sysctl routine for now */
+               kern_sysvipc50_sysctl_p = NULL;
+
+               /* Initialize each sub-component */
+#ifdef SYSVSHM
+               shminit();
+#endif
+#ifdef SYSVSEM
+               seminit();
+#endif
+#ifdef SYSVMSG
+               msginit();
 #endif
+#endif /* _MODULE */
+               break;
+       case MODULE_CMD_FINI:
+               /*
+                * Make sure no subcomponents are active.  Each one
+                * tells us if it is busy, and if it was _not_ busy,
+                * we assume it has already done its own clean-up.
+                * So we might need to re-init any components that
+                * are successfully fini'd if we find one that is 
+                * still busy.
+                */
+#ifdef SYSVSHM
+               if (shmfini()) {
+                       return EBUSY;
+               }
+#endif
+#ifdef SYSVSEM
+               if (semfini()) {
+#ifdef SYSVSHM
+                       shminit();
+#endif
+                       return EBUSY;
+               }
+#endif
+#ifdef SYSVMSG
+               if (msgfini()) {
+#ifdef SYSVSEM
+                       seminit();
+#endif
+#ifdef SYSVSHM
+                       shminit();
+#endif
+                       return EBUSY;
+               }
+#endif
+
+               /* Unlink the system calls. */
+               error = syscall_disestablish(NULL, sysvipc_syscalls);
+               if (error)
+                       return error;
+
+#ifdef _MODULE
+               /* Remove the sysctl sub-trees */
+               sysctl_teardown(&sysctl_sysvipc_clog);
+#endif  
+
+               /* Remove the kauth listener */
+               sysvipcfini();
+               break;
+       default:
+               return ENOTTY;
+       }
+       return error;
+}
 
 void
 sysvipc50_set_compat_sysctl(int (*compat_sysctl)(SYSCTLFN_PROTO))
diff -r 0af1ca3e681f -r c66011dffc76 sys/modules/sysv_ipc/Makefile
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/modules/sysv_ipc/Makefile     Wed May 13 02:06:25 2015 +0000
@@ -0,0 +1,13 @@
+# $NetBSD: Makefile,v 1.1 2015/05/13 02:06:25 pgoyette Exp $
+
+.include "../Makefile.inc"
+
+.PATH: ${S}/kern
+
+KMOD=  sysv_ipc
+
+CPPFLAGS+=     -DSYSVSEM -DSYSVSHM -DSYSVMSG
+
+SRCS=  sysv_ipc.c sysv_msg.c sysv_sem.c sysv_shm.c
+
+.include <bsd.kmodule.mk>



Home | Main Index | Thread Index | Old Index