vhost.h (4926B)
1#ifndef VHOST_H 2#define VHOST_H 3 4#include "hw/virtio/vhost-backend.h" 5#include "hw/virtio/virtio.h" 6#include "exec/memory.h" 7 8/* Generic structures common for any vhost based device. */ 9 10struct vhost_inflight { 11 int fd; 12 void *addr; 13 uint64_t size; 14 uint64_t offset; 15 uint16_t queue_size; 16}; 17 18struct vhost_virtqueue { 19 int kick; 20 int call; 21 void *desc; 22 void *avail; 23 void *used; 24 int num; 25 unsigned long long desc_phys; 26 unsigned desc_size; 27 unsigned long long avail_phys; 28 unsigned avail_size; 29 unsigned long long used_phys; 30 unsigned used_size; 31 EventNotifier masked_notifier; 32 struct vhost_dev *dev; 33}; 34 35typedef unsigned long vhost_log_chunk_t; 36#define VHOST_LOG_PAGE 0x1000 37#define VHOST_LOG_BITS (8 * sizeof(vhost_log_chunk_t)) 38#define VHOST_LOG_CHUNK (VHOST_LOG_PAGE * VHOST_LOG_BITS) 39#define VHOST_INVALID_FEATURE_BIT (0xff) 40 41struct vhost_log { 42 unsigned long long size; 43 int refcnt; 44 int fd; 45 vhost_log_chunk_t *log; 46}; 47 48struct vhost_dev; 49struct vhost_iommu { 50 struct vhost_dev *hdev; 51 MemoryRegion *mr; 52 hwaddr iommu_offset; 53 IOMMUNotifier n; 54 QLIST_ENTRY(vhost_iommu) iommu_next; 55}; 56 57typedef struct VhostDevConfigOps { 58 /* Vhost device config space changed callback 59 */ 60 int (*vhost_dev_config_notifier)(struct vhost_dev *dev); 61} VhostDevConfigOps; 62 63struct vhost_memory; 64struct vhost_dev { 65 VirtIODevice *vdev; 66 MemoryListener memory_listener; 67 MemoryListener iommu_listener; 68 struct vhost_memory *mem; 69 int n_mem_sections; 70 MemoryRegionSection *mem_sections; 71 int n_tmp_sections; 72 MemoryRegionSection *tmp_sections; 73 struct vhost_virtqueue *vqs; 74 unsigned int nvqs; 75 /* the first virtqueue which would be used by this vhost dev */ 76 int vq_index; 77 /* if non-zero, minimum required value for max_queues */ 78 int num_queues; 79 uint64_t features; 80 uint64_t acked_features; 81 uint64_t backend_features; 82 uint64_t protocol_features; 83 uint64_t max_queues; 84 uint64_t backend_cap; 85 bool started; 86 bool log_enabled; 87 uint64_t log_size; 88 Error *migration_blocker; 89 const VhostOps *vhost_ops; 90 void *opaque; 91 struct vhost_log *log; 92 QLIST_ENTRY(vhost_dev) entry; 93 QLIST_HEAD(, vhost_iommu) iommu_list; 94 IOMMUNotifier n; 95 const VhostDevConfigOps *config_ops; 96}; 97 98extern const VhostOps kernel_ops; 99extern const VhostOps user_ops; 100extern const VhostOps vdpa_ops; 101 102struct vhost_net { 103 struct vhost_dev dev; 104 struct vhost_virtqueue vqs[2]; 105 int backend; 106 NetClientState *nc; 107}; 108 109int vhost_dev_init(struct vhost_dev *hdev, void *opaque, 110 VhostBackendType backend_type, 111 uint32_t busyloop_timeout, Error **errp); 112void vhost_dev_cleanup(struct vhost_dev *hdev); 113int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev); 114void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev); 115int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev); 116void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev); 117 118/* Test and clear masked event pending status. 119 * Should be called after unmask to avoid losing events. 120 */ 121bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n); 122 123/* Mask/unmask events from this vq. 124 */ 125void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n, 126 bool mask); 127uint64_t vhost_get_features(struct vhost_dev *hdev, const int *feature_bits, 128 uint64_t features); 129void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits, 130 uint64_t features); 131bool vhost_has_free_slot(void); 132 133int vhost_net_set_backend(struct vhost_dev *hdev, 134 struct vhost_vring_file *file); 135 136int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write); 137int vhost_dev_get_config(struct vhost_dev *hdev, uint8_t *config, 138 uint32_t config_len, Error **errp); 139int vhost_dev_set_config(struct vhost_dev *dev, const uint8_t *data, 140 uint32_t offset, uint32_t size, uint32_t flags); 141/* notifier callback in case vhost device config space changed 142 */ 143void vhost_dev_set_config_notifier(struct vhost_dev *dev, 144 const VhostDevConfigOps *ops); 145 146void vhost_dev_reset_inflight(struct vhost_inflight *inflight); 147void vhost_dev_free_inflight(struct vhost_inflight *inflight); 148void vhost_dev_save_inflight(struct vhost_inflight *inflight, QEMUFile *f); 149int vhost_dev_load_inflight(struct vhost_inflight *inflight, QEMUFile *f); 150int vhost_dev_prepare_inflight(struct vhost_dev *hdev, VirtIODevice *vdev); 151int vhost_dev_set_inflight(struct vhost_dev *dev, 152 struct vhost_inflight *inflight); 153int vhost_dev_get_inflight(struct vhost_dev *dev, uint16_t queue_size, 154 struct vhost_inflight *inflight); 155#endif