PERFORCE change 114975 for review
Alexander Leidinger
netchild at FreeBSD.org
Sat Feb 24 16:18:29 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=114975
Change 114975 by netchild at netchild_magellan on 2007/02/24 16:18:14
- Split out the linux aio stuff into its own module.
- Let the linker find the symbols itself instead of guessing the
location.
Submitted by: Li, Xiao <intron at intron.ac>
My modifications based upon his submission:
- Some files.* + NOTES glue to be able to compile this stuff into
the kernel (the files.* stuff is underdocumented, reviews welcome).
- amd64 part
- aio compilation fixes for non-linux kernel parts
TODO:
- run test this stuff (i386 + amd64)
- review the complete linuxaio code
Affected files ...
.. //depot/projects/linuxolator/src/sys/amd64/conf/NOTES#5 edit
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux.h#19 edit
.. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_dummy.c#9 edit
.. //depot/projects/linuxolator/src/sys/amd64/linux32/syscalls.master#19 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_aio.c#11 edit
.. //depot/projects/linuxolator/src/sys/compat/linux/linux_aio.h#5 edit
.. //depot/projects/linuxolator/src/sys/conf/files.amd64#10 edit
.. //depot/projects/linuxolator/src/sys/conf/files.i386#9 edit
.. //depot/projects/linuxolator/src/sys/conf/files.pc98#7 edit
.. //depot/projects/linuxolator/src/sys/conf/options.amd64#2 edit
.. //depot/projects/linuxolator/src/sys/conf/options.i386#2 edit
.. //depot/projects/linuxolator/src/sys/conf/options.pc98#2 edit
.. //depot/projects/linuxolator/src/sys/i386/conf/NOTES#7 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/linux.h#15 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/linux_dummy.c#9 edit
.. //depot/projects/linuxolator/src/sys/i386/linux/syscalls.master#18 edit
.. //depot/projects/linuxolator/src/sys/kern/vfs_aio.c#7 edit
.. //depot/projects/linuxolator/src/sys/modules/Makefile#8 edit
.. //depot/projects/linuxolator/src/sys/modules/aio/Makefile#5 edit
.. //depot/projects/linuxolator/src/sys/modules/linux/Makefile#5 edit
.. //depot/projects/linuxolator/src/sys/modules/linuxaio/Makefile#1 add
.. //depot/projects/linuxolator/src/sys/pc98/conf/NOTES#4 edit
.. //depot/projects/linuxolator/src/sys/sys/aio.h#2 edit
Differences ...
==== //depot/projects/linuxolator/src/sys/amd64/conf/NOTES#5 (text+ko) ====
@@ -608,9 +608,12 @@
# and PSEUDOFS)
options LINPROCFS
-#Enable the linux-like sys filesystem support (requires COMPAT_LINUX32
+# Enable the linux-like sys filesystem support (requires COMPAT_LINUX32
# and PSEUDOFS)
-options LINSYSFS
+options LINSYSFS
+
+# Enable the linux aio support (requires COMPAT_LINUX32 and VFS_AIO)
+options LINUXAIO
#
# SysVR4 ABI emulation
==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux.h#19 (text+ko) ====
==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_dummy.c#9 (text+ko) ====
@@ -111,6 +111,11 @@
DUMMY(pselect6);
DUMMY(ppoll);
DUMMY(unshare);
+DUMMY(io_setup);
+DUMMY(io_destroy);
+DUMMY(io_getevents);
+DUMMY(io_submit);
+DUMMY(io_cancel);
#define DUMMY_XATTR(s) \
int \
==== //depot/projects/linuxolator/src/sys/amd64/linux32/syscalls.master#19 (text+ko) ====
==== //depot/projects/linuxolator/src/sys/compat/linux/linux_aio.c#11 (text+ko) ====
@@ -44,9 +44,6 @@
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/sx.h>
-#include <sys/linker.h>
-#include <sys/sysctl.h>
-#include <sys/syscall.h>
#include <sys/sysproto.h>
#ifdef COMPAT_LINUX32
@@ -193,13 +190,13 @@
*/
#define LINUX_AIO_LOCK(p) { \
if ((p)->p_aioinfo == NULL) \
- p_aio_init_aioinfo(p); \
+ aio_init_aioinfo(p); \
mtx_lock((struct mtx *)((p)->p_aioinfo)); \
}
#define LINUX_AIO_UNLOCK(p) { \
if ((p)->p_aioinfo == NULL) \
- p_aio_init_aioinfo(p); \
+ aio_init_aioinfo(p); \
mtx_unlock((struct mtx *)((p)->p_aioinfo)); \
}
@@ -208,48 +205,36 @@
static eventhandler_tag linux_aio_exit_tag;
/*
- * XXX
- * Calling external function/variable declared with "static" is DANGEROUS !!!
- * Compiler may use register to transfer calling arguments for optimization,
- * which is NOT a normal calling way and can cause kernel crash.
+ * To backup pointers to the dummy implementation of these
+ * system calls faked by the macro DUMMY() in linux_dummy.c.
+ */
+#define PREPARE_DUMMY_SYSCALL_BACKUP(s) \
+ static sy_call_t *p_dummy_linux_ ## s
+#define SHOW_REAL_SYSCALL(s) { \
+ p_dummy_linux_ ## s = linux_sysent[LINUX_SYS_linux_ ## s].sy_call; \
+ linux_sysent[LINUX_SYS_linux_ ## s].sy_call = \
+ (sy_call_t *)(linux_ ## s); \
+}
+/*
+ * The concept of "scope": the functions linux_io_xxx defined in this file
+ * always mask/screen/override/prevent homonymous functions defined in
+ * any other files.
*/
+#define RESTORE_DUMMY_SYSCALL(s) { \
+ linux_sysent[LINUX_SYS_linux_ ## s].sy_call = p_dummy_linux_ ## s; \
+}
-#define NATIVE_AIO_MODULE_NAME "aio"
-static struct mod_depend native_aio_module_depend = {1, 1, 1};
-static linker_file_t native_aio_module_handle = NULL;
+PREPARE_DUMMY_SYSCALL_BACKUP(io_setup);
+PREPARE_DUMMY_SYSCALL_BACKUP(io_destroy);
+PREPARE_DUMMY_SYSCALL_BACKUP(io_getevents);
+PREPARE_DUMMY_SYSCALL_BACKUP(io_submit);
+PREPARE_DUMMY_SYSCALL_BACKUP(io_cancel);
-/* Mirror of sysctls in /sys/kern/vfs_aio.c */
-#define NATIVE_AIO_SYSCTL_CAPACITY_PROC "vfs.aio.max_aio_queue_per_proc"
-static int native_aio_capacity_proc;
-#define NATIVE_AIO_SYSCTL_CAPACITY_SYS "vfs.aio.max_aio_queue"
-static int native_aio_capacity_sys;
-
-/* For declaration of aio_aqueue(), defined in /sys/kern/vfs_aio.c */
-struct aioliojob;
-
-/* Functions in /sys/kern/vfs_aio.c, XXX defined with "static" */
-#define GET_INTERNAL_FUNC_POINTER(s) { \
- * ((caddr_t *) & p_ ## s) = linker_file_lookup_symbol( \
- native_aio_module_handle, #s, FALSE); \
- if (p_ ## s == NULL) \
- break; \
-}
-static void (*p_aio_init_aioinfo) (struct proc *p);
-static int (*p_aio_aqueue) (struct thread *td, struct aiocb *job,
- struct aioliojob *lio, int type, int osigev);
-
-/* System calls in /sys/kern/vfs_aio.c */
-#define DEFINE_SYSCALL_POINTER_VARIABLE(s) \
- static int (* p_ ## s) (struct thread *, struct s ## _args *)
-#define GET_SYSCALL_POINTER(s) { \
- * ((sy_call_t **) & p_ ## s) = sysent[SYS_ ## s].sy_call; \
- if ((sy_call_t *) p_ ## s == (sy_call_t *)lkmressys) \
- break; \
-}
-DEFINE_SYSCALL_POINTER_VARIABLE(aio_return);
-DEFINE_SYSCALL_POINTER_VARIABLE(aio_suspend);
-DEFINE_SYSCALL_POINTER_VARIABLE(aio_cancel);
-DEFINE_SYSCALL_POINTER_VARIABLE(aio_error);
+/*
+ * Substantially defined in linux_sysent.c.
+ * Also declared in linux_sysvec.c.
+ */
+extern struct sysent linux_sysent[LINUX_SYS_MAXSYSCALL];
static int user_mem_rw_verify(void *p, size_t s)
{
@@ -331,7 +316,8 @@
if (isuserland) {
nerr = copyin(piocb, &localcb, sizeof(localcb));
pcb = &localcb;
- } else
+ }
+ else
pcb = piocb;
DPPRINTF("Dump struct aiocb (%p, %s): %s",
@@ -419,85 +405,6 @@
return (nerr);
}
-static int link_to_native_aio_module(struct thread *td)
-{
- int nerr;
-
- if (native_aio_module_handle != NULL) {
- /* Linking has been done successfully. */
- return (0);
- }
-
- nerr = linker_reference_module(NATIVE_AIO_MODULE_NAME,
- &native_aio_module_depend, &native_aio_module_handle);
- if (nerr)
- return (nerr);
-
- do {
- nerr = EINVAL;
-
- /* Kernel internal functions */
- GET_INTERNAL_FUNC_POINTER(aio_init_aioinfo);
- GET_INTERNAL_FUNC_POINTER(aio_aqueue);
-
- /* System calls */
- GET_SYSCALL_POINTER(aio_return);
- GET_SYSCALL_POINTER(aio_suspend);
- GET_SYSCALL_POINTER(aio_cancel);
- GET_SYSCALL_POINTER(aio_error);
-
- nerr = 0;
- } while (0);
-
- if (nerr) {
- linker_release_module(NULL, NULL, native_aio_module_handle);
- native_aio_module_handle = NULL;
-
- printf(LMSG("Unable to link to the native module \""
- NATIVE_AIO_MODULE_NAME "\"."));
-
- return (nerr);
- }
-
- return (0);
-}
-
-#define LINK_TO_NATIVE_AIO_MODULE() \
- if (link_to_native_aio_module(td)) { \
- printf(LMSG("Please load the module \"" \
- NATIVE_AIO_MODULE_NAME "\" " \
- "to provide FreeBSD " \
- "native Asynchronous I/O support.")); \
- return (ENOSYS); \
-}
-
-static int mirror_native_aio_sysctl(struct thread *td)
-{
- int nerr = 0;
- size_t l;
-
- l = sizeof(native_aio_capacity_proc);
- nerr = kernel_sysctlbyname(td, NATIVE_AIO_SYSCTL_CAPACITY_PROC,
- &native_aio_capacity_proc, &l, NULL, 0,
- NULL ,0);
- if (nerr)
- return (nerr);
-
- l = sizeof(native_aio_capacity_sys);
- nerr = kernel_sysctlbyname(td, NATIVE_AIO_SYSCTL_CAPACITY_SYS,
- &native_aio_capacity_sys, &l, NULL, 0,
- NULL ,0);
- if (nerr)
- return (nerr);
-
- DPRINTF(NATIVE_AIO_SYSCTL_CAPACITY_PROC "=%d, "
- NATIVE_AIO_SYSCTL_CAPACITY_SYS "=%d",
- native_aio_capacity_proc,
- native_aio_capacity_sys);
-
- return (nerr);
-}
-
/* Linux system call io_setup(2) */
int linux_io_setup(struct thread *td, struct linux_io_setup_args *args)
{
@@ -508,27 +415,17 @@
int nerr = 0, nr, nrall, nq, arg_nr_reqs;
DARGPRINTF("%u, %p", args->nr_reqs, args->ctxp);
- LINK_TO_NATIVE_AIO_MODULE();
- nerr = mirror_native_aio_sysctl(td);
- if (nerr) {
- printf(LMSG("linux_io_setup(): Unable to query sysctls "
- NATIVE_AIO_SYSCTL_CAPACITY_PROC
- " and/or " NATIVE_AIO_SYSCTL_CAPACITY_SYS
- " ."));
- return (nerr);
- }
/* Signed integer is a little safer than unsigned */
arg_nr_reqs = args->nr_reqs;
if (arg_nr_reqs <= 0)
return (EINVAL);
- if (arg_nr_reqs > native_aio_capacity_proc
- || arg_nr_reqs > native_aio_capacity_sys) {
+ if (arg_nr_reqs > max_aio_queue_per_proc
+ || arg_nr_reqs > max_aio_queue_count) {
printf(LMSG("linux_io_setup(): Please increase sysctls "
- NATIVE_AIO_SYSCTL_CAPACITY_PROC
- " and/or " NATIVE_AIO_SYSCTL_CAPACITY_SYS
- " ."));
+ "vfs.aio.max_aio_queue_per_proc "
+ "and/or vfs.aio.max_aio_queue. "));
return (ENOMEM);
}
@@ -568,12 +465,12 @@
nq, nr, nrall);
/* Check whether there are enough resources for requested queue */
- if (arg_nr_reqs > native_aio_capacity_proc - nr
- || arg_nr_reqs > native_aio_capacity_sys - nrall) {
+ if (arg_nr_reqs > max_aio_queue_per_proc - nr
+ || arg_nr_reqs > max_aio_queue_count - nrall) {
printf(LMSG("linux_io_setup(): "
"Please increase sysctls "
- NATIVE_AIO_SYSCTL_CAPACITY_PROC
- " and/or " NATIVE_AIO_SYSCTL_CAPACITY_SYS " ."
+ "vfs.aio.max_aio_queue_per_proc "
+ "and/or vfs.aio.max_aio_queue. "
"Besides %d queues of %d requests totally "
"for this process, and %d requests' queues "
"totally for the whole system, "
@@ -632,7 +529,6 @@
struct aio_return_args aioretargs;
DARGPRINTF("%lx", (unsigned long)args->ctx);
- LINK_TO_NATIVE_AIO_MODULE();
p = td->td_proc;
@@ -684,7 +580,7 @@
/* Cancel FreeBSD native clone */
cancelargs.fd = preq->req_linux.aio_fildes;
cancelargs.aiocbp = preq->req_pbsd;
- p_aio_cancel(td, &cancelargs);
+ aio_cancel(td, &cancelargs);
DPRINTF("aio_cancel() returned %ld", (long)td->td_retval[0]);
if (td->td_retval[0] == AIO_NOTCANCELED)
printf(LMSG("linux_io_destroy(): Asynchronous IO "
@@ -698,7 +594,7 @@
if (td->td_retval[0] == AIO_ALLDONE) {
aioretargs.aiocbp = preq->req_pbsd;
- p_aio_return(td, &aioretargs);
+ aio_return(td, &aioretargs);
DPRINTF("aio_return(%p) returned %ld",
aioretargs.aiocbp,
(long)td->td_retval[0]);
@@ -754,7 +650,6 @@
(unsigned long) args->ctx_id,
(long)args->min_nr, (long)args->nr,
args->events, args->timeout);
- LINK_TO_NATIVE_AIO_MODULE();
if (args->nr <= 0)
return (EINVAL);
@@ -821,7 +716,7 @@
} else { /* Deal with the request queue */
i = 0; /*
* This variable's value will be the return value
- * of linux_io_getevents()
+ * of linux_io_getevents()
*/
nerr = user_malloc(td, (void **)&u_aiocbp,
@@ -839,14 +734,14 @@
/* Collecting finished requests and waiting for queued requests */
LINUX_AIO_REQ_FOREACH_SAFE(pctx, preq, ptmpreq) {
-
+
/* Collect all finished requests */
if (i >= args->nr) /* Full */
break;
aioerrargs.aiocbp = preq->req_pbsd;
- p_aio_error(td, &aioerrargs);
+ aio_error(td, &aioerrargs);
aio_ret = td->td_retval[0];
td->td_retval[0] = 0;
@@ -865,7 +760,7 @@
LINUX_AIO_REQ_UNHOOK(pctx, preq);
aioretargs.aiocbp = preq->req_pbsd;
- aio_err = p_aio_return(td, &aioretargs);
+ aio_err = aio_return(td, &aioretargs);
aio_ret = td->td_retval[0];
td->td_retval[0] = 0;
@@ -947,7 +842,7 @@
LINUX_AIO_REQ_FOREACH(pctx, preq) {
copyout(&(preq->req_pbsd), &(u_aiocbp[j]),
sizeof(preq->req_pbsd));
- j++;
+ j ++;
}
MPASS(j == pctx->ctx_nreq_cur);
aiosusargs.aiocbp = u_aiocbp;
@@ -961,7 +856,7 @@
aiosusargs.timeout = NULL;
}
- aio_err = p_aio_suspend(td, &aiosusargs);
+ aio_err = aio_suspend(td, &aiosusargs);
DPRINTF("aio_suspend(%p, %d, %p) returned %ld",
aiosusargs.aiocbp, aiosusargs.nent,
aiosusargs.timeout, (long)aio_err);
@@ -991,7 +886,7 @@
pctx);
break;
}
- } /*
+ } /*
* End of collecting finished requests
* and waiting for queued requests
*/
@@ -1026,9 +921,7 @@
struct linux_iocb *porig;
struct aiocb iocb, *piocb;
- DARGPRINTF("%lx, %ld, %p", (unsigned long)args->ctx_id,
- (long)args->nr, args->iocbpp);
- LINK_TO_NATIVE_AIO_MODULE();
+ DARGPRINTF("%lx, %ld, %p", (unsigned long)args->ctx_id, (long)args->nr, args->iocbpp);
if (args->nr <= 0)
return (EINVAL);
@@ -1072,7 +965,7 @@
LINUX_AIO_UNLOCK(p); /* XXX Interlaced, seamless */
for (i = 0; pctx->ctx_nreq_cur < pctx->ctx_nreq_max && i < args->nr;
- i++) {
+ i ++) {
/* Get user space Linux control block */
nerr = copyin(&(args->iocbpp[i]), &porig, sizeof(porig));
if (nerr != 0)
@@ -1094,7 +987,7 @@
DUMP_FREEBSD_AIOCB(piocb, 1);
/* Submit user space control block */
- nerr = p_aio_aqueue(td, piocb, NULL, iocb.aio_lio_opcode, 0);
+ nerr = aio_aqueue(td, piocb, NULL, iocb.aio_lio_opcode, 0);
if (nerr != 0) {
user_free(td, piocb, sizeof(*piocb));
break;
@@ -1139,9 +1032,7 @@
struct linux_io_event evt;
struct aio_cancel_args aiocnclargs;
- DARGPRINTF("%lx, %p, %p", (unsigned long)args->ctx_id,
- args->iocb, args->result);
- LINK_TO_NATIVE_AIO_MODULE();
+ DARGPRINTF("%lx, %p, %p", (unsigned long)args->ctx_id, args->iocb, args->result);
nerr = copyin(args->iocb, &lcb, sizeof(lcb));
if (nerr != 0)
@@ -1205,7 +1096,7 @@
/* Cancel FreeBSD native clone */
aiocnclargs.fd = preq->req_linux.aio_fildes;
aiocnclargs.aiocbp = preq->req_pbsd;
- p_aio_cancel(td, &aiocnclargs);
+ aio_cancel(td, &aiocnclargs);
DPRINTF("aio_cancel() returned %ld", (long)td->td_retval[0]);
if (td->td_retval[0] == AIO_CANCELED) {
@@ -1308,6 +1199,17 @@
linux_aio_exit_tag = EVENTHANDLER_REGISTER(process_exit,
linux_aio_proc_rundown,
NULL, EVENTHANDLER_PRI_ANY);
+
+ /*
+ * Backup pointers to the dummy implementation of these
+ * system calls faked by the macro DUMMY() in linux_dummy.c.
+ * And then, show real system calls.
+ */
+ SHOW_REAL_SYSCALL(io_setup);
+ SHOW_REAL_SYSCALL(io_destroy);
+ SHOW_REAL_SYSCALL(io_getevents);
+ SHOW_REAL_SYSCALL(io_submit);
+ SHOW_REAL_SYSCALL(io_cancel);
break;
case MOD_UNLOAD:
LINUX_AIO_CTX_LIST_LOCK();
@@ -1321,15 +1223,16 @@
mtx_destroy(&linux_aio_context_list_mtx);
uma_zdestroy(linux_aio_request_zone);
uma_zdestroy(linux_aio_context_zone);
- if (native_aio_module_handle != NULL) {
- /*
- * linker_release_module() cannot be used here.
- * It tries to hold "kld_sx", conflicting against
- * module_unload().
- */
- linker_file_unload(native_aio_module_handle,
- LINKER_UNLOAD_NORMAL);
- }
+
+ /*
+ * Restore pointers to the dummy implementation of these
+ * system calls faked by the macro DUMMY() in linux_dummy.c.
+ */
+ RESTORE_DUMMY_SYSCALL(io_setup);
+ RESTORE_DUMMY_SYSCALL(io_destroy);
+ RESTORE_DUMMY_SYSCALL(io_getevents);
+ RESTORE_DUMMY_SYSCALL(io_submit);
+ RESTORE_DUMMY_SYSCALL(io_cancel);
break;
case MOD_SHUTDOWN:
break;
@@ -1347,3 +1250,5 @@
};
DECLARE_MODULE(linuxaio, linux_aio_mod, SI_SUB_VFS, SI_ORDER_ANY);
+MODULE_DEPEND(linuxaio, aio, 1, 1, 1);
+MODULE_DEPEND(linuxaio, linux, 1, 1, 1);
==== //depot/projects/linuxolator/src/sys/compat/linux/linux_aio.h#5 (text+ko) ====
==== //depot/projects/linuxolator/src/sys/conf/files.amd64#10 (text+ko) ====
@@ -233,6 +233,7 @@
amd64/linux32/linux32_machdep.c optional compat_linux32
amd64/linux32/linux32_sysent.c optional compat_linux32
amd64/linux32/linux32_sysvec.c optional compat_linux32
+compat/linux/linux_aio.c optional linuxaio compat_linux32 vfs_aio
compat/linux/linux_emul.c optional compat_linux32
compat/linux/linux_file.c optional compat_linux32
compat/linux/linux_futex.c optional compat_linux32
==== //depot/projects/linuxolator/src/sys/conf/files.i386#9 (text+ko) ====
@@ -85,6 +85,7 @@
#
compat/linprocfs/linprocfs.c optional linprocfs
compat/linsysfs/linsysfs.c optional linsysfs
+compat/linux/linux_aio.c optional linuxaio compat_linux aio
compat/linux/linux_emul.c optional compat_linux
compat/linux/linux_file.c optional compat_linux
compat/linux/linux_futex.c optional compat_linux
==== //depot/projects/linuxolator/src/sys/conf/files.pc98#7 (text+ko) ====
@@ -55,6 +55,7 @@
#
compat/linprocfs/linprocfs.c optional linprocfs
compat/linsysfs/linsysfs.c optional linsysfs
+compat/linux/linux_aio.c optional linuxaio compat_linux vfs_aio
compat/linux/linux_emul.c optional compat_linux
compat/linux/linux_file.c optional compat_linux
compat/linux/linux_futex.c optional compat_linux
==== //depot/projects/linuxolator/src/sys/conf/options.amd64#2 (text+ko) ====
@@ -19,6 +19,7 @@
#DEBUG_SVR4 opt_svr4.h
LINPROCFS opt_dontuse.h
LINSYSFS opt_dontuse.h
+LINUXAIO opt_dontuse.h
NDISAPI opt_dontuse.h
CLK_CALIBRATION_LOOP opt_clock.h
==== //depot/projects/linuxolator/src/sys/conf/options.i386#2 (text+ko) ====
@@ -26,6 +26,7 @@
DEBUG_SVR4 opt_svr4.h
LINPROCFS opt_dontuse.h
LINSYSFS opt_dontuse.h
+LINUXAIO opt_dontuse.h
NDISAPI opt_dontuse.h
PECOFF_DEBUG opt_pecoff.h
PECOFF_SUPPORT opt_dontuse.h
==== //depot/projects/linuxolator/src/sys/conf/options.pc98#2 (text+ko) ====
@@ -25,6 +25,7 @@
DEBUG_SVR4 opt_svr4.h
LINPROCFS opt_dontuse.h
LINSYSFS opt_dontuse.h
+LINUXAIO opt_dontuse.h
PECOFF_DEBUG opt_pecoff.h
PECOFF_SUPPORT opt_dontuse.h
==== //depot/projects/linuxolator/src/sys/i386/conf/NOTES#7 (text+ko) ====
@@ -1133,9 +1133,12 @@
# and PSEUDOFS)
options LINPROCFS
-#Enable the linux-like sys filesystem support (requires COMPAT_LINUX
+# Enable the linux-like sys filesystem support (requires COMPAT_LINUX
# and PSEUDOFS)
-options LINSYSFS
+options LINSYSFS
+
+# Enable the linux aio support (requires COMPAT_LINUX and VFS_AIO)
+options LINUXAIO
#
# SysVR4 ABI emulation
==== //depot/projects/linuxolator/src/sys/i386/linux/linux.h#15 (text+ko) ====
==== //depot/projects/linuxolator/src/sys/i386/linux/linux_dummy.c#9 (text+ko) ====
@@ -101,6 +101,11 @@
DUMMY(pselect6);
DUMMY(ppoll);
DUMMY(unshare);
+DUMMY(io_setup);
+DUMMY(io_destroy);
+DUMMY(io_getevents);
+DUMMY(io_submit);
+DUMMY(io_cancel);
#define DUMMY_XATTR(s) \
int \
==== //depot/projects/linuxolator/src/sys/i386/linux/syscalls.master#18 (text+ko) ====
==== //depot/projects/linuxolator/src/sys/kern/vfs_aio.c#7 (text+ko) ====
@@ -139,8 +139,8 @@
SYSCTL_INT(_vfs_aio, OID_AUTO, target_aio_procs, CTLFLAG_RW, &target_aio_procs,
0, "Preferred number of ready kernel threads for async IO");
-static int max_queue_count = MAX_AIO_QUEUE;
-SYSCTL_INT(_vfs_aio, OID_AUTO, max_aio_queue, CTLFLAG_RW, &max_queue_count, 0,
+int max_aio_queue_count = MAX_AIO_QUEUE;
+SYSCTL_INT(_vfs_aio, OID_AUTO, max_aio_queue, CTLFLAG_RW, &max_aio_queue_count, 0,
"Maximum number of aio requests to queue, globally");
static int num_queue_count = 0;
@@ -172,7 +172,7 @@
SYSCTL_INT(_vfs_aio, OID_AUTO, max_aio_per_proc, CTLFLAG_RW, &max_aio_per_proc,
0, "Maximum active aio requests per process (stored in the process)");
-static int max_aio_queue_per_proc = MAX_AIO_QUEUE_PER_PROC;
+int max_aio_queue_per_proc = MAX_AIO_QUEUE_PER_PROC;
SYSCTL_INT(_vfs_aio, OID_AUTO, max_aio_queue_per_proc, CTLFLAG_RW,
&max_aio_queue_per_proc, 0,
"Maximum queued aio requests per process (stored in the process)");
@@ -257,19 +257,6 @@
struct thread *aiothread; /* (*) the AIO thread */
};
-/*
- * data-structure for lio signal management
- */
-struct aioliojob {
- int lioj_flags; /* (a) listio flags */
- int lioj_count; /* (a) listio flags */
- int lioj_finished_count; /* (a) listio flags */
- struct sigevent lioj_signal; /* (a) signal on all I/O done */
- TAILQ_ENTRY(aioliojob) lioj_list; /* (a) lio list */
- struct knlist klist; /* (a) list of knotes */
- ksiginfo_t lioj_ksi; /* (a) Realtime signal info */
-};
-
#define LIOJ_SIGNAL 0x1 /* signal on all done (lio) */
#define LIOJ_SIGNAL_POSTED 0x2 /* signal has been posted */
#define LIOJ_KEVENT_POSTED 0x4 /* kevent triggered */
@@ -313,13 +300,10 @@
static TAILQ_HEAD(,aiocblist) aio_jobs; /* (c) Async job list */
static struct unrhdr *aiod_unr;
-void aio_init_aioinfo(struct proc *p);
static void aio_onceonly(void);
static int aio_free_entry(struct aiocblist *aiocbe);
static void aio_process(struct aiocblist *aiocbe);
static int aio_newproc(int *);
-int aio_aqueue(struct thread *td, struct aiocb *job,
- struct aioliojob *lio, int type, int osigev);
static void aio_physwakeup(struct buf *bp);
static void aio_proc_rundown(void *arg, struct proc *p);
static void aio_proc_rundown_exec(void *arg, struct proc *p, struct image_params *imgp);
@@ -1347,7 +1331,7 @@
suword(&job->_aiocb_private.error, 0);
suword(&job->_aiocb_private.kernelinfo, -1);
- if (num_queue_count >= max_queue_count ||
+ if (num_queue_count >= max_aio_queue_count ||
ki->kaio_count >= ki->kaio_qallowed_count) {
suword(&job->_aiocb_private.error, EAGAIN);
return (EAGAIN);
==== //depot/projects/linuxolator/src/sys/modules/Makefile#8 (text+ko) ====
@@ -138,6 +138,7 @@
${_linprocfs} \
${_linsysfs} \
${_linux} \
+ ${_linuxaio} \
lmc \
lpt \
mac_biba \
@@ -371,6 +372,7 @@
_linprocfs= linprocfs
_linsysfs= linsysfs
_linux= linux
+_linuxaio= linuxaio
_mse= mse
.if ${MK_NCP} != "no"
_ncp= ncp
@@ -479,6 +481,7 @@
_linprocfs= linprocfs
_linsysfs= linsysfs
_linux= linux
+_linuxaio= linuxaio
_mly= mly
_mxge= mxge
_ndis= ndis
@@ -498,8 +501,8 @@
.if ${MACHINE_ARCH} == "ia64"
# Modules not enabled on ia64 (as compared to i386) include:
-# aac acpi aout apm atspeaker drm ibcs2 linprocfs linux ncv
-# nsp oltr pecoff s3 sbni stg vesa
+# aac acpi aout apm atspeaker drm ibcs2 linsysfs linprocfs linux
+# linuxaio ncv nsp oltr pecoff s3 sbni stg vesa
# acpi is not enabled because it is broken as a module on ia64
_aic= aic
#_ar= ar not 64-bit clean
==== //depot/projects/linuxolator/src/sys/modules/aio/Makefile#5 (text+ko) ====
@@ -5,6 +5,7 @@
KMOD= aio
SRCS= vfs_aio.c opt_vfs_aio.h vnode_if.h
-EXPORT_SYMS= aio_init_aioinfo aio_aqueue
+EXPORT_SYMS= aio_init_aioinfo aio_aqueue max_aio_queue_count \
+ max_aio_queue_per_proc
.include <bsd.kmod.mk>
==== //depot/projects/linuxolator/src/sys/modules/linux/Makefile#5 (text+ko) ====
@@ -8,7 +8,7 @@
.PATH: ${.CURDIR}/../../compat/linux ${.CURDIR}/../../${MACHINE_ARCH}/linux${SFX}
KMOD= linux
-SRCS= linux_aio.c linux${SFX}_dummy.c linux_emul.c linux_file.c \
+SRCS= linux${SFX}_dummy.c linux_emul.c linux_file.c \
linux_futex.c linux_getcwd.c linux_ioctl.c linux_ipc.c \
linux${SFX}_machdep.c linux_mib.c linux_misc.c linux_signal.c \
linux_socket.c linux_stats.c linux_sysctl.c linux${SFX}_sysent.c \
==== //depot/projects/linuxolator/src/sys/pc98/conf/NOTES#4 (text+ko) ====
@@ -695,6 +695,9 @@
# and PSEUDOFS)
options LINSYSFS
+# Enable the linux aio support (requires COMPAT_LINUX and VFS_AIO)
+options LINUXAIO
+
#
# SysVR4 ABI emulation
#
==== //depot/projects/linuxolator/src/sys/sys/aio.h#2 (text+ko) ====
@@ -23,6 +23,12 @@
#include <sys/types.h>
#include <sys/signal.h>
+#ifdef _KERNEL
+#include <sys/event.h>
+#include <sys/queue.h>
+#include <sys/signalvar.h>
+#endif
+
/*
* Returned by aio_cancel:
*/
@@ -135,6 +141,28 @@
extern void (*aio_swake)(struct socket *, struct sockbuf *);
+/* To be used by the Linux AIO module */
+extern int max_aio_queue_count;
+extern int max_aio_queue_per_proc;
+
+/*
+ * data-structure for lio signal management
+ */
+struct aioliojob {
+ int lioj_flags; /* (a) listio flags */
+ int lioj_count; /* (a) listio flags */
+ int lioj_finished_count; /* (a) listio flags */
+ struct sigevent lioj_signal; /* (a) signal on all I/O done */
+ TAILQ_ENTRY(aioliojob) lioj_list; /* (a) lio list */
+ struct knlist klist; /* (a) list of knotes */
+ ksiginfo_t lioj_ksi; /* (a) Realtime signal info */
+};
+
+/* To be used by the Linux AIO module */
+extern void aio_init_aioinfo(struct proc *p);
+extern int aio_aqueue(struct thread *td, struct aiocb *job,
+ struct aioliojob *lio, int type, int osigev);
+
#endif
#endif
More information about the p4-projects
mailing list