From patchwork Fri Aug 17 20:05:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Justin Pettit X-Patchwork-Id: 959124 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ovn.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41sZ2f0jmwz9s0n for ; Sat, 18 Aug 2018 06:06:01 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 11BDECD5; Fri, 17 Aug 2018 20:05:58 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 6063CC7F for ; Fri, 17 Aug 2018 20:05:56 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net [217.70.183.194]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 1AD0167F for ; Fri, 17 Aug 2018 20:05:54 +0000 (UTC) X-Originating-IP: 76.21.1.228 Received: from localhost.localdomain (unknown [76.21.1.228]) (Authenticated sender: jpettit@ovn.org) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id DA4E540002 for ; Fri, 17 Aug 2018 20:05:51 +0000 (UTC) From: Justin Pettit To: dev@openvswitch.org Date: Fri, 17 Aug 2018 13:05:48 -0700 Message-Id: <20180817200548.64153-1-jpettit@ovn.org> X-Mailer: git-send-email 2.17.1 X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH] dpif-netlink: Prevent abort in probe_broken_meters(). X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Commit 92d0d515d ("dpif-netlink: Probe for broken Linux meter implementations.") introduced a deadlock on the 'once' structure declared in probe_broken_meters() with the following callstack: probe_broken_meters() probe_broken_meters__() dpif_netlink_meter_set() probe_broken_meters() This commit introduce a modified version of dpif_netlink_meter_set() that sets a meter without calling the probe. Reported-by: Numan Siddique Signed-off-by: Justin Pettit Acked-by: Ben Pfaff --- lib/dpif-netlink.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index e2810a83a656..e6d5a6ec5757 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -3223,13 +3223,9 @@ dpif_netlink_meter_get_features(const struct dpif *dpif_, } static int -dpif_netlink_meter_set(struct dpif *dpif_, ofproto_meter_id meter_id, - struct ofputil_meter_config *config) +dpif_netlink_meter_set__(struct dpif *dpif_, ofproto_meter_id meter_id, + struct ofputil_meter_config *config) { - if (probe_broken_meters(dpif_)) { - return ENOMEM; - } - struct dpif_netlink *dpif = dpif_netlink_cast(dpif_); struct ofpbuf buf, *msg; uint64_t stub[1024 / 8]; @@ -3303,6 +3299,17 @@ dpif_netlink_meter_set(struct dpif *dpif_, ofproto_meter_id meter_id, return 0; } +static int +dpif_netlink_meter_set(struct dpif *dpif_, ofproto_meter_id meter_id, + struct ofputil_meter_config *config) +{ + if (probe_broken_meters(dpif_)) { + return ENOMEM; + } + + return dpif_netlink_meter_set__(dpif_, meter_id, config); +} + /* Retrieve statistics and/or delete meter 'meter_id'. Statistics are * stored in 'stats', if it is not null. If 'command' is * OVS_METER_CMD_DEL, the meter is deleted and statistics are optionally @@ -3416,9 +3423,10 @@ probe_broken_meters__(struct dpif *dpif) struct ofputil_meter_config config2 = { 2, OFPMF13_KBPS, 1, &band}; /* Try adding two meters and make sure that they both come back with - * the proper meter id. */ - dpif_netlink_meter_set(dpif, id1, &config1); - dpif_netlink_meter_set(dpif, id2, &config2); + * the proper meter id. Use the "__" version so that we don't cause + * a recurve deadlock. */ + dpif_netlink_meter_set__(dpif, id1, &config1); + dpif_netlink_meter_set__(dpif, id2, &config2); if (dpif_netlink_meter_get(dpif, id1, NULL, 0) || dpif_netlink_meter_get(dpif, id2, NULL, 0)) {