• Zach Brown's avatar
    [PATCH] aio: remove aio_max_nr accounting race · d55b5fda
    Zach Brown authored
    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: default avatarZach Brown <zach.brown@oracle.com>
    Cc: Benjamin LaHaise <bcrl@kvack.org>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    d55b5fda
aio.c 44.1 KB