git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mbuf: rename physical address to IOVA
[dpdk.git]
/
drivers
/
net
/
vhost
/
rte_eth_vhost.c
diff --git
a/drivers/net/vhost/rte_eth_vhost.c
b/drivers/net/vhost/rte_eth_vhost.c
index
cdd8c31
..
f98c980
100644
(file)
--- a/
drivers/net/vhost/rte_eth_vhost.c
+++ b/
drivers/net/vhost/rte_eth_vhost.c
@@
-36,6
+36,7
@@
#include <rte_mbuf.h>
#include <rte_ethdev.h>
#include <rte_mbuf.h>
#include <rte_ethdev.h>
+#include <rte_ethdev_vdev.h>
#include <rte_malloc.h>
#include <rte_memcpy.h>
#include <rte_vdev.h>
#include <rte_malloc.h>
#include <rte_memcpy.h>
#include <rte_vdev.h>
@@
-104,7
+105,7
@@
struct vhost_queue {
rte_atomic32_t while_queuing;
struct pmd_internal *internal;
struct rte_mempool *mb_pool;
rte_atomic32_t while_queuing;
struct pmd_internal *internal;
struct rte_mempool *mb_pool;
- uint
8
_t port;
+ uint
16
_t port;
uint16_t virtqueue_id;
struct vhost_stats stats;
};
uint16_t virtqueue_id;
struct vhost_stats stats;
};
@@
-606,7
+607,8
@@
new_device(int vid)
RTE_LOG(INFO, PMD, "New connection established\n");
RTE_LOG(INFO, PMD, "New connection established\n");
- _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_INTR_LSC, NULL);
+ _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_INTR_LSC,
+ NULL, NULL);
return 0;
}
return 0;
}
@@
-660,7
+662,8
@@
destroy_device(int vid)
RTE_LOG(INFO, PMD, "Connection closed\n");
RTE_LOG(INFO, PMD, "Connection closed\n");
- _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_INTR_LSC, NULL);
+ _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_INTR_LSC,
+ NULL, NULL);
}
static int
}
static int
@@
-689,7
+692,8
@@
vring_state_changed(int vid, uint16_t vring, int enable)
RTE_LOG(INFO, PMD, "vring%u is %s\n",
vring, enable ? "enabled" : "disabled");
RTE_LOG(INFO, PMD, "vring%u is %s\n",
vring, enable ? "enabled" : "disabled");
- _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_QUEUE_STATE, NULL);
+ _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_QUEUE_STATE,
+ NULL, NULL);
return 0;
}
return 0;
}
@@
-701,7
+705,7
@@
static struct vhost_device_ops vhost_ops = {
};
int
};
int
-rte_eth_vhost_get_queue_event(uint
8
_t port_id,
+rte_eth_vhost_get_queue_event(uint
16
_t port_id,
struct rte_eth_vhost_queue_event *event)
{
struct rte_vhost_vring_state *state;
struct rte_eth_vhost_queue_event *event)
{
struct rte_vhost_vring_state *state;
@@
-738,7
+742,7
@@
rte_eth_vhost_get_queue_event(uint8_t port_id,
}
int
}
int
-rte_eth_vhost_get_vid_from_port_id(uint
8
_t port_id)
+rte_eth_vhost_get_vid_from_port_id(uint
16
_t port_id)
{
struct internal_list *list;
struct rte_eth_dev *eth_dev;
{
struct internal_list *list;
struct rte_eth_dev *eth_dev;
@@
-791,11
+795,14
@@
eth_dev_close(struct rte_eth_dev *dev)
{
struct pmd_internal *internal;
struct internal_list *list;
{
struct pmd_internal *internal;
struct internal_list *list;
+ unsigned int i;
internal = dev->data->dev_private;
if (!internal)
return;
internal = dev->data->dev_private;
if (!internal)
return;
+ eth_dev_stop(dev);
+
rte_vhost_driver_unregister(internal->iface_name);
list = find_internal_resource(internal->iface_name);
rte_vhost_driver_unregister(internal->iface_name);
list = find_internal_resource(internal->iface_name);
@@
-807,9
+814,17
@@
eth_dev_close(struct rte_eth_dev *dev)
pthread_mutex_unlock(&internal_list_lock);
rte_free(list);
pthread_mutex_unlock(&internal_list_lock);
rte_free(list);
+ for (i = 0; i < dev->data->nb_rx_queues; i++)
+ rte_free(dev->data->rx_queues[i]);
+ for (i = 0; i < dev->data->nb_tx_queues; i++)
+ rte_free(dev->data->tx_queues[i]);
+
+ rte_free(dev->data->mac_addrs);
free(internal->dev_name);
free(internal->iface_name);
rte_free(internal);
free(internal->dev_name);
free(internal->iface_name);
rte_free(internal);
+
+ dev->data->dev_private = NULL;
}
static int
}
static int
@@
-875,7
+890,7
@@
eth_dev_info(struct rte_eth_dev *dev,
dev_info->min_rx_bufsize = 0;
}
dev_info->min_rx_bufsize = 0;
}
-static
void
+static
int
eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
{
unsigned i;
eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
{
unsigned i;
@@
-913,6
+928,8
@@
eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
stats->oerrors = tx_missed_total;
stats->ibytes = rx_total_bytes;
stats->obytes = tx_total_bytes;
stats->oerrors = tx_missed_total;
stats->ibytes = rx_total_bytes;
stats->obytes = tx_total_bytes;
+
+ return 0;
}
static void
}
static void
@@
-961,6
+978,18
@@
eth_link_update(struct rte_eth_dev *dev __rte_unused,
return 0;
}
return 0;
}
+static uint32_t
+eth_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
+{
+ struct vhost_queue *vq;
+
+ vq = dev->data->rx_queues[rx_queue_id];
+ if (vq == NULL)
+ return 0;
+
+ return rte_vhost_rx_queue_count(vq->vid, vq->virtqueue_id);
+}
+
static const struct eth_dev_ops ops = {
.dev_start = eth_dev_start,
.dev_stop = eth_dev_stop,
static const struct eth_dev_ops ops = {
.dev_start = eth_dev_start,
.dev_stop = eth_dev_stop,
@@
-972,6
+1001,7
@@
static const struct eth_dev_ops ops = {
.rx_queue_release = eth_queue_release,
.tx_queue_release = eth_queue_release,
.tx_done_cleanup = eth_tx_done_cleanup,
.rx_queue_release = eth_queue_release,
.tx_queue_release = eth_queue_release,
.tx_done_cleanup = eth_tx_done_cleanup,
+ .rx_queue_count = eth_rx_queue_count,
.link_update = eth_link_update,
.stats_get = eth_stats_get,
.stats_reset = eth_stats_reset,
.link_update = eth_link_update,
.stats_get = eth_stats_get,
.stats_reset = eth_stats_reset,
@@
-983,9
+1013,10
@@
static const struct eth_dev_ops ops = {
static struct rte_vdev_driver pmd_vhost_drv;
static int
static struct rte_vdev_driver pmd_vhost_drv;
static int
-eth_dev_vhost_create(
const char *name, char *iface_name, int16_t queues
,
-
const unsigned
numa_node, uint64_t flags)
+eth_dev_vhost_create(
struct rte_vdev_device *dev, char *iface_name
,
+
int16_t queues, const unsigned int
numa_node, uint64_t flags)
{
{
+ const char *name = rte_vdev_device_name(dev);
struct rte_eth_dev_data *data = NULL;
struct pmd_internal *internal = NULL;
struct rte_eth_dev *eth_dev = NULL;
struct rte_eth_dev_data *data = NULL;
struct pmd_internal *internal = NULL;
struct rte_eth_dev *eth_dev = NULL;
@@
-996,23
+1027,19
@@
eth_dev_vhost_create(const char *name, char *iface_name, int16_t queues,
RTE_LOG(INFO, PMD, "Creating VHOST-USER backend on numa socket %u\n",
numa_node);
RTE_LOG(INFO, PMD, "Creating VHOST-USER backend on numa socket %u\n",
numa_node);
- /* now do all data allocation - for eth_dev structure
, dummy pci driver
- *
and internal
(private) data
+ /* now do all data allocation - for eth_dev structure
and internal
+ * (private) data
*/
data = rte_zmalloc_socket(name, sizeof(*data), 0, numa_node);
if (data == NULL)
goto error;
*/
data = rte_zmalloc_socket(name, sizeof(*data), 0, numa_node);
if (data == NULL)
goto error;
- internal = rte_zmalloc_socket(name, sizeof(*internal), 0, numa_node);
- if (internal == NULL)
- goto error;
-
list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node);
if (list == NULL)
goto error;
/* reserve an ethdev entry */
list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node);
if (list == NULL)
goto error;
/* reserve an ethdev entry */
- eth_dev = rte_eth_
dev_allocate(name
);
+ eth_dev = rte_eth_
vdev_allocate(dev, sizeof(*internal)
);
if (eth_dev == NULL)
goto error;
if (eth_dev == NULL)
goto error;
@@
-1029,10
+1056,10
@@
eth_dev_vhost_create(const char *name, char *iface_name, int16_t queues,
/* now put it all together
* - store queue data in internal,
/* now put it all together
* - store queue data in internal,
- * - store numa_node info in ethdev data
* - point eth_dev_data to internals
* - and point eth_dev structure to new eth_dev_data structure
*/
* - point eth_dev_data to internals
* - and point eth_dev structure to new eth_dev_data structure
*/
+ internal = eth_dev->data->dev_private;
internal->dev_name = strdup(name);
if (internal->dev_name == NULL)
goto error;
internal->dev_name = strdup(name);
if (internal->dev_name == NULL)
goto error;
@@
-1048,26
+1075,20
@@
eth_dev_vhost_create(const char *name, char *iface_name, int16_t queues,
rte_spinlock_init(&vring_state->lock);
vring_states[eth_dev->data->port_id] = vring_state;
rte_spinlock_init(&vring_state->lock);
vring_states[eth_dev->data->port_id] = vring_state;
- data->dev_private = internal;
- data->port_id = eth_dev->data->port_id;
- memmove(data->name, eth_dev->data->name, sizeof(data->name));
+ /* We'll replace the 'data' originally allocated by eth_dev. So the
+ * vhost PMD resources won't be shared between multi processes.
+ */
+ rte_memcpy(data, eth_dev->data, sizeof(*data));
+ eth_dev->data = data;
+
data->nb_rx_queues = queues;
data->nb_tx_queues = queues;
internal->max_queues = queues;
data->dev_link = pmd_link;
data->mac_addrs = eth_addr;
data->nb_rx_queues = queues;
data->nb_tx_queues = queues;
internal->max_queues = queues;
data->dev_link = pmd_link;
data->mac_addrs = eth_addr;
+ data->dev_flags = RTE_ETH_DEV_INTR_LSC;
- /* We'll replace the 'data' originally allocated by eth_dev. So the
- * vhost PMD resources won't be shared between multi processes.
- */
- eth_dev->data = data;
eth_dev->dev_ops = &ops;
eth_dev->dev_ops = &ops;
- eth_dev->driver = NULL;
- data->dev_flags =
- RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC;
- data->kdrv = RTE_KDRV_NONE;
- data->drv_name = pmd_vhost_drv.driver.name;
- data->numa_node = numa_node;
/* finally assign rx and tx ops */
eth_dev->rx_pkt_burst = eth_vhost_rx;
/* finally assign rx and tx ops */
eth_dev->rx_pkt_burst = eth_vhost_rx;
@@
-1090,8
+1111,10
@@
eth_dev_vhost_create(const char *name, char *iface_name, int16_t queues,
return data->port_id;
error:
return data->port_id;
error:
- if (internal)
+ if (internal) {
+ free(internal->iface_name);
free(internal->dev_name);
free(internal->dev_name);
+ }
rte_free(vring_state);
rte_free(eth_addr);
if (eth_dev)
rte_free(vring_state);
rte_free(eth_addr);
if (eth_dev)
@@
-1134,7
+1157,6
@@
open_int(const char *key __rte_unused, const char *value, void *extra_args)
static int
rte_pmd_vhost_probe(struct rte_vdev_device *dev)
{
static int
rte_pmd_vhost_probe(struct rte_vdev_device *dev)
{
- const char *name;
struct rte_kvargs *kvlist = NULL;
int ret = 0;
char *iface_name;
struct rte_kvargs *kvlist = NULL;
int ret = 0;
char *iface_name;
@@
-1143,8
+1165,8
@@
rte_pmd_vhost_probe(struct rte_vdev_device *dev)
int client_mode = 0;
int dequeue_zero_copy = 0;
int client_mode = 0;
int dequeue_zero_copy = 0;
- name = rte_vdev_device_name(dev);
-
RTE_LOG(INFO, PMD, "Initializing pmd_vhost for %s\n", name
);
+ RTE_LOG(INFO, PMD, "Initializing pmd_vhost for %s\n",
+
rte_vdev_device_name(dev)
);
kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), valid_arguments);
if (kvlist == NULL)
kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), valid_arguments);
if (kvlist == NULL)
@@
-1189,7
+1211,11
@@
rte_pmd_vhost_probe(struct rte_vdev_device *dev)
flags |= RTE_VHOST_USER_DEQUEUE_ZERO_COPY;
}
flags |= RTE_VHOST_USER_DEQUEUE_ZERO_COPY;
}
- eth_dev_vhost_create(name, iface_name, queues, rte_socket_id(), flags);
+ if (dev->device.numa_node == SOCKET_ID_ANY)
+ dev->device.numa_node = rte_socket_id();
+
+ eth_dev_vhost_create(dev, iface_name, queues, dev->device.numa_node,
+ flags);
out_free:
rte_kvargs_free(kvlist);
out_free:
rte_kvargs_free(kvlist);
@@
-1201,7
+1227,6
@@
rte_pmd_vhost_remove(struct rte_vdev_device *dev)
{
const char *name;
struct rte_eth_dev *eth_dev = NULL;
{
const char *name;
struct rte_eth_dev *eth_dev = NULL;
- unsigned int i;
name = rte_vdev_device_name(dev);
RTE_LOG(INFO, PMD, "Un-Initializing pmd_vhost for %s\n", name);
name = rte_vdev_device_name(dev);
RTE_LOG(INFO, PMD, "Un-Initializing pmd_vhost for %s\n", name);
@@
-1211,19
+1236,11
@@
rte_pmd_vhost_remove(struct rte_vdev_device *dev)
if (eth_dev == NULL)
return -ENODEV;
if (eth_dev == NULL)
return -ENODEV;
- eth_dev_stop(eth_dev);
-
eth_dev_close(eth_dev);
rte_free(vring_states[eth_dev->data->port_id]);
vring_states[eth_dev->data->port_id] = NULL;
eth_dev_close(eth_dev);
rte_free(vring_states[eth_dev->data->port_id]);
vring_states[eth_dev->data->port_id] = NULL;
- for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
- rte_free(eth_dev->data->rx_queues[i]);
- for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
- rte_free(eth_dev->data->tx_queues[i]);
-
- rte_free(eth_dev->data->mac_addrs);
rte_free(eth_dev->data);
rte_eth_dev_release_port(eth_dev);
rte_free(eth_dev->data);
rte_eth_dev_release_port(eth_dev);