• Dexuan Cui's avatar
    Tools: hv: Reopen the devices if read() or write() returns errors · 9fc3c01a
    Dexuan Cui authored
    The state machine in the hv_utils driver can run out of order in some
    corner cases, e.g. if the kvp daemon doesn't call write() fast enough
    due to some reason, kvp_timeout_func() can run first and move the state
    to HVUTIL_READY; next, when kvp_on_msg() is called it returns -EINVAL
    since kvp_transaction.state is smaller than HVUTIL_USERSPACE_REQ; later,
    the daemon's write() gets an error -EINVAL, and the daemon will exit().
    
    We can reproduce the issue by sending a SIGSTOP signal to the daemon, wait
    for 1 minute, and send a SIGCONT signal to the daemon: the daemon will
    exit() quickly.
    
    We can fix the issue by forcing a reset of the device (which means the
    daemon can close() and open() the device again) and doing extra necessary
    clean-up.
    Signed-off-by: default avatarDexuan Cui <decui@microsoft.com>
    Reviewed-by: default avatarMichael Kelley <mikelley@microsoft.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    9fc3c01a
hv_kvp_daemon.c 35.7 KB