DPDK  26.07.0
rte_vhost.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2017 Intel Corporation
3  */
4 
5 #ifndef _RTE_VHOST_H_
6 #define _RTE_VHOST_H_
7 
13 #include <stdbool.h>
14 #include <stdint.h>
15 #include <sys/eventfd.h>
16 
17 #include <rte_compat.h>
18 #include <rte_memory.h>
19 #include <rte_mempool.h>
20 
21 #ifndef __cplusplus
22 /* These are not C++-aware. */
23 #include <linux/vhost.h>
24 #include <linux/virtio_ring.h>
25 #include <linux/virtio_net.h>
26 #endif
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 #define RTE_VHOST_USER_CLIENT (1ULL << 0)
33 #define RTE_VHOST_USER_NO_RECONNECT (1ULL << 1)
34 #define RTE_VHOST_USER_RESERVED_1 (1ULL << 2)
35 #define RTE_VHOST_USER_IOMMU_SUPPORT (1ULL << 3)
36 #define RTE_VHOST_USER_POSTCOPY_SUPPORT (1ULL << 4)
37 /* support mbuf with external buffer attached */
38 #define RTE_VHOST_USER_EXTBUF_SUPPORT (1ULL << 5)
39 /* support only linear buffers (no chained mbufs) */
40 #define RTE_VHOST_USER_LINEARBUF_SUPPORT (1ULL << 6)
41 #define RTE_VHOST_USER_ASYNC_COPY (1ULL << 7)
42 #define RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS (1ULL << 8)
43 #define RTE_VHOST_USER_NET_STATS_ENABLE (1ULL << 9)
44 #define RTE_VHOST_USER_ASYNC_CONNECT (1ULL << 10)
45 
46 /* Features. */
47 #ifndef VIRTIO_NET_F_GUEST_ANNOUNCE
48  #define VIRTIO_NET_F_GUEST_ANNOUNCE 21
49 #endif
50 
51 #ifndef VIRTIO_NET_F_MQ
52  #define VIRTIO_NET_F_MQ 22
53 #endif
54 
55 #ifndef VIRTIO_NET_F_MTU
56  #define VIRTIO_NET_F_MTU 3
57 #endif
58 
59 #ifndef VIRTIO_F_ANY_LAYOUT
60  #define VIRTIO_F_ANY_LAYOUT 27
61 #endif
62 
64 #ifndef VHOST_USER_PROTOCOL_F_MQ
65 #define VHOST_USER_PROTOCOL_F_MQ 0
66 #endif
67 
68 #ifndef VHOST_USER_PROTOCOL_F_LOG_SHMFD
69 #define VHOST_USER_PROTOCOL_F_LOG_SHMFD 1
70 #endif
71 
72 #ifndef VHOST_USER_PROTOCOL_F_RARP
73 #define VHOST_USER_PROTOCOL_F_RARP 2
74 #endif
75 
76 #ifndef VHOST_USER_PROTOCOL_F_REPLY_ACK
77 #define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
78 #endif
79 
80 #ifndef VHOST_USER_PROTOCOL_F_NET_MTU
81 #define VHOST_USER_PROTOCOL_F_NET_MTU 4
82 #endif
83 
84 #ifndef VHOST_USER_PROTOCOL_F_BACKEND_REQ
85 #define VHOST_USER_PROTOCOL_F_BACKEND_REQ 5
86 #endif
87 
88 #ifndef VHOST_USER_PROTOCOL_F_CRYPTO_SESSION
89 #define VHOST_USER_PROTOCOL_F_CRYPTO_SESSION 7
90 #endif
91 
92 #ifndef VHOST_USER_PROTOCOL_F_PAGEFAULT
93 #define VHOST_USER_PROTOCOL_F_PAGEFAULT 8
94 #endif
95 
96 #ifndef VHOST_USER_PROTOCOL_F_CONFIG
97 #define VHOST_USER_PROTOCOL_F_CONFIG 9
98 #endif
99 
100 #ifndef VHOST_USER_PROTOCOL_F_BACKEND_SEND_FD
101 #define VHOST_USER_PROTOCOL_F_BACKEND_SEND_FD 10
102 #endif
103 
104 #ifndef VHOST_USER_PROTOCOL_F_HOST_NOTIFIER
105 #define VHOST_USER_PROTOCOL_F_HOST_NOTIFIER 11
106 #endif
107 
108 #ifndef VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD
109 #define VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD 12
110 #endif
111 
112 #ifndef VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS
113 #define VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS 15
114 #endif
115 
116 #ifndef VHOST_USER_PROTOCOL_F_STATUS
117 #define VHOST_USER_PROTOCOL_F_STATUS 16
118 #endif
119 
121 #ifndef VHOST_USER_F_PROTOCOL_FEATURES
122 #define VHOST_USER_F_PROTOCOL_FEATURES 30
123 #endif
124 
125 #define RTE_MAX_VHOST_DEVICE 1024
126 
127 #define RTE_VHOST_VDPA_DEVICE_TYPE_NET 0
128 #define RTE_VHOST_VDPA_DEVICE_TYPE_BLK 1
129 
130 struct rte_vdpa_device;
131 
137  uint64_t guest_phys_addr;
138  uint64_t guest_user_addr;
139  uint64_t host_user_addr;
140  uint64_t size;
141  void *mmap_addr;
142  uint64_t mmap_size;
143  int fd;
144 };
145 
150  uint32_t nregions;
151  struct rte_vhost_mem_region regions[];
152 };
153 
154 struct rte_vhost_inflight_desc_split {
155  uint8_t inflight;
156  uint8_t padding[5];
157  uint16_t next;
158  uint64_t counter;
159 };
160 
161 struct rte_vhost_inflight_info_split {
162  uint64_t features;
163  uint16_t version;
164  uint16_t desc_num;
165  uint16_t last_inflight_io;
166  uint16_t used_idx;
167  struct rte_vhost_inflight_desc_split desc[];
168 };
169 
170 struct rte_vhost_inflight_desc_packed {
171  uint8_t inflight;
172  uint8_t padding;
173  uint16_t next;
174  uint16_t last;
175  uint16_t num;
176  uint64_t counter;
177  uint16_t id;
178  uint16_t flags;
179  uint32_t len;
180  uint64_t addr;
181 };
182 
183 struct rte_vhost_inflight_info_packed {
184  uint64_t features;
185  uint16_t version;
186  uint16_t desc_num;
187  uint16_t free_head;
188  uint16_t old_free_head;
189  uint16_t used_idx;
190  uint16_t old_used_idx;
191  uint8_t used_wrap_counter;
192  uint8_t old_used_wrap_counter;
193  uint8_t padding[7];
194  struct rte_vhost_inflight_desc_packed desc[];
195 };
196 
197 struct rte_vhost_resubmit_desc {
198  uint16_t index;
199  uint64_t counter;
200 };
201 
202 struct rte_vhost_resubmit_info {
203  struct rte_vhost_resubmit_desc *resubmit_list;
204  uint16_t resubmit_num;
205 };
206 
207 struct rte_vhost_ring_inflight {
208  union {
209  struct rte_vhost_inflight_info_split *inflight_split;
210  struct rte_vhost_inflight_info_packed *inflight_packed;
211  };
212 
213  struct rte_vhost_resubmit_info *resubmit_inflight;
214 };
215 
216 struct rte_vhost_vring {
217  union {
218  struct vring_desc *desc;
219  struct vring_packed_desc *desc_packed;
220  };
221  union {
222  struct vring_avail *avail;
223  struct vring_packed_desc_event *driver_event;
224  };
225  union {
226  struct vring_used *used;
227  struct vring_packed_desc_event *device_event;
228  };
229  uint64_t log_guest_addr;
230 
232  int callfd;
233 
234  int kickfd;
235  uint16_t size;
236 };
237 
242  /* Message handling failed */
243  RTE_VHOST_MSG_RESULT_ERR = -1,
244  /* Message handling successful */
245  RTE_VHOST_MSG_RESULT_OK = 0,
246  /* Message handling successful and reply prepared */
247  RTE_VHOST_MSG_RESULT_REPLY = 1,
248  /* Message not handled */
249  RTE_VHOST_MSG_RESULT_NOT_HANDLED,
250 };
251 
266 typedef enum rte_vhost_msg_result (*rte_vhost_msg_handle)(int vid, void *msg);
267 
272  /* Called prior to the frontend message handling. */
273  rte_vhost_msg_handle pre_msg_handle;
274  /* Called after the frontend message handling. */
275  rte_vhost_msg_handle post_msg_handle;
276 };
277 
282  int (*new_device)(int vid);
283  void (*destroy_device)(int vid);
285  int (*vring_state_changed)(int vid, uint16_t queue_id, int enable);
293  int (*features_changed)(int vid, uint64_t features);
294 
295  int (*new_connection)(int vid);
296  void (*destroy_connection)(int vid);
297 
304  void (*guest_notified)(int vid);
305 
312  bool (*guest_notify)(int vid, uint16_t queue_id);
313 };
314 
320  volatile void *addr;
325  uint64_t val;
327  uint64_t mask;
331  uint8_t size;
337  uint8_t match;
338 };
339 
341 #define RTE_VHOST_STATS_NAME_SIZE 64
342 
352  uint64_t id;
353  uint64_t value;
354 };
355 
364 };
365 
378 static __rte_always_inline uint64_t
380  uint64_t gpa, uint64_t *len)
381 {
382  struct rte_vhost_mem_region *r;
383  uint32_t i;
384 
385  for (i = 0; i < mem->nregions; i++) {
386  r = &mem->regions[i];
387  if (gpa >= r->guest_phys_addr &&
388  gpa < r->guest_phys_addr + r->size) {
389 
390  if (unlikely(*len > r->guest_phys_addr + r->size - gpa))
391  *len = r->guest_phys_addr + r->size - gpa;
392 
393  return gpa - r->guest_phys_addr +
394  r->host_user_addr;
395  }
396  }
397  *len = 0;
398 
399  return 0;
400 }
401 
402 #define RTE_VHOST_NEED_LOG(features) ((features) & (1ULL << VHOST_F_LOG_ALL))
403 
422 void rte_vhost_log_write(int vid, uint64_t addr, uint64_t len);
423 
442 void rte_vhost_log_used_vring(int vid, uint16_t vring_idx,
443  uint64_t offset, uint64_t len);
444 
445 int rte_vhost_enable_guest_notification(int vid, uint16_t queue_id, int enable);
446 
459 __rte_experimental
460 void rte_vhost_notify_guest(int vid, uint16_t queue_id);
461 
466 int rte_vhost_driver_register(const char *path, uint64_t flags);
467 
468 /* Unregister vhost driver. This is only meaningful to vhost user. */
469 int rte_vhost_driver_unregister(const char *path);
470 
481 int
482 rte_vhost_driver_attach_vdpa_device(const char *path,
483  struct rte_vdpa_device *dev);
484 
493 int
494 rte_vhost_driver_detach_vdpa_device(const char *path);
495 
504 struct rte_vdpa_device *
505 rte_vhost_driver_get_vdpa_device(const char *path);
506 
517 int
518 rte_vhost_driver_get_vdpa_dev_type(const char *path, uint32_t *type);
519 
530 int rte_vhost_driver_set_features(const char *path, uint64_t features);
531 
547 int rte_vhost_driver_enable_features(const char *path, uint64_t features);
548 
561 int rte_vhost_driver_disable_features(const char *path, uint64_t features);
562 
573 int rte_vhost_driver_get_features(const char *path, uint64_t *features);
574 
585 int
587  uint64_t protocol_features);
588 
599 int
601  uint64_t *protocol_features);
602 
613 int
614 rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num);
615 
628 int
629 rte_vhost_driver_set_max_queue_num(const char *path, uint32_t max_queue_pairs);
630 
641 int rte_vhost_get_negotiated_features(int vid, uint64_t *features);
642 
653 int
655  uint64_t *protocol_features);
656 
657 /* Register callbacks. */
658 int rte_vhost_driver_callback_register(const char *path,
659  struct rte_vhost_device_ops const * const ops);
660 
672 int rte_vhost_driver_start(const char *path);
673 
687 int rte_vhost_get_mtu(int vid, uint16_t *mtu);
688 
699 int rte_vhost_get_numa_node(int vid);
700 
710 uint16_t rte_vhost_get_vring_num(int vid);
711 
726 int rte_vhost_get_ifname(int vid, char *buf, size_t len);
727 
739 uint16_t rte_vhost_avail_entries(int vid, uint16_t queue_id);
740 
741 struct rte_mbuf;
742 struct rte_mempool;
759 uint16_t rte_vhost_enqueue_burst(int vid, uint16_t queue_id,
760  struct rte_mbuf **pkts, uint16_t count);
761 
779 uint16_t rte_vhost_dequeue_burst(int vid, uint16_t queue_id,
780  struct rte_mempool *mbuf_pool, struct rte_mbuf **pkts, uint16_t count);
781 
796 int rte_vhost_get_mem_table(int vid, struct rte_vhost_memory **mem);
797 
810 int rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx,
811  struct rte_vhost_vring *vring);
812 
825 int
826 rte_vhost_get_vhost_ring_inflight(int vid, uint16_t vring_idx,
827  struct rte_vhost_ring_inflight *vring);
828 
844 int
845 rte_vhost_set_inflight_desc_split(int vid, uint16_t vring_idx,
846  uint16_t idx);
847 
866 int
867 rte_vhost_set_inflight_desc_packed(int vid, uint16_t vring_idx,
868  uint16_t head, uint16_t last, uint16_t *inflight_entry);
869 
882 int
884  uint16_t vring_idx, uint16_t idx);
885 
901 int
903  uint16_t vring_idx, uint16_t head);
904 
919 int
920 rte_vhost_clr_inflight_desc_split(int vid, uint16_t vring_idx,
921  uint16_t last_used_idx, uint16_t idx);
922 
935 int
936 rte_vhost_clr_inflight_desc_packed(int vid, uint16_t vring_idx,
937  uint16_t head);
938 
950 int rte_vhost_vring_call(int vid, uint16_t vring_idx);
951 
964 int rte_vhost_vring_call_nonblock(int vid, uint16_t vring_idx);
965 
976 uint32_t rte_vhost_rx_queue_count(int vid, uint16_t qid);
977 
990 int
991 rte_vhost_get_monitor_addr(int vid, uint16_t queue_id,
992  struct rte_vhost_power_monitor_cond *pmc);
993 
1006 int
1007 rte_vhost_get_log_base(int vid, uint64_t *log_base, uint64_t *log_size);
1008 
1023 int
1024 rte_vhost_get_vring_base(int vid, uint16_t queue_id,
1025  uint16_t *last_avail_idx, uint16_t *last_used_idx);
1026 
1045 int
1047  uint16_t queue_id, uint16_t *last_avail_idx, uint16_t *last_used_idx);
1048 
1063 int
1064 rte_vhost_set_vring_base(int vid, uint16_t queue_id,
1065  uint16_t last_avail_idx, uint16_t last_used_idx);
1066 
1079 int
1081  struct rte_vhost_user_extern_ops const * const ops, void *ctx);
1082 
1091 struct rte_vdpa_device *
1092 rte_vhost_get_vdpa_device(int vid);
1093 
1104 int
1105 rte_vhost_backend_config_change(int vid, bool need_reply);
1106 
1130 int
1131 rte_vhost_vring_stats_get_names(int vid, uint16_t queue_id,
1132  struct rte_vhost_stat_name *name, unsigned int size);
1133 
1157 int
1158 rte_vhost_vring_stats_get(int vid, uint16_t queue_id,
1159  struct rte_vhost_stat *stats, unsigned int n);
1160 
1173 int
1174 rte_vhost_vring_stats_reset(int vid, uint16_t queue_id);
1175 
1176 #ifdef __cplusplus
1177 }
1178 #endif
1179 
1180 #endif /* _RTE_VHOST_H_ */
int rte_vhost_driver_start(const char *path)
#define __rte_always_inline
Definition: rte_common.h:506
int rte_vhost_driver_register(const char *path, uint64_t flags)
int(* new_device)(int vid)
Definition: rte_vhost.h:282
uint16_t rte_vhost_avail_entries(int vid, uint16_t queue_id)
int rte_vhost_vring_stats_reset(int vid, uint16_t queue_id)
int rte_vhost_driver_disable_features(const char *path, uint64_t features)
struct rte_vdpa_device * rte_vhost_get_vdpa_device(int vid)
void rte_vhost_log_used_vring(int vid, uint16_t vring_idx, uint64_t offset, uint64_t len)
#define RTE_VHOST_STATS_NAME_SIZE
Definition: rte_vhost.h:341
int rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx, struct rte_vhost_vring *vring)
int rte_vhost_set_inflight_desc_packed(int vid, uint16_t vring_idx, uint16_t head, uint16_t last, uint16_t *inflight_entry)
int rte_vhost_clr_inflight_desc_packed(int vid, uint16_t vring_idx, uint16_t head)
uint16_t rte_vhost_enqueue_burst(int vid, uint16_t queue_id, struct rte_mbuf **pkts, uint16_t count)
int rte_vhost_backend_config_change(int vid, bool need_reply)
int rte_vhost_get_vhost_ring_inflight(int vid, uint16_t vring_idx, struct rte_vhost_ring_inflight *vring)
int rte_vhost_driver_get_protocol_features(const char *path, uint64_t *protocol_features)
int rte_vhost_set_last_inflight_io_packed(int vid, uint16_t vring_idx, uint16_t head)
int rte_vhost_get_mtu(int vid, uint16_t *mtu)
int rte_vhost_driver_detach_vdpa_device(const char *path)
int rte_vhost_driver_set_protocol_features(const char *path, uint64_t protocol_features)
uint64_t id
Definition: rte_vhost.h:352
int rte_vhost_driver_get_vdpa_dev_type(const char *path, uint32_t *type)
int rte_vhost_vring_stats_get(int vid, uint16_t queue_id, struct rte_vhost_stat *stats, unsigned int n)
static __rte_always_inline uint64_t rte_vhost_va_from_guest_pa(struct rte_vhost_memory *mem, uint64_t gpa, uint64_t *len)
Definition: rte_vhost.h:379
#define unlikely(x)
uint16_t rte_vhost_get_vring_num(int vid)
int rte_vhost_extern_callback_register(int vid, struct rte_vhost_user_extern_ops const *const ops, void *ctx)
char name[RTE_VHOST_STATS_NAME_SIZE]
Definition: rte_vhost.h:363
int rte_vhost_get_numa_node(int vid)
int rte_vhost_set_inflight_desc_split(int vid, uint16_t vring_idx, uint16_t idx)
int rte_vhost_get_mem_table(int vid, struct rte_vhost_memory **mem)
__rte_experimental void rte_vhost_notify_guest(int vid, uint16_t queue_id)
int rte_vhost_driver_attach_vdpa_device(const char *path, struct rte_vdpa_device *dev)
void(* guest_notified)(int vid)
Definition: rte_vhost.h:304
int(* vring_state_changed)(int vid, uint16_t queue_id, int enable)
Definition: rte_vhost.h:285
int rte_vhost_set_last_inflight_io_split(int vid, uint16_t vring_idx, uint16_t idx)
int rte_vhost_vring_call(int vid, uint16_t vring_idx)
int rte_vhost_get_negotiated_features(int vid, uint64_t *features)
struct rte_vdpa_device * rte_vhost_driver_get_vdpa_device(const char *path)
rte_vhost_msg_result
Definition: rte_vhost.h:241
int rte_vhost_set_vring_base(int vid, uint16_t queue_id, uint16_t last_avail_idx, uint16_t last_used_idx)
int rte_vhost_clr_inflight_desc_split(int vid, uint16_t vring_idx, uint16_t last_used_idx, uint16_t idx)
int rte_vhost_get_log_base(int vid, uint64_t *log_base, uint64_t *log_size)
int rte_vhost_vring_stats_get_names(int vid, uint16_t queue_id, struct rte_vhost_stat_name *name, unsigned int size)
int rte_vhost_vring_call_nonblock(int vid, uint16_t vring_idx)
uint32_t rte_vhost_rx_queue_count(int vid, uint16_t qid)
int rte_vhost_get_negotiated_protocol_features(int vid, uint64_t *protocol_features)
uint64_t value
Definition: rte_vhost.h:353
uint16_t rte_vhost_dequeue_burst(int vid, uint16_t queue_id, struct rte_mempool *mbuf_pool, struct rte_mbuf **pkts, uint16_t count)
int rte_vhost_get_vring_base(int vid, uint16_t queue_id, uint16_t *last_avail_idx, uint16_t *last_used_idx)
bool(* guest_notify)(int vid, uint16_t queue_id)
Definition: rte_vhost.h:312
int rte_vhost_driver_get_features(const char *path, uint64_t *features)
int rte_vhost_get_monitor_addr(int vid, uint16_t queue_id, struct rte_vhost_power_monitor_cond *pmc)
int rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num)
int rte_vhost_driver_set_features(const char *path, uint64_t features)
int rte_vhost_get_ifname(int vid, char *buf, size_t len)
int rte_vhost_get_vring_base_from_inflight(int vid, uint16_t queue_id, uint16_t *last_avail_idx, uint16_t *last_used_idx)
int rte_vhost_driver_set_max_queue_num(const char *path, uint32_t max_queue_pairs)
int(* features_changed)(int vid, uint64_t features)
Definition: rte_vhost.h:293
enum rte_vhost_msg_result(* rte_vhost_msg_handle)(int vid, void *msg)
Definition: rte_vhost.h:266
int rte_vhost_driver_enable_features(const char *path, uint64_t features)
void rte_vhost_log_write(int vid, uint64_t addr, uint64_t len)
void(* destroy_device)(int vid)
Definition: rte_vhost.h:283