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=b79a9f84aa67f67f0735917c8da6aa92d8e50cd6;hpb=f908b22ea47a84bd1cb5c644bc12f5307721cea6;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 b79a9f84aa..63424656e3 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -112,25 +112,11 @@ virtio_user_queue_setup(struct virtio_user_dev *dev, } int -virtio_user_start_device(struct virtio_user_dev *dev) +virtio_user_dev_set_features(struct virtio_user_dev *dev) { uint64_t features; - int ret; + int ret = -1; - /* - * XXX workaround! - * - * We need to make sure that the locks will be - * taken in the correct order to avoid deadlocks. - * - * Before releasing this lock, this thread should - * not trigger any memory hotplug events. - * - * This is a temporary workaround, and should be - * replaced when we get proper supports from the - * memory subsystem in the future. - */ - rte_mcfg_mem_read_lock(); pthread_mutex_lock(&dev->mutex); if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER && @@ -141,10 +127,8 @@ virtio_user_start_device(struct virtio_user_dev *dev) 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 */ @@ -154,6 +138,36 @@ virtio_user_start_device(struct virtio_user_dev *dev) 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) +{ + int ret; + + /* + * XXX workaround! + * + * We need to make sure that the locks will be + * taken in the correct order to avoid deadlocks. + * + * Before releasing this lock, this thread should + * not trigger any memory hotplug events. + * + * This is a temporary workaround, and should be + * replaced when we get proper supports from the + * memory subsystem in the future. + */ + rte_mcfg_mem_read_lock(); + pthread_mutex_lock(&dev->mutex); + + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER && + dev->vhostfd < 0) + goto error; /* Step 2: share memory regions */ ret = dev->ops->send_request(dev, VHOST_USER_SET_MEM_TABLE, NULL); @@ -784,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 (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) - 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)); @@ -805,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 (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) - 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"