[email protected]
[Top] [All Lists]

PERFORCE change 114975 for review

Subject: PERFORCE change 114975 for review
From: Alexander Leidinger
Date: Sat, 24 Feb 2007 16:18:28 GMT
http://perforce.freebsd.org/chv.cgi?CH=114975

Change 114975 by [email protected]_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 <[email protected]>
        
        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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/p4-projects
To unsubscribe, send any mail to "[email protected]"

<Prev in Thread] Current Thread [Next in Thread>