Code Review
/
deb_dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
Merge tag 'upstream/16.11.9' into 16.11.x
[deb_dpdk.git]
/
drivers
/
net
/
virtio
/
virtio_user_ethdev.c
diff --git
a/drivers/net/virtio/virtio_user_ethdev.c
b/drivers/net/virtio/virtio_user_ethdev.c
index
406beea
..
caa9be5
100644
(file)
--- a/
drivers/net/virtio/virtio_user_ethdev.c
+++ b/
drivers/net/virtio/virtio_user_ethdev.c
@@
-87,21
+87,24
@@
virtio_user_write_dev_config(struct virtio_hw *hw, size_t offset,
}
static void
}
static void
-virtio_user_
set_status(struct virtio_hw *hw, uint8_t status
)
+virtio_user_
reset(struct virtio_hw *hw
)
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
- if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK)
- virtio_user_start_device(dev);
- dev->status = status;
+ if (dev->status & VIRTIO_CONFIG_STATUS_DRIVER_OK)
+ virtio_user_stop_device(dev);
}
static void
}
static void
-virtio_user_
reset(struct virtio_hw *hw
)
+virtio_user_
set_status(struct virtio_hw *hw, uint8_t status
)
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
- virtio_user_stop_device(dev);
+ 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;
}
static uint8_t
}
static uint8_t
@@
-117,7
+120,8
@@
virtio_user_get_features(struct virtio_hw *hw)
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
- return dev->features;
+ /* unmask feature bits defined in vhost user protocol */
+ return dev->device_features & VIRTIO_PMD_SUPPORTED_GUEST_FEATURES;
}
static void
}
static void
@@
-125,7
+129,7
@@
virtio_user_set_features(struct virtio_hw *hw, uint64_t features)
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
{
struct virtio_user_dev *dev = virtio_user_get_dev(hw);
- dev->features = features;
+ dev->features = features
& dev->device_features
;
}
static uint8_t
}
static uint8_t
@@
-212,7
+216,7
@@
virtio_user_notify_queue(struct virtio_hw *hw, struct virtqueue *vq)
strerror(errno));
}
strerror(errno));
}
-
static
const struct virtio_pci_ops virtio_user_ops = {
+const struct virtio_pci_ops virtio_user_ops = {
.read_dev_cfg = virtio_user_read_dev_config,
.write_dev_cfg = virtio_user_write_dev_config,
.reset = virtio_user_reset,
.read_dev_cfg = virtio_user_read_dev_config,
.write_dev_cfg = virtio_user_write_dev_config,
.reset = virtio_user_reset,
@@
-301,7
+305,8
@@
virtio_user_eth_dev_alloc(const char *name)
return NULL;
}
return NULL;
}
- hw->vtpci_ops = &virtio_user_ops;
+ hw->port_id = data->port_id;
+ virtio_hw_internal[hw->port_id].vtpci_ops = &virtio_user_ops;
hw->use_msix = 0;
hw->modern = 0;
hw->use_simple_rxtx = 0;
hw->use_msix = 0;
hw->modern = 0;
hw->use_simple_rxtx = 0;
@@
-364,7
+369,7
@@
virtio_user_pmd_probe(const char *name, const char *params)
}
} else {
PMD_INIT_LOG(ERR, "arg %s is mandatory for virtio_user\n",
}
} else {
PMD_INIT_LOG(ERR, "arg %s is mandatory for virtio_user\n",
-
VIRTIO_USER_ARG_QUEUE_SIZE
);
+
VIRTIO_USER_ARG_PATH
);
goto end;
}
goto end;
}
@@
-411,6
+416,13
@@
virtio_user_pmd_probe(const char *name, const char *params)
goto end;
}
goto end;
}
+ 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;
+ }
+
eth_dev = virtio_user_eth_dev_alloc(name);
if (!eth_dev) {
PMD_INIT_LOG(ERR, "virtio_user fails to alloc device");
eth_dev = virtio_user_eth_dev_alloc(name);
if (!eth_dev) {
PMD_INIT_LOG(ERR, "virtio_user fails to alloc device");
@@
-467,7
+479,6
@@
virtio_user_pmd_remove(const char *name)
virtio_user_dev_uninit(dev);
rte_free(eth_dev->data->dev_private);
virtio_user_dev_uninit(dev);
rte_free(eth_dev->data->dev_private);
- rte_free(eth_dev->data);
rte_eth_dev_release_port(eth_dev);
return 0;
rte_eth_dev_release_port(eth_dev);
return 0;