#define VHOST_BACKEND_F_IOTLB_BATCH 2
#endif
-extern const char * const vhost_msg_strings[VHOST_USER_MAX];
-
struct vhost_memory_region {
uint64_t guest_phys_addr;
uint64_t memory_size; /* bytes */
int (*set_vring_addr)(struct virtio_user_dev *dev, struct vhost_vring_addr *addr);
int (*get_status)(struct virtio_user_dev *dev, uint8_t *status);
int (*set_status)(struct virtio_user_dev *dev, uint8_t status);
- int (*send_request)(struct virtio_user_dev *dev,
- enum vhost_user_request req,
- void *arg);
- int (*enable_qp)(struct virtio_user_dev *dev,
- uint16_t pair_idx,
- int enable);
- int (*dma_map)(struct virtio_user_dev *dev, void *addr,
- uint64_t iova, size_t len);
- int (*dma_unmap)(struct virtio_user_dev *dev, void *addr,
- uint64_t iova, size_t len);
+ int (*enable_qp)(struct virtio_user_dev *dev, uint16_t pair_idx, int enable);
+ int (*dma_map)(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len);
+ int (*dma_unmap)(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len);
};
extern struct virtio_user_backend_ops virtio_ops_user;
return -ENOTSUP;
}
-static uint64_t vhost_req_user_to_kernel[] = {
- [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER,
-};
-
-static int
-vhost_kernel_send_request(struct virtio_user_dev *dev,
- enum vhost_user_request req,
- void *arg)
-{
- int ret = -1;
- unsigned int i;
- uint64_t req_kernel;
- int vhostfd;
-
- PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);
-
- req_kernel = vhost_req_user_to_kernel[req];
-
- switch (req_kernel) {
- default:
- vhostfd = -1;
- }
- if (vhostfd == -1) {
- for (i = 0; i < dev->max_queue_pairs; ++i) {
- if (dev->vhostfds[i] < 0)
- continue;
-
- ret = ioctl(dev->vhostfds[i], req_kernel, arg);
- if (ret < 0)
- break;
- }
- } else {
- ret = ioctl(vhostfd, req_kernel, arg);
- }
-
- if (ret < 0)
- PMD_DRV_LOG(ERR, "%s failed: %s",
- vhost_msg_strings[req], strerror(errno));
-
- return ret;
-}
-
/**
* Set up environment to talk with a vhost kernel backend.
*
.set_vring_addr = vhost_kernel_set_vring_addr,
.get_status = vhost_kernel_get_status,
.set_status = vhost_kernel_set_status,
- .send_request = vhost_kernel_send_request,
.enable_qp = vhost_kernel_enable_queue_pair
};
return vhost_user_check_reply_ack(dev, &msg);
}
-static struct vhost_user_msg m;
-
-const char * const vhost_msg_strings[] = {
- [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER",
-};
-
-static int
-vhost_user_sock(struct virtio_user_dev *dev,
- enum vhost_user_request req,
- void *arg)
-{
- struct vhost_user_msg msg;
- struct vhost_vring_file *file = 0;
- int need_reply = 0;
- int fds[VHOST_MEMORY_MAX_NREGIONS];
- int fd_num = 0;
- int vhostfd = dev->vhostfd;
-
- RTE_SET_USED(m);
-
- PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);
-
- if (dev->is_server && vhostfd < 0)
- return -1;
-
- msg.request = req;
- msg.flags = VHOST_USER_VERSION;
- msg.size = 0;
-
- switch (req) {
- case VHOST_USER_SET_LOG_BASE:
- msg.payload.u64 = *((__u64 *)arg);
- msg.size = sizeof(m.payload.u64);
- break;
-
- case VHOST_USER_SET_FEATURES:
- msg.payload.u64 = *((__u64 *)arg) | (dev->device_features &
- (1ULL << VHOST_USER_F_PROTOCOL_FEATURES));
- msg.size = sizeof(m.payload.u64);
- break;
-
- case VHOST_USER_RESET_OWNER:
- break;
-
- case VHOST_USER_SET_LOG_FD:
- fds[fd_num++] = *((int *)arg);
- break;
-
- case VHOST_USER_SET_VRING_ERR:
- file = arg;
- msg.payload.u64 = file->index & VHOST_USER_VRING_IDX_MASK;
- msg.size = sizeof(m.payload.u64);
- if (file->fd > 0)
- fds[fd_num++] = file->fd;
- else
- msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK;
- break;
-
- default:
- PMD_DRV_LOG(ERR, "trying to send unhandled msg type");
- return -1;
- }
-
- if (vhost_user_write(vhostfd, &msg, fds, fd_num) < 0) {
- PMD_DRV_LOG(ERR, "%s failed: %s",
- vhost_msg_strings[req], strerror(errno));
- return -1;
- }
-
- if (need_reply || msg.flags & VHOST_USER_NEED_REPLY_MASK) {
- if (vhost_user_read(vhostfd, &msg) < 0) {
- PMD_DRV_LOG(ERR, "Received msg failed: %s",
- strerror(errno));
- return -1;
- }
-
- if (req != msg.request) {
- PMD_DRV_LOG(ERR, "Received unexpected msg type");
- return -1;
- }
-
- switch (req) {
- default:
- /* Reply-ack handling */
- if (msg.size != sizeof(m.payload.u64)) {
- PMD_DRV_LOG(ERR, "Received bad msg size");
- return -1;
- }
-
- if (msg.payload.u64 != 0) {
- PMD_DRV_LOG(ERR, "Slave replied NACK");
- return -1;
- }
-
- break;
- }
- }
-
- return 0;
-}
-
#define MAX_VIRTIO_USER_BACKLOG 1
static int
virtio_user_start_server(struct virtio_user_dev *dev, struct sockaddr_un *un)
.set_vring_addr = vhost_user_set_vring_addr,
.get_status = vhost_user_get_status,
.set_status = vhost_user_set_status,
- .send_request = vhost_user_sock,
.enable_qp = vhost_user_enable_queue_pair
};
#define VHOST_SET_BACKEND_FEATURES _IOW(VHOST_VIRTIO, 0x25, __u64)
#define VHOST_GET_BACKEND_FEATURES _IOR(VHOST_VIRTIO, 0x26, __u64)
-static uint64_t vhost_req_user_to_vdpa[] = {
- [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER,
-};
-
/* no alignment requirement */
struct vhost_iotlb_msg {
uint64_t iova;
return vhost_vdpa_ioctl(dev->vhostfd, VHOST_VDPA_SET_STATUS, &status);
}
-/* with below features, vhost vdpa does not need to do the checksum and TSO,
- * these info will be passed to virtio_user through virtio net header.
- */
-#define VHOST_VDPA_GUEST_OFFLOADS_MASK \
- ((1ULL << VIRTIO_NET_F_GUEST_CSUM) | \
- (1ULL << VIRTIO_NET_F_GUEST_TSO4) | \
- (1ULL << VIRTIO_NET_F_GUEST_TSO6) | \
- (1ULL << VIRTIO_NET_F_GUEST_ECN) | \
- (1ULL << VIRTIO_NET_F_GUEST_UFO))
-
-#define VHOST_VDPA_HOST_OFFLOADS_MASK \
- ((1ULL << VIRTIO_NET_F_HOST_TSO4) | \
- (1ULL << VIRTIO_NET_F_HOST_TSO6) | \
- (1ULL << VIRTIO_NET_F_CSUM))
-
-static int
-vhost_vdpa_send_request(struct virtio_user_dev *dev,
- enum vhost_user_request req,
- void *arg)
-{
- int ret = -1;
- uint64_t req_vdpa;
-
- PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);
-
- req_vdpa = vhost_req_user_to_vdpa[req];
-
- switch (req_vdpa) {
- case VHOST_SET_VRING_ADDR:
- PMD_DRV_LOG(DEBUG, "vhostfd=%d, index=%u",
- dev->vhostfd, *(unsigned int *)arg);
- break;
- default:
- break;
- }
-
- ret = ioctl(dev->vhostfd, req_vdpa, arg);
- if (ret < 0)
- PMD_DRV_LOG(ERR, "%s failed: %s",
- vhost_msg_strings[req], strerror(errno));
-
- return ret;
-}
-
/**
* Set up environment to talk with a vhost vdpa backend.
*
.set_vring_addr = vhost_vdpa_set_vring_addr,
.get_status = vhost_vdpa_get_status,
.set_status = vhost_vdpa_set_status,
- .send_request = vhost_vdpa_send_request,
.enable_qp = vhost_vdpa_enable_queue_pair,
.dma_map = vhost_vdpa_dma_map_batch,
.dma_unmap = vhost_vdpa_dma_unmap_batch,