Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp645544pxj; Thu, 13 May 2021 13:26:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJya+DbHmrjup01p/VLutvJfh6WZAWFIciXCyr1lPUgvTtYo4pmTrJG62KuNseLmb0w+8EPE X-Received: by 2002:aa7:cf07:: with SMTP id a7mr52235468edy.261.1620937589252; Thu, 13 May 2021 13:26:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620937589; cv=none; d=google.com; s=arc-20160816; b=KCjknIltSTKwaj7xhaLWVe54/7EwCPv4YSqY1Jd2O87SEKz9pNHX3GrdC/XriWwXZ5 cVLVAk/R1joCIBA+07tgBqDQcQKrBvak63QDshuUNWoToeVZOfV098QvHOGyZAFSHlja nEBnZEByiKDCk13GJBb5r8nDkTXtPq0PaVZ2j9KZ7WrjtO8EAR9yL4o6yCOgeeB7hATb KaTNe3kfXmped3ECShy1Gwz/3XW/owaz0zXfJpsrRHapes/etImsv2OFNeelUenJgutr Hiap3f+0uuTehF6JytqYq+CRRKSvlsjg/b1H0LFL6Qi9rT9BkCNfByOGNuKpjidoslf6 vWqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=Yf3RBieZdiicWTaG/yStW2tY0nQklIL62foAniDpVU4=; b=J1THNyfMC11cH4owkCebr/vADhTgVBzUqKNQKVVVihyZ9UbGb3+XKSv5td9K+oWfFr 1dnXe5e5gptOu/FkLD9bxPc5ltDW1OxSa1IEnWE5iyvvRH3mD+a5UB1QUcSeYrz2asR5 6TovhfTsWLIKnbvcrnfbNWxuWIvqlmH1wmkCcNJL7tS0v+el1n2/XMDATMdET/y9MCye cbcFb8iCYkCOKZq/qDkKPFsvemoc/BZg/zd0gkQ0VhZwalzxe7EXUyP5qL0/mi6RhzZt xQTganodOPnsobrBpY196J72fGSVGbYuUaVxDr4Dx8oAC3NtcGiXujUyIdP/VwUzfE31 Su4g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ucloud.cn Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o25si3868191ejg.539.2021.05.13.13.25.50; Thu, 13 May 2021 13:26:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ucloud.cn Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233357AbhEMNJb (ORCPT + 99 others); Thu, 13 May 2021 09:09:31 -0400 Received: from mail-m2454.qiye.163.com ([220.194.24.54]:25454 "EHLO mail-m2454.qiye.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229466AbhEMNJ3 (ORCPT ); Thu, 13 May 2021 09:09:29 -0400 Received: from localhost.localdomain (unknown [106.75.220.3]) by mail-m2454.qiye.163.com (Hmail) with ESMTPA id 9EE7CC00202; Thu, 13 May 2021 21:08:14 +0800 (CST) From: Tao Liu To: pshelar@ovn.org Cc: dev@openvswitch.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, i.maximets@ovn.org, jean.tourrilhes@hpe.com, kuba@kernel.org, davem@davemloft.net, thomas.liu@ucloud.cn, wenxu@ucloud.cn Subject: [ovs-dev] [PATCH net v2] openvswitch: meter: fix race when getting now_ms. Date: Thu, 13 May 2021 21:08:00 +0800 Message-Id: <20210513130800.31913-1-thomas.liu@ucloud.cn> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-HM-Spam-Status: e1kfGhgUHx5ZQUtXWQgYFAkeWUFZS1VLWVdZKFlBSUI3V1ktWUFJV1kPCR oVCBIfWUFZQx1MSlZMQ0NCSB5JTEodQx9VGRETFhoSFyQUDg9ZV1kWGg8SFR0UWUFZT0tIVUpKS0 hKTFVLWQY+ X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6OE06LTo4OT0yKBQrEh9CKTgC HigKCUhVSlVKTUlLQkpKSUJOSUlIVTMWGhIXVQ8TFBYaCFUXEg47DhgXFA4fVRgVRVlXWRILWUFZ SktNVUxOVUlJS1VIWVdZCAFZQUlNQk83Bg++ X-HM-Tid: 0a7965d789ec8c13kuqt9ee7cc00202 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We have observed meters working unexpected if traffic is 3+Gbit/s with multiple connections. now_ms is not pretected by meter->lock, we may get a negative long_delta_ms when another cpu updated meter->used, then: delta_ms = (u32)long_delta_ms; which will be a large value. band->bucket += delta_ms * band->rate; then we get a wrong band->bucket. OpenVswitch userspace datapath has fixed the same issue[1] some time ago, and we port the implementation to kernel datapath. [1] https://patchwork.ozlabs.org/project/openvswitch/patch/20191025114436.9746-1-i.maximets@ovn.org/ Fixes: 96fbc13d7e77 ("openvswitch: Add meter infrastructure") Signed-off-by: Tao Liu Suggested-by: Ilya Maximets --- Changelog: v2: just set negative long_delta_ms to zero in case of race for meter lock. v1: make now_ms protected by meter lock. --- net/openvswitch/meter.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/net/openvswitch/meter.c b/net/openvswitch/meter.c index 96b524c..896b8f5 100644 --- a/net/openvswitch/meter.c +++ b/net/openvswitch/meter.c @@ -611,6 +611,14 @@ bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb, spin_lock(&meter->lock); long_delta_ms = (now_ms - meter->used); /* ms */ + if (long_delta_ms < 0) { + /* This condition means that we have several threads fighting + * for a meter lock, and the one who received the packets a + * bit later wins. Assuming that all racing threads received + * packets at the same time to avoid overflow. + */ + long_delta_ms = 0; + } /* Make sure delta_ms will not be too large, so that bucket will not * wrap around below. -- 1.8.3.1