Skip to content
  • Luiz Capitulino's avatar
    qemu-ga: guest-suspend: make the API synchronous · dc8764f0
    Luiz Capitulino authored
    
    
    Currently, qemu-ga has a SIGCHLD handler that automatically reaps terminated
    children processes. The idea is to avoid having qemu-ga commands blocked
    waiting for children to terminate.
    
    That approach has two problems:
    
     1. qemu-ga is unable to detect errors in the child, meaning that qemu-ga
        returns success even if the child fails to perform its task
    
     2. if a command does depend on the child exit status, the command has to
        play tricks to bypass the automatic reaper
    
    Case 2 impacts the guest-suspend-* API, because it has to execute an external
    program to check for suspend support. Today, to bypass the automatic reaper,
    suspend code has to double fork and pass exit status information through a
    pipe. Besides being complex, this is prone to race condition bugs. Indeed,
    the current code does have such bugs.
    
    Making the guest-suspend-* API synchronous (ie. by dropping the SIGCHLD
    handler and calling waitpid() from commands) is a much simpler approach,
    which fixes current race conditions bugs and enables commands to detect
    errors in the child.
    
    This commit does just that. There's a side effect though, guest-shutdown
    will generate zombies if shutting down fails. This will be fixed by the
    next commit.
    
    Signed-off-by: default avatarLuiz Capitulino <lcapitulino@redhat.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
    dc8764f0