[ovs-dev] [PATCH v2 11/11] netdev-dpdk: Use ->reconfigure() call to change rx/tx queues.
Daniele Di Proietto
diproiettod at vmware.com
Thu Mar 3 01:33:22 UTC 2016
This introduces in dpif-netdev and netdev-dpdk the first use for the
newly introduce reconfigure netdev call.
When a request to change the number of queues comes, netdev-dpdk will
remember this and notify the upper layer via
netdev_request_reconfigure().
The datapath, instead of periodically calling netdev_set_multiq(), can
detect this and call reconfigure().
This mechanism can also be used to:
* Automatically match the number of rxq with the one provided by qemu
via the new_device callback.
* Provide a way to change the MTU of dpdk devices at runtime.
Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
---
lib/dpif-netdev.c | 70 +++++++++----------
lib/netdev-dpdk.c | 181 +++++++++++++++++++++++++-------------------------
lib/netdev-provider.h | 19 ++----
lib/netdev.c | 30 ++-------
lib/netdev.h | 3 +-
5 files changed, 136 insertions(+), 167 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 0c3673b..8e9181c 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -256,8 +256,6 @@ struct dp_netdev_port {
unsigned n_rxq; /* Number of elements in 'rxq' */
struct netdev_rxq **rxq;
char *type; /* Port type as requested by user. */
- int latest_requested_n_rxq; /* Latest requested from netdev number
- of rx queues. */
};
/* Contained by struct dp_netdev_flow's 'stats' member. */
@@ -1161,20 +1159,26 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type,
/* There can only be ovs_numa_get_n_cores() pmd threads,
* so creates a txq for each, and one extra for the non
* pmd threads. */
- error = netdev_set_multiq(netdev, n_cores + 1,
- netdev_requested_n_rxq(netdev));
+ error = netdev_set_multiq(netdev, n_cores + 1);
if (error && (error != EOPNOTSUPP)) {
VLOG_ERR("%s, cannot set multiq", devname);
goto out_close;
}
}
+
+ if (netdev_is_reconf_required(netdev)) {
+ error = netdev_reconfigure(netdev);
+ if (error) {
+ goto out_close;
+ }
+ }
+
port = xzalloc(sizeof *port);
port->port_no = port_no;
port->netdev = netdev;
port->n_rxq = netdev_n_rxq(netdev);
port->rxq = xmalloc(sizeof *port->rxq * port->n_rxq);
port->type = xstrdup(type);
- port->latest_requested_n_rxq = netdev_requested_n_rxq(netdev);
for (i = 0; i < port->n_rxq; i++) {
error = netdev_rxq_open(netdev, &port->rxq[i], i);
@@ -2450,24 +2454,6 @@ dpif_netdev_operate(struct dpif *dpif, struct dpif_op **ops, size_t n_ops)
}
}
-/* Returns true if the configuration for rx queues is changed. */
-static bool
-pmd_n_rxq_changed(const struct dp_netdev *dp)
-{
- struct dp_netdev_port *port;
-
- CMAP_FOR_EACH (port, node, &dp->ports) {
- int requested_n_rxq = netdev_requested_n_rxq(port->netdev);
-
- if (netdev_is_pmd(port->netdev)
- && port->latest_requested_n_rxq != requested_n_rxq) {
- return true;
- }
- }
-
- return false;
-}
-
static bool
cmask_equals(const char *a, const char *b)
{
@@ -2600,14 +2586,12 @@ reconfigure_pmd_threads(struct dp_netdev *dp)
dp_netdev_destroy_all_pmds(dp);
CMAP_FOR_EACH (port, node, &dp->ports) {
- struct netdev *netdev = port->netdev;
- int requested_n_rxq = netdev_requested_n_rxq(netdev);
- if (netdev_is_pmd(port->netdev)
- && port->latest_requested_n_rxq != requested_n_rxq) {
+ if (netdev_is_reconf_required(port->netdev)) {
cmap_remove(&dp->ports, &port->node, hash_odp_port(port->port_no));
hmapx_add(&to_reconfigure, port);
}
}
+
ovs_mutex_unlock(&dp->port_mutex);
/* Waits for the other threads to see the ports removed from the cmap,
@@ -2616,11 +2600,9 @@ reconfigure_pmd_threads(struct dp_netdev *dp)
ovs_mutex_lock(&dp->port_mutex);
HMAPX_FOR_EACH (node, &to_reconfigure) {
- int requested_n_rxq = netdev_requested_n_rxq(port->netdev);
int i, err;
port = node->data;
- requested_n_rxq = netdev_requested_n_rxq(port->netdev);
/* Closes the existing 'rxq's. */
for (i = 0; i < port->n_rxq; i++) {
netdev_rxq_close(port->rxq[i]);
@@ -2628,18 +2610,15 @@ reconfigure_pmd_threads(struct dp_netdev *dp)
}
port->n_rxq = 0;
- /* Sets the new rx queue config. */
- err = netdev_set_multiq(port->netdev, ovs_numa_get_n_cores() + 1,
- requested_n_rxq);
+ /* Allows the netdev to apply the pending configuration changes. */
+ err = netdev_reconfigure(port->netdev);
if (err && (err != EOPNOTSUPP)) {
- VLOG_ERR("Failed to set dpdk interface %s rx_queue to: %u",
- netdev_get_name(port->netdev),
- requested_n_rxq);
+ VLOG_ERR("Failed to set interface %s new configuration",
+ netdev_get_name(port->netdev));
do_destroy_port(port);
failed_config = true;
continue;
}
- port->latest_requested_n_rxq = requested_n_rxq;
/* If the netdev_reconfigure() above succeeds, reopens the 'rxq's and
* inserts the port back in the cmap, to allow transmitting packets. */
port->n_rxq = netdev_n_rxq(port->netdev);
@@ -2670,6 +2649,21 @@ reconfigure_pmd_threads(struct dp_netdev *dp)
dp_netdev_reset_pmd_threads(dp);
}
+/* Returns true if one of the netdevs in 'dp' requires a reconfiguration */
+static bool
+ports_require_restart(const struct dp_netdev *dp)
+{
+ struct dp_netdev_port *port;
+
+ CMAP_FOR_EACH (port, node, &dp->ports) {
+ if (netdev_is_reconf_required(port->netdev)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
/* Return true if needs to revalidate datapath flows. */
static bool
dpif_netdev_run(struct dpif *dpif)
@@ -2695,7 +2689,7 @@ dpif_netdev_run(struct dpif *dpif)
ovs_mutex_unlock(&dp->non_pmd_mutex);
if (!cmask_equals(dp->pmd_cmask, dp->requested_pmd_cmask)
- || pmd_n_rxq_changed(dp)) {
+ || ports_require_restart(dp)) {
reconfigure_pmd_threads(dp);
}
@@ -2718,6 +2712,8 @@ dpif_netdev_wait(struct dpif *dpif)
ovs_mutex_lock(&dp_netdev_mutex);
CMAP_FOR_EACH (port, node, &dp->ports) {
+ netdev_wait_reconf_required(port->netdev);
+
if (!netdev_is_pmd(port->netdev)) {
int i;
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index a48ca71..ce35427 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -237,6 +237,12 @@ struct netdev_dpdk {
/* In dpdk_list. */
struct ovs_list list_node OVS_GUARDED_BY(dpdk_mutex);
+
+ /* The following properties cannot be changed when a device is running,
+ * so we remember the request and update them next time
+ * netdev_dpdk*_reconfigure() is called */
+ int requested_n_txq;
+ int requested_n_rxq;
};
struct netdev_rxq_dpdk {
@@ -614,7 +620,8 @@ netdev_dpdk_init(struct netdev *netdev_, unsigned int port_no,
netdev_->n_txq = NR_QUEUE;
netdev_->n_rxq = NR_QUEUE;
- netdev_->requested_n_rxq = NR_QUEUE;
+ netdev->requested_n_rxq = NR_QUEUE;
+ netdev->requested_n_txq = NR_QUEUE;
netdev->real_n_txq = NR_QUEUE;
if (type == DPDK_DEV_ETH) {
@@ -796,7 +803,7 @@ netdev_dpdk_get_config(const struct netdev *netdev, struct smap *args)
ovs_mutex_lock(&dev->mutex);
- smap_add_format(args, "requested_rx_queues", "%d", netdev->requested_n_rxq);
+ smap_add_format(args, "requested_rx_queues", "%d", dev->requested_n_rxq);
smap_add_format(args, "configured_rx_queues", "%d", netdev->n_rxq);
smap_add_format(args, "requested_tx_queues", "%d", netdev->n_txq);
smap_add_format(args, "configured_tx_queues", "%d", dev->real_n_txq);
@@ -809,11 +816,14 @@ static int
netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args)
{
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
+ int new_n_rxq;
ovs_mutex_lock(&dev->mutex);
- netdev->requested_n_rxq = MAX(smap_get_int(args, "n_rxq",
- netdev->requested_n_rxq), 1);
- netdev_change_seq_changed(netdev);
+ new_n_rxq = MAX(smap_get_int(args, "n_rxq", dev->requested_n_rxq), 1);
+ if (new_n_rxq != dev->requested_n_rxq) {
+ dev->requested_n_rxq = new_n_rxq;
+ netdev_request_reconfigure(netdev);
+ }
ovs_mutex_unlock(&dev->mutex);
return 0;
@@ -827,95 +837,26 @@ netdev_dpdk_get_numa_id(const struct netdev *netdev_)
return netdev->socket_id;
}
-/* Sets the number of tx queues and rx queues for the dpdk interface.
- * If the configuration fails, do not try restoring its old configuration
- * and just returns the error. */
+/* Sets the number of tx queues for the dpdk interface. */
static int
-netdev_dpdk_set_multiq(struct netdev *netdev_, unsigned int n_txq,
- unsigned int n_rxq)
+netdev_dpdk_set_multiq(struct netdev *netdev_, unsigned int n_txq)
{
struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
int err = 0;
- int old_rxq, old_txq;
- if (netdev->up.n_txq == n_txq && netdev->up.n_rxq == n_rxq) {
- return err;
- }
-
- ovs_mutex_lock(&dpdk_mutex);
ovs_mutex_lock(&netdev->mutex);
- rte_eth_dev_stop(netdev->port_id);
-
- old_txq = netdev->up.n_txq;
- old_rxq = netdev->up.n_rxq;
- netdev->up.n_txq = n_txq;
- netdev->up.n_rxq = n_rxq;
-
- rte_free(netdev->tx_q);
- err = dpdk_eth_dev_init(netdev);
- netdev_dpdk_alloc_txq(netdev, netdev->real_n_txq);
- if (err) {
- /* If there has been an error, it means that the requested queues
- * have not been created. Restore the old numbers. */
- netdev->up.n_txq = old_txq;
- netdev->up.n_rxq = old_rxq;
- }
-
- netdev->txq_needs_locking = netdev->real_n_txq != netdev->up.n_txq;
-
- ovs_mutex_unlock(&netdev->mutex);
- ovs_mutex_unlock(&dpdk_mutex);
-
- return err;
-}
-
-static int
-netdev_dpdk_vhost_cuse_set_multiq(struct netdev *netdev_, unsigned int n_txq,
- unsigned int n_rxq)
-{
- struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
- int err = 0;
-
- if (netdev->up.n_txq == n_txq && netdev->up.n_rxq == n_rxq) {
- return err;
+ if (netdev->up.n_txq == n_txq) {
+ goto out;
}
- ovs_mutex_lock(&dpdk_mutex);
- ovs_mutex_lock(&netdev->mutex);
-
- netdev->up.n_txq = n_txq;
- netdev->real_n_txq = 1;
- netdev->up.n_rxq = 1;
- netdev->txq_needs_locking = netdev->real_n_txq != netdev->up.n_txq;
+ netdev->requested_n_txq = n_txq;
+ netdev_request_reconfigure(netdev_);
+out:
ovs_mutex_unlock(&netdev->mutex);
- ovs_mutex_unlock(&dpdk_mutex);
-
return err;
-}
-
-static int
-netdev_dpdk_vhost_set_multiq(struct netdev *netdev_, unsigned int n_txq,
- unsigned int n_rxq)
-{
- struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
- int err = 0;
-
- if (netdev->up.n_txq == n_txq && netdev->up.n_rxq == n_rxq) {
- return err;
- }
-
- ovs_mutex_lock(&dpdk_mutex);
- ovs_mutex_lock(&netdev->mutex);
-
- netdev->up.n_txq = n_txq;
- netdev->up.n_rxq = n_rxq;
-
- ovs_mutex_unlock(&netdev->mutex);
- ovs_mutex_unlock(&dpdk_mutex);
- return err;
}
static struct netdev_rxq *
@@ -2239,8 +2180,70 @@ unlock_dpdk:
return err;
}
-#define NETDEV_DPDK_CLASS(NAME, INIT, CONSTRUCT, DESTRUCT, MULTIQ, SEND, \
- GET_CARRIER, GET_STATS, GET_FEATURES, GET_STATUS, RXQ_RECV) \
+static int
+netdev_dpdk_reconfigure(struct netdev *netdev_)
+{
+ struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
+ int err = 0;
+
+ ovs_mutex_lock(&dpdk_mutex);
+ ovs_mutex_lock(&netdev->mutex);
+ rte_eth_dev_stop(netdev->port_id);
+
+ netdev_->n_txq = netdev->requested_n_txq;
+ netdev_->n_rxq = netdev->requested_n_rxq;
+
+ rte_free(netdev->tx_q);
+ err = dpdk_eth_dev_init(netdev);
+ netdev_dpdk_alloc_txq(netdev, netdev->real_n_txq);
+
+ netdev->txq_needs_locking = netdev->real_n_txq != netdev->up.n_txq;
+
+ ovs_mutex_unlock(&netdev->mutex);
+ ovs_mutex_unlock(&dpdk_mutex);
+
+ return err;
+}
+
+static int
+netdev_dpdk_vhost_user_reconfigure(struct netdev *netdev_)
+{
+ struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
+
+ ovs_mutex_lock(&dpdk_mutex);
+ ovs_mutex_lock(&netdev->mutex);
+
+ netdev->up.n_txq = netdev->requested_n_txq;
+ netdev->up.n_rxq = netdev->requested_n_rxq;
+
+ ovs_mutex_unlock(&netdev->mutex);
+ ovs_mutex_unlock(&dpdk_mutex);
+
+ return 0;
+}
+
+static int
+netdev_dpdk_vhost_cuse_reconfigure(struct netdev *netdev_)
+{
+ struct netdev_dpdk *netdev = netdev_dpdk_cast(netdev_);
+
+ ovs_mutex_lock(&dpdk_mutex);
+ ovs_mutex_lock(&netdev->mutex);
+
+ netdev->up.n_txq = netdev->requested_n_txq;
+ netdev->real_n_txq = 1;
+ netdev->up.n_rxq = 1;
+ netdev->txq_needs_locking = netdev->real_n_txq != netdev->up.n_txq;
+
+ ovs_mutex_unlock(&netdev->mutex);
+ ovs_mutex_unlock(&dpdk_mutex);
+
+ return 0;
+}
+
+#define NETDEV_DPDK_CLASS(NAME, INIT, CONSTRUCT, DESTRUCT, SEND, \
+ GET_CARRIER, GET_STATS, GET_FEATURES, \
+ GET_STATUS, RECONFIGURE, RXQ_RECV) \
{ \
NAME, \
INIT, /* init */ \
@@ -2258,7 +2261,7 @@ unlock_dpdk:
NULL, /* push header */ \
NULL, /* pop header */ \
netdev_dpdk_get_numa_id, /* get_numa_id */ \
- MULTIQ, /* set_multiq */ \
+ netdev_dpdk_set_multiq, \
\
SEND, /* send */ \
NULL, /* send_wait */ \
@@ -2298,7 +2301,7 @@ unlock_dpdk:
NULL, /* arp_lookup */ \
\
netdev_dpdk_update_flags, \
- NULL, /* reconfigure */ \
+ RECONFIGURE, \
\
netdev_dpdk_rxq_alloc, \
netdev_dpdk_rxq_construct, \
@@ -2413,12 +2416,12 @@ static const struct netdev_class dpdk_class =
NULL,
netdev_dpdk_construct,
netdev_dpdk_destruct,
- netdev_dpdk_set_multiq,
netdev_dpdk_eth_send,
netdev_dpdk_get_carrier,
netdev_dpdk_get_stats,
netdev_dpdk_get_features,
netdev_dpdk_get_status,
+ netdev_dpdk_reconfigure,
netdev_dpdk_rxq_recv);
static const struct netdev_class dpdk_ring_class =
@@ -2427,12 +2430,12 @@ static const struct netdev_class dpdk_ring_class =
NULL,
netdev_dpdk_ring_construct,
netdev_dpdk_destruct,
- netdev_dpdk_set_multiq,
netdev_dpdk_ring_send,
netdev_dpdk_get_carrier,
netdev_dpdk_get_stats,
netdev_dpdk_get_features,
netdev_dpdk_get_status,
+ netdev_dpdk_reconfigure,
netdev_dpdk_rxq_recv);
static const struct netdev_class OVS_UNUSED dpdk_vhost_cuse_class =
@@ -2441,12 +2444,12 @@ static const struct netdev_class OVS_UNUSED dpdk_vhost_cuse_class =
dpdk_vhost_cuse_class_init,
netdev_dpdk_vhost_cuse_construct,
netdev_dpdk_vhost_destruct,
- netdev_dpdk_vhost_cuse_set_multiq,
netdev_dpdk_vhost_send,
netdev_dpdk_vhost_get_carrier,
netdev_dpdk_vhost_get_stats,
NULL,
NULL,
+ netdev_dpdk_vhost_cuse_reconfigure,
netdev_dpdk_vhost_rxq_recv);
static const struct netdev_class OVS_UNUSED dpdk_vhost_user_class =
@@ -2455,12 +2458,12 @@ static const struct netdev_class OVS_UNUSED dpdk_vhost_user_class =
dpdk_vhost_user_class_init,
netdev_dpdk_vhost_user_construct,
netdev_dpdk_vhost_destruct,
- netdev_dpdk_vhost_set_multiq,
netdev_dpdk_vhost_send,
netdev_dpdk_vhost_get_carrier,
netdev_dpdk_vhost_get_stats,
NULL,
NULL,
+ netdev_dpdk_vhost_user_reconfigure,
netdev_dpdk_vhost_rxq_recv);
void
diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
index 9646cca..b405c4b 100644
--- a/lib/netdev-provider.h
+++ b/lib/netdev-provider.h
@@ -67,8 +67,6 @@ struct netdev {
* modify them. */
int n_txq;
int n_rxq;
- /* Number of rx queues requested by user. */
- int requested_n_rxq;
int ref_cnt; /* Times this devices was opened. */
struct shash_node *node; /* Pointer to element in global map. */
struct ovs_list saved_flags_list; /* Contains "struct netdev_saved_flags". */
@@ -295,13 +293,8 @@ struct netdev_class {
* such info, returns NETDEV_NUMA_UNSPEC. */
int (*get_numa_id)(const struct netdev *netdev);
- /* Configures the number of tx queues and rx queues of 'netdev'.
- * Return 0 if successful, otherwise a positive errno value.
- *
- * 'n_rxq' specifies the maximum number of receive queues to create.
- * The netdev provider might choose to create less (e.g. if the hardware
- * supports only a smaller number). The actual number of queues created
- * is stored in the 'netdev->n_rxq' field.
+ /* Configures the number of tx queues of 'netdev'. Returns 0 if successful,
+ * otherwise a positive errno value.
*
* 'n_txq' specifies the exact number of transmission queues to create.
* The caller will call netdev_send() concurrently from 'n_txq' different
@@ -309,12 +302,8 @@ struct netdev_class {
* making sure that these concurrent calls do not create a race condition
* by using multiple hw queues or locking.
*
- * On error, the tx queue and rx queue configuration is indeterminant.
- * Caller should make decision on whether to restore the previous or
- * the default configuration. Also, caller must make sure there is no
- * other thread accessing the queues at the same time. */
- int (*set_multiq)(struct netdev *netdev, unsigned int n_txq,
- unsigned int n_rxq);
+ * On error, the tx queue configuration is unchanged. */
+ int (*set_multiq)(struct netdev *netdev, unsigned int n_txq);
/* Sends buffers on 'netdev'.
* Returns 0 if successful (for every buffer), otherwise a positive errno
diff --git a/lib/netdev.c b/lib/netdev.c
index 2c0918b..49c5534 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -106,12 +106,6 @@ netdev_n_rxq(const struct netdev *netdev)
return netdev->n_rxq;
}
-int
-netdev_requested_n_rxq(const struct netdev *netdev)
-{
- return netdev->requested_n_rxq;
-}
-
bool
netdev_is_pmd(const struct netdev *netdev)
{
@@ -384,7 +378,6 @@ netdev_open(const char *name, const char *type, struct netdev **netdevp)
/* By default enable one tx and rx queue per netdev. */
netdev->n_txq = netdev->netdev_class->send ? 1 : 0;
netdev->n_rxq = netdev->netdev_class->rxq_alloc ? 1 : 0;
- netdev->requested_n_rxq = netdev->n_rxq;
list_init(&netdev->saved_flags_list);
@@ -685,37 +678,26 @@ netdev_rxq_drain(struct netdev_rxq *rx)
: 0);
}
-/* Configures the number of tx queues and rx queues of 'netdev'.
- * Return 0 if successful, otherwise a positive errno value.
- *
- * 'n_rxq' specifies the maximum number of receive queues to create.
- * The netdev provider might choose to create less (e.g. if the hardware
- * supports only a smaller number). The caller can check how many have been
- * actually created by calling 'netdev_n_rxq()'
+/* Configures the number of tx queues of 'netdev'. Returns 0 if successful,
+ * otherwise a positive errno value.
*
* 'n_txq' specifies the exact number of transmission queues to create.
* If this function returns successfully, the caller can make 'n_txq'
* concurrent calls to netdev_send() (each one with a different 'qid' in the
* range [0..'n_txq'-1]).
*
- * On error, the tx queue and rx queue configuration is indeterminant.
- * Caller should make decision on whether to restore the previous or
- * the default configuration. Also, caller must make sure there is no
- * other thread accessing the queues at the same time. */
+ * On error, the tx queue and rx queue configuration is unchanged */
int
-netdev_set_multiq(struct netdev *netdev, unsigned int n_txq,
- unsigned int n_rxq)
+netdev_set_multiq(struct netdev *netdev, unsigned int n_txq)
{
int error;
error = (netdev->netdev_class->set_multiq
- ? netdev->netdev_class->set_multiq(netdev,
- MAX(n_txq, 1),
- MAX(n_rxq, 1))
+ ? netdev->netdev_class->set_multiq(netdev, MAX(n_txq, 1))
: EOPNOTSUPP);
if (error && error != EOPNOTSUPP) {
- VLOG_DBG_RL(&rl, "failed to set tx/rx queue for network device %s:"
+ VLOG_DBG_RL(&rl, "failed to set tx queue for network device %s:"
"%s", netdev_get_name(netdev), ovs_strerror(error));
}
diff --git a/lib/netdev.h b/lib/netdev.h
index c2a1d6c..bb3d297 100644
--- a/lib/netdev.h
+++ b/lib/netdev.h
@@ -142,7 +142,6 @@ bool netdev_is_reserved_name(const char *name);
int netdev_n_txq(const struct netdev *netdev);
int netdev_n_rxq(const struct netdev *netdev);
-int netdev_requested_n_rxq(const struct netdev *netdev);
bool netdev_is_pmd(const struct netdev *netdev);
/* Open and close. */
@@ -168,7 +167,7 @@ const char *netdev_get_type_from_name(const char *);
int netdev_get_mtu(const struct netdev *, int *mtup);
int netdev_set_mtu(const struct netdev *, int mtu);
int netdev_get_ifindex(const struct netdev *);
-int netdev_set_multiq(struct netdev *, unsigned int n_txq, unsigned int n_rxq);
+int netdev_set_multiq(struct netdev *, unsigned int n_txq);
/* Packet reception. */
int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id);
--
2.1.4
More information about the dev
mailing list