in vdpa_user/vduse_dev.c [190:226]
static int vduse_dev_msg_sync(struct vduse_dev *dev,
struct vduse_dev_msg *msg)
{
int ret;
if (unlikely(dev->broken))
return -EIO;
init_waitqueue_head(&msg->waitq);
spin_lock(&dev->msg_lock);
if (unlikely(dev->broken)) {
spin_unlock(&dev->msg_lock);
return -EIO;
}
msg->req.request_id = dev->msg_unique++;
vduse_enqueue_msg(&dev->send_list, msg);
wake_up(&dev->waitq);
spin_unlock(&dev->msg_lock);
if (dev->msg_timeout)
ret = wait_event_killable_timeout(msg->waitq, msg->completed,
(long)dev->msg_timeout * HZ);
else
ret = wait_event_killable(msg->waitq, msg->completed);
spin_lock(&dev->msg_lock);
if (!msg->completed) {
list_del(&msg->list);
msg->resp.result = VDUSE_REQ_RESULT_FAILED;
/* Mark the device as malfunction when there is a timeout */
if (!ret)
vduse_dev_broken(dev);
}
ret = (msg->resp.result == VDUSE_REQ_RESULT_OK) ? 0 : -EIO;
spin_unlock(&dev->msg_lock);
return ret;
}