• David Vrabel's avatar
    xen/evtchn: dynamically grow pending event channel ring · 86200154
    David Vrabel authored
    If more than 1024 event channels are bound to a evtchn device then it
    possible (even with well behaved applications) for the ring to
    overflow and events to be lost (reported as an -EFBIG error).
    
    Dynamically increase the size of the ring so there is always enough
    space for all bound events.  Well behaved applicables that only unmask
    events after draining them from the ring can thus no longer lose
    events.
    
    However, an application could unmask an event before draining it,
    allowing multiple entries per port to accumulate in the ring, and a
    overflow could still occur.  So the overflow detection and reporting
    is retained.
    
    The ring size is initially only 64 entries so the common use case of
    an application only binding a few events will use less memory than
    before.  The ring size may grow to 512 KiB (enough for all 2^17
    possible channels).  This order 7 kmalloc() may fail due to memory
    fragmentation, so we fall back to trying vmalloc().
    Signed-off-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
    Reviewed-by: default avatarAndrew Cooper <andrew.cooper3@citrix.com>
    86200154
evtchn.c 15.4 KB