2022-03-14 20:34:41 +03:00
|
|
|
/*
|
|
|
|
* vhost shadow virtqueue
|
|
|
|
*
|
|
|
|
* SPDX-FileCopyrightText: Red Hat, Inc. 2021
|
|
|
|
* SPDX-FileContributor: Author: Eugenio Pérez <eperezma@redhat.com>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef VHOST_SHADOW_VIRTQUEUE_H
|
|
|
|
#define VHOST_SHADOW_VIRTQUEUE_H
|
|
|
|
|
|
|
|
#include "qemu/event_notifier.h"
|
2022-03-14 20:34:45 +03:00
|
|
|
#include "hw/virtio/virtio.h"
|
|
|
|
#include "standard-headers/linux/vhost_types.h"
|
2022-03-14 20:34:41 +03:00
|
|
|
|
|
|
|
/* Shadow virtqueue to relay notifications */
|
|
|
|
typedef struct VhostShadowVirtqueue {
|
2022-03-14 20:34:45 +03:00
|
|
|
/* Shadow vring */
|
|
|
|
struct vring vring;
|
|
|
|
|
2022-03-14 20:34:41 +03:00
|
|
|
/* Shadow kick notifier, sent to vhost */
|
|
|
|
EventNotifier hdev_kick;
|
|
|
|
/* Shadow call notifier, sent to vhost */
|
|
|
|
EventNotifier hdev_call;
|
2022-03-14 20:34:42 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Borrowed virtqueue's guest to host notifier. To borrow it in this event
|
|
|
|
* notifier allows to recover the VhostShadowVirtqueue from the event loop
|
|
|
|
* easily. If we use the VirtQueue's one, we don't have an easy way to
|
|
|
|
* retrieve VhostShadowVirtqueue.
|
|
|
|
*
|
|
|
|
* So shadow virtqueue must not clean it, or we would lose VirtQueue one.
|
|
|
|
*/
|
|
|
|
EventNotifier svq_kick;
|
2022-03-14 20:34:43 +03:00
|
|
|
|
|
|
|
/* Guest's call notifier, where the SVQ calls guest. */
|
|
|
|
EventNotifier svq_call;
|
2022-03-14 20:34:41 +03:00
|
|
|
} VhostShadowVirtqueue;
|
|
|
|
|
2022-03-14 20:34:44 +03:00
|
|
|
bool vhost_svq_valid_features(uint64_t features, Error **errp);
|
|
|
|
|
2022-03-14 20:34:42 +03:00
|
|
|
void vhost_svq_set_svq_kick_fd(VhostShadowVirtqueue *svq, int svq_kick_fd);
|
2022-03-14 20:34:43 +03:00
|
|
|
void vhost_svq_set_svq_call_fd(VhostShadowVirtqueue *svq, int call_fd);
|
2022-03-14 20:34:45 +03:00
|
|
|
void vhost_svq_get_vring_addr(const VhostShadowVirtqueue *svq,
|
|
|
|
struct vhost_vring_addr *addr);
|
|
|
|
size_t vhost_svq_driver_area_size(const VhostShadowVirtqueue *svq);
|
|
|
|
size_t vhost_svq_device_area_size(const VhostShadowVirtqueue *svq);
|
2022-03-14 20:34:42 +03:00
|
|
|
|
|
|
|
void vhost_svq_stop(VhostShadowVirtqueue *svq);
|
|
|
|
|
2022-03-14 20:34:41 +03:00
|
|
|
VhostShadowVirtqueue *vhost_svq_new(void);
|
|
|
|
|
|
|
|
void vhost_svq_free(gpointer vq);
|
|
|
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(VhostShadowVirtqueue, vhost_svq_free);
|
|
|
|
|
|
|
|
#endif
|