2017-12-19 15:49:01 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
* Copyright(c) 2010-2016 Intel Corporation
|
2016-06-15 09:03:24 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <unistd.h>
|
2017-03-31 19:44:58 +00:00
|
|
|
#include <fcntl.h>
|
|
|
|
#include <sys/socket.h>
|
2016-06-15 09:03:24 +00:00
|
|
|
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
#include <rte_malloc.h>
|
|
|
|
#include <rte_kvargs.h>
|
2017-04-11 15:44:12 +00:00
|
|
|
#include <rte_ethdev_vdev.h>
|
2017-11-07 06:54:21 +00:00
|
|
|
#include <rte_bus_vdev.h>
|
2017-03-31 19:44:58 +00:00
|
|
|
#include <rte_alarm.h>
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
|
|
|
#include "virtio_ethdev.h"
|
2016-06-15 09:03:24 +00:00
|
|
|
#include "virtio_logs.h"
|
|
|
|
#include "virtio_pci.h"
|
|
|
|
#include "virtqueue.h"
|
2016-06-15 09:07:17 +00:00
|
|
|
#include "virtio_rxtx.h"
|
2016-06-15 09:03:24 +00:00
|
|
|
#include "virtio_user/virtio_user_dev.h"
|
|
|
|
|
|
|
|
#define virtio_user_get_dev(hw) \
|
|
|
|
((struct virtio_user_dev *)(hw)->virtio_user_dev)
|
|
|
|
|
2018-04-06 09:25:54 +00:00
|
|
|
static int
|
|
|
|
virtio_user_server_reconnect(struct virtio_user_dev *dev)
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
int connectfd;
|
|
|
|
struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];
|
|
|
|
|
|
|
|
connectfd = accept(dev->listenfd, NULL, NULL);
|
|
|
|
if (connectfd < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
dev->vhostfd = connectfd;
|
2018-05-11 03:31:37 +00:00
|
|
|
if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES,
|
|
|
|
&dev->device_features) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "get_features failed: %s",
|
|
|
|
strerror(errno));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2018-10-29 05:28:06 +00:00
|
|
|
dev->device_features |= dev->frontend_features;
|
|
|
|
|
2018-07-02 13:56:36 +00:00
|
|
|
/* umask vhost-user unsupported features */
|
|
|
|
dev->device_features &= ~(dev->unsupported_features);
|
2018-05-11 03:31:37 +00:00
|
|
|
|
|
|
|
dev->features &= dev->device_features;
|
|
|
|
|
2018-04-06 09:25:54 +00:00
|
|
|
ret = virtio_user_start_device(dev);
|
|
|
|
if (ret < 0)
|
|
|
|
return -1;
|
|
|
|
|
2018-05-11 03:31:37 +00:00
|
|
|
if (dev->queue_pairs > 1) {
|
|
|
|
ret = virtio_user_handle_mq(dev, dev->queue_pairs);
|
|
|
|
if (ret != 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "Fails to enable multi-queue pairs!");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
2018-04-06 09:25:54 +00:00
|
|
|
if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) {
|
|
|
|
if (rte_intr_disable(eth_dev->intr_handle) < 0) {
|
|
|
|
PMD_DRV_LOG(ERR, "interrupt disable failed");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
rte_intr_callback_unregister(eth_dev->intr_handle,
|
|
|
|
virtio_interrupt_handler,
|
|
|
|
eth_dev);
|
|
|
|
eth_dev->intr_handle->fd = connectfd;
|
|
|
|
rte_intr_callback_register(eth_dev->intr_handle,
|
|
|
|
virtio_interrupt_handler, eth_dev);
|
|
|
|
|
|
|
|
if (rte_intr_enable(eth_dev->intr_handle) < 0) {
|
|
|
|
PMD_DRV_LOG(ERR, "interrupt enable failed");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PMD_INIT_LOG(NOTICE, "server mode virtio-user reconnection succeeds!");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-03-31 19:44:58 +00:00
|
|
|
static void
|
|
|
|
virtio_user_delayed_handler(void *param)
|
|
|
|
{
|
|
|
|
struct virtio_hw *hw = (struct virtio_hw *)param;
|
2018-04-06 09:25:54 +00:00
|
|
|
struct rte_eth_dev *eth_dev = &rte_eth_devices[hw->port_id];
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
2017-03-31 19:44:58 +00:00
|
|
|
|
2018-04-06 09:25:54 +00:00
|
|
|
if (rte_intr_disable(eth_dev->intr_handle) < 0) {
|
|
|
|
PMD_DRV_LOG(ERR, "interrupt disable failed");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
rte_intr_callback_unregister(eth_dev->intr_handle,
|
|
|
|
virtio_interrupt_handler, eth_dev);
|
|
|
|
if (dev->is_server) {
|
|
|
|
if (dev->vhostfd >= 0) {
|
|
|
|
close(dev->vhostfd);
|
|
|
|
dev->vhostfd = -1;
|
|
|
|
}
|
|
|
|
eth_dev->intr_handle->fd = dev->listenfd;
|
|
|
|
rte_intr_callback_register(eth_dev->intr_handle,
|
|
|
|
virtio_interrupt_handler, eth_dev);
|
|
|
|
if (rte_intr_enable(eth_dev->intr_handle) < 0) {
|
|
|
|
PMD_DRV_LOG(ERR, "interrupt enable failed");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2017-03-31 19:44:58 +00:00
|
|
|
}
|
|
|
|
|
2016-06-15 09:03:24 +00:00
|
|
|
static void
|
|
|
|
virtio_user_read_dev_config(struct virtio_hw *hw, size_t offset,
|
|
|
|
void *dst, int length)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
|
|
|
if (offset == offsetof(struct virtio_net_config, mac) &&
|
|
|
|
length == ETHER_ADDR_LEN) {
|
|
|
|
for (i = 0; i < ETHER_ADDR_LEN; ++i)
|
|
|
|
((uint8_t *)dst)[i] = dev->mac_addr[i];
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-03-31 19:44:58 +00:00
|
|
|
if (offset == offsetof(struct virtio_net_config, status)) {
|
|
|
|
char buf[128];
|
|
|
|
|
|
|
|
if (dev->vhostfd >= 0) {
|
|
|
|
int r;
|
|
|
|
int flags;
|
|
|
|
|
|
|
|
flags = fcntl(dev->vhostfd, F_GETFL);
|
2017-10-24 08:17:38 +00:00
|
|
|
if (fcntl(dev->vhostfd, F_SETFL,
|
|
|
|
flags | O_NONBLOCK) == -1) {
|
|
|
|
PMD_DRV_LOG(ERR, "error setting O_NONBLOCK flag");
|
|
|
|
return;
|
|
|
|
}
|
2017-03-31 19:44:58 +00:00
|
|
|
r = recv(dev->vhostfd, buf, 128, MSG_PEEK);
|
|
|
|
if (r == 0 || (r < 0 && errno != EAGAIN)) {
|
|
|
|
dev->status &= (~VIRTIO_NET_S_LINK_UP);
|
|
|
|
PMD_DRV_LOG(ERR, "virtio-user port %u is down",
|
|
|
|
hw->port_id);
|
2018-04-06 09:25:54 +00:00
|
|
|
|
|
|
|
/* This function could be called in the process
|
|
|
|
* of interrupt handling, callback cannot be
|
|
|
|
* unregistered here, set an alarm to do it.
|
2017-03-31 19:44:58 +00:00
|
|
|
*/
|
|
|
|
rte_eal_alarm_set(1,
|
|
|
|
virtio_user_delayed_handler,
|
|
|
|
(void *)hw);
|
|
|
|
} else {
|
|
|
|
dev->status |= VIRTIO_NET_S_LINK_UP;
|
|
|
|
}
|
2017-11-14 10:39:56 +00:00
|
|
|
if (fcntl(dev->vhostfd, F_SETFL,
|
|
|
|
flags & ~O_NONBLOCK) == -1) {
|
|
|
|
PMD_DRV_LOG(ERR, "error clearing O_NONBLOCK flag");
|
|
|
|
return;
|
|
|
|
}
|
2018-04-06 09:25:54 +00:00
|
|
|
} else if (dev->is_server) {
|
|
|
|
dev->status &= (~VIRTIO_NET_S_LINK_UP);
|
|
|
|
if (virtio_user_server_reconnect(dev) >= 0)
|
|
|
|
dev->status |= VIRTIO_NET_S_LINK_UP;
|
2017-03-31 19:44:58 +00:00
|
|
|
}
|
2018-04-06 09:25:54 +00:00
|
|
|
|
2016-06-15 09:03:24 +00:00
|
|
|
*(uint16_t *)dst = dev->status;
|
2017-03-31 19:44:58 +00:00
|
|
|
}
|
2016-06-15 09:03:24 +00:00
|
|
|
|
|
|
|
if (offset == offsetof(struct virtio_net_config, max_virtqueue_pairs))
|
|
|
|
*(uint16_t *)dst = dev->max_queue_pairs;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
virtio_user_write_dev_config(struct virtio_hw *hw, size_t offset,
|
|
|
|
const void *src, int length)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
|
|
|
if ((offset == offsetof(struct virtio_net_config, mac)) &&
|
|
|
|
(length == ETHER_ADDR_LEN))
|
|
|
|
for (i = 0; i < ETHER_ADDR_LEN; ++i)
|
|
|
|
dev->mac_addr[i] = ((const uint8_t *)src)[i];
|
|
|
|
else
|
2017-01-27 15:16:32 +00:00
|
|
|
PMD_DRV_LOG(ERR, "not supported offset=%zu, len=%d",
|
2016-06-15 09:03:24 +00:00
|
|
|
offset, length);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2017-01-13 12:18:35 +00:00
|
|
|
virtio_user_reset(struct virtio_hw *hw)
|
2016-06-15 09:03:24 +00:00
|
|
|
{
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
2017-01-13 12:18:35 +00:00
|
|
|
if (dev->status & VIRTIO_CONFIG_STATUS_DRIVER_OK)
|
|
|
|
virtio_user_stop_device(dev);
|
2016-06-15 09:03:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2017-01-13 12:18:35 +00:00
|
|
|
virtio_user_set_status(struct virtio_hw *hw, uint8_t status)
|
2016-06-15 09:03:24 +00:00
|
|
|
{
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
2017-01-13 12:18:35 +00:00
|
|
|
if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK)
|
|
|
|
virtio_user_start_device(dev);
|
|
|
|
else if (status == VIRTIO_CONFIG_STATUS_RESET)
|
|
|
|
virtio_user_reset(hw);
|
|
|
|
dev->status = status;
|
2016-06-15 09:03:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static uint8_t
|
|
|
|
virtio_user_get_status(struct virtio_hw *hw)
|
|
|
|
{
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
|
|
|
return dev->status;
|
|
|
|
}
|
|
|
|
|
|
|
|
static uint64_t
|
|
|
|
virtio_user_get_features(struct virtio_hw *hw)
|
|
|
|
{
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
2017-01-13 12:18:34 +00:00
|
|
|
/* unmask feature bits defined in vhost user protocol */
|
|
|
|
return dev->device_features & VIRTIO_PMD_SUPPORTED_GUEST_FEATURES;
|
2016-06-15 09:03:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
virtio_user_set_features(struct virtio_hw *hw, uint64_t features)
|
|
|
|
{
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
2017-01-13 12:18:34 +00:00
|
|
|
dev->features = features & dev->device_features;
|
2016-06-15 09:03:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static uint8_t
|
|
|
|
virtio_user_get_isr(struct virtio_hw *hw __rte_unused)
|
|
|
|
{
|
2017-03-31 19:44:57 +00:00
|
|
|
/* rxq interrupts and config interrupt are separated in virtio-user,
|
|
|
|
* here we only report config change.
|
2016-06-15 09:03:24 +00:00
|
|
|
*/
|
2017-03-31 19:44:57 +00:00
|
|
|
return VIRTIO_PCI_ISR_CONFIG;
|
2016-06-15 09:03:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static uint16_t
|
|
|
|
virtio_user_set_config_irq(struct virtio_hw *hw __rte_unused,
|
|
|
|
uint16_t vec __rte_unused)
|
|
|
|
{
|
2017-03-31 19:44:57 +00:00
|
|
|
return 0;
|
2016-06-15 09:03:24 +00:00
|
|
|
}
|
|
|
|
|
2017-03-31 19:44:56 +00:00
|
|
|
static uint16_t
|
|
|
|
virtio_user_set_queue_irq(struct virtio_hw *hw __rte_unused,
|
|
|
|
struct virtqueue *vq __rte_unused,
|
|
|
|
uint16_t vec)
|
|
|
|
{
|
|
|
|
/* pretend we have done that */
|
|
|
|
return vec;
|
|
|
|
}
|
|
|
|
|
2016-06-15 09:03:24 +00:00
|
|
|
/* This function is to get the queue size, aka, number of descs, of a specified
|
|
|
|
* queue. Different with the VHOST_USER_GET_QUEUE_NUM, which is used to get the
|
|
|
|
* max supported queues.
|
|
|
|
*/
|
|
|
|
static uint16_t
|
|
|
|
virtio_user_get_queue_num(struct virtio_hw *hw, uint16_t queue_id __rte_unused)
|
|
|
|
{
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
|
|
|
/* Currently, each queue has same queue size */
|
|
|
|
return dev->queue_size;
|
|
|
|
}
|
|
|
|
|
2019-01-11 09:39:29 +00:00
|
|
|
static void
|
|
|
|
virtio_user_setup_queue_packed(struct virtqueue *vq,
|
|
|
|
struct virtio_user_dev *dev)
|
|
|
|
{
|
|
|
|
uint16_t queue_idx = vq->vq_queue_index;
|
|
|
|
struct vring_packed *vring;
|
|
|
|
uint64_t desc_addr;
|
|
|
|
uint64_t avail_addr;
|
|
|
|
uint64_t used_addr;
|
|
|
|
uint16_t i;
|
|
|
|
|
|
|
|
vring = &dev->packed_vrings[queue_idx];
|
|
|
|
desc_addr = (uintptr_t)vq->vq_ring_virt_mem;
|
|
|
|
avail_addr = desc_addr + vq->vq_nentries *
|
|
|
|
sizeof(struct vring_packed_desc);
|
|
|
|
used_addr = RTE_ALIGN_CEIL(avail_addr +
|
|
|
|
sizeof(struct vring_packed_desc_event),
|
|
|
|
VIRTIO_PCI_VRING_ALIGN);
|
|
|
|
vring->num = vq->vq_nentries;
|
2019-03-19 06:43:08 +00:00
|
|
|
vring->desc = (void *)(uintptr_t)desc_addr;
|
|
|
|
vring->driver = (void *)(uintptr_t)avail_addr;
|
|
|
|
vring->device = (void *)(uintptr_t)used_addr;
|
2019-01-11 09:39:29 +00:00
|
|
|
dev->packed_queues[queue_idx].avail_wrap_counter = true;
|
|
|
|
dev->packed_queues[queue_idx].used_wrap_counter = true;
|
|
|
|
|
2019-01-22 17:01:41 +00:00
|
|
|
for (i = 0; i < vring->num; i++)
|
2019-03-19 06:43:08 +00:00
|
|
|
vring->desc[i].flags = 0;
|
2019-01-11 09:39:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
virtio_user_setup_queue_split(struct virtqueue *vq, struct virtio_user_dev *dev)
|
2016-06-15 09:03:24 +00:00
|
|
|
{
|
|
|
|
uint16_t queue_idx = vq->vq_queue_index;
|
|
|
|
uint64_t desc_addr, avail_addr, used_addr;
|
|
|
|
|
|
|
|
desc_addr = (uintptr_t)vq->vq_ring_virt_mem;
|
|
|
|
avail_addr = desc_addr + vq->vq_nentries * sizeof(struct vring_desc);
|
|
|
|
used_addr = RTE_ALIGN_CEIL(avail_addr + offsetof(struct vring_avail,
|
|
|
|
ring[vq->vq_nentries]),
|
|
|
|
VIRTIO_PCI_VRING_ALIGN);
|
|
|
|
|
|
|
|
dev->vrings[queue_idx].num = vq->vq_nentries;
|
|
|
|
dev->vrings[queue_idx].desc = (void *)(uintptr_t)desc_addr;
|
|
|
|
dev->vrings[queue_idx].avail = (void *)(uintptr_t)avail_addr;
|
|
|
|
dev->vrings[queue_idx].used = (void *)(uintptr_t)used_addr;
|
2019-01-11 09:39:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
virtio_user_setup_queue(struct virtio_hw *hw, struct virtqueue *vq)
|
|
|
|
{
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
|
|
|
if (vtpci_packed_queue(hw))
|
|
|
|
virtio_user_setup_queue_packed(vq, dev);
|
|
|
|
else
|
|
|
|
virtio_user_setup_queue_split(vq, dev);
|
2016-06-15 09:03:24 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
virtio_user_del_queue(struct virtio_hw *hw, struct virtqueue *vq)
|
|
|
|
{
|
|
|
|
/* For legacy devices, write 0 to VIRTIO_PCI_QUEUE_PFN port, QEMU
|
|
|
|
* correspondingly stops the ioeventfds, and reset the status of
|
|
|
|
* the device.
|
|
|
|
* For modern devices, set queue desc, avail, used in PCI bar to 0,
|
|
|
|
* not see any more behavior in QEMU.
|
|
|
|
*
|
|
|
|
* Here we just care about what information to deliver to vhost-user
|
|
|
|
* or vhost-kernel. So we just close ioeventfd for now.
|
|
|
|
*/
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
|
|
|
close(dev->callfds[vq->vq_queue_index]);
|
|
|
|
close(dev->kickfds[vq->vq_queue_index]);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
virtio_user_notify_queue(struct virtio_hw *hw, struct virtqueue *vq)
|
|
|
|
{
|
|
|
|
uint64_t buf = 1;
|
|
|
|
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
|
|
|
|
|
2016-06-15 09:07:17 +00:00
|
|
|
if (hw->cvq && (hw->cvq->vq == vq)) {
|
2019-01-11 09:39:29 +00:00
|
|
|
if (vtpci_packed_queue(vq->hw))
|
|
|
|
virtio_user_handle_cq_packed(dev, vq->vq_queue_index);
|
|
|
|
else
|
|
|
|
virtio_user_handle_cq(dev, vq->vq_queue_index);
|
2016-06-15 09:07:17 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-06-15 09:03:24 +00:00
|
|
|
if (write(dev->kickfds[vq->vq_queue_index], &buf, sizeof(buf)) < 0)
|
2017-01-27 15:16:32 +00:00
|
|
|
PMD_DRV_LOG(ERR, "failed to kick backend: %s",
|
2016-06-15 09:03:24 +00:00
|
|
|
strerror(errno));
|
|
|
|
}
|
|
|
|
|
net/virtio: fix multiple process support
The introduce of virtio 1.0 support brings yet another set of ops, badly,
it's not handled correctly, that it breaks the multiple process support.
The issue is the data/function pointer may vary from different processes,
and the old used to do one time set (for primary process only). That
said, the function pointer the secondary process saw is actually from the
primary process space. Accessing it could likely result to a crash.
Kudos to the last patches, we now be able to maintain those info that may
vary among different process locally, meaning every process could have its
own copy for each of them, with the correct value set. And this is what
this patch does:
- remap the PCI (IO port for legacy device and memory map for modern
device)
- set vtpci_ops correctly
After that, multiple process would work like a charm. (At least, it
passed my fuzzy test)
Fixes: b8f04520ad71 ("virtio: use PCI ioport API")
Fixes: d5bbeefca826 ("virtio: introduce PCI implementation structure")
Fixes: 6ba1f63b5ab0 ("virtio: support specification 1.0")
Cc: stable@dpdk.org
Reported-by: Juho Snellman <jsnell@iki.fi>
Reported-by: Yaron Illouz <yaroni@radcom.com>
Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2017-01-06 10:16:19 +00:00
|
|
|
const struct virtio_pci_ops virtio_user_ops = {
|
2016-06-15 09:03:24 +00:00
|
|
|
.read_dev_cfg = virtio_user_read_dev_config,
|
|
|
|
.write_dev_cfg = virtio_user_write_dev_config,
|
|
|
|
.get_status = virtio_user_get_status,
|
|
|
|
.set_status = virtio_user_set_status,
|
|
|
|
.get_features = virtio_user_get_features,
|
|
|
|
.set_features = virtio_user_set_features,
|
|
|
|
.get_isr = virtio_user_get_isr,
|
|
|
|
.set_config_irq = virtio_user_set_config_irq,
|
2017-03-31 19:44:56 +00:00
|
|
|
.set_queue_irq = virtio_user_set_queue_irq,
|
2016-06-15 09:03:24 +00:00
|
|
|
.get_queue_num = virtio_user_get_queue_num,
|
|
|
|
.setup_queue = virtio_user_setup_queue,
|
|
|
|
.del_queue = virtio_user_del_queue,
|
|
|
|
.notify_queue = virtio_user_notify_queue,
|
|
|
|
};
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
|
|
|
static const char *valid_args[] = {
|
|
|
|
#define VIRTIO_USER_ARG_QUEUES_NUM "queues"
|
|
|
|
VIRTIO_USER_ARG_QUEUES_NUM,
|
|
|
|
#define VIRTIO_USER_ARG_CQ_NUM "cq"
|
|
|
|
VIRTIO_USER_ARG_CQ_NUM,
|
|
|
|
#define VIRTIO_USER_ARG_MAC "mac"
|
|
|
|
VIRTIO_USER_ARG_MAC,
|
|
|
|
#define VIRTIO_USER_ARG_PATH "path"
|
|
|
|
VIRTIO_USER_ARG_PATH,
|
|
|
|
#define VIRTIO_USER_ARG_QUEUE_SIZE "queue_size"
|
|
|
|
VIRTIO_USER_ARG_QUEUE_SIZE,
|
2017-03-28 17:20:00 +00:00
|
|
|
#define VIRTIO_USER_ARG_INTERFACE_NAME "iface"
|
|
|
|
VIRTIO_USER_ARG_INTERFACE_NAME,
|
2018-07-02 13:56:37 +00:00
|
|
|
#define VIRTIO_USER_ARG_SERVER_MODE "server"
|
2018-04-06 09:25:54 +00:00
|
|
|
VIRTIO_USER_ARG_SERVER_MODE,
|
2018-07-02 13:56:37 +00:00
|
|
|
#define VIRTIO_USER_ARG_MRG_RXBUF "mrg_rxbuf"
|
|
|
|
VIRTIO_USER_ARG_MRG_RXBUF,
|
|
|
|
#define VIRTIO_USER_ARG_IN_ORDER "in_order"
|
|
|
|
VIRTIO_USER_ARG_IN_ORDER,
|
2019-01-03 02:40:06 +00:00
|
|
|
#define VIRTIO_USER_ARG_PACKED_VQ "packed_vq"
|
2018-12-17 21:31:37 +00:00
|
|
|
VIRTIO_USER_ARG_PACKED_VQ,
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
#define VIRTIO_USER_DEF_CQ_EN 0
|
|
|
|
#define VIRTIO_USER_DEF_Q_NUM 1
|
|
|
|
#define VIRTIO_USER_DEF_Q_SZ 256
|
2018-04-06 09:25:54 +00:00
|
|
|
#define VIRTIO_USER_DEF_SERVER_MODE 0
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
|
|
|
static int
|
|
|
|
get_string_arg(const char *key __rte_unused,
|
|
|
|
const char *value, void *extra_args)
|
|
|
|
{
|
|
|
|
if (!value || !extra_args)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
*(char **)extra_args = strdup(value);
|
|
|
|
|
2017-03-28 17:20:00 +00:00
|
|
|
if (!*(char **)extra_args)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
get_integer_arg(const char *key __rte_unused,
|
|
|
|
const char *value, void *extra_args)
|
|
|
|
{
|
|
|
|
if (!value || !extra_args)
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
*(uint64_t *)extra_args = strtoull(value, NULL, 0);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-11-21 18:06:14 +00:00
|
|
|
static struct rte_vdev_driver virtio_user_driver;
|
|
|
|
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
static struct rte_eth_dev *
|
2017-04-11 15:44:12 +00:00
|
|
|
virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev)
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
{
|
|
|
|
struct rte_eth_dev *eth_dev;
|
|
|
|
struct rte_eth_dev_data *data;
|
|
|
|
struct virtio_hw *hw;
|
|
|
|
struct virtio_user_dev *dev;
|
|
|
|
|
2017-04-11 15:44:12 +00:00
|
|
|
eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*hw));
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
if (!eth_dev) {
|
|
|
|
PMD_INIT_LOG(ERR, "cannot alloc rte_eth_dev");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
data = eth_dev->data;
|
2017-04-11 15:44:12 +00:00
|
|
|
hw = eth_dev->data->dev_private;
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
|
|
|
dev = rte_zmalloc(NULL, sizeof(*dev), 0);
|
|
|
|
if (!dev) {
|
|
|
|
PMD_INIT_LOG(ERR, "malloc virtio_user_dev failed");
|
|
|
|
rte_eth_dev_release_port(eth_dev);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
net/virtio: store PCI operators pointer locally
We used to store the vtpci_ops at virtio_hw structure. The struct,
however, is stored in shared memory. That means only one value is
allowed. For the multiple process model, however, the address of
vtpci_ops should be different among different processes.
Take virtio PMD as example, the vtpci_ops is set by the primary
process, based on its own process space. If we access that address
from the secondary process, that would be an illegal memory access,
A crash then might happen.
To make the multiple process model work, we need store the vtpci_ops
in local memory but not in a shared memory. This is what the patch
does: a local virtio_hw_internal array of size RTE_MAX_ETHPORTS is
allocated. This new structure is used to store all these kind of
info in a non-shared memory. Current, we have:
- vtpci_ops
- rte_pci_ioport
- virtio pci mapped memory, such as common_cfg.
The later two will be done in coming patches. Later patches would also
set them correctly for secondary process, so that the multiple process
model could work.
Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2017-01-06 10:16:17 +00:00
|
|
|
hw->port_id = data->port_id;
|
2017-03-31 19:44:56 +00:00
|
|
|
dev->port_id = data->port_id;
|
net/virtio: store PCI operators pointer locally
We used to store the vtpci_ops at virtio_hw structure. The struct,
however, is stored in shared memory. That means only one value is
allowed. For the multiple process model, however, the address of
vtpci_ops should be different among different processes.
Take virtio PMD as example, the vtpci_ops is set by the primary
process, based on its own process space. If we access that address
from the secondary process, that would be an illegal memory access,
A crash then might happen.
To make the multiple process model work, we need store the vtpci_ops
in local memory but not in a shared memory. This is what the patch
does: a local virtio_hw_internal array of size RTE_MAX_ETHPORTS is
allocated. This new structure is used to store all these kind of
info in a non-shared memory. Current, we have:
- vtpci_ops
- rte_pci_ioport
- virtio pci mapped memory, such as common_cfg.
The later two will be done in coming patches. Later patches would also
set them correctly for secondary process, so that the multiple process
model could work.
Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2017-01-06 10:16:17 +00:00
|
|
|
virtio_hw_internal[hw->port_id].vtpci_ops = &virtio_user_ops;
|
2017-03-31 19:44:58 +00:00
|
|
|
/*
|
|
|
|
* MSIX is required to enable LSC (see virtio_init_device).
|
|
|
|
* Here just pretend that we support msix.
|
|
|
|
*/
|
|
|
|
hw->use_msix = 1;
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
hw->modern = 0;
|
2017-09-07 12:13:46 +00:00
|
|
|
hw->use_simple_rx = 0;
|
2018-07-02 13:56:35 +00:00
|
|
|
hw->use_inorder_rx = 0;
|
|
|
|
hw->use_inorder_tx = 0;
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
hw->virtio_user_dev = dev;
|
|
|
|
return eth_dev;
|
|
|
|
}
|
|
|
|
|
2016-09-27 19:11:06 +00:00
|
|
|
static void
|
|
|
|
virtio_user_eth_dev_free(struct rte_eth_dev *eth_dev)
|
|
|
|
{
|
|
|
|
struct rte_eth_dev_data *data = eth_dev->data;
|
|
|
|
struct virtio_hw *hw = data->dev_private;
|
|
|
|
|
|
|
|
rte_free(hw->virtio_user_dev);
|
|
|
|
rte_eth_dev_release_port(eth_dev);
|
|
|
|
}
|
|
|
|
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
/* Dev initialization routine. Invoked once for each virtio vdev at
|
2017-06-23 04:14:45 +00:00
|
|
|
* EAL init time, see rte_bus_probe().
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
* Returns 0 on success.
|
|
|
|
*/
|
|
|
|
static int
|
2017-04-11 15:44:13 +00:00
|
|
|
virtio_user_pmd_probe(struct rte_vdev_device *dev)
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
{
|
2016-06-29 09:05:35 +00:00
|
|
|
struct rte_kvargs *kvlist = NULL;
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
struct rte_eth_dev *eth_dev;
|
|
|
|
struct virtio_hw *hw;
|
|
|
|
uint64_t queues = VIRTIO_USER_DEF_Q_NUM;
|
|
|
|
uint64_t cq = VIRTIO_USER_DEF_CQ_EN;
|
|
|
|
uint64_t queue_size = VIRTIO_USER_DEF_Q_SZ;
|
2018-04-06 09:25:54 +00:00
|
|
|
uint64_t server_mode = VIRTIO_USER_DEF_SERVER_MODE;
|
2018-07-02 13:56:37 +00:00
|
|
|
uint64_t mrg_rxbuf = 1;
|
|
|
|
uint64_t in_order = 1;
|
2019-01-03 02:40:06 +00:00
|
|
|
uint64_t packed_vq = 0;
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
char *path = NULL;
|
2017-03-28 17:20:00 +00:00
|
|
|
char *ifname = NULL;
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
char *mac_addr = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
|
2019-03-25 04:12:15 +00:00
|
|
|
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
|
|
|
|
const char *name = rte_vdev_device_name(dev);
|
|
|
|
eth_dev = rte_eth_dev_attach_secondary(name);
|
|
|
|
if (!eth_dev) {
|
|
|
|
RTE_LOG(ERR, PMD, "Failed to probe %s\n", name);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (eth_virtio_dev_init(eth_dev) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "eth_virtio_dev_init fails");
|
|
|
|
rte_eth_dev_release_port(eth_dev);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
eth_dev->dev_ops = &virtio_user_secondary_eth_dev_ops;
|
|
|
|
eth_dev->device = &dev->device;
|
|
|
|
rte_eth_dev_probing_finish(eth_dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-04-11 15:44:13 +00:00
|
|
|
kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), valid_args);
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
if (!kvlist) {
|
|
|
|
PMD_INIT_LOG(ERR, "error when parsing param");
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
2016-07-12 09:30:25 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_PATH) == 1) {
|
2016-09-27 19:11:06 +00:00
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_PATH,
|
|
|
|
&get_string_arg, &path) < 0) {
|
2016-06-29 09:05:33 +00:00
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_PATH);
|
|
|
|
goto end;
|
|
|
|
}
|
2016-07-12 09:30:25 +00:00
|
|
|
} else {
|
2017-01-27 15:16:32 +00:00
|
|
|
PMD_INIT_LOG(ERR, "arg %s is mandatory for virtio_user",
|
2018-11-06 06:40:22 +00:00
|
|
|
VIRTIO_USER_ARG_PATH);
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
2017-03-28 17:20:00 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_INTERFACE_NAME) == 1) {
|
|
|
|
if (is_vhost_user_by_type(path)) {
|
|
|
|
PMD_INIT_LOG(ERR,
|
|
|
|
"arg %s applies only to vhost-kernel backend",
|
|
|
|
VIRTIO_USER_ARG_INTERFACE_NAME);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_INTERFACE_NAME,
|
|
|
|
&get_string_arg, &ifname) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_INTERFACE_NAME);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-29 09:05:33 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_MAC) == 1) {
|
2016-09-27 19:11:06 +00:00
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_MAC,
|
|
|
|
&get_string_arg, &mac_addr) < 0) {
|
2016-06-29 09:05:33 +00:00
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_MAC);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
2016-06-29 09:05:33 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_QUEUE_SIZE) == 1) {
|
2016-09-27 19:11:06 +00:00
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_QUEUE_SIZE,
|
|
|
|
&get_integer_arg, &queue_size) < 0) {
|
2016-06-29 09:05:33 +00:00
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_QUEUE_SIZE);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
2016-06-29 09:05:33 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_QUEUES_NUM) == 1) {
|
2016-09-27 19:11:06 +00:00
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_QUEUES_NUM,
|
|
|
|
&get_integer_arg, &queues) < 0) {
|
2016-06-29 09:05:33 +00:00
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_QUEUES_NUM);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
2018-04-06 09:25:54 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_SERVER_MODE) == 1) {
|
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_SERVER_MODE,
|
|
|
|
&get_integer_arg, &server_mode) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_SERVER_MODE);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-29 09:05:33 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_CQ_NUM) == 1) {
|
2016-09-27 19:11:06 +00:00
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_CQ_NUM,
|
|
|
|
&get_integer_arg, &cq) < 0) {
|
2016-06-29 09:05:33 +00:00
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_CQ_NUM);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
} else if (queues > 1) {
|
2016-06-15 09:07:17 +00:00
|
|
|
cq = 1;
|
2016-06-29 09:05:33 +00:00
|
|
|
}
|
2016-06-15 09:07:17 +00:00
|
|
|
|
2018-12-17 21:31:37 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_PACKED_VQ) == 1) {
|
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_PACKED_VQ,
|
|
|
|
&get_integer_arg, &packed_vq) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_PACKED_VQ);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-15 09:07:17 +00:00
|
|
|
if (queues > 1 && cq == 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "multi-q requires ctrl-q");
|
|
|
|
goto end;
|
|
|
|
}
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
2017-03-14 10:09:56 +00:00
|
|
|
if (queues > VIRTIO_MAX_VIRTQUEUE_PAIRS) {
|
|
|
|
PMD_INIT_LOG(ERR, "arg %s %" PRIu64 " exceeds the limit %u",
|
|
|
|
VIRTIO_USER_ARG_QUEUES_NUM, queues,
|
|
|
|
VIRTIO_MAX_VIRTQUEUE_PAIRS);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
2018-07-02 13:56:37 +00:00
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_MRG_RXBUF) == 1) {
|
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_MRG_RXBUF,
|
|
|
|
&get_integer_arg, &mrg_rxbuf) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_MRG_RXBUF);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_IN_ORDER) == 1) {
|
|
|
|
if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_IN_ORDER,
|
|
|
|
&get_integer_arg, &in_order) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "error to parse %s",
|
|
|
|
VIRTIO_USER_ARG_IN_ORDER);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-25 04:12:15 +00:00
|
|
|
eth_dev = virtio_user_eth_dev_alloc(dev);
|
|
|
|
if (!eth_dev) {
|
|
|
|
PMD_INIT_LOG(ERR, "virtio_user fails to alloc device");
|
|
|
|
goto end;
|
|
|
|
}
|
2018-05-10 23:58:30 +00:00
|
|
|
|
2019-03-25 04:12:15 +00:00
|
|
|
hw = eth_dev->data->dev_private;
|
|
|
|
if (virtio_user_dev_init(hw->virtio_user_dev, path, queues, cq,
|
|
|
|
queue_size, mac_addr, &ifname, server_mode,
|
|
|
|
mrg_rxbuf, in_order, packed_vq) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "virtio_user_dev_init fails");
|
|
|
|
virtio_user_eth_dev_free(eth_dev);
|
|
|
|
goto end;
|
2016-09-27 19:11:06 +00:00
|
|
|
}
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
|
2017-05-04 14:48:59 +00:00
|
|
|
/* previously called by rte_pci_probe() for physical dev */
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
if (eth_virtio_dev_init(eth_dev) < 0) {
|
|
|
|
PMD_INIT_LOG(ERR, "eth_virtio_dev_init fails");
|
2016-09-27 19:11:06 +00:00
|
|
|
virtio_user_eth_dev_free(eth_dev);
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
goto end;
|
|
|
|
}
|
2018-05-10 23:58:30 +00:00
|
|
|
|
|
|
|
rte_eth_dev_probing_finish(eth_dev);
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
end:
|
2016-06-29 09:05:35 +00:00
|
|
|
if (kvlist)
|
|
|
|
rte_kvargs_free(kvlist);
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
if (path)
|
|
|
|
free(path);
|
|
|
|
if (mac_addr)
|
|
|
|
free(mac_addr);
|
2017-03-28 17:20:00 +00:00
|
|
|
if (ifname)
|
|
|
|
free(ifname);
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2017-04-11 15:44:13 +00:00
|
|
|
virtio_user_pmd_remove(struct rte_vdev_device *vdev)
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
{
|
2017-04-11 15:44:13 +00:00
|
|
|
const char *name;
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
struct rte_eth_dev *eth_dev;
|
|
|
|
struct virtio_hw *hw;
|
|
|
|
struct virtio_user_dev *dev;
|
|
|
|
|
2017-04-11 15:44:13 +00:00
|
|
|
if (!vdev)
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
return -EINVAL;
|
|
|
|
|
2017-04-11 15:44:13 +00:00
|
|
|
name = rte_vdev_device_name(vdev);
|
2017-01-27 15:16:32 +00:00
|
|
|
PMD_DRV_LOG(INFO, "Un-Initializing %s", name);
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
eth_dev = rte_eth_dev_allocated(name);
|
|
|
|
if (!eth_dev)
|
|
|
|
return -ENODEV;
|
|
|
|
|
2019-03-25 04:12:15 +00:00
|
|
|
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
|
|
|
return rte_eth_dev_release_port(eth_dev);
|
|
|
|
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
/* make sure the device is stopped, queues freed */
|
|
|
|
rte_eth_dev_close(eth_dev->data->port_id);
|
|
|
|
|
|
|
|
hw = eth_dev->data->dev_private;
|
|
|
|
dev = hw->virtio_user_dev;
|
|
|
|
virtio_user_dev_uninit(dev);
|
|
|
|
|
|
|
|
rte_eth_dev_release_port(eth_dev);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-09-20 12:41:29 +00:00
|
|
|
static struct rte_vdev_driver virtio_user_driver = {
|
2016-10-06 13:54:03 +00:00
|
|
|
.probe = virtio_user_pmd_probe,
|
|
|
|
.remove = virtio_user_pmd_remove,
|
net/virtio-user: add virtual device
Add a new virtual device named virtio-user, which can be used just like
eth_ring, eth_null, etc. To reuse the code of original virtio, we do
some adjustment in virtio_ethdev.c, such as remove key _static_ of
eth_virtio_dev_init() so that it can be reused in virtual device; and
we add some check to make sure it will not crash.
Configured parameters include:
- queues (optional, 1 by default), number of queue pairs, multi-queue
not supported for now.
- cq (optional, 0 by default), not supported for now.
- mac (optional), random value will be given if not specified.
- queue_size (optional, 256 by default), size of virtqueues.
- path (madatory), path of vhost user.
When enable CONFIG_RTE_VIRTIO_USER (enabled by default), the compiled
library can be used in both VM and container environment.
Examples:
path_vhost=<path_to_vhost_user> # use vhost-user as a backend
sudo ./examples/l2fwd/build/l2fwd -c 0x100000 -n 4 \
--socket-mem 0,1024 --no-pci --file-prefix=l2fwd \
--vdev=virtio-user0,mac=00:01:02:03:04:05,path=$path_vhost -- -p 0x1
Known issues:
- Control queue and multi-queue are not supported yet.
- Cannot work with --huge-unlink.
- Cannot work with no-huge.
- Cannot work when there are more than VHOST_MEMORY_MAX_NREGIONS(8)
hugepages.
- Root privilege is a must (mainly becase of sorting hugepages according
to physical address).
- Applications should not use file name like HUGEFILE_FMT ("%smap_%d").
- Cannot work with vhost-net backend.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
2016-06-15 09:03:25 +00:00
|
|
|
};
|
|
|
|
|
2016-10-10 05:43:15 +00:00
|
|
|
RTE_PMD_REGISTER_VDEV(net_virtio_user, virtio_user_driver);
|
2016-10-24 16:22:22 +00:00
|
|
|
RTE_PMD_REGISTER_ALIAS(net_virtio_user, virtio_user);
|
2016-10-10 05:43:15 +00:00
|
|
|
RTE_PMD_REGISTER_PARAM_STRING(net_virtio_user,
|
2016-07-09 01:06:13 +00:00
|
|
|
"path=<path> "
|
|
|
|
"mac=<mac addr> "
|
|
|
|
"cq=<int> "
|
|
|
|
"queue_size=<int> "
|
2017-03-28 17:20:00 +00:00
|
|
|
"queues=<int> "
|
2018-07-30 08:28:04 +00:00
|
|
|
"iface=<string> "
|
|
|
|
"server=<0|1> "
|
|
|
|
"mrg_rxbuf=<0|1> "
|
2019-01-03 02:40:06 +00:00
|
|
|
"in_order=<0|1> "
|
|
|
|
"packed_vq=<0|1>");
|