From patchwork Thu Sep 17 10:54:29 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zoltan Kiss X-Patchwork-Id: 518802 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (unknown [IPv6:2600:3c00::f03c:91ff:fe6e:bdf7]) by ozlabs.org (Postfix) with ESMTP id 48884140273 for ; Thu, 17 Sep 2015 20:55:00 +1000 (AEST) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 336C510878; Thu, 17 Sep 2015 03:54:58 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx3v1.cudamail.com (mx3.cudamail.com [64.34.241.5]) by archives.nicira.com (Postfix) with ESMTPS id 85E3F1086D for ; Thu, 17 Sep 2015 03:54:56 -0700 (PDT) Received: from bar4.cudamail.com (bar2 [192.168.15.2]) by mx3v1.cudamail.com (Postfix) with ESMTP id E795D61853E for ; Thu, 17 Sep 2015 04:54:55 -0600 (MDT) X-ASG-Debug-ID: 1442487294-03dc214a9f008d0001-byXFYA Received: from mx3-pf1.cudamail.com ([192.168.14.2]) by bar4.cudamail.com with ESMTP id O7FQBxrHGJM7oRGd (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 17 Sep 2015 04:54:54 -0600 (MDT) X-Barracuda-Envelope-From: zoltan.kiss@linaro.org X-Barracuda-RBL-Trusted-Forwarder: 192.168.14.2 Received: from unknown (HELO mail-wi0-f174.google.com) (209.85.212.174) by mx3-pf1.cudamail.com with ESMTPS (RC4-SHA encrypted); 17 Sep 2015 10:54:48 -0000 Received-SPF: pass (mx3-pf1.cudamail.com: SPF record at _netblocks.google.com designates 209.85.212.174 as permitted sender) X-Barracuda-Apparent-Source-IP: 209.85.212.174 X-Barracuda-RBL-IP: 209.85.212.174 Received: by wicgb1 with SMTP id gb1so112296951wic.1 for ; Thu, 17 Sep 2015 03:54:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=M8pnf9rycUp0QQXRN+OBeXPaA4uvSFY2aTeXoznjZFc=; b=f/xVz1YgjdOxNcOodpsdQ89Iss818W6ClCZ6zguQx7diBe/OeZ79imPmyn/B44Ev/M xKbDcHXDc0HLOL5MuyL7pJoV/mQ6+F9ug8QJpWjYyVuYYfuVeeNVaseAFFOxyaASFRUT LHHMmf47CoYt/xydhyvYdVThVLY+855qH+Lk4TFapEwy3/n2eXUI6GAqMvWaqo1bOU3H sgmAKQsz9mbZ6Zs3ntbRV0ggKV3+uY9lBHpfKDcnGJrq68mO10Xm34okc/FCSs38WQAH ZOggNyShlU7/3umD/e21jisNM9D/Aj/yj4tSb6DEb5n6rujX3J1t1gnoFTtrQ/CP3LYL Bo5A== X-Gm-Message-State: ALoCoQllHQQw0+tkRTvZ/gDCllc+a9+dUowFi7Th7So9k3LWdqwTGtWcKp7agiofc0/BbeLnyFB4 X-Received: by 10.194.117.164 with SMTP id kf4mr17415975wjb.9.1442487287086; Thu, 17 Sep 2015 03:54:47 -0700 (PDT) Received: from localhost.localdomain ([90.152.119.35]) by smtp.googlemail.com with ESMTPSA id uq5sm2791374wjc.3.2015.09.17.03.54.46 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 17 Sep 2015 03:54:46 -0700 (PDT) X-CudaMail-Envelope-Sender: zoltan.kiss@linaro.org From: Zoltan Kiss To: dev@openvswitch.org X-CudaMail-MID: CM-V1-916007316 X-CudaMail-DTE: 091715 X-CudaMail-Originating-IP: 209.85.212.174 Date: Thu, 17 Sep 2015 11:54:29 +0100 X-ASG-Orig-Subj: [##CM-V1-916007316##][PATCH v2] ofproto-dpif: do not block on uninitialized pause barriers Message-Id: <1442487269-5984-1-git-send-email-zoltan.kiss@linaro.org> X-Mailer: git-send-email 1.9.1 X-GBUdb-Analysis: 0, 209.85.212.174, Ugly c=0.414814 p=-0.464286 Source Normal X-MessageSniffer-Rules: 0-0-0-11103-c X-Barracuda-Connect: UNKNOWN[192.168.14.2] X-Barracuda-Start-Time: 1442487294 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=3.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=3.0 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22629 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Cc: Ilya Maximets Subject: [ovs-dev] [PATCH v2] ofproto-dpif: do not block on uninitialized pause barriers 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" e4e74c3a "dpif-netdev: Purge all ukeys when reconfigure pmd." introduced a new dp_purge_cb function, which calls udpif_pause_revalidators() and that tries to block on pause_barrier. But if OVS was started with flow-restore-wait="true" (e.g. through ovs-ctl), type_run() will have backer->recv_set_enable == false, and udpif_set_threads won't initialize the barrier, which leads to a segfault like this: #0 seq_read (seq=0x0) at lib/seq.c:121 #1 0x00000000004f33a2 in ovs_barrier_block (barrier=barrier@entry=0x9304a0) at lib/ovs-thread.c:291 #2 0x0000000000445a01 in udpif_pause_revalidators (udpif=0x930410) at ofproto/ofproto-dpif-upcall.c:526 #3 dp_purge_cb (aux=0x930410, pmd_id=4294967295) at ofproto/ofproto-dpif-upcall.c:2271 #4 0x0000000000471552 in dp_netdev_del_pmd (pmd=pmd@entry=0x961f10, dp=, dp=) at lib/dpif-netdev.c:2891 #5 0x00000000004716d9 in dp_netdev_destroy_all_pmds (dp=0x948550) at lib/dpif-netdev.c:2904 #6 dpif_netdev_pmd_set (dpif=, n_rxqs=1, cmask=0x946250 "2") at lib/dpif-netdev.c:2385 #7 0x000000000047873a in dpif_poll_threads_set (dpif=0x95ed10, n_rxqs=, cmask=) at lib/dpif.c:1411 #8 0x000000000043897f in type_run (type=) at ofproto/ofproto-dpif.c:558 #9 0x000000000042b195 in ofproto_type_run (datapath_type=, datapath_type@entry=0xcf23e0 "netdev") at ofproto/ofproto.c:1655 #10 0x000000000040f395 in bridge_run__ () at vswitchd/bridge.c:2875 #11 0x00000000004155b3 in bridge_reconfigure (ovs_cfg=ovs_cfg@entry=0x961db0) at vswitchd/bridge.c:700 #12 0x0000000000418439 in bridge_run () at vswitchd/bridge.c:2984 #13 0x000000000040d025 in main (argc=11, argv=0x7fffffffe9a8) at vswitchd/ovs-vswitchd.c:120 This patch introduces ofproto_dpif_backer_enabled(), which checks recv_set_enable before touching the latch and blocking on pause_barrier. It removes a stale control character in ofproto/ofproto.c as well. Signed-off-by: Zoltan Kiss --- v2: - ofproto_dpif_backer_enabled() to check recv_set_enable - do not touch the latch - diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 8a43bbf..3b897e0 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -522,8 +522,10 @@ udpif_start_threads(struct udpif *udpif, size_t n_handlers, static void udpif_pause_revalidators(struct udpif *udpif) { - latch_set(&udpif->pause_latch); - ovs_barrier_block(&udpif->pause_barrier); + if (ofproto_dpif_backer_enabled(udpif->backer)) { + latch_set(&udpif->pause_latch); + ovs_barrier_block(&udpif->pause_barrier); + } } /* Resumes the pausing of revalidators. Should only be called by the @@ -531,8 +533,10 @@ udpif_pause_revalidators(struct udpif *udpif) static void udpif_resume_revalidators(struct udpif *udpif) { - latch_poll(&udpif->pause_latch); - ovs_barrier_block(&udpif->pause_barrier); + if (ofproto_dpif_backer_enabled(udpif->backer)) { + latch_poll(&udpif->pause_latch); + ovs_barrier_block(&udpif->pause_barrier); + } } /* Tells 'udpif' how many threads it should use to handle upcalls. diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 1279907..e2ed149 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -515,6 +515,12 @@ lookup_ofproto_dpif_by_port_name(const char *name) return NULL; } +bool +ofproto_dpif_backer_enabled(struct dpif_backer* backer) +{ + return backer->recv_set_enable; +} + static int type_run(const char *type) { diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h index 69ca54c..81449cc 100644 --- a/ofproto/ofproto-dpif.h +++ b/ofproto/ofproto-dpif.h @@ -172,7 +172,8 @@ int ofproto_dpif_add_internal_flow(struct ofproto_dpif *, struct rule **rulep); int ofproto_dpif_delete_internal_flow(struct ofproto_dpif *, struct match *, int priority); -^L +bool ofproto_dpif_backer_enabled(struct dpif_backer* backer); + /* struct rule_dpif has struct rule as it's first member. */ #define RULE_CAST(RULE) ((struct rule *)RULE) #define GROUP_CAST(GROUP) ((struct ofgroup *)GROUP) diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index c7dd8a2..642ae06 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -880,7 +880,6 @@ ofproto_get_flow_restore_wait(void) return flow_restore_wait; } -^L /* Spanning Tree Protocol (STP) configuration. */ /* Configures STP on 'ofproto' using the settings defined in 's'. If