From patchwork Tue May 28 18:14:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Darrell Ball X-Patchwork-Id: 1106465 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="klGrdqfT"; dkim-atps=neutral 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 45D28k3KXkz9s1c for ; Wed, 29 May 2019 04:16:05 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 2063F2183; Tue, 28 May 2019 18:16:03 +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 DE1CE2176 for ; Tue, 28 May 2019 18:14:56 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 90CA087D for ; Tue, 28 May 2019 18:14:56 +0000 (UTC) Received: by mail-pl1-f182.google.com with SMTP id d14so3140836pls.8 for ; Tue, 28 May 2019 11:14:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=dgkuZ3EQMm5vFK4+1bBjW6aPdyzkWvQDg3WFBAyoyz0=; b=klGrdqfT8sSR+Dk3vKfNQHUk4Nnm/X7CHviON94N8T9gAuiYOy1PsBpEz52Gtwl49S ooMS4hpNsVtoBH+Nqe9f/aWwBO2jug9QSfIhP0vKPxaDo4lGXPGaG8tuHZ4AMmceivap Evrx12N5RuxqvIauRP1ECUQShtE1q+8R0hSrsK3WUYC8yFy5/Bh0zndaq4UIUhUkTRPD MhpKqXOwsGwTGq0FdGQwe5Vhfh1usuS1i43XPsZ06kSvfVpRtqfbo1sd8//us3z/RRMh tVJ7BFXtzUHo+PTCIT52owJIT1c8/CGuEFKngpI3yXjMs/BNhaaRIm7Gy6q2S5uz8m9G kYcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=dgkuZ3EQMm5vFK4+1bBjW6aPdyzkWvQDg3WFBAyoyz0=; b=pRx00rquxp1MKbAriMTct7XLD+ouoCLJ/sxueegJR7FKmQHGuH9Tg+kR2Fc0ANudQe rNMoYksmtJXw0ibw8LNsXXR/SzV3b9u/dFJpgSDg/znMWu6eqGsiBd1jMWct5aNL1Ei9 FPfpj1khY0uGVq0negMil709qFXbkJ1GRXKSpZBx4egWD2vT28oWOFkihKnCTeWUjTnm HpBi7rKhyujSzg8dJ2LkPXc8BZq8HxaenjCyWoDDuorGZakfujVrp26NmPdY6GKCPYA8 kJdRXP6LPFZ3zG9i+9vE7EdeBobTgBxAn7FmhJ+Q6uWL9/ZlNRzZtp8DmTSNOMNLr13H Tmtw== X-Gm-Message-State: APjAAAVxXXux0MD51PybTREHhsWPFz+xxdwrd/qCQOLLSEsc5G1Z1gRS C7gPm5iAjKeAZnt5WZKoMIY= X-Google-Smtp-Source: APXvYqyAeZ1tUHjnZdT+NdGeEaxU0ILsZDxGNAv/8ycaoJVFh8fs2KM8IwiwrZiCnuA5kbB9Vas6gg== X-Received: by 2002:a17:902:9895:: with SMTP id s21mr9821166plp.139.1559067296142; Tue, 28 May 2019 11:14:56 -0700 (PDT) Received: from ubuntu.localdomain (c-76-102-76-212.hsd1.ca.comcast.net. [76.102.76.212]) by smtp.gmail.com with ESMTPSA id h18sm13011235pgv.38.2019.05.28.11.14.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 May 2019 11:14:55 -0700 (PDT) From: Darrell Ball To: dlu998@gmail.com, dev@openvswitch.org Date: Tue, 28 May 2019 11:14:42 -0700 Message-Id: <1559067284-48389-1-git-send-email-dlu998@gmail.com> X-Mailer: git-send-email 1.9.1 X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [patch v2 1/3] conntrack: Don't re-add cleaned 'conn' to expiry list. 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 When a 'conn' entry is cleaned up from an expiry list, we don't want to put it back during an update. Hence, we detect and block this. Fixes: 967bb5c5cd90 ("conntrack: Add rcu support.") Signed-off-by: Darrell Ball --- v2: No change. lib/conntrack-private.h | 11 +++++++---- lib/conntrack.c | 2 ++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/conntrack-private.h b/lib/conntrack-private.h index 51b7d7f..bcfbe10 100644 --- a/lib/conntrack-private.h +++ b/lib/conntrack-private.h @@ -102,11 +102,12 @@ struct conn { /* Mutable data. */ struct ovs_mutex lock; /* Guards all mutable fields. */ ovs_u128 label; - uint32_t mark; long long expiration; + uint32_t mark; int seq_skew; bool seq_skew_dir; /* TCP sequence skew direction due to NATTing of FTP * control messages; true if reply direction. */ + bool cleaned; /* True if cleaned from expiry lists. */ /* Immutable data. */ bool alg_related; /* True if alg data connection. */ @@ -218,9 +219,11 @@ conn_update_expiration(struct conntrack *ct, struct conn *conn, ovs_mutex_lock(&ct->ct_lock); ovs_mutex_lock(&conn->lock); - conn->expiration = now + ct_timeout_val[tm]; - ovs_list_remove(&conn->exp_node); - ovs_list_push_back(&ct->exp_lists[tm], &conn->exp_node); + if (!conn->cleaned) { + conn->expiration = now + ct_timeout_val[tm]; + ovs_list_remove(&conn->exp_node); + ovs_list_push_back(&ct->exp_lists[tm], &conn->exp_node); + } ovs_mutex_unlock(&conn->lock); ovs_mutex_unlock(&ct->ct_lock); diff --git a/lib/conntrack.c b/lib/conntrack.c index d7d48a4..c57d9fd 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -343,6 +343,7 @@ conn_clean(struct conntrack *ct, struct conn *conn) cmap_remove(&ct->conns, &conn->nat_conn->cm_node, hash); } ovs_list_remove(&conn->exp_node); + conn->cleaned = true; ovsrcu_postpone(delete_conn, conn); atomic_count_dec(&ct->n_conn); } @@ -354,6 +355,7 @@ conn_clean_one(struct conntrack *ct, struct conn *conn) conn_clean_cmn(ct, conn); if (conn->conn_type == CT_CONN_TYPE_DEFAULT) { ovs_list_remove(&conn->exp_node); + conn->cleaned = true; atomic_count_dec(&ct->n_conn); } ovsrcu_postpone(delete_conn_one, conn); From patchwork Tue May 28 18:14:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Darrell Ball X-Patchwork-Id: 1106467 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VfDdoEN+"; dkim-atps=neutral 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 45D29G6lGdz9s1c for ; Wed, 29 May 2019 04:16:34 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id D932C2189; Tue, 28 May 2019 18:16:03 +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 7DB5F2176 for ; Tue, 28 May 2019 18:14:58 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 3357287D for ; Tue, 28 May 2019 18:14:58 +0000 (UTC) Received: by mail-pf1-f177.google.com with SMTP id a23so11987835pff.4 for ; Tue, 28 May 2019 11:14:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=Ta0gudhmxneXzjklPipsM44b9fQRnUmjCppssrLdBLs=; b=VfDdoEN+14TSoh7BP4Jq6RmLajF7sf6h/Ds9DFxozgog/c0ulNssb4yqcmdIvf8Yia KZznhk9eWepHcxEugdxxh9cwzt8mfXRLX2dUQOOyhGlVGyLli/nJh1ksvzjfUETtxG4Y LpzSfvEMk7gPJxiQqMiMWKiIbuB2NeV3sPLQXzA/odzfkRoVPcbjhFB1EVxzGx0aw22n Md4jKRfIgY4GY95iUVda8TsCJ5Rj4LMsGr2CjuJ9USzVVHHXDUjovetCKNg60agHCoXJ eMUV7VC12+XH5sYUSzxOKbBY6rN15rl7YK83DzeMW9D65GB31/1j9vtB91AtnYU4QSPm qSvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=Ta0gudhmxneXzjklPipsM44b9fQRnUmjCppssrLdBLs=; b=KqQPeS9/dZN27Ieoem7kp6M4t3tb+funhtu+MF1JEsO44b6JVHjdiogcXWY8GJH0cG mSDs7upunoHqjCH41NN4AnNn0zJBW87F8mU86AiR3DvhOhFSdPEt14FqL3hvetmpIdE6 BCYNMojBhtYt4Bpx64ehOEk7aI+HX/y2YVDXiOC9HOfsjgr00KExGYOUelYBwqyDo2+4 /2MwJJMj2vrDb9z0kVgZ1u4ehj9n9K1zlTxUhFtsHFKvx9OC8JwT+SzLeNHBmu02pxwe FJmNdimVKBi66J0W81vrvY01CpOjfalhazx3m4Pxq4BqpY8H4NF4n2zlogM5MS1dHwfB nWVA== X-Gm-Message-State: APjAAAVlSQl2P33RBl06uQsIUK/tCgK+4xR683QDwTIDF5BqpJd44ZUN pz3gH24dTwFmOIYq9V1e9tI= X-Google-Smtp-Source: APXvYqxudxcuEps/2/ya01Y9rQ3bIEqbhgG413MY2NHpwK0HI86V/Ac5aMH02DIniQCzQEJnZqFAng== X-Received: by 2002:a62:7796:: with SMTP id s144mr86619704pfc.260.1559067297814; Tue, 28 May 2019 11:14:57 -0700 (PDT) Received: from ubuntu.localdomain (c-76-102-76-212.hsd1.ca.comcast.net. [76.102.76.212]) by smtp.gmail.com with ESMTPSA id h18sm13011235pgv.38.2019.05.28.11.14.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 May 2019 11:14:57 -0700 (PDT) From: Darrell Ball To: dlu998@gmail.com, dev@openvswitch.org Date: Tue, 28 May 2019 11:14:43 -0700 Message-Id: <1559067284-48389-2-git-send-email-dlu998@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1559067284-48389-1-git-send-email-dlu998@gmail.com> References: <1559067284-48389-1-git-send-email-dlu998@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [patch v2 2/3] conntrack: Fix missed 'conn' lookup checks. 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 Whenever a 'conn' entry is removed or added, we need to reverify it's existence status under lock protection. There were some cases that were missed, so fix them. Fixes: 967bb5c5cd90 ("conntrack: Add rcu support.") Signed-off-by: Darrell Ball --- v2: No change. lib/conntrack.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index c57d9fd..e9d6720 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -956,7 +956,10 @@ conn_update_state(struct conntrack *ct, struct dp_packet *pkt, break; case CT_UPDATE_NEW: ovs_mutex_lock(&ct->ct_lock); - conn_clean(ct, conn); + uint32_t hash = conn_key_hash(&conn->key, ct->hash_basis); + if (conn_key_lookup(ct, &conn->key, hash, now, NULL, NULL)) { + conn_clean(ct, conn); + } ovs_mutex_unlock(&ct->ct_lock); create_new_conn = true; break; @@ -1089,11 +1092,15 @@ process_one(struct conntrack *ct, struct dp_packet *pkt, bool create_new_conn = false; conn_key_lookup(ct, &ctx->key, ctx->hash, now, &ctx->conn, &ctx->reply); struct conn *conn = ctx->conn; + uint32_t hash; /* Delete found entry if in wrong direction. 'force' implies commit. */ if (OVS_UNLIKELY(force && ctx->reply && conn)) { ovs_mutex_lock(&ct->ct_lock); - conn_clean(ct, conn); + hash = conn_key_hash(&conn->key, ct->hash_basis); + if (conn_key_lookup(ct, &conn->key, hash, now, NULL, NULL)) { + conn_clean(ct, conn); + } ovs_mutex_unlock(&ct->ct_lock); conn = NULL; } @@ -1103,7 +1110,7 @@ process_one(struct conntrack *ct, struct dp_packet *pkt, ctx->reply = true; struct conn *rev_conn = conn; /* Save for debugging. */ - uint32_t hash = conn_key_hash(&conn->rev_key, ct->hash_basis); + hash = conn_key_hash(&conn->rev_key, ct->hash_basis); conn_key_lookup(ct, &ctx->key, hash, now, &conn, &ctx->reply); if (!conn) { @@ -1158,8 +1165,11 @@ process_one(struct conntrack *ct, struct dp_packet *pkt, ovs_rwlock_unlock(&ct->resources_lock); ovs_mutex_lock(&ct->ct_lock); - conn = conn_not_found(ct, pkt, ctx, commit, now, nat_action_info, - helper, alg_exp, ct_alg_ctl); + hash = conn_key_hash(&ctx->key, ct->hash_basis); + if (!conn_key_lookup(ct, &ctx->key, hash, now, NULL, NULL)) { + conn = conn_not_found(ct, pkt, ctx, commit, now, nat_action_info, + helper, alg_exp, ct_alg_ctl); + } ovs_mutex_unlock(&ct->ct_lock); } From patchwork Tue May 28 18:14:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Darrell Ball X-Patchwork-Id: 1106469 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=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ne6TPnB6"; dkim-atps=neutral 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 45D29s5Rxbz9s1c for ; Wed, 29 May 2019 04:17:05 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 875C3218E; Tue, 28 May 2019 18:16:04 +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 AA6292176 for ; Tue, 28 May 2019 18:14:59 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pl1-f196.google.com (mail-pl1-f196.google.com [209.85.214.196]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 41553879 for ; Tue, 28 May 2019 18:14:59 +0000 (UTC) Received: by mail-pl1-f196.google.com with SMTP id go2so8656360plb.9 for ; Tue, 28 May 2019 11:14:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=RvvV3EoLdfcT/DoBtEP/x/MhNnx2FEPZdr/wQZFqHAY=; b=ne6TPnB6K0g7FCmH6nkR2AfGMTQLjSUppcRRIzmquYEJNGf3z7fwAgzAhcKjUokpqb bH1lENWZJX44pvLq8Pg+vq2AH9W4C3EuRuXX8D6HGO7dHcgu30ZAZyM68HO5ukjLboG2 AX28lHesn2srLiaj12jAfk95S2lBQYT30OhlkzXGj42CwjVYi5ZTPWuE7XaEAUupxttp KLIeZ+rBxAbGQGngAaymSEjqaU8xjMogfLvTQaZ0vOPphobaXJjxUhC21hVmqVUsLSRj MbiOMUby+PTGoOp3zt28WNmvn234P3bEk6O2BN97aOGmfHAIQHjtaXt3Sexezq9KeEvA 2Vfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=RvvV3EoLdfcT/DoBtEP/x/MhNnx2FEPZdr/wQZFqHAY=; b=AQbeYyAP2ln+WzkxQwSKxk6l0RCvjIftJcf5h4DmatcKQy0JiKoaAC1W/FXjDvMh2+ X78fMUrGYG8LZriqMKb3O6tiv7HZg8s4DwZsgX/DP+YqZQe3slxkEUSmgF3CPPcm6jJK BT49zhMArPZ7MUsT41qtxzf6+ynFMVjOJoP6JONKuGUSI3sUu22jgR09HU75hDyrC6BA rzPjC0955U5AW5xFAXYk6twsg+L5pnJ7TJ1SJtofmHlbuJDP4sl/qNzYop0VCQOjWw4A gPOfi1rw6RzrfCuiOiOwvQPgAGjsv8BWzJJPYfz/v9LUNMvhfwWjdXZh1kQWWnJdgvxN r70Q== X-Gm-Message-State: APjAAAX3dNaO1Rt/e/Kcpf4jrFoE202DS1SNwJlRdn4WarYNbzRw8YcY UZwGCLvIWtND8XEzL+NXFAM= X-Google-Smtp-Source: APXvYqxDZfxu0cBcY75WRkdZ+xwld4G2CVEwNnPYIdsNj5Se2p1JYvdBS88IMJn/ypwr0rJIou+OUg== X-Received: by 2002:a17:902:6bc4:: with SMTP id m4mr60823570plt.266.1559067298859; Tue, 28 May 2019 11:14:58 -0700 (PDT) Received: from ubuntu.localdomain (c-76-102-76-212.hsd1.ca.comcast.net. [76.102.76.212]) by smtp.gmail.com with ESMTPSA id h18sm13011235pgv.38.2019.05.28.11.14.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 May 2019 11:14:58 -0700 (PDT) From: Darrell Ball To: dlu998@gmail.com, dev@openvswitch.org Date: Tue, 28 May 2019 11:14:44 -0700 Message-Id: <1559067284-48389-3-git-send-email-dlu998@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1559067284-48389-1-git-send-email-dlu998@gmail.com> References: <1559067284-48389-1-git-send-email-dlu998@gmail.com> X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [patch v2 3/3] conntrack: Add 'conn_lookup()' api. 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 The new api incorporates the hash calculation which can be a distraction. Signed-off-by: Darrell Ball --- v2: Newly introduced patch. lib/conntrack.c | 49 +++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index e9d6720..67c3a58 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -428,6 +428,14 @@ conn_key_lookup(struct conntrack *ct, const struct conn_key *key, return found; } +static bool +conn_lookup(struct conntrack *ct, const struct conn_key *key, + long long now, struct conn **conn_out, bool *reply) +{ + uint32_t hash = conn_key_hash(key, ct->hash_basis); + return conn_key_lookup(ct, key, hash, now, conn_out, reply); +} + static void write_ct_md(struct dp_packet *pkt, uint16_t zone, const struct conn *conn, const struct conn_key *key, const struct alg_exp_node *alg_exp) @@ -784,10 +792,8 @@ conn_seq_skew_set(struct conntrack *ct, const struct conn *conn_in, OVS_NO_THREAD_SAFETY_ANALYSIS { struct conn *conn; - bool reply; - uint32_t hash = conn_key_hash(&conn_in->key, ct->hash_basis); ovs_mutex_unlock(&conn_in->lock); - conn_key_lookup(ct, &conn_in->key, hash, now, &conn, &reply); + conn_lookup(ct, &conn_in->key, now, &conn, NULL); ovs_mutex_lock(&conn_in->lock); if (conn && seq_skew) { @@ -956,8 +962,7 @@ conn_update_state(struct conntrack *ct, struct dp_packet *pkt, break; case CT_UPDATE_NEW: ovs_mutex_lock(&ct->ct_lock); - uint32_t hash = conn_key_hash(&conn->key, ct->hash_basis); - if (conn_key_lookup(ct, &conn->key, hash, now, NULL, NULL)) { + if (conn_lookup(ct, &conn->key, now, NULL, NULL)) { conn_clean(ct, conn); } ovs_mutex_unlock(&ct->ct_lock); @@ -1042,9 +1047,7 @@ check_orig_tuple(struct conntrack *ct, struct dp_packet *pkt, key.dl_type = ctx_in->key.dl_type; key.zone = pkt->md.ct_zone; - uint32_t hash = conn_key_hash(&key, ct->hash_basis); - bool reply; - conn_key_lookup(ct, &key, hash, now, conn, &reply); + conn_lookup(ct, &key, now, conn, NULL); return *conn ? true : false; } @@ -1092,13 +1095,11 @@ process_one(struct conntrack *ct, struct dp_packet *pkt, bool create_new_conn = false; conn_key_lookup(ct, &ctx->key, ctx->hash, now, &ctx->conn, &ctx->reply); struct conn *conn = ctx->conn; - uint32_t hash; /* Delete found entry if in wrong direction. 'force' implies commit. */ if (OVS_UNLIKELY(force && ctx->reply && conn)) { ovs_mutex_lock(&ct->ct_lock); - hash = conn_key_hash(&conn->key, ct->hash_basis); - if (conn_key_lookup(ct, &conn->key, hash, now, NULL, NULL)) { + if (conn_lookup(ct, &conn->key, now, NULL, NULL)) { conn_clean(ct, conn); } ovs_mutex_unlock(&ct->ct_lock); @@ -1110,7 +1111,7 @@ process_one(struct conntrack *ct, struct dp_packet *pkt, ctx->reply = true; struct conn *rev_conn = conn; /* Save for debugging. */ - hash = conn_key_hash(&conn->rev_key, ct->hash_basis); + uint32_t hash = conn_key_hash(&conn->rev_key, ct->hash_basis); conn_key_lookup(ct, &ctx->key, hash, now, &conn, &ctx->reply); if (!conn) { @@ -1165,8 +1166,7 @@ process_one(struct conntrack *ct, struct dp_packet *pkt, ovs_rwlock_unlock(&ct->resources_lock); ovs_mutex_lock(&ct->ct_lock); - hash = conn_key_hash(&ctx->key, ct->hash_basis); - if (!conn_key_lookup(ct, &ctx->key, hash, now, NULL, NULL)) { + if (!conn_lookup(ct, &ctx->key, now, NULL, NULL)) { conn = conn_not_found(ct, pkt, ctx, commit, now, nat_action_info, helper, alg_exp, ct_alg_ctl); } @@ -2057,10 +2057,8 @@ nat_select_range_tuple(struct conntrack *ct, const struct conn *conn, nat_conn->rev_key.src.port = htons(port); } - uint32_t conn_hash = conn_key_hash(&nat_conn->rev_key, - ct->hash_basis); - bool found = conn_key_lookup(ct, &nat_conn->rev_key, conn_hash, - time_msec(), NULL, NULL); + bool found = conn_lookup(ct, &nat_conn->rev_key, time_msec(), + NULL, NULL); if (!found) { return true; } else if (pat_enabled && !all_ports_tried) { @@ -2353,18 +2351,17 @@ int conntrack_flush_tuple(struct conntrack *ct, const struct ct_dpif_tuple *tuple, uint16_t zone) { - struct conn_lookup_ctx ctx; int error = 0; + struct conn_key key; + struct conn *conn; - memset(&ctx, 0, sizeof(ctx)); - tuple_to_conn_key(tuple, zone, &ctx.key); - ctx.hash = conn_key_hash(&ctx.key, ct->hash_basis); + memset(&key, 0, sizeof(key)); + tuple_to_conn_key(tuple, zone, &key); ovs_mutex_lock(&ct->ct_lock); - conn_key_lookup(ct, &ctx.key, ctx.hash, time_msec(), &ctx.conn, - &ctx.reply); + conn_lookup(ct, &key, time_msec(), &conn, NULL); - if (ctx.conn && ctx.conn->conn_type == CT_CONN_TYPE_DEFAULT) { - conn_clean(ct, ctx.conn); + if (conn && conn->conn_type == CT_CONN_TYPE_DEFAULT) { + conn_clean(ct, conn); } else { VLOG_WARN("Must flush tuple using the original pre-NATed tuple"); error = ENOENT;