Skip to content
  • Roman Pen's avatar
    5e1b34a3
    linux-aio: prevent submitting more than MAX_EVENTS · 5e1b34a3
    Roman Pen authored
    
    
    Invoking io_setup(MAX_EVENTS) we ask kernel to create ring buffer for us
    with specified number of events.  But kernel ring buffer allocation logic
    is a bit tricky (ring buffer is page size aligned + some percpu allocation
    are required) so eventually more than requested events number is allocated.
    
    From a userspace side we have to follow the convention and should not try
    to io_submit() more or logic, which consumes completed events, should be
    changed accordingly.  The pitfall is in the following sequence:
    
        MAX_EVENTS = 128
        io_setup(MAX_EVENTS)
    
        io_submit(MAX_EVENTS)
        io_submit(MAX_EVENTS)
    
        /* now 256 events are in-flight */
    
        io_getevents(MAX_EVENTS) = 128
    
        /* we can handle only 128 events at once, to be sure
         * that nothing is pended the io_getevents(MAX_EVENTS)
         * call must be invoked once more or hang will happen. */
    
    To prevent the hang or reiteration of io_getevents() call this patch
    restricts the number of in-flights, which is now limited to MAX_EVENTS.
    
    Signed-off-by: default avatarRoman Pen <roman.penyaev@profitbricks.com>
    Reviewed-by: default avatarFam Zheng <famz@redhat.com>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-id: 1468415004-31755-1-git-send-email-roman.penyaev@profitbricks.com
    Cc: Stefan Hajnoczi <stefanha@redhat.com>
    Cc: qemu-devel@nongnu.org
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    5e1b34a3
    linux-aio: prevent submitting more than MAX_EVENTS
    Roman Pen authored
    
    
    Invoking io_setup(MAX_EVENTS) we ask kernel to create ring buffer for us
    with specified number of events.  But kernel ring buffer allocation logic
    is a bit tricky (ring buffer is page size aligned + some percpu allocation
    are required) so eventually more than requested events number is allocated.
    
    From a userspace side we have to follow the convention and should not try
    to io_submit() more or logic, which consumes completed events, should be
    changed accordingly.  The pitfall is in the following sequence:
    
        MAX_EVENTS = 128
        io_setup(MAX_EVENTS)
    
        io_submit(MAX_EVENTS)
        io_submit(MAX_EVENTS)
    
        /* now 256 events are in-flight */
    
        io_getevents(MAX_EVENTS) = 128
    
        /* we can handle only 128 events at once, to be sure
         * that nothing is pended the io_getevents(MAX_EVENTS)
         * call must be invoked once more or hang will happen. */
    
    To prevent the hang or reiteration of io_getevents() call this patch
    restricts the number of in-flights, which is now limited to MAX_EVENTS.
    
    Signed-off-by: default avatarRoman Pen <roman.penyaev@profitbricks.com>
    Reviewed-by: default avatarFam Zheng <famz@redhat.com>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-id: 1468415004-31755-1-git-send-email-roman.penyaev@profitbricks.com
    Cc: Stefan Hajnoczi <stefanha@redhat.com>
    Cc: qemu-devel@nongnu.org
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Loading