static irqreturn_t vu_req_read_message()

in drivers/virtio_uml.c [357:405]


static irqreturn_t vu_req_read_message(struct virtio_uml_device *vu_dev,
				       struct time_travel_event *ev)
{
	struct virtqueue *vq;
	int response = 1;
	struct {
		struct vhost_user_msg msg;
		u8 extra_payload[512];
	} msg;
	int rc;

	rc = vhost_user_recv_req(vu_dev, &msg.msg,
				 sizeof(msg.msg.payload) +
				 sizeof(msg.extra_payload));

	if (rc)
		return IRQ_NONE;

	switch (msg.msg.header.request) {
	case VHOST_USER_SLAVE_CONFIG_CHANGE_MSG:
		vu_dev->config_changed_irq = true;
		response = 0;
		break;
	case VHOST_USER_SLAVE_VRING_CALL:
		virtio_device_for_each_vq((&vu_dev->vdev), vq) {
			if (vq->index == msg.msg.payload.vring_state.index) {
				response = 0;
				vu_dev->vq_irq_vq_map |= BIT_ULL(vq->index);
				break;
			}
		}
		break;
	case VHOST_USER_SLAVE_IOTLB_MSG:
		/* not supported - VIRTIO_F_ACCESS_PLATFORM */
	case VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG:
		/* not supported - VHOST_USER_PROTOCOL_F_HOST_NOTIFIER */
	default:
		vu_err(vu_dev, "unexpected slave request %d\n",
		       msg.msg.header.request);
	}

	if (ev && !vu_dev->suspended)
		time_travel_add_irq_event(ev);

	if (msg.msg.header.flags & VHOST_USER_FLAG_NEED_REPLY)
		vhost_user_reply(vu_dev, &msg.msg, response);

	return IRQ_HANDLED;
}