• P
    monitor: Suspend monitor instead dropping commands · 9ab84470
    Peter Xu 提交于
    When a QMP client sends in-band commands more quickly that we can
    process them, we can either queue them without limit (QUEUE), drop
    commands when the queue is full (DROP), or suspend receiving commands
    when the queue is full (SUSPEND).  None of them is ideal:
    
    * QUEUE lets a misbehaving client make QEMU eat memory without bounds.
    Not such a hot idea.
    
    * With DROP, the client has to cope with dropped in-band commands.  To
    inform the client, we send a COMMAND_DROPPED event then.  The event is
    flawed by design in two ways: it's ambiguous (see commit d621cfe0),
    and it brings back the "eat memory without bounds" problem.
    
    * With SUSPEND, the client has to manage the flow of in-band commands to
    keep the monitor available for out-of-band commands.
    
    We currently DROP.  Switch to SUSPEND.
    
    Managing the flow of in-band commands to keep the monitor available for
    out-of-band commands isn't really hard: just count the number of
    "outstanding" in-band commands (commands sent minus replies received),
    and if it exceeds the limit, hold back additional ones until it drops
    below the limit again.
    
    Note that we need to be careful pairing the suspend with a resume, or
    else the monitor will hang, possibly forever.  And here since we need to
    make sure both:
    
         (1) popping request from the req queue, and
         (2) reading length of the req queue
    
    will be in the same critical section, we let the pop function take the
    corresponding queue lock when there is a request, then we release the
    lock from the caller.
    Reviewed-by: NMarc-André Lureau <marcandre.lureau@redhat.com>
    Signed-off-by: NPeter Xu <peterx@redhat.com>
    Message-Id: <20181009062718.1914-2-peterx@redhat.com>
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    9ab84470
monitor.c 128.8 KB