X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fvirtio%2Fvirtio_user%2Fvirtio_user_dev.c;h=63424656e3c1a8e55640e97320aa4fe92aed9f8b;hb=844e4683718742b28a7708cc00f7ee7246f92d7b;hp=2a0c8610859a4e1a6935b89e0ec1e923d44309d5;hpb=0b0dc66c72774fc5de721f1ecf726f6fcb102dbe;p=dpdk.git diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 2a0c861085..63424656e3 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -112,20 +112,41 @@ virtio_user_queue_setup(struct virtio_user_dev *dev, } int -is_vhost_user_by_type(const char *path) +virtio_user_dev_set_features(struct virtio_user_dev *dev) { - struct stat sb; + uint64_t features; + int ret = -1; - if (stat(path, &sb) == -1) - return 0; + pthread_mutex_lock(&dev->mutex); + + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER && + dev->vhostfd < 0) + goto error; + + /* Step 0: tell vhost to create queues */ + if (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0) + goto error; + + features = dev->features; - return S_ISSOCK(sb.st_mode); + /* Strip VIRTIO_NET_F_MAC, as MAC address is handled in vdev init */ + features &= ~(1ull << VIRTIO_NET_F_MAC); + /* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to know */ + features &= ~(1ull << VIRTIO_NET_F_CTRL_VQ); + features &= ~(1ull << VIRTIO_NET_F_STATUS); + ret = dev->ops->send_request(dev, VHOST_USER_SET_FEATURES, &features); + if (ret < 0) + goto error; + PMD_DRV_LOG(INFO, "set features: %" PRIx64, features); +error: + pthread_mutex_unlock(&dev->mutex); + + return ret; } int virtio_user_start_device(struct virtio_user_dev *dev) { - uint64_t features; int ret; /* @@ -144,27 +165,10 @@ virtio_user_start_device(struct virtio_user_dev *dev) rte_mcfg_mem_read_lock(); pthread_mutex_lock(&dev->mutex); - if (is_vhost_user_by_type(dev->path) && dev->vhostfd < 0) + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER && + dev->vhostfd < 0) goto error; - /* Step 0: tell vhost to create queues */ - if (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0) - goto error; - - /* Step 1: negotiate protocol features & set features */ - features = dev->features; - - - /* Strip VIRTIO_NET_F_MAC, as MAC address is handled in vdev init */ - features &= ~(1ull << VIRTIO_NET_F_MAC); - /* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to know */ - features &= ~(1ull << VIRTIO_NET_F_CTRL_VQ); - features &= ~(1ull << VIRTIO_NET_F_STATUS); - ret = dev->ops->send_request(dev, VHOST_USER_SET_FEATURES, &features); - if (ret < 0) - goto error; - PMD_DRV_LOG(INFO, "set features: %" PRIx64, features); - /* Step 2: share memory regions */ ret = dev->ops->send_request(dev, VHOST_USER_SET_MEM_TABLE, NULL); if (ret < 0) @@ -360,16 +364,16 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) dev->tapfds = NULL; if (dev->is_server) { - if (access(dev->path, F_OK) == 0 && - !is_vhost_user_by_type(dev->path)) { - PMD_DRV_LOG(ERR, "Server mode doesn't support vhost-kernel!"); + if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) { + PMD_DRV_LOG(ERR, "Server mode only supports vhost-user!"); return -1; } dev->ops = &virtio_ops_user; } else { - if (is_vhost_user_by_type(dev->path)) { + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) { dev->ops = &virtio_ops_user; - } else { + } else if (dev->backend_type == + VIRTIO_USER_BACKEND_VHOST_KERNEL) { dev->ops = &virtio_ops_kernel; dev->vhostfds = malloc(dev->max_queue_pairs * @@ -430,7 +434,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, int cq, int queue_size, const char *mac, char **ifname, - int server, int mrg_rxbuf, int in_order, int packed_vq) + int server, int mrg_rxbuf, int in_order, int packed_vq, + enum virtio_user_backend_type backend_type) { uint64_t protocol_features = 0; @@ -445,6 +450,8 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, dev->frontend_features = 0; dev->unsupported_features = ~VIRTIO_USER_SUPPORTED_FEATURES; dev->protocol_features = VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES; + dev->backend_type = backend_type; + parse_mac(dev, mac); if (*ifname) { @@ -457,7 +464,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, return -1; } - if (!is_vhost_user_by_type(dev->path)) + if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) dev->unsupported_features |= (1ULL << VHOST_USER_F_PROTOCOL_FEATURES); @@ -539,7 +546,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, } /* The backend will not report this feature, we add it explicitly */ - if (is_vhost_user_by_type(dev->path)) + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) dev->frontend_features |= (1ull << VIRTIO_NET_F_STATUS); /* @@ -791,14 +798,15 @@ virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status) int ret; uint64_t arg = status; - /* Vhost-user only for now */ - if (!is_vhost_user_by_type(dev->path)) - return 0; - - if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) + ret = dev->ops->send_request(dev, + VHOST_USER_SET_STATUS, &arg); + else if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_VDPA) + ret = dev->ops->send_request(dev, + VHOST_USER_SET_STATUS, &status); + else return 0; - ret = dev->ops->send_request(dev, VHOST_USER_SET_STATUS, &arg); if (ret) { PMD_INIT_LOG(ERR, "VHOST_USER_SET_STATUS failed (%d): %s", ret, strerror(errno)); @@ -812,27 +820,32 @@ int virtio_user_update_status(struct virtio_user_dev *dev) { uint64_t ret; + uint8_t status; int err; - /* Vhost-user only for now */ - if (!is_vhost_user_by_type(dev->path)) - return 0; + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) { + err = dev->ops->send_request(dev, VHOST_USER_GET_STATUS, &ret); + if (!err && ret > UINT8_MAX) { + PMD_INIT_LOG(ERR, "Invalid VHOST_USER_GET_STATUS " + "response 0x%" PRIx64 "\n", ret); + return -1; + } - if (!(dev->protocol_features & (1UL << VHOST_USER_PROTOCOL_F_STATUS))) + status = ret; + } else if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_VDPA) { + err = dev->ops->send_request(dev, VHOST_USER_GET_STATUS, + &status); + } else { return 0; + } - err = dev->ops->send_request(dev, VHOST_USER_GET_STATUS, &ret); if (err) { PMD_INIT_LOG(ERR, "VHOST_USER_GET_STATUS failed (%d): %s", err, strerror(errno)); return -1; } - if (ret > UINT8_MAX) { - PMD_INIT_LOG(ERR, "Invalid VHOST_USER_GET_STATUS response 0x%" PRIx64 "\n", ret); - return -1; - } - dev->status = ret; + dev->status = status; PMD_INIT_LOG(DEBUG, "Updated Device Status(0x%08x):\n" "\t-RESET: %u\n" "\t-ACKNOWLEDGE: %u\n"