cvs commit: src/sys/amd64/linux32 linux.h syscalls.master src/sys/compat/linux linux_aio.c linux_aio.h src/sys/conf files.amd64 files.i386 src/sys/i386/linux linux.h syscalls.master src/sys/kern vfs_aio.c src/sys/modules/aio Makefile ...

Alexander Leidinger netchild at FreeBSD.org
Sun Oct 15 14:22:14 UTC 2006


netchild    2006-10-15 14:22:14 UTC

  FreeBSD src repository

  Modified files:
    sys/amd64/linux32    linux.h syscalls.master 
    sys/conf             files.amd64 files.i386 
    sys/i386/linux       linux.h syscalls.master 
    sys/kern             vfs_aio.c 
    sys/modules/aio      Makefile 
    sys/modules/linux    Makefile 
  Added files:
    sys/compat/linux     linux_aio.c linux_aio.h 
  Log:
  MFP4 (with some minor changes):
  
  Implement the linux_io_* syscalls (AIO). They are only enabled if the native
  AIO code is available (either compiled in to the kernel or as a module) at
  the time the functions are used. If the AIO stuff is not available there
  will be a ENOSYS.
  
  From the submitter:
  ---snip---
  DESIGN NOTES:
  
  1. Linux permits a process to own multiple AIO queues (distinguished by
     "context"), but FreeBSD creates only one single AIO queue per process.
     My code maintains a request queue (STAILQ of queue(3)) per "context",
     and throws all AIO requests of all contexts owned by a process into
     the single FreeBSD per-process AIO queue.
  
     When the process calls io_destroy(2), io_getevents(2), io_submit(2) and
     io_cancel(2), my code can pick out requests owned by the specified context
     from the single FreeBSD per-process AIO queue according to the per-context
     request queues maintained by my code.
  
  2. The request queue maintained by my code stores contrast information between
     Linux IO control blocks (struct linux_iocb) and FreeBSD IO control blocks
     (struct aiocb). FreeBSD IO control block actually exists in userland memory
     space, required by FreeBSD native aio_XXXXXX(2).
  
  3. It is quite troubling that the function io_getevents() of libaio-0.3.105
     needs to use Linux-specific "struct aio_ring", which is a partial mirror
     of context in user space. I would rather take the address of context in
     kernel as the context ID, but the io_getevents() of libaio forces me to
     take the address of the "ring" in user space as the context ID.
  
     To my surprise, one comment line in the file "io_getevents.c" of
     libaio-0.3.105 reads:
  
               Ben will hate me for this
  
  REFERENCE:
  
  1. Linux kernel source code:   http://www.kernel.org/pub/linux/kernel/v2.6/
     (include/linux/aio_abi.h, fs/aio.c)
  
  2. Linux manual pages:         http://www.kernel.org/pub/linux/docs/manpages/
     (io_setup(2), io_destroy(2), io_getevents(2), io_submit(2), io_cancel(2))
  
  3. Linux Scalability Effort:   http://lse.sourceforge.net/io/aio.html
     The design notes:           http://lse.sourceforge.net/io/aionotes.txt
  
  4. The package libaio, both source and binary:
         http://rpmfind.net/linux/rpm2html/search.php?query=libaio
     Simple transparent interface to Linux AIO system calls.
  
  5. Libaio-oracle:              http://oss.oracle.com/projects/libaio-oracle/
     POSIX AIO implementation based on Linux AIO system calls (depending on
     libaio).
  ---snip---
  
  Submitted by:   Li, Xiao <intron at intron.ac>
  
  Revision  Changes    Path
  1.7       +2 -0      src/sys/amd64/linux32/linux.h
  1.21      +5 -5      src/sys/amd64/linux32/syscalls.master
  1.1       +1349 -0   src/sys/compat/linux/linux_aio.c (new)
  1.1       +98 -0     src/sys/compat/linux/linux_aio.h (new)
  1.95      +1 -0      src/sys/conf/files.amd64
  1.567     +1 -0      src/sys/conf/files.i386
  1.70      +2 -0      src/sys/i386/linux/linux.h
  1.81      +5 -5      src/sys/i386/linux/syscalls.master
  1.228     +4 -4      src/sys/kern/vfs_aio.c
  1.2       +2 -0      src/sys/modules/aio/Makefile
  1.69      +7 -5      src/sys/modules/linux/Makefile


More information about the cvs-all mailing list