From patchwork Sun Feb 28 20:13:15 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: 589632 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 865C1140326 for ; Mon, 29 Feb 2016 07:14:10 +1100 (AEDT) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id EBB9A1086D; Sun, 28 Feb 2016 12:13:56 -0800 (PST) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx3v3.cudamail.com (mx3.cudamail.com [64.34.241.5]) by archives.nicira.com (Postfix) with ESMTPS id 9D1AB1076F for ; Sun, 28 Feb 2016 12:13:54 -0800 (PST) Received: from bar6.cudamail.com (localhost [127.0.0.1]) by mx3v3.cudamail.com (Postfix) with ESMTPS id 2135C16267A for ; Sun, 28 Feb 2016 13:13:54 -0700 (MST) X-ASG-Debug-ID: 1456690433-0b323745cf0b600001-byXFYA Received: from mx3-pf2.cudamail.com ([192.168.14.1]) by bar6.cudamail.com with ESMTP id xX8nwipLgH3OWEiC (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 28 Feb 2016 13:13:53 -0700 (MST) X-Barracuda-Envelope-From: diproiettod@vmware.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.14.1 Received: from unknown (HELO smtp-outbound-1.vmware.com) (208.91.2.12) by mx3-pf2.cudamail.com with ESMTPS (DHE-RSA-AES256-SHA encrypted); 28 Feb 2016 20:13:53 -0000 Received-SPF: error (mx3-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 2ED6329340 for ; Sun, 28 Feb 2016 12:13:52 -0800 (PST) Received: from sc9-mailhost2.vmware.com (unknown [10.129.192.177]) by sc9-mailhost1.vmware.com (Postfix) with ESMTP id A65CB18868; Sun, 28 Feb 2016 12:13:52 -0800 (PST) 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-V2-227012327 X-CudaMail-DTE: 022816 X-CudaMail-Originating-IP: 208.91.2.12 Date: Sun, 28 Feb 2016 12:13:15 -0800 X-ASG-Orig-Subj: [##CM-V2-227012327##][PATCH 03/11] dpif-netdev: Do not keep refcount for ports. Message-Id: <1456690403-15050-4-git-send-email-diproiettod@vmware.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1456690403-15050-1-git-send-email-diproiettod@vmware.com> References: <1456690403-15050-1-git-send-email-diproiettod@vmware.com> X-Barracuda-Connect: UNKNOWN[192.168.14.1] X-Barracuda-Start-Time: 1456690433 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) Subject: [ovs-dev] [PATCH 03/11] dpif-netdev: Do not keep refcount for ports. 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" Only the main thread will delete ports after pausing every other thread. There's no need to keep count. Signed-off-by: Daniele Di Proietto --- lib/dpif-netdev.c | 50 ++++++++++++++------------------------------------ 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 5d7fac7..ebdbacb 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -252,7 +252,6 @@ struct dp_netdev_port { struct netdev_saved_flags *sf; unsigned n_rxq; /* Number of elements in 'rxq' */ struct netdev_rxq **rxq; - struct ovs_refcount ref_cnt; char *type; /* Port type as requested by user. */ int latest_requested_n_rxq; /* Latest requested from netdev number of rx queues. */ @@ -1173,7 +1172,6 @@ do_add_port(struct dp_netdev *dp, const char *devname, const char *type, } port->sf = sf; - ovs_refcount_init(&port->ref_cnt); cmap_insert(&dp->ports, &port->node, hash_port_no(port_no)); if (netdev_is_pmd(netdev)) { @@ -1279,29 +1277,22 @@ get_port_by_number(struct dp_netdev *dp, } static void -port_ref(struct dp_netdev_port *port) +port_destroy(struct dp_netdev_port *port) { - if (port) { - ovs_refcount_ref(&port->ref_cnt); + if (!port) { + return; } -} - -static void -port_unref(struct dp_netdev_port *port) -{ - if (port && ovs_refcount_unref_relaxed(&port->ref_cnt) == 1) { - int i; - netdev_close(port->netdev); - netdev_restore_flags(port->sf); + netdev_close(port->netdev); + netdev_restore_flags(port->sf); - for (i = 0; i < port->n_rxq; i++) { - netdev_rxq_close(port->rxq[i]); - } - free(port->rxq); - free(port->type); - free(port); + for (unsigned i = 0; i < port->n_rxq; i++) { + netdev_rxq_close(port->rxq[i]); } + + free(port->rxq); + free(port->type); + free(port); } static int @@ -1380,7 +1371,7 @@ do_del_port(struct dp_netdev *dp, struct dp_netdev_port *port) } } - port_unref(port); + port_destroy(port); } static void @@ -2646,23 +2637,17 @@ dpif_netdev_wait(struct dpif *dpif) } static int -pmd_load_queues(struct dp_netdev_pmd_thread *pmd, - struct rxq_poll **ppoll_list, int poll_cnt) +pmd_load_queues(struct dp_netdev_pmd_thread *pmd, struct rxq_poll **ppoll_list) OVS_REQUIRES(pmd->poll_mutex) { struct rxq_poll *poll_list = *ppoll_list; struct rxq_poll *poll; int i; - for (i = 0; i < poll_cnt; i++) { - port_unref(poll_list[i].port); - } - poll_list = xrealloc(poll_list, pmd->poll_cnt * sizeof *poll_list); i = 0; LIST_FOR_EACH (poll, node, &pmd->poll_list) { - port_ref(poll->port); poll_list[i++] = *poll; } @@ -2690,7 +2675,7 @@ reload: emc_cache_init(&pmd->flow_cache); ovs_mutex_lock(&pmd->poll_mutex); - poll_cnt = pmd_load_queues(pmd, &poll_list, poll_cnt); + poll_cnt = pmd_load_queues(pmd, &poll_list); ovs_mutex_unlock(&pmd->poll_mutex); /* List port/core affinity */ @@ -2732,10 +2717,6 @@ reload: goto reload; } - for (i = 0; i < poll_cnt; i++) { - port_unref(poll_list[i].port); - } - dp_netdev_pmd_reload_done(pmd); free(poll_list); @@ -3002,7 +2983,6 @@ dp_netdev_pmd_clear_poll_list(struct dp_netdev_pmd_thread *pmd) ovs_mutex_lock(&pmd->poll_mutex); LIST_FOR_EACH_POP (poll, node, &pmd->poll_list) { - port_unref(poll->port); free(poll); } pmd->poll_cnt = 0; @@ -3022,7 +3002,6 @@ dp_netdev_del_port_from_pmd(struct dp_netdev_port *port, LIST_FOR_EACH_SAFE (poll, next, node, &pmd->poll_list) { if (poll->port == port) { found = true; - port_unref(poll->port); list_remove(&poll->node); pmd->poll_cnt--; free(poll); @@ -3078,7 +3057,6 @@ dp_netdev_add_rxq_to_pmd(struct dp_netdev_pmd_thread *pmd, { struct rxq_poll *poll = xmalloc(sizeof *poll); - port_ref(port); poll->port = port; poll->rx = rx;