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>

Reply via email to