| 974 | }; |
| 975 | |
| 976 | static int |
| 977 | vhost_driver_setup(struct rte_eth_dev *eth_dev) |
| 978 | { |
| 979 | struct pmd_internal *internal = eth_dev->data->dev_private; |
| 980 | struct internal_list *list = NULL; |
| 981 | struct rte_vhost_vring_state *vring_state = NULL; |
| 982 | unsigned int numa_node = eth_dev->device->numa_node; |
| 983 | const char *name = eth_dev->device->name; |
| 984 | |
| 985 | /* Don't try to setup again if it has already been done. */ |
| 986 | list = find_internal_resource(internal->iface_name); |
| 987 | if (list) |
| 988 | return 0; |
| 989 | |
| 990 | list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node); |
| 991 | if (list == NULL) |
| 992 | return -1; |
| 993 | |
| 994 | vring_state = rte_zmalloc_socket(name, sizeof(*vring_state), |
| 995 | 0, numa_node); |
| 996 | if (vring_state == NULL) |
| 997 | goto free_list; |
| 998 | |
| 999 | list->eth_dev = eth_dev; |
| 1000 | pthread_mutex_lock(&internal_list_lock); |
| 1001 | TAILQ_INSERT_TAIL(&internal_list, list, next); |
| 1002 | pthread_mutex_unlock(&internal_list_lock); |
| 1003 | |
| 1004 | rte_spinlock_init(&vring_state->lock); |
| 1005 | vring_states[eth_dev->data->port_id] = vring_state; |
| 1006 | |
| 1007 | if (rte_vhost_driver_register(internal->iface_name, internal->flags)) |
| 1008 | goto list_remove; |
| 1009 | |
| 1010 | if (internal->disable_flags) { |
| 1011 | if (rte_vhost_driver_disable_features(internal->iface_name, |
| 1012 | internal->disable_flags)) |
| 1013 | goto drv_unreg; |
| 1014 | } |
| 1015 | |
| 1016 | if (rte_vhost_driver_set_max_queue_num(internal->iface_name, internal->max_queues)) |
| 1017 | goto drv_unreg; |
| 1018 | |
| 1019 | if (rte_vhost_driver_callback_register(internal->iface_name, |
| 1020 | &vhost_ops) < 0) { |
| 1021 | VHOST_LOG(ERR, "Can't register callbacks\n"); |
| 1022 | goto drv_unreg; |
| 1023 | } |
| 1024 | |
| 1025 | if (rte_vhost_driver_start(internal->iface_name) < 0) { |
| 1026 | VHOST_LOG(ERR, "Failed to start driver for %s\n", |
| 1027 | internal->iface_name); |
| 1028 | goto drv_unreg; |
| 1029 | } |
| 1030 | |
| 1031 | return 0; |
| 1032 | |
| 1033 | drv_unreg: |
no test coverage detected