Thanks for spotting this, fixed
On 15/05/2016 23:22, "Ilya Maximets" <i.maxim...@samsung.com> wrote: >One typo inline. > >Best regards, Ilya Maximets. > >On 23.04.2016 04:03, Daniele Di Proietto wrote: >> 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. >> * Move a DPDK vhost device to the proper NUMA socket. >> >> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> >> --- >> lib/dpif-netdev.c | 69 +++++++++--------- >> lib/netdev-bsd.c | 2 +- >> lib/netdev-dpdk.c | 195 >> ++++++++++++++++++++++++++------------------------ >> lib/netdev-dummy.c | 2 +- >> lib/netdev-linux.c | 2 +- >> lib/netdev-provider.h | 23 +++--- >> lib/netdev-vport.c | 2 +- >> lib/netdev.c | 36 +++------- >> lib/netdev.h | 3 +- >> 9 files changed, 160 insertions(+), 174 deletions(-) >> >> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c >> index 7531c2f..a1fa2d7 100644 >> --- a/lib/dpif-netdev.c >> +++ b/lib/dpif-netdev.c >> @@ -257,8 +257,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. */ >> @@ -1166,20 +1164,26 @@ port_create(const char *devname, const char >> *open_type, 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_tx_multiq(netdev, n_cores + 1); >> if (error && (error != EOPNOTSUPP)) { >> VLOG_ERR("%s, cannot set multiq", devname); >> goto out; >> } >> } >> + >> + if (netdev_is_reconf_required(netdev)) { >> + error = netdev_reconfigure(netdev); >> + if (error) { >> + goto out; >> + } >> + } >> + >> port = xzalloc(sizeof *port); >> port->port_no = port_no; >> port->netdev = netdev; >> port->n_rxq = netdev_n_rxq(netdev); >> port->rxq = xcalloc(port->n_rxq, sizeof *port->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); >> @@ -2467,27 +2471,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; >> - >> - ovs_mutex_lock(&dp->port_mutex); >> - HMAP_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) { >> - ovs_mutex_unlock(&dp->port_mutex); >> - return true; >> - } >> - } >> - ovs_mutex_unlock(&dp->port_mutex); >> - >> - return false; >> -} >> - >> static bool >> cmask_equals(const char *a, const char *b) >> { >> @@ -2611,11 +2594,9 @@ static int >> port_reconfigure(struct dp_netdev_port *port) >> { >> struct netdev *netdev = port->netdev; >> - int requested_n_rxq = netdev_requested_n_rxq(netdev); >> int i, err; >> >> - if (!netdev_is_pmd(port->netdev) >> - || port->latest_requested_n_rxq != requested_n_rxq) { >> + if (!netdev_is_reconf_required(netdev)) { >> return 0; >> } >> >> @@ -2626,15 +2607,14 @@ port_reconfigure(struct dp_netdev_port *port) >> } >> 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 'netdev' to apply the pending configuration changes. */ >> + err = netdev_reconfigure(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(netdev)); >> return err; >> } >> - /* If the set_multiq() above succeeds, reopens the 'rxq's. */ >> + /* If the netdev_reconfigure( above succeeds, reopens the 'rxq's. */ > >Forgotten ')'. > >> port->rxq = xrealloc(port->rxq, sizeof *port->rxq * >> netdev_n_rxq(netdev)); >> for (i = 0; i < netdev_n_rxq(netdev); i++) { >> err = netdev_rxq_open(netdev, &port->rxq[i], i); >> @@ -2678,6 +2658,22 @@ 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) >> + OVS_REQUIRES(dp->port_mutex) >> +{ >> + struct dp_netdev_port *port; >> + >> + HMAP_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) >> @@ -2704,7 +2700,7 @@ dpif_netdev_run(struct dpif *dpif) >> dp_netdev_pmd_unref(non_pmd); >> >> if (!cmask_equals(dp->pmd_cmask, dp->requested_pmd_cmask) >> - || pmd_n_rxq_changed(dp)) { >> + || ports_require_restart(dp)) { >> reconfigure_pmd_threads(dp); >> } >> ovs_mutex_unlock(&dp->port_mutex); >> @@ -2729,6 +2725,7 @@ dpif_netdev_wait(struct dpif *dpif) >> ovs_mutex_lock(&dp_netdev_mutex); >> ovs_mutex_lock(&dp->port_mutex); >> HMAP_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-bsd.c b/lib/netdev-bsd.c >> index 32e8f74..43fa982 100644 >> --- a/lib/netdev-bsd.c >> +++ b/lib/netdev-bsd.c >> @@ -1497,7 +1497,7 @@ netdev_bsd_update_flags(struct netdev *netdev_, enum >> netdev_flags off, >> NULL, /* push header */ \ >> NULL, /* pop header */ \ >> NULL, /* get_numa_id */ \ >> - NULL, /* set_multiq */ \ >> + NULL, /* set_tx_multiq */ \ >> \ >> netdev_bsd_send, \ >> netdev_bsd_send_wait, \ >> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c >> index c4ff039..d4e8bf0 100644 >> --- a/lib/netdev-dpdk.c >> +++ b/lib/netdev-dpdk.c >> @@ -342,6 +342,11 @@ struct netdev_dpdk { >> struct qos_conf *qos_conf; >> rte_spinlock_t qos_lock; >> >> + /* 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 { >> @@ -723,7 +728,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; >> + dev->requested_n_rxq = NR_QUEUE; >> + dev->requested_n_txq = NR_QUEUE; >> dev->real_n_txq = NR_QUEUE; >> >> if (type == DPDK_DEV_ETH) { >> @@ -909,7 +915,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); >> @@ -922,11 +928,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; >> @@ -940,95 +949,24 @@ netdev_dpdk_get_numa_id(const struct netdev *netdev) >> return dev->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_tx_multiq(struct netdev *netdev, unsigned int n_txq) >> { >> struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); >> - int err = 0; >> - int old_rxq, old_txq; >> - >> - if (netdev->n_txq == n_txq && netdev->n_rxq == n_rxq) { >> - return err; >> - } >> >> - ovs_mutex_lock(&dpdk_mutex); >> ovs_mutex_lock(&dev->mutex); >> >> - rte_eth_dev_stop(dev->port_id); >> - >> - old_txq = netdev->n_txq; >> - old_rxq = netdev->n_rxq; >> - netdev->n_txq = n_txq; >> - netdev->n_rxq = n_rxq; >> - >> - rte_free(dev->tx_q); >> - err = dpdk_eth_dev_init(dev); >> - netdev_dpdk_alloc_txq(dev, dev->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->n_txq = old_txq; >> - netdev->n_rxq = old_rxq; >> - } >> - >> - dev->txq_needs_locking = dev->real_n_txq != netdev->n_txq; >> - >> - ovs_mutex_unlock(&dev->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 *dev = netdev_dpdk_cast(netdev); >> - int err = 0; >> - >> - if (netdev->n_txq == n_txq && netdev->n_rxq == n_rxq) { >> - return err; >> - } >> - >> - ovs_mutex_lock(&dpdk_mutex); >> - ovs_mutex_lock(&dev->mutex); >> - >> - netdev->n_txq = n_txq; >> - dev->real_n_txq = 1; >> - netdev->n_rxq = 1; >> - dev->txq_needs_locking = dev->real_n_txq != netdev->n_txq; >> - >> - ovs_mutex_unlock(&dev->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 *dev = netdev_dpdk_cast(netdev); >> - int err = 0; >> - >> - if (netdev->n_txq == n_txq && netdev->n_rxq == n_rxq) { >> - return err; >> + if (dev->requested_n_txq == n_txq) { >> + goto out; >> } >> >> - ovs_mutex_lock(&dpdk_mutex); >> - ovs_mutex_lock(&dev->mutex); >> - >> - netdev->n_txq = n_txq; >> - netdev->n_rxq = n_rxq; >> + dev->requested_n_txq = n_txq; >> + netdev_request_reconfigure(netdev); >> >> +out: >> ovs_mutex_unlock(&dev->mutex); >> - ovs_mutex_unlock(&dpdk_mutex); >> - >> - return err; >> + return 0; >> } >> >> static struct netdev_rxq * >> @@ -2592,6 +2530,7 @@ egress_policer_qos_get(const struct netdev *netdev, >> struct smap *details) >> 1ULL * policer->app_srtcm_params.cir); >> smap_add_format(details, "cbs", "%llu", >> 1ULL * policer->app_srtcm_params.cbs); >> + >> return 0; >> } >> >> @@ -2661,8 +2600,80 @@ static const struct dpdk_qos_ops egress_policer_ops = >> { >> egress_policer_run >> }; >> >> -#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 *dev = netdev_dpdk_cast(netdev); >> + int err = 0; >> + >> + ovs_mutex_lock(&dpdk_mutex); >> + ovs_mutex_lock(&dev->mutex); >> + >> + if (netdev->n_txq == dev->requested_n_txq >> + && netdev->n_rxq == dev->requested_n_rxq) { >> + /* Reconfiguration is unnecessary */ >> + >> + goto out; >> + } >> + >> + rte_eth_dev_stop(dev->port_id); >> + >> + netdev->n_txq = dev->requested_n_txq; >> + netdev->n_rxq = dev->requested_n_rxq; >> + >> + rte_free(dev->tx_q); >> + err = dpdk_eth_dev_init(dev); >> + netdev_dpdk_alloc_txq(dev, dev->real_n_txq); >> + >> + dev->txq_needs_locking = dev->real_n_txq != netdev->n_txq; >> + >> +out: >> + >> + ovs_mutex_unlock(&dev->mutex); >> + ovs_mutex_unlock(&dpdk_mutex); >> + >> + return err; >> +} >> + >> +static int >> +netdev_dpdk_vhost_user_reconfigure(struct netdev *netdev) >> +{ >> + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); >> + >> + ovs_mutex_lock(&dpdk_mutex); >> + ovs_mutex_lock(&dev->mutex); >> + >> + netdev->n_txq = dev->requested_n_txq; >> + netdev->n_rxq = dev->requested_n_rxq; >> + >> + ovs_mutex_unlock(&dev->mutex); >> + ovs_mutex_unlock(&dpdk_mutex); >> + >> + return 0; >> +} >> + >> +static int >> +netdev_dpdk_vhost_cuse_reconfigure(struct netdev *netdev) >> +{ >> + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); >> + >> + ovs_mutex_lock(&dpdk_mutex); >> + ovs_mutex_lock(&dev->mutex); >> + >> + netdev->n_txq = dev->requested_n_txq; >> + dev->real_n_txq = 1; >> + netdev->n_rxq = 1; >> + dev->txq_needs_locking = dev->real_n_txq != netdev->n_txq; >> + >> + ovs_mutex_unlock(&dev->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, \ >> true, /* is_pmd */ \ >> @@ -2681,7 +2692,7 @@ static const struct dpdk_qos_ops egress_policer_ops = { >> NULL, /* push header */ \ >> NULL, /* pop header */ \ >> netdev_dpdk_get_numa_id, /* get_numa_id */ \ >> - MULTIQ, /* set_multiq */ \ >> + netdev_dpdk_set_tx_multiq, \ >> \ >> SEND, /* send */ \ >> NULL, /* send_wait */ \ >> @@ -2720,7 +2731,7 @@ static const struct dpdk_qos_ops egress_policer_ops = { >> NULL, /* arp_lookup */ \ >> \ >> netdev_dpdk_update_flags, \ >> - NULL, /* reconfigure */ \ >> + RECONFIGURE, \ >> \ >> netdev_dpdk_rxq_alloc, \ >> netdev_dpdk_rxq_construct, \ >> @@ -2835,12 +2846,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 = >> @@ -2849,12 +2860,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 = >> @@ -2863,12 +2874,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 = >> @@ -2877,12 +2888,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-dummy.c b/lib/netdev-dummy.c >> index a001322..ac3e491 100644 >> --- a/lib/netdev-dummy.c >> +++ b/lib/netdev-dummy.c >> @@ -1235,7 +1235,7 @@ static const struct netdev_class dummy_class = { >> NULL, /* push header */ >> NULL, /* pop header */ >> NULL, /* get_numa_id */ >> - NULL, /* set_multiq */ >> + NULL, /* set_tx_multiq */ >> >> netdev_dummy_send, /* send */ >> NULL, /* send_wait */ >> diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c >> index 427b3e2..3cc39b4 100644 >> --- a/lib/netdev-linux.c >> +++ b/lib/netdev-linux.c >> @@ -2766,7 +2766,7 @@ netdev_linux_update_flags(struct netdev *netdev_, enum >> netdev_flags off, >> NULL, /* push header */ \ >> NULL, /* pop header */ \ >> NULL, /* get_numa_id */ \ >> - NULL, /* set_multiq */ \ >> + NULL, /* set_tx_multiq */ \ >> \ >> netdev_linux_send, \ >> netdev_linux_send_wait, \ >> diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h >> index 853fc44..be31e31 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". */ >> @@ -298,13 +296,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 >> @@ -312,12 +305,12 @@ 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); >> + * The caller will call netdev_reconfigure() (if necessary) before using >> + * netdev_send() on any of the newly configured queues, giving the >> provider >> + * a chance to adjust its settings. >> + * >> + * On error, the tx queue configuration is unchanged. */ >> + int (*set_tx_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-vport.c b/lib/netdev-vport.c >> index 4a1d711..4e5137e 100644 >> --- a/lib/netdev-vport.c >> +++ b/lib/netdev-vport.c >> @@ -1488,7 +1488,7 @@ netdev_vport_range(struct unixctl_conn *conn, int argc, >> PUSH_HEADER, \ >> POP_HEADER, \ >> NULL, /* get_numa_id */ \ >> - NULL, /* set_multiq */ \ >> + NULL, /* set_tx_multiq */ \ >> \ >> NULL, /* send */ \ >> NULL, /* send_wait */ \ >> diff --git a/lib/netdev.c b/lib/netdev.c >> index d226bb1..a3cf2fe 100644 >> --- a/lib/netdev.c >> +++ b/lib/netdev.c >> @@ -114,12 +114,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) >> { >> @@ -390,7 +384,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; >> >> ovs_list_init(&netdev->saved_flags_list); >> >> @@ -691,37 +684,30 @@ 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. */ >> + * The change might not effective immediately. The caller must check if a >> + * reconfiguration is required with netdev_is_reconf_required() and >> eventually >> + * call netdev_reconfigure() before using the new queues. >> + * >> + * On error, the tx queue configuration is unchanged */ >> int >> -netdev_set_multiq(struct netdev *netdev, unsigned int n_txq, >> - unsigned int n_rxq) >> +netdev_set_tx_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)) >> + error = (netdev->netdev_class->set_tx_multiq >> + ? netdev->netdev_class->set_tx_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 857e2ae..aeac97c 100644 >> --- a/lib/netdev.h >> +++ b/lib/netdev.h >> @@ -108,7 +108,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. */ >> @@ -134,7 +133,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_tx_multiq(struct netdev *, unsigned int n_txq); >> >> /* Packet reception. */ >> int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id); >> _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev