03 Oct, 2006

1 commit


01 Oct, 2006

2 commits

  • This work is initially done by Zach Brown to add support for vectored aio.
    These are the core changes for AIO to support
    IOCB_CMD_PREADV/IOCB_CMD_PWRITEV.

    [akpm@osdl.org: huge build fix]
    Signed-off-by: Zach Brown
    Signed-off-by: Christoph Hellwig
    Signed-off-by: Badari Pulavarty
    Acked-by: Benjamin LaHaise
    Acked-by: James Morris
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Badari Pulavarty
     
  • This patch vectorizes aio_read() and aio_write() methods to prepare for
    collapsing all aio & vectored operations into one interface - which is
    aio_read()/aio_write().

    Signed-off-by: Badari Pulavarty
    Signed-off-by: Christoph Hellwig
    Cc: Michael Holzheu
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Badari Pulavarty
     

27 Jun, 2006

1 commit

  • acquired (aquired)
    contiguous (contigious)
    successful (succesful, succesfull)
    surprise (suprise)
    whether (weather)
    some other misspellings

    Signed-off-by: Andreas Mohr
    Signed-off-by: Adrian Bunk

    Andreas Mohr
     

23 Jun, 2006

1 commit


26 Mar, 2006

1 commit


09 Jan, 2006

1 commit


14 Nov, 2005

2 commits

  • aio: replace locking comments with assert_spin_locked()

    Signed-off-by: Zach Brown
    Acked-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zach Brown
     
  • Sync iocbs have a life cycle that don't need a kioctx. Their retrying, if
    any, is done in the context of their owner who has allocated them on the
    stack.

    The sole user of a sync iocb's ctx reference was aio_complete() checking for
    an elevated iocb ref count that could never happen. No path which grabs an
    iocb ref has access to sync iocbs.

    If we were to implement sync iocb cancelation it would be done by the owner of
    the iocb using its on-stack reference.

    Removing this chunk from aio_complete allows us to remove the entire kioctx
    instance from mm_struct, reducing its size by a third. On a i386 testing box
    the slab size went from 768 to 504 bytes and from 5 to 8 per page.

    Signed-off-by: Zach Brown
    Acked-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zach Brown
     

07 Nov, 2005

1 commit

  • AIO was adding a new context's max requests to the global total before
    testing if that resulting total was over the global limit. This let
    innocent tasks get their new limit tested along with a racing guilty task
    that was crossing the limit. This serializes the _nr accounting with a
    spinlock It also switches to using unsigned long for the global totals.
    Individual contexts are still limited to an unsigned int's worth of
    requests by the syscall interface.

    The problem and fix were verified with a simple program that spun creating
    and destroying a context while holding on to another long lived context.
    Before the patch a task creating a tiny context could get a spurious EAGAIN
    if it raced with a task creating a very large context that overran the
    limit.

    Signed-off-by: Zach Brown
    Cc: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zach Brown
     

24 Oct, 2005

1 commit

  • Another case of missing call to security_file_permission: aio functions
    (namely, io_submit) does not check credentials with security modules.

    Below is the simple patch to the problem. It seems that it is enough to
    check for rights at the request submission time.

    Signed-off-by: Kostik Belousov
    Signed-off-by: Chris Wright
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Kostik Belousov
     

18 Oct, 2005

1 commit

  • lock_kiocb() was introduced to serialize retrying and cancellation. In the
    process of doing so it tried to sleep waiting for KIF_LOCKED while holding
    the ctx_lock spinlock. Recent fixes have ensured that multiple concurrent
    retries won't be attempted for a given iocb. Cancel has other problems and
    has no significant in-tree users that have been complaining about it. So
    for the immediate future we'll revert sleeping with the lock held and will
    address proper cancellation and retry serialization in the future.

    Signed-off-by: Zach Brown
    Acked-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zach Brown
     

01 Oct, 2005

3 commits

  • Recently aio_p{read,write} changed to perform retries internally rather
    than returning -EIOCBRETRY. This inadvertantly resulted in always calling
    aio_{read,write} with ki_left at 0 which would in turn immediately return
    0. Harmless, but we can avoid this call by checking in the caller.

    Signed-off-by: Zach Brown
    Signed-off-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zach Brown
     
  • Only one of the run or kick path is supposed to put an iocb on the run
    list. If both of them do it than one of them can end up referencing a
    freed iocb. The kick path could delete the task_list item from the wait
    queue before getting the ctx_lock and putting the iocb on the run list.
    The run path was testing the task_list item outside the lock so that it
    could catch ki_retry methods that return -EIOCBRETRY *without* putting the
    iocb on a wait queue and promising to call kick_iocb. This unlocked check
    could then race with the kick path to cause both to try and put the iocb on
    the run list.

    The patch stops the run path from testing task_list by requring that any
    ki_retry that returns -EIOCBRETRY *must* guarantee that kick_iocb() will be
    called in the future. aio_p{read,write}, the only in-tree -EIOCBRETRY
    users, are updated.

    Signed-off-by: Zach Brown
    Signed-off-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zach Brown
     
  • Only one of the run or kick path is supposed to put an iocb on the run
    list. If both of them do it than one of them can end up referencing a
    freed iocb. The kick patch could set the Kicked bit before acquiring the
    ctx_lock and putting the iocb on the run list. The run path, while holding
    the ctx_lock, could see this partial kick and mistake it for a kick that
    was deferred while it was doing work with the run_list NULLed out. It
    would then race with the kick thread to add the iocb to the run list.

    This patch moves the kick setting under the ctx_lock so that only one of
    the kick or run path queues the iocb on the run list, as intended.

    Signed-off-by: Zach Brown
    Signed-off-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zach Brown
     

18 Sep, 2005

1 commit

  • Add smp_mb__after_clear_bit() to unlock_kiocb()

    AIO's use of wait_on_bit_lock()/wake_up_bit() forgot to add a barrier
    between clearing its lock bit and calling wake_up_bit() so wake_up_bit()'s
    unlocked waitqueue_active() can race. This puts AIO's use in line with the
    others and the comment above wake_up_bit().

    Signed-off-by: Zach Brown
    Acked-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zach Brown
     

10 Sep, 2005

3 commits

  • Patch to eliminate struct files_struct.file_lock spinlock on the reader side
    and use rcu refcounting rcuref_xxx api for the f_count refcounter. The
    updates to the fdtable are done by allocating a new fdtable structure and
    setting files->fdt to point to the new structure. The fdtable structure is
    protected by RCU thereby allowing lock-free lookup. For fd arrays/sets that
    are vmalloced, we use keventd to free them since RCU callbacks can't sleep. A
    global list of fdtable to be freed is not scalable, so we use a per-cpu list.
    If keventd is already handling the current cpu's work, we use a timer to defer
    queueing of that work.

    Since the last publication, this patch has been re-written to avoid using
    explicit memory barriers and use rcu_assign_pointer(), rcu_dereference()
    premitives instead. This required that the fd information is kept in a
    separate structure (fdtable) and updated atomically.

    Signed-off-by: Dipankar Sarma
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dipankar Sarma
     
  • Implement a per-kiocb lock to serialise retry operations and cancel. This
    is done using wait_on_bit_lock() on the KIF_LOCKED bit of kiocb->ki_flags.
    Also, make the cancellation path lock the kiocb and subsequently release
    all references to it if the cancel was successful. This version includes a
    fix for the deadlock with __aio_run_iocbs.

    Signed-off-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Benjamin LaHaise
     
  • Note that other than few exceptions, most of the current filesystem and/or
    drivers do not have aio cancel specifically defined (kiob->ki_cancel field
    is mostly NULL). However, sys_io_cancel system call universally sets
    return code to -EAGAIN. This gives applications a wrong impression that
    this call is implemented but just never works. We have customer inquires
    about this issue.

    Changed by Benjamin LaHaise to EINVAL instead of ENOSYS

    Signed-off-by: S. Wendy Cheng
    Acked-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Wendy Cheng
     

05 Sep, 2005

1 commit

  • Normally, activate_mm() is called from exec(), and thus it used to be a
    no-op because we use a completely new "MM context" on the host (for
    instance, a new process), and so we didn't need to flush any "TLB entries"
    (which for us are the set of memory mappings for the host process from the
    virtual "RAM" file).

    Kernel threads, instead, are usually handled in a different way. So, when
    for AIO we call use_mm(), things used to break and so Benjamin implemented
    activate_mm(). However, that is only needed for AIO, and could slow down
    exec() inside UML, so be smart: detect being called for AIO (via
    PF_BORROWED_MM) and do the full flush only in that situation.

    Comment also the caller so that people won't go breaking UML without
    noticing. I also rely on the caller's locks for testing current->flags.

    Signed-off-by: Paolo 'Blaisorblade' Giarrusso
    CC: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Paolo 'Blaisorblade' Giarrusso
     

29 Jun, 2005

1 commit

  • In the case of buffered AIO, in the aio retry path (aio_run_iocb), when the
    retry method returns EIOCBRETRY the kicked iocb is added to the context run
    list but is never queued onto the work queue. The request therefore is
    never completed.

    This patch fixes that by adding the appropriate call to aio_queue_work in
    aio_run_aiocb so that subsequent retries will be handled by the aio worker
    thread.

    Signed-off-by: Sébastien Dugué
    Acked-by: Benjamin LaHaise
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Sébastien Dugu
     

01 May, 2005

4 commits

  • This patch optimizes io_submit_one to call aio_run_iocb() directly if
    ctx->run_list is empty. When the list is empty, the operation of adding to
    the list, then call to __aio_run_iocbs() is unnecessary because these
    operations are done in one atomic step. ctx->run_list always has only one
    element in this case. This optimization speeds up industry standard db
    transaction processing benchmark by 0.2%.

    Signed-off-by: Ken Chen
    Cc: Benjamin LaHaise
    Cc: Suparna Bhattacharya
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ken Chen
     
  • Clean up code that was previously used for debug purpose. Remove aio_run,
    aio_wakeups, iocb->ki_queued and iocb->ki_kicked. Also clean up unused
    variable count in __aio_run_iocbs() and debug code in read_events().

    Signed-off-by: Ken Chen
    Cc: Benjamin LaHaise
    Cc: Suparna Bhattacharya
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ken Chen
     
  • Since the tail pointer in aio_ring structure never wrap ring size more than
    once, so a simple compare is sufficient to wrap the index around. This avoid
    a more expensive mod operation.

    Signed-off-by: Ken Chen
    Cc: Benjamin LaHaise
    Cc: Suparna Bhattacharya
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ken Chen
     
  • This patch removes superfluous kiocb member initialization in the AIO
    allocation and deallocation path. For example, in really_put_req(),
    right before kiocb is returned to slab, 5 variables are reset to NULL.
    The same variables will be initialized at the kiocb allocation time,
    so why bother reset them knowing that they will be set to valid data
    at alloc time? Another example: ki_retry is initialized in __aio_get_req,
    but is initialized again in io_submit_one.

    Signed-off-by: Ken Chen
    Cc: Benjamin LaHaise
    Cc: Suparna Bhattacharya
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ken Chen
     

25 Apr, 2005

1 commit


17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds