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);