* Copyright(c) 2010-2019 Intel Corporation
*/
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#include <pthread.h>
+#include <sched.h>
+
#include <stdint.h>
#include <unistd.h>
#include <stdbool.h>
*/
used->ring[used->idx & (vq->vring.size - 1)].id = task->req_idx;
used->ring[used->idx & (vq->vring.size - 1)].len = task->data_len;
- rte_smp_mb();
+ rte_atomic_thread_fence(__ATOMIC_SEQ_CST);
used->idx++;
- rte_smp_mb();
+ rte_atomic_thread_fence(__ATOMIC_SEQ_CST);
rte_vhost_clr_inflight_desc_split(task->ctrlr->vid,
vq->id, used->idx, task->req_idx);
desc->id = task->buffer_id;
desc->addr = 0;
- rte_smp_mb();
+ rte_atomic_thread_fence(__ATOMIC_SEQ_CST);
if (vq->used_wrap_counter)
desc->flags |= VIRTQ_DESC_F_AVAIL | VIRTQ_DESC_F_USED;
else
desc->flags &= ~(VIRTQ_DESC_F_AVAIL | VIRTQ_DESC_F_USED);
- rte_smp_mb();
+ rte_atomic_thread_fence(__ATOMIC_SEQ_CST);
rte_vhost_clr_inflight_desc_packed(task->ctrlr->vid, vq->id,
task->inflight_idx);
struct vhost_blk_ctrlr *ctrlr;
struct vhost_blk_queue *vq;
char path[PATH_MAX];
- uint64_t features;
+ uint64_t features, protocol_features;
pthread_t tid;
int i, ret;
- bool packed_ring;
+ bool packed_ring, inflight_shmfd;
ret = rte_vhost_get_ifname(vid, path, PATH_MAX);
if (ret) {
}
packed_ring = !!(features & (1ULL << VIRTIO_F_RING_PACKED));
+ ret = rte_vhost_get_negotiated_protocol_features(
+ vid, &protocol_features);
+ if (ret) {
+ fprintf(stderr,
+ "Failed to get the negotiated protocol features\n");
+ return -1;
+ }
+ inflight_shmfd = !!(features &
+ (1ULL << VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD));
+
/* Disable Notifications and init last idx */
for (i = 0; i < NUM_OF_BLK_QUEUES; i++) {
vq = &ctrlr->queues[i];
assert(rte_vhost_get_vring_base(ctrlr->vid, i,
&vq->last_avail_idx,
&vq->last_used_idx) == 0);
- assert(rte_vhost_get_vhost_ring_inflight(ctrlr->vid, i,
- &vq->inflight_ring) == 0);
- if (packed_ring) {
+ if (inflight_shmfd)
+ assert(rte_vhost_get_vhost_ring_inflight(
+ ctrlr->vid, i,
+ &vq->inflight_ring) == 0);
+
+ if (packed_ring && inflight_shmfd) {
/* for the reconnection */
assert(rte_vhost_get_vring_base_from_inflight(
ctrlr->vid, i,
/* start polling vring */
worker_thread_status = WORKER_STATE_START;
fprintf(stdout, "New Device %s, Device ID %d\n", path, vid);
- if (pthread_create(&tid, NULL, &ctrlr_worker, ctrlr) < 0) {
+ if (rte_ctrl_thread_create(&tid, "vhostblk-ctrlr", NULL,
+ &ctrlr_worker, ctrlr) != 0) {
fprintf(stderr, "Worker Thread Started Failed\n");
return -1;
}
signal(SIGINT, signal_handler);
- rte_vhost_driver_start(dev_pathname);
+ ret = rte_vhost_driver_start(dev_pathname);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to start vhost driver.\n");
+ return -1;
+ }
/* loop for exit the application */
while (1)