Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp442544rwr; Wed, 19 Apr 2023 08:29:48 -0700 (PDT) X-Google-Smtp-Source: AKy350apI5qEHWVcVkWi/24l6dCnPqndu+9gGgUUtMN7g0dAYULfyP+heyjVpRQDQNGDCR7NzXRT X-Received: by 2002:a05:6a21:788c:b0:ee:af32:754b with SMTP id bf12-20020a056a21788c00b000eeaf32754bmr4867259pzc.2.1681918188530; Wed, 19 Apr 2023 08:29:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681918188; cv=none; d=google.com; s=arc-20160816; b=jEGtROb+ez7y6v4Tb5TrkcuF6fL3wGDIN7m+kODB5nNe79ISXQ+F1YTU6zFMbhCMQD b/HnUH9cR5lp2E3j8B2ozcUxc8mVOVCEpP1iCKIGuB6sWW7nCsJsZiJufiC4AH0Xkicj NVQT/9aM9pnSlLKfhzqu/wtimcLvMdFmzWgVj9tf/016GkJ+q3RZX/HiXnJG+fAYTJuK dFlqLUUvbp2GqVDvXFD7liL5KFPAg/d9yVvaLXEa9DIESfErMKF8Co6njwLCVXRZw/SF u/Q9sxBqXLNWruoHokGpJQ3cB/kPYy+JO7fPLxzx49bwdiJwbZL8R1GYLE8AItl89S6d RZxA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=bbxI3njLrydMsZCyG/AyFl5rf7LnbTbryMaKG1jrIhk=; b=gNZ9N1BvQsKNugkqwxXMWaaLK7Yp3mRd+FSNSTvyuMgwEPJviSB8DFmw58EEZauRs/ XbfiSL2Pp3nv3E2w3w7Mvab/AWBBZaCiRCFXVORaMbn6AE6Vk9U+Dr/KRr5NeTaX/rXY f0RGPEd95Qv5xsJVbiz75Q7PRUKXHin/2cZJ22VAddUcsx0EyCCbAJkNbRg7j/CdPLmN 023retX35DjxYjSnqTNGGIHem16J6YGdGnEnK6I3Ea4a6bXpUOzfX6ck6DQJ6XCW1HGG aYRksn7TYV7In6tUTmA4nbYZ32W9A7AR9xA9FbdS9eMbtVzm7X6V+4r71VY6uYY9J/39 //FQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 4-20020a630f44000000b0050bf5a814a8si15948049pgp.403.2023.04.19.08.29.34; Wed, 19 Apr 2023 08:29:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232779AbjDSPYJ (ORCPT + 99 others); Wed, 19 Apr 2023 11:24:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47472 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232651AbjDSPYI (ORCPT ); Wed, 19 Apr 2023 11:24:08 -0400 Received: from synguard (unknown [212.29.212.82]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA0BC901D; Wed, 19 Apr 2023 08:23:31 -0700 (PDT) Received: from dali.siklu.local (dali.siklu.local [192.168.42.30]) by synguard (Postfix) with ESMTP id 571014DFC6; Wed, 19 Apr 2023 18:14:59 +0300 (IDT) From: Shmuel Hazan To: Russell King Cc: Marcin Wojtas , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , horatiu.vultur@microchip.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Rob Herring , Krzysztof Kozlowski , devicetree@vger.kernel.org, Shmuel Hazan Subject: [PATCH v3 1/3] net: mvpp2: tai: add refcount for ptp worker Date: Wed, 19 Apr 2023 18:14:55 +0300 Message-Id: <20230419151457.22411-2-shmuel.h@siklu.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230419151457.22411-1-shmuel.h@siklu.com> References: <20230419151457.22411-1-shmuel.h@siklu.com> X-Spam-Status: No, score=-1.1 required=5.0 tests=BAYES_00,FSL_HELO_NON_FQDN_1, HELO_NO_DOMAIN,RDNS_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In some configurations, a single TAI can be responsible for multiple mvpp2 interfaces. However, the mvpp2 driver will call mvpp22_tai_stop and mvpp22_tai_start per interface RX timestamp disable/enable. As a result, disabling timestamping for one interface would stop the worker and corrupt the other interface's RX timestamps. This commit solves the issue by introducing a simpler ref count for each TAI instance. Due to the ref count, we need now to lock tai->lock before doing anything, as a result, we can't update the current ts using mvpp22_tai_gettimex64 as it will cause a deadlock. Therefore, we will just schedule the worker to start immediately. Fixes: ce3497e2072e ("net: mvpp2: ptp: add support for receive timestamping") Signed-off-by: Shmuel Hazan --- .../net/ethernet/marvell/mvpp2/mvpp2_tai.c | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_tai.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_tai.c index 95862aff49f1..2e3d43b1bac1 100644 --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_tai.c +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_tai.c @@ -61,6 +61,7 @@ struct mvpp2_tai { u64 period; // nanosecond period in 32.32 fixed point /* This timestamp is updated every two seconds */ struct timespec64 stamp; + u16 poll_worker_refcount; }; static void mvpp2_tai_modify(void __iomem *reg, u32 mask, u32 set) @@ -368,18 +369,39 @@ void mvpp22_tai_tstamp(struct mvpp2_tai *tai, u32 tstamp, hwtstamp->hwtstamp = timespec64_to_ktime(ts); } +static void mvpp22_tai_start_unlocked(struct mvpp2_tai *tai) +{ + tai->poll_worker_refcount++; + if (tai->poll_worker_refcount > 1) + return; + + ptp_schedule_worker(tai->ptp_clock, 0); +} + void mvpp22_tai_start(struct mvpp2_tai *tai) { - long delay; + unsigned long flags; - delay = mvpp22_tai_aux_work(&tai->caps); + spin_lock_irqsave(&tai->lock, flags); + mvpp22_tai_start_unlocked(tai); + spin_unlock_irqrestore(&tai->lock, flags); +} - ptp_schedule_worker(tai->ptp_clock, delay); +static void mvpp22_tai_stop_unlocked(struct mvpp2_tai *tai) +{ + tai->poll_worker_refcount--; + if (tai->poll_worker_refcount) + return; + ptp_cancel_worker_sync(tai->ptp_clock); } void mvpp22_tai_stop(struct mvpp2_tai *tai) { - ptp_cancel_worker_sync(tai->ptp_clock); + unsigned long flags; + + spin_lock_irqsave(&tai->lock, flags); + mvpp22_tai_stop_unlocked(tai); + spin_unlock_irqrestore(&tai->lock, flags); } static void mvpp22_tai_remove(void *priv) -- 2.40.0