Module Name: src
Committed By: rmind
Date: Sun Jul 19 02:50:45 UTC 2009
Modified Files:
src/distrib/sets/lists/base: module.mi
src/sys/arch/i386/conf: GENERIC MONOLITHIC
src/sys/kern: init_main.c kern_stub.c sys_mqueue.c syscalls.master
src/sys/modules: Makefile
src/sys/sys: mqueue.h
Added Files:
src/sys/modules/mqueue: Makefile
Log Message:
Make POSIX message queues a kernel module.
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/distrib/sets/lists/base/module.mi
cvs rdiff -u -r1.935 -r1.936 src/sys/arch/i386/conf/GENERIC
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/i386/conf/MONOLITHIC
cvs rdiff -u -r1.392 -r1.393 src/sys/kern/init_main.c
cvs rdiff -u -r1.18 -r1.19 src/sys/kern/kern_stub.c
cvs rdiff -u -r1.23 -r1.24 src/sys/kern/sys_mqueue.c
cvs rdiff -u -r1.227 -r1.228 src/sys/kern/syscalls.master
cvs rdiff -u -r1.30 -r1.31 src/sys/modules/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/modules/mqueue/Makefile
cvs rdiff -u -r1.9 -r1.10 src/sys/sys/mqueue.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/base/module.mi
diff -u src/distrib/sets/lists/base/module.mi:1.9 src/distrib/sets/lists/base/module.mi:1.10
--- src/distrib/sets/lists/base/module.mi:1.9 Sat Jul 18 21:32:52 2009
+++ src/distrib/sets/lists/base/module.mi Sun Jul 19 02:50:44 2009
@@ -1,4 +1,4 @@
-# $NetBSD: module.mi,v 1.9 2009/07/18 21:32:52 reinoud Exp $
+# $NetBSD: module.mi,v 1.10 2009/07/19 02:50:44 rmind Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -57,6 +57,8 @@
./@MODULEDIR@/mfs/mfs.kmod base-kernel-modules
./@MODULEDIR@/miniroot base-kernel-modules
./@MODULEDIR@/miniroot/miniroot.kmod base-kernel-modules
+./@MODULEDIR@/mqueue base-kernel-modules
+./@MODULEDIR@/mqueue/mqueue.kmod base-kernel-modules
./@MODULEDIR@/msdos base-kernel-modules
./@MODULEDIR@/msdos/msdos.kmod base-kernel-modules
./@MODULEDIR@/nfs base-kernel-modules
Index: src/sys/arch/i386/conf/GENERIC
diff -u src/sys/arch/i386/conf/GENERIC:1.935 src/sys/arch/i386/conf/GENERIC:1.936
--- src/sys/arch/i386/conf/GENERIC:1.935 Sat Jul 18 16:31:42 2009
+++ src/sys/arch/i386/conf/GENERIC Sun Jul 19 02:50:44 2009
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.935 2009/07/18 16:31:42 reinoud Exp $
+# $NetBSD: GENERIC,v 1.936 2009/07/19 02:50:44 rmind Exp $
#
# GENERIC machine description file
#
@@ -22,7 +22,7 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.935 $"
+#ident "GENERIC-$Revision: 1.936 $"
maxusers 64 # estimated number of users
@@ -97,7 +97,8 @@
options SYSVSEM # System V-like semaphores
options SYSVSHM # System V-like memory sharing
#options P1003_1B_SEMAPHORE # p1003.1b semaphore support
-no options AIO # POSIX AIO, built as a module
+no options AIO # POSIX asynchronous I/O, built as a module
+no options MQUEUE # POSIX messsage queues, built as a module
options MODULAR # new style module framework
Index: src/sys/arch/i386/conf/MONOLITHIC
diff -u src/sys/arch/i386/conf/MONOLITHIC:1.7 src/sys/arch/i386/conf/MONOLITHIC:1.8
--- src/sys/arch/i386/conf/MONOLITHIC:1.7 Sun Mar 29 17:06:01 2009
+++ src/sys/arch/i386/conf/MONOLITHIC Sun Jul 19 02:50:44 2009
@@ -11,7 +11,8 @@
options COREDUMP
options P1003_1B_SEMAPHORE # p1003.1b semaphore support
-options AIO # POSIX AIO, built as a module
+options AIO # POSIX asynchronous I/O, built as a module
+options MQUEUE # POSIX messsage queues, built as a module
options COMPAT_OSSAUDIO # OSS (Voxware) audio driver compatibility
options COMPAT_SVR4 # binary compatibility with SVR4
Index: src/sys/kern/init_main.c
diff -u src/sys/kern/init_main.c:1.392 src/sys/kern/init_main.c:1.393
--- src/sys/kern/init_main.c:1.392 Fri Jul 17 23:31:51 2009
+++ src/sys/kern/init_main.c Sun Jul 19 02:50:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: init_main.c,v 1.392 2009/07/17 23:31:51 ad Exp $ */
+/* $NetBSD: init_main.c,v 1.393 2009/07/19 02:50:44 rmind Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.392 2009/07/17 23:31:51 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.393 2009/07/19 02:50:44 rmind Exp $");
#include "opt_ddb.h"
#include "opt_ipsec.h"
@@ -159,7 +159,6 @@
#include <sys/uuid.h>
#include <sys/extent.h>
#include <sys/disk.h>
-#include <sys/mqueue.h>
#include <sys/msgbuf.h>
#include <sys/module.h>
#include <sys/event.h>
@@ -430,9 +429,6 @@
/* Initialize kqueue. */
kqueue_init();
- /* Initialize message queues. */
- mqueue_sysinit();
-
/* Initialize the system monitor subsystems. */
#if NSYSMON_TASKQ > 0
sysmon_task_queue_preinit();
Index: src/sys/kern/kern_stub.c
diff -u src/sys/kern/kern_stub.c:1.18 src/sys/kern/kern_stub.c:1.19
--- src/sys/kern/kern_stub.c:1.18 Fri Feb 13 22:41:04 2009
+++ src/sys/kern/kern_stub.c Sun Jul 19 02:50:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_stub.c,v 1.18 2009/02/13 22:41:04 apb Exp $ */
+/* $NetBSD: kern_stub.c,v 1.19 2009/07/19 02:50:44 rmind Exp $ */
/*-
* Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_stub.c,v 1.18 2009/02/13 22:41:04 apb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_stub.c,v 1.19 2009/07/19 02:50:44 rmind Exp $");
#include "opt_ptrace.h"
#include "opt_ktrace.h"
@@ -205,6 +205,16 @@
{ SYS___aio_suspend50, "aio" },
{ SYS_aio_write, "aio" },
{ SYS_lio_listio, "aio" },
+ { SYS_mq_open, "mqueue" },
+ { SYS_mq_close, "mqueue" },
+ { SYS_mq_unlink, "mqueue" },
+ { SYS_mq_getattr, "mqueue" },
+ { SYS_mq_setattr, "mqueue" },
+ { SYS_mq_notify, "mqueue" },
+ { SYS_mq_send, "mqueue" },
+ { SYS_mq_receive, "mqueue" },
+ { SYS___mq_timedsend50, "mqueue" },
+ { SYS___mq_timedreceive50, "mqueue" },
{ SYS_compat_43_fstat43, "compat" },
{ SYS_compat_43_lstat43, "compat" },
{ SYS_compat_43_oaccept, "compat" },
Index: src/sys/kern/sys_mqueue.c
diff -u src/sys/kern/sys_mqueue.c:1.23 src/sys/kern/sys_mqueue.c:1.24
--- src/sys/kern/sys_mqueue.c:1.23 Sun Jul 19 02:26:49 2009
+++ src/sys/kern/sys_mqueue.c Sun Jul 19 02:50:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_mqueue.c,v 1.23 2009/07/19 02:26:49 rmind Exp $ */
+/* $NetBSD: sys_mqueue.c,v 1.24 2009/07/19 02:50:44 rmind Exp $ */
/*
* Copyright (c) 2007-2009 Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.23 2009/07/19 02:26:49 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.24 2009/07/19 02:50:44 rmind Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -56,6 +56,7 @@
#include <sys/kmem.h>
#include <sys/lwp.h>
#include <sys/mqueue.h>
+#include <sys/module.h>
#include <sys/mutex.h>
#include <sys/pool.h>
#include <sys/poll.h>
@@ -66,16 +67,19 @@
#include <sys/signalvar.h>
#include <sys/stat.h>
#include <sys/sysctl.h>
+#include <sys/syscall.h>
+#include <sys/syscallvar.h>
#include <sys/syscallargs.h>
#include <sys/systm.h>
#include <sys/unistd.h>
#include <miscfs/genfs/genfs.h>
+MODULE(MODULE_CLASS_MISC, mqueue, NULL);
+
/* System-wide limits. */
static u_int mq_open_max = MQ_OPEN_MAX;
static u_int mq_prio_max = MQ_PRIO_MAX;
-
static u_int mq_max_msgsize = 16 * MQ_DEF_MSGSIZE;
static u_int mq_def_maxmsg = 32;
@@ -83,6 +87,8 @@
static pool_cache_t mqmsg_cache;
static LIST_HEAD(, mqueue) mqueue_head;
+static int mqueue_sysinit(void);
+static int mqueue_sysfini(bool);
static int mq_poll_fop(file_t *, int);
static int mq_stat_fop(file_t *, struct stat *);
static int mq_close_fop(file_t *);
@@ -99,17 +105,86 @@
.fo_drain = fnullop_drain,
};
+static const struct syscall_package mqueue_syscalls[] = {
+ { SYS_mq_open, 0, (sy_call_t *)sys_mq_open },
+ { SYS_mq_close, 0, (sy_call_t *)sys_mq_close },
+ { SYS_mq_unlink, 0, (sy_call_t *)sys_mq_unlink },
+ { SYS_mq_getattr, 0, (sy_call_t *)sys_mq_getattr },
+ { SYS_mq_setattr, 0, (sy_call_t *)sys_mq_setattr },
+ { SYS_mq_notify, 0, (sy_call_t *)sys_mq_notify },
+ { SYS_mq_send, 0, (sy_call_t *)sys_mq_send },
+ { SYS_mq_receive, 0, (sy_call_t *)sys_mq_receive },
+ { SYS___mq_timedsend50, 0, (sy_call_t *)sys___mq_timedsend50 },
+ { SYS___mq_timedreceive50, 0, (sy_call_t *)sys___mq_timedreceive50 },
+ { 0, 0, NULL }
+};
+
/*
- * Initialize POSIX message queue subsystem.
+ * Initialisation and unloading of POSIX message queue subsystem.
*/
-void
+
+static int
mqueue_sysinit(void)
{
+ int error;
mqmsg_cache = pool_cache_init(MQ_DEF_MSGSIZE, coherency_unit,
0, 0, "mqmsgpl", NULL, IPL_NONE, NULL, NULL, NULL);
mutex_init(&mqlist_mtx, MUTEX_DEFAULT, IPL_NONE);
LIST_INIT(&mqueue_head);
+
+ error = syscall_establish(NULL, mqueue_syscalls);
+ if (error) {
+ (void)mqueue_sysfini(false);
+ }
+ return error;
+}
+
+static int
+mqueue_sysfini(bool interface)
+{
+
+ if (interface) {
+ int error;
+ bool inuse;
+
+ /* Stop syscall activity. */
+ error = syscall_disestablish(NULL, mqueue_syscalls);
+ if (error)
+ return error;
+ /*
+ * Check if there are any message queues in use.
+ * TODO: We shall support forced unload.
+ */
+ mutex_enter(&mqlist_mtx);
+ inuse = !LIST_EMPTY(&mqueue_head);
+ mutex_exit(&mqlist_mtx);
+ if (inuse) {
+ error = syscall_establish(NULL, mqueue_syscalls);
+ KASSERT(error == 0);
+ return EBUSY;
+ }
+ }
+ mutex_destroy(&mqlist_mtx);
+ pool_cache_destroy(mqmsg_cache);
+ return 0;
+}
+
+/*
+ * Module interface.
+ */
+static int
+mqueue_modcmd(modcmd_t cmd, void *arg)
+{
+
+ switch (cmd) {
+ case MODULE_CMD_INIT:
+ return mqueue_sysinit();
+ case MODULE_CMD_FINI:
+ return mqueue_sysfini(true);
+ default:
+ return ENOTTY;
+ }
}
/*
Index: src/sys/kern/syscalls.master
diff -u src/sys/kern/syscalls.master:1.227 src/sys/kern/syscalls.master:1.228
--- src/sys/kern/syscalls.master:1.227 Fri May 15 15:51:27 2009
+++ src/sys/kern/syscalls.master Sun Jul 19 02:50:44 2009
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.227 2009/05/15 15:51:27 pooka Exp $
+ $NetBSD: syscalls.master,v 1.228 2009/07/19 02:50:44 rmind Exp $
; @(#)syscalls.master 8.2 (Berkeley) 1/13/94
@@ -501,20 +501,20 @@
unsigned int *value); }
255 STD MODULAR { int|sys||_ksem_destroy(intptr_t id); }
256 UNIMPL sys__ksem_timedwait
-257 STD { mqd_t|sys||mq_open(const char * name, int oflag, \
+257 STD MODULAR { mqd_t|sys||mq_open(const char * name, int oflag, \
mode_t mode, struct mq_attr *attr); }
-258 STD { int|sys||mq_close(mqd_t mqdes); }
-259 STD { int|sys||mq_unlink(const char *name); }
-260 STD { int|sys||mq_getattr(mqd_t mqdes, \
+258 STD MODULAR { int|sys||mq_close(mqd_t mqdes); }
+259 STD MODULAR { int|sys||mq_unlink(const char *name); }
+260 STD MODULAR { int|sys||mq_getattr(mqd_t mqdes, \
struct mq_attr *mqstat); }
-261 STD { int|sys||mq_setattr(mqd_t mqdes, \
+261 STD MODULAR { int|sys||mq_setattr(mqd_t mqdes, \
const struct mq_attr *mqstat, \
struct mq_attr *omqstat); }
-262 STD { int|sys||mq_notify(mqd_t mqdes, \
+262 STD MODULAR { int|sys||mq_notify(mqd_t mqdes, \
const struct sigevent *notification); }
-263 STD { int|sys||mq_send(mqd_t mqdes, const char *msg_ptr, \
+263 STD MODULAR { int|sys||mq_send(mqd_t mqdes, const char *msg_ptr, \
size_t msg_len, unsigned msg_prio); }
-264 STD { ssize_t|sys||mq_receive(mqd_t mqdes, char *msg_ptr, \
+264 STD MODULAR { ssize_t|sys||mq_receive(mqd_t mqdes, char *msg_ptr, \
size_t msg_len, unsigned *msg_prio); }
265 COMPAT_50 MODULAR { int|sys||mq_timedsend(mqd_t mqdes, \
const char *msg_ptr, size_t msg_len, \
@@ -835,11 +835,11 @@
431 STD { int|sys|50|__sigtimedwait(const sigset_t *set, \
siginfo_t *info, \
struct timespec *timeout); }
-432 STD { int|sys|50|mq_timedsend(mqd_t mqdes, \
+432 STD MODULAR { int|sys|50|mq_timedsend(mqd_t mqdes, \
const char *msg_ptr, size_t msg_len, \
unsigned msg_prio, \
const struct timespec *abs_timeout); }
-433 STD { ssize_t|sys|50|mq_timedreceive(mqd_t mqdes, \
+433 STD MODULAR { ssize_t|sys|50|mq_timedreceive(mqd_t mqdes, \
char *msg_ptr, size_t msg_len, unsigned *msg_prio, \
const struct timespec *abs_timeout); }
434 STD { int|sys|50|_lwp_park(const struct timespec *ts, \
Index: src/sys/modules/Makefile
diff -u src/sys/modules/Makefile:1.30 src/sys/modules/Makefile:1.31
--- src/sys/modules/Makefile:1.30 Sat Jul 18 16:31:42 2009
+++ src/sys/modules/Makefile Sun Jul 19 02:50:44 2009
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.30 2009/07/18 16:31:42 reinoud Exp $
+# $NetBSD: Makefile,v 1.31 2009/07/19 02:50:44 rmind Exp $
# For all platforms
@@ -25,6 +25,7 @@
SUBDIR+= layerfs
SUBDIR+= lfs
SUBDIR+= mfs
+SUBDIR+= mqueue
SUBDIR+= msdos
SUBDIR+= nfs
SUBDIR+= nfsserver
Index: src/sys/sys/mqueue.h
diff -u src/sys/sys/mqueue.h:1.9 src/sys/sys/mqueue.h:1.10
--- src/sys/sys/mqueue.h:1.9 Sun Jul 19 02:26:49 2009
+++ src/sys/sys/mqueue.h Sun Jul 19 02:50:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: mqueue.h,v 1.9 2009/07/19 02:26:49 rmind Exp $ */
+/* $NetBSD: mqueue.h,v 1.10 2009/07/19 02:50:44 rmind Exp $ */
/*
* Copyright (c) 2007-2009 Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -108,7 +108,6 @@
};
/* Prototypes */
-void mqueue_sysinit(void);
void mqueue_print_list(void (*pr)(const char *, ...));
int abstimeout2timo(struct timespec *, int *);
int mq_send1(lwp_t *, mqd_t, const char *, size_t, unsigned, int);
Added files:
Index: src/sys/modules/mqueue/Makefile
diff -u /dev/null src/sys/modules/mqueue/Makefile:1.1
--- /dev/null Sun Jul 19 02:50:45 2009
+++ src/sys/modules/mqueue/Makefile Sun Jul 19 02:50:44 2009
@@ -0,0 +1,10 @@
+# $NetBSD: Makefile,v 1.1 2009/07/19 02:50:44 rmind Exp $
+#
+.include "../Makefile.inc"
+
+.PATH: ${S}/kern
+
+KMOD= mqueue
+SRCS= sys_mqueue.c
+
+.include <bsd.kmodule.mk>