From patchwork Tue Mar 15 22:30:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniele Di Proietto X-Patchwork-Id: 597881 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (archives.nicira.com [96.126.127.54]) by ozlabs.org (Postfix) with ESMTP id 3qPq8d1l15z9sRB for ; Wed, 16 Mar 2016 09:31:13 +1100 (AEDT) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 8D7B3108DE; Tue, 15 Mar 2016 15:30:39 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx1e4.cudamail.com (mx1.cudamail.com [69.90.118.67]) by archives.nicira.com (Postfix) with ESMTPS id 8DE7510770 for ; Tue, 15 Mar 2016 15:30:34 -0700 (PDT) Received: from bar5.cudamail.com (unknown [192.168.21.12]) by mx1e4.cudamail.com (Postfix) with ESMTPS id 16D511E0388 for ; Tue, 15 Mar 2016 16:30:34 -0600 (MDT) X-ASG-Debug-ID: 1458081033-09eadd305f1e5740001-byXFYA Received: from mx1-pf2.cudamail.com ([192.168.24.2]) by bar5.cudamail.com with ESMTP id 4ECWqIovtJqEHM2L (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 15 Mar 2016 16:30:33 -0600 (MDT) X-Barracuda-Envelope-From: diproiettod@vmware.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.24.2 Received: from unknown (HELO smtp-outbound-1.vmware.com) (208.91.2.12) by mx1-pf2.cudamail.com with ESMTPS (DHE-RSA-AES256-SHA encrypted); 15 Mar 2016 22:30:33 -0000 Received-SPF: error (mx1-pf2.cudamail.com: error in processing during lookup of vmware.com: DNS problem) X-Barracuda-Apparent-Source-IP: 208.91.2.12 X-Barracuda-RBL-IP: 208.91.2.12 Received: from sc9-mailhost1.vmware.com (sc9-mailhost1.vmware.com [10.113.161.71]) by smtp-outbound-1.vmware.com (Postfix) with ESMTP id 515C82915F; Tue, 15 Mar 2016 15:30:31 -0700 (PDT) Received: from sc9-mailhost2.vmware.com (unknown [10.33.74.30]) by sc9-mailhost1.vmware.com (Postfix) with ESMTP id 3A38E18CF7; Tue, 15 Mar 2016 15:30:32 -0700 (PDT) X-CudaMail-Envelope-Sender: diproiettod@vmware.com From: Daniele Di Proietto To: dev@openvswitch.org X-CudaMail-Whitelist-To: dev@openvswitch.org X-CudaMail-MID: CM-E2-314097872 X-CudaMail-DTE: 031516 X-CudaMail-Originating-IP: 208.91.2.12 Date: Tue, 15 Mar 2016 15:30:03 -0700 X-ASG-Orig-Subj: [##CM-E2-314097872##][PATCH v3 11/11] netdev-dpdk: Use ->reconfigure() call to change rx/tx queues. Message-Id: <1458081003-82542-12-git-send-email-diproiettod@vmware.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1458081003-82542-1-git-send-email-diproiettod@vmware.com> References: <1458081003-82542-1-git-send-email-diproiettod@vmware.com> X-Barracuda-Connect: UNKNOWN[192.168.24.2] X-Barracuda-Start-Time: 1458081033 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-ASG-Whitelist: Header =?UTF-8?B?eFwtY3VkYW1haWxcLXdoaXRlbGlzdFwtdG8=?= X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 X-ASG-Whitelist: EmailCat (corporate) Cc: Ilya Maximets Subject: [ovs-dev] [PATCH v3 11/11] netdev-dpdk: Use ->reconfigure() call to change rx/tx queues. X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dev-bounces@openvswitch.org Sender: "dev" 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 --- lib/dpif-netdev.c | 71 +++++++++---------- lib/netdev-dpdk.c | 193 ++++++++++++++++++++++++++------------------------ lib/netdev-provider.h | 19 ++--- lib/netdev.c | 30 ++------ lib/netdev.h | 3 +- 5 files changed, 147 insertions(+), 169 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 9fbf821..7a775d8 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,10 +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, i, err; + 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]); @@ -2627,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); @@ -2669,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) @@ -2694,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); } @@ -2717,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 b5867e8..7d3e275 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -339,6 +339,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 { @@ -720,7 +725,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) { @@ -903,7 +909,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); @@ -916,11 +922,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; @@ -934,95 +943,25 @@ 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. */ -static int -netdev_dpdk_set_multiq(struct netdev *netdev_, unsigned int n_txq, - unsigned int n_rxq) -{ - 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; -} - +/* Sets the number of tx queues for the dpdk interface. */ static int -netdev_dpdk_vhost_cuse_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; - - 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->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 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; + if (netdev->requested_n_txq == n_txq) { + goto out; } - ovs_mutex_lock(&dpdk_mutex); - ovs_mutex_lock(&netdev->mutex); - - netdev->up.n_txq = n_txq; - netdev->up.n_rxq = n_rxq; + netdev->requested_n_txq = n_txq; + netdev_request_reconfigure(netdev_); +out: ovs_mutex_unlock(&netdev->mutex); - ovs_mutex_unlock(&dpdk_mutex); + return 0; - return err; } static struct netdev_rxq * @@ -2568,6 +2507,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; } @@ -2637,8 +2577,79 @@ 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 *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); + + if (netdev_->n_txq == netdev->requested_n_txq + && netdev_->n_rxq == netdev->requested_n_rxq) { + /* Reconfiguration is unnecessary */ + + goto out; + } + + 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; + +out: + + 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 */ \ @@ -2656,7 +2667,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_multiq, \ \ SEND, /* send */ \ NULL, /* send_wait */ \ @@ -2696,7 +2707,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, \ @@ -2811,12 +2822,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 = @@ -2825,12 +2836,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 = @@ -2839,12 +2850,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 = @@ -2853,12 +2864,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 0317910..ea40d61 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 7cb7085..8c1d7a4 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 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);