X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fvhost%2Frte_eth_vhost.c;h=310cbefcf20bbb53b4c6b0f5eef023a40bf87954;hb=3e7bced6a6f29f980c4d72574bb0f4301f06e272;hp=4ee10c1aa1bbb4edde23ae6a0c7a2fb0fd61cc69;hpb=ee584e9710b9abd60ee9faef664e106dcea10085;p=dpdk.git diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 4ee10c1aa1..310cbefcf2 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -88,6 +88,7 @@ struct vhost_queue { struct pmd_internal { char *dev_name; char *iface_name; + uint16_t max_queues; volatile uint16_t once; }; @@ -109,7 +110,7 @@ static pthread_t session_th; static struct rte_eth_link pmd_link = { .link_speed = 10000, .link_duplex = ETH_LINK_FULL_DUPLEX, - .link_status = 0 + .link_status = ETH_LINK_DOWN }; struct rte_vhost_vring_state { @@ -228,6 +229,9 @@ new_device(struct virtio_net *dev) struct pmd_internal *internal; struct vhost_queue *vq; unsigned i; +#ifdef RTE_LIBRTE_VHOST_NUMA + int newnode, ret; +#endif if (dev == NULL) { RTE_LOG(INFO, PMD, "Invalid argument\n"); @@ -243,6 +247,17 @@ new_device(struct virtio_net *dev) eth_dev = list->eth_dev; internal = eth_dev->data->dev_private; +#ifdef RTE_LIBRTE_VHOST_NUMA + ret = get_mempolicy(&newnode, NULL, 0, dev, + MPOL_F_NODE | MPOL_F_ADDR); + if (ret < 0) { + RTE_LOG(ERR, PMD, "Unknown numa node\n"); + return -1; + } + + eth_dev->data->numa_node = newnode; +#endif + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { vq = eth_dev->data->rx_queues[i]; if (vq == NULL) @@ -250,7 +265,6 @@ new_device(struct virtio_net *dev) vq->device = dev; vq->internal = internal; vq->port = eth_dev->data->port_id; - rte_vhost_enable_guest_notification(dev, vq->virtqueue_id, 0); } for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { vq = eth_dev->data->tx_queues[i]; @@ -259,12 +273,14 @@ new_device(struct virtio_net *dev) vq->device = dev; vq->internal = internal; vq->port = eth_dev->data->port_id; - rte_vhost_enable_guest_notification(dev, vq->virtqueue_id, 0); } + for (i = 0; i < dev->virt_qp_nb * VIRTIO_QNUM; i++) + rte_vhost_enable_guest_notification(dev, i, 0); + dev->flags |= VIRTIO_DEV_RUNNING; dev->priv = eth_dev; - eth_dev->data->dev_link.link_status = 1; + eth_dev->data->dev_link.link_status = ETH_LINK_UP; for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { vq = eth_dev->data->rx_queues[i]; @@ -322,7 +338,7 @@ destroy_device(volatile struct virtio_net *dev) rte_pause(); } - eth_dev->data->dev_link.link_status = 0; + eth_dev->data->dev_link.link_status = ETH_LINK_DOWN; dev->priv = NULL; dev->flags &= ~VIRTIO_DEV_RUNNING; @@ -351,9 +367,6 @@ vring_state_changed(struct virtio_net *dev, uint16_t vring, int enable) struct rte_vhost_vring_state *state; struct rte_eth_dev *eth_dev; struct internal_list *list; -#ifdef RTE_LIBRTE_VHOST_NUMA - int newnode, ret; -#endif if (dev == NULL) { RTE_LOG(ERR, PMD, "Invalid argument\n"); @@ -369,17 +382,6 @@ vring_state_changed(struct virtio_net *dev, uint16_t vring, int enable) eth_dev = list->eth_dev; /* won't be NULL */ state = vring_states[eth_dev->data->port_id]; - -#ifdef RTE_LIBRTE_VHOST_NUMA - ret = get_mempolicy(&newnode, NULL, 0, dev, - MPOL_F_NODE | MPOL_F_ADDR); - if (ret < 0) { - RTE_LOG(ERR, PMD, "Unknown numa node\n"); - return -1; - } - - eth_dev->data->numa_node = newnode; -#endif rte_spinlock_lock(&state->lock); state->cur[vring] = enable; state->max_vring = RTE_MAX(vring, state->max_vring); @@ -554,11 +556,19 @@ static void eth_dev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) { + struct pmd_internal *internal; + + internal = dev->data->dev_private; + if (internal == NULL) { + RTE_LOG(ERR, PMD, "Invalid device specified\n"); + return; + } + dev_info->driver_name = drivername; dev_info->max_mac_addrs = 1; dev_info->max_rx_pktlen = (uint32_t)-1; - dev_info->max_rx_queues = dev->data->nb_rx_queues; - dev_info->max_tx_queues = dev->data->nb_tx_queues; + dev_info->max_rx_queues = internal->max_queues; + dev_info->max_tx_queues = internal->max_queues; dev_info->min_rx_bufsize = 0; } @@ -750,6 +760,7 @@ eth_dev_vhost_create(const char *name, char *iface_name, int16_t queues, memmove(data->name, eth_dev->data->name, sizeof(data->name)); data->nb_rx_queues = queues; data->nb_tx_queues = queues; + internal->max_queues = queues; data->dev_link = pmd_link; data->mac_addrs = eth_addr;