git://git.onelab.eu
/
sliver-openvswitch.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dpif-netdev: Add DPDK netdev.
[sliver-openvswitch.git]
/
lib
/
netdev.c
diff --git
a/lib/netdev.c
b/lib/netdev.c
index
0d408bf
..
4ec1d7d
100644
(file)
--- a/
lib/netdev.c
+++ b/
lib/netdev.c
@@
-31,6
+31,7
@@
#include "fatal-signal.h"
#include "hash.h"
#include "list.h"
#include "fatal-signal.h"
#include "hash.h"
#include "list.h"
+#include "netdev-dpdk.h"
#include "netdev-provider.h"
#include "netdev-vport.h"
#include "ofpbuf.h"
#include "netdev-provider.h"
#include "netdev-vport.h"
#include "ofpbuf.h"
@@
-90,6
+91,18
@@
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
static void restore_all_flags(void *aux OVS_UNUSED);
void update_device_args(struct netdev *, const struct shash *args);
static void restore_all_flags(void *aux OVS_UNUSED);
void update_device_args(struct netdev *, const struct shash *args);
+int
+netdev_n_rxq(const struct netdev *netdev)
+{
+ return netdev->n_rxq;
+}
+
+bool
+netdev_is_pmd(const struct netdev *netdev)
+{
+ return !strcmp(netdev->netdev_class->type, "dpdk");
+}
+
static void
netdev_initialize(void)
OVS_EXCLUDED(netdev_class_mutex, netdev_mutex)
static void
netdev_initialize(void)
OVS_EXCLUDED(netdev_class_mutex, netdev_mutex)
@@
-112,6
+125,7
@@
netdev_initialize(void)
netdev_register_provider(&netdev_tap_class);
netdev_register_provider(&netdev_bsd_class);
#endif
netdev_register_provider(&netdev_tap_class);
netdev_register_provider(&netdev_bsd_class);
#endif
+ netdev_dpdk_register();
ovsthread_once_done(&once);
}
ovsthread_once_done(&once);
}
@@
-327,6
+341,13
@@
netdev_open(const char *name, const char *type, struct netdev **netdevp)
netdev->netdev_class = rc->class;
netdev->name = xstrdup(name);
netdev->node = shash_add(&netdev_shash, name, netdev);
netdev->netdev_class = rc->class;
netdev->name = xstrdup(name);
netdev->node = shash_add(&netdev_shash, name, netdev);
+
+ /* By default enable one rx queue per netdev. */
+ if (netdev->netdev_class->rxq_alloc) {
+ netdev->n_rxq = 1;
+ } else {
+ netdev->n_rxq = 0;
+ }
list_init(&netdev->saved_flags_list);
error = rc->class->construct(netdev);
list_init(&netdev->saved_flags_list);
error = rc->class->construct(netdev);
@@
-500,24
+521,25
@@
netdev_parse_name(const char *netdev_name_, char **name, char **type)
}
}
}
}
-/* Attempts to open a netdev_rx handle for obtaining packets received on
- * 'netdev'. On success, returns 0 and stores a nonnull 'netdev_rx *' into
+/* Attempts to open a netdev_rx
q
handle for obtaining packets received on
+ * 'netdev'. On success, returns 0 and stores a nonnull 'netdev_rx
q
*' into
* '*rxp'. On failure, returns a positive errno value and stores NULL into
* '*rxp'.
*
* Some kinds of network devices might not support receiving packets. This
* function returns EOPNOTSUPP in that case.*/
int
* '*rxp'. On failure, returns a positive errno value and stores NULL into
* '*rxp'.
*
* Some kinds of network devices might not support receiving packets. This
* function returns EOPNOTSUPP in that case.*/
int
-netdev_rx
_open(struct netdev *netdev, struct netdev_rx **rxp
)
+netdev_rx
q_open(struct netdev *netdev, struct netdev_rxq **rxp, int id
)
OVS_EXCLUDED(netdev_mutex)
{
int error;
OVS_EXCLUDED(netdev_mutex)
{
int error;
- if (netdev->netdev_class->rx
_alloc
) {
- struct netdev_rx
*rx = netdev->netdev_class->rx
_alloc();
+ if (netdev->netdev_class->rx
q_alloc && id < netdev->n_rxq
) {
+ struct netdev_rx
q *rx = netdev->netdev_class->rxq
_alloc();
if (rx) {
rx->netdev = netdev;
if (rx) {
rx->netdev = netdev;
- error = netdev->netdev_class->rx_construct(rx);
+ rx->queue_id = id;
+ error = netdev->netdev_class->rxq_construct(rx);
if (!error) {
ovs_mutex_lock(&netdev_mutex);
netdev->ref_cnt++;
if (!error) {
ovs_mutex_lock(&netdev_mutex);
netdev->ref_cnt++;
@@
-526,7
+548,7
@@
netdev_rx_open(struct netdev *netdev, struct netdev_rx **rxp)
*rxp = rx;
return 0;
}
*rxp = rx;
return 0;
}
- netdev->netdev_class->rx_dealloc(rx);
+ netdev->netdev_class->rx
q
_dealloc(rx);
} else {
error = ENOMEM;
}
} else {
error = ENOMEM;
}
@@
-540,13
+562,13
@@
netdev_rx_open(struct netdev *netdev, struct netdev_rx **rxp)
/* Closes 'rx'. */
void
/* Closes 'rx'. */
void
-netdev_rx
_close(struct netdev_rx
*rx)
+netdev_rx
q_close(struct netdev_rxq
*rx)
OVS_EXCLUDED(netdev_mutex)
{
if (rx) {
struct netdev *netdev = rx->netdev;
OVS_EXCLUDED(netdev_mutex)
{
if (rx) {
struct netdev *netdev = rx->netdev;
- netdev->netdev_class->rx_destruct(rx);
- netdev->netdev_class->rx_dealloc(rx);
+ netdev->netdev_class->rx
q
_destruct(rx);
+ netdev->netdev_class->rx
q
_dealloc(rx);
netdev_close(netdev);
}
}
netdev_close(netdev);
}
}
@@
-566,11
+588,11
@@
netdev_rx_close(struct netdev_rx *rx)
* This function may be set to null if it would always return EOPNOTSUPP
* anyhow. */
int
* This function may be set to null if it would always return EOPNOTSUPP
* anyhow. */
int
-netdev_rx
_recv(struct netdev_rx
*rx, struct ofpbuf **buffers, int *cnt)
+netdev_rx
q_recv(struct netdev_rxq
*rx, struct ofpbuf **buffers, int *cnt)
{
int retval;
{
int retval;
- retval = rx->netdev->netdev_class->rx_recv(rx, buffers, cnt);
+ retval = rx->netdev->netdev_class->rx
q
_recv(rx, buffers, cnt);
if (!retval) {
COVERAGE_INC(netdev_received);
}
if (!retval) {
COVERAGE_INC(netdev_received);
}
@@
-580,17
+602,17
@@
netdev_rx_recv(struct netdev_rx *rx, struct ofpbuf **buffers, int *cnt)
/* Arranges for poll_block() to wake up when a packet is ready to be received
* on 'rx'. */
void
/* Arranges for poll_block() to wake up when a packet is ready to be received
* on 'rx'. */
void
-netdev_rx
_wait(struct netdev_rx
*rx)
+netdev_rx
q_wait(struct netdev_rxq
*rx)
{
{
- rx->netdev->netdev_class->rx_wait(rx);
+ rx->netdev->netdev_class->rx
q
_wait(rx);
}
/* Discards any packets ready to be received on 'rx'. */
int
}
/* Discards any packets ready to be received on 'rx'. */
int
-netdev_rx
_drain(struct netdev_rx
*rx)
+netdev_rx
q_drain(struct netdev_rxq
*rx)
{
{
- return (rx->netdev->netdev_class->rx_drain
- ? rx->netdev->netdev_class->rx_drain(rx)
+ return (rx->netdev->netdev_class->rx
q
_drain
+ ? rx->netdev->netdev_class->rx
q
_drain(rx)
: 0);
}
: 0);
}
@@
-1588,16
+1610,16
@@
netdev_get_type_from_name(const char *name)
}
\f
struct netdev *
}
\f
struct netdev *
-netdev_rx
_get_netdev(const struct netdev_rx
*rx)
+netdev_rx
q_get_netdev(const struct netdev_rxq
*rx)
{
ovs_assert(rx->netdev->ref_cnt > 0);
return rx->netdev;
}
const char *
{
ovs_assert(rx->netdev->ref_cnt > 0);
return rx->netdev;
}
const char *
-netdev_rx
_get_name(const struct netdev_rx
*rx)
+netdev_rx
q_get_name(const struct netdev_rxq
*rx)
{
{
- return netdev_get_name(netdev_rx_get_netdev(rx));
+ return netdev_get_name(netdev_rx
q
_get_netdev(rx));
}
static void
}
static void