From nobody Sat Oct 24 13:19:55 2026 Received: from mail-oo1-f54.google.com (mail-oo1-f54.google.com [209.85.161.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE84652CCF2 for ; Tue, 13 Oct 2026 19:19:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919192; cv=none; b=iGPvNKpPzgF6e7Wa6UMA5eyehRbe31dmKrta5voct+vaZqvEPczjkM4DbA+6ZaQalEuia2qBk7+12OIBoeTjcWgGFLci9UpubeZazsA3hRRfjaY2BURz900ypDOSgjSbv6e2GEwJ6kwIV7voatnTQjYFw6xxwDGJ3r9XkiB+JHU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919192; c=relaxed/simple; bh=gIMYuS9JxR7CPdiCa2tA60WVNZMmxDlDk7M0OBLgqkE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K+gDqsSIdSUKnICuBE/roVLnBIslKa7xIsS7J4ZCGjJQa+TLsypMkL5WC0s8d1V4xBGtGRHv1iEnVAX3AF/7gsY4bRbiZyLhKvUaWilWQEgL+Q9X3RekxdZXCh7OPyowQzI0jmLKmayR4Ayi23mrQh7d9apklqk2nFGnyXQcwnc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OJlO8KcF; arc=none smtp.client-ip=209.85.161.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OJlO8KcF" Received: by mail-oo1-f54.google.com with SMTP id 006d021491bc7-6df5e315bd1so2285758eaf.2 for ; Tue, 13 Oct 2026 12:19:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791919189; x=1792523989; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Ye8Z53vHx1EFOnkJGmfg97MMg0sWXfEXyW1OqzDyMg8=; b=OJlO8KcFaiEJ9lDwYyzG5TxxXC12aPyIkDuFaOQOoyBV58DOrmfiR+XEKSVWGXW5DJ KeZojC9RjJSPzmi8sB3C0h2PAT6j/eL2j/4S/l7Xpr3Idjm9EmdfS8geUT04MK59LQhY lOrQm3zAQhBhMzwXxPlj3/vLTMdtoOBcH5AVGQuHDCawc33WlQND1lGmCtku1uFV+4AD AcLV+Qjc2YPnW9jsHn+rh8pBKuQ9Q4vrFR102SrAK52szslUHouwcRtyr40e5X3INgSP qAhuNwJ1oIjnlmrrHNj11YCoPv0MSDcvMpM9rsUcCck+fx4x9GlpW8Xr6W0+kv19HNbH Epfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791919189; x=1792523989; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Ye8Z53vHx1EFOnkJGmfg97MMg0sWXfEXyW1OqzDyMg8=; b=kvg5WAvQWINZTAfEN6XIRwE1ww9jZmL5hnpYgrnFMsLKCSbHPhnLqaMN0htPlKuyrS tIWI4Pu53w5FAIwTkFJC5o0wspbC5OjcAbYVvf1MOX3w791TCmW/euxvgomHRXtYA5nv VEhEMGxt4UeTUp8d/lPR5S6gD08XrvAOzFz5Rgf7LS0tfn7ShhP52ZantUkuaaXXpRrt IvyExwKzSAS07DX0Z55Bn6TEMw6EEdqg/LZtXfqwe9TDv/BXn/Zgzt2qxECCFwoFsf7p 4sb5sznVwp+pHkHbrmqDUMDwmQbTmxFhOqsifbvL/1LpkOZzH3CwLTUKnJ8Nn2gwWzkw KU8g== X-Forwarded-Encrypted: i=1; AKwUvBwu4y+XfQ7y3eP79qrVhpTOf4UqtkeUJsIfYOI414VIWLvFUOeP3WQU4Rs65NOktPjU3DE/TY7fiz4ojMQ=@vger.kernel.org X-Gm-Message-State: AFq9FYIs7aWxIgtV4mG16LQtAYGqq8K8dBt8tGi8mfbw/Z6Dh+n4ByRG J4MqvpRoJDHcjjtP2GiTZyaNN3qd5nBw+HeMIra5lHJAlTRVEofgyOab X-Gm-Gg: AYBFou0Us3rFbg4ThGo4lYl+NjK081hZNOqCquPFsTnN0x72LJnBSUs+KDBmfaw78Bc 84EpzWyfqS4WzXUMl7yvoQt/BIryiTuQ0lgaJRuqfugodFPfln9X1UzwbJ1xfebeP/3SeBVply4 fDk6riHfNfqGkC7xlOePv4IqTG1+SQIfBjhJnI8quEM6HMSrHCQUrC48yQqGLz0DtdFTLhvwqdE 8YTfaPIjuG8RuFf4flZqtRlLnApqNrqMs1bb+GlcUJy9H1+w5z08zJdZgX2hSXHtYWGqGQ27X8I 4w8UmqVDb4zqtYwJazpgY5KO9Jz9B8tMyQVM0SNkta2bIPuQqOlTBiL8am36+fAGRwA3AEYidzB fUOrd8AjmM+t34i2Syroc079hWaRFqwd/P43CBtTsubQlkQ126JpFGftLyVXtfJbq5QoBfphtpq tdSzRIyLjztNQ9cvngg4XgbiHytdMwDnSC3LB/5ePbcVdbwbVJKsrLiziJnUOWDerD0beUBFpA+ 6YsOrGM6f9Ic4VA9NYIHtaooaf6IAFDBdn1oG17FqZ6NEqpz/PMh5EGmUbB9qfuykxa1P4ujDJb 7j/YX3s+smD6GCd8cnOq5i0XzPgP0FMO0Yi4vVhJHysnLQnqGYw2dq6GEwqMUiBJg7UleITL14s RPUm2xhWbdl5rLOGSMr9h X-Received: by 2002:a05:6820:1a0f:b0:6df:428f:f17d with SMTP id 006d021491bc7-6ef0e9e3183mr9476815eaf.15.1791919189604; Tue, 13 Oct 2026 12:19:49 -0700 (PDT) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-83039a3dfa1sm13280507a34.18.2026.10.13.12.19.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Oct 2026 12:19:49 -0700 (PDT) From: James Hilliard Date: Tue, 13 Oct 2026 13:19:45 -0600 Subject: [PATCH net v3 1/5] ptp: drain virtual clock sysfs operations before unregistering children Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20261013-ptp-vclock-sampling-v3-1-d3ee4ea62fc6@gmail.com> References: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> In-Reply-To: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> To: netdev@vger.kernel.org, Paolo Abeni , Jakub Kicinski , Richard Cochran , Andrew Lunn , Yangbo Lu , Miroslav Lichvar Cc: Eric Dumazet , "David S. Miller" , linux-kernel@vger.kernel.org, James Hilliard X-Mailer: b4 0.15.2 Parent clock removal walks its virtual clocks before removing the n_vclocks sysfs attribute. The mutex taken by ptp_vclock_in_use() is released before that walk, so a concurrent sysfs deletion can pick the same child and unregister and free its ptp_vclock a second time. A reference held by the device iterator does not protect that separately allocated virtual clock. Remove n_vclocks before walking the children. Removing the attribute prevents new stores and drains stores already running, without holding n_vclocks_mux across a callback that needs that mutex. Skip virtual clocks, which do not have this attribute. This race was found by code inspection of virtual-clock registration failure cleanup and parent removal. Fixes: bfcbb76b0f59 ("ptp: unregister virtual clocks when unregistering phy= sical clock.") Signed-off-by: James Hilliard Reviewed-by: Vadim Fedorenko --- drivers/ptp/ptp_clock.c | 5 +++++ drivers/ptp/ptp_private.h | 1 + drivers/ptp/ptp_sysfs.c | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c index 4111342d64f0..47ffc773065a 100644 --- a/drivers/ptp/ptp_clock.c +++ b/drivers/ptp/ptp_clock.c @@ -508,6 +508,11 @@ static int unregister_vclock(struct device *dev, void = *data) =20 int ptp_clock_unregister(struct ptp_clock *ptp) { + /* + * Stop and drain virtual-clock creation and deletion before walking the + * children. Do not hold n_vclocks_mux while waiting for sysfs callbacks. + */ + ptp_vclock_remove_sysfs(ptp); if (ptp_vclock_in_use(ptp)) { device_for_each_child(&ptp->dev, NULL, unregister_vclock); } diff --git a/drivers/ptp/ptp_private.h b/drivers/ptp/ptp_private.h index db4039d642b4..ec8633126d6b 100644 --- a/drivers/ptp/ptp_private.h +++ b/drivers/ptp/ptp_private.h @@ -169,6 +169,7 @@ extern const struct attribute_group *ptp_groups[]; =20 int ptp_populate_pin_groups(struct ptp_clock *ptp); void ptp_cleanup_pin_groups(struct ptp_clock *ptp); +void ptp_vclock_remove_sysfs(struct ptp_clock *ptp); =20 struct ptp_vclock *ptp_vclock_register(struct ptp_clock *pclock); void ptp_vclock_unregister(struct ptp_vclock *vclock); diff --git a/drivers/ptp/ptp_sysfs.c b/drivers/ptp/ptp_sysfs.c index dc398c6b7528..53388b123198 100644 --- a/drivers/ptp/ptp_sysfs.c +++ b/drivers/ptp/ptp_sysfs.c @@ -263,6 +263,12 @@ static ssize_t n_vclocks_store(struct device *dev, } static DEVICE_ATTR_RW(n_vclocks); =20 +void ptp_vclock_remove_sysfs(struct ptp_clock *ptp) +{ + if (!ptp->is_virtual_clock) + device_remove_file(&ptp->dev, &dev_attr_n_vclocks); +} + static ssize_t max_vclocks_show(struct device *dev, struct device_attribute *attr, char *page) { --=20 2.53.0 From nobody Sat Oct 24 13:19:55 2026 Received: from mail-ot1-f52.google.com (mail-ot1-f52.google.com [209.85.210.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1940551DDEA for ; Tue, 13 Oct 2026 19:19:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919193; cv=none; b=e2UUPYKml2HzrCb28AV2aLao1nxJHJmYtTpT9VccMD8/V4mh8iqqlpS2sdr2H/UiMsvgrh1nAIMWzZwKm9m/pVaJZy4tq/yrSF9T5maRoWfwJXihvO4Hc453+im1HJT+GC1KSNkDZykzxus92bqtoLgY8oLr8IXsp+g/Yia1Wmk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919193; c=relaxed/simple; bh=GrTN2b5PpfqmbfLLMqSYA4B6Q1Ro+NBdw8xoIri7aK0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n5lwQ9rqxxXrljIdHN8mRJO399FLbLI545mUk9w24AJ7HGyb+Y8Qf/XAU/RA+i+YziGw9MtjAfE9DTjrA1dtEd0t9slxNZxkCmfKql6yHYR1kdhR2ADuskOQZQsRfq4HKk/reVPUrymtqs0CWRPwsO7yxAiX8o3lm/ZK+pmWBdI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VHQ1hF/z; arc=none smtp.client-ip=209.85.210.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VHQ1hF/z" Received: by mail-ot1-f52.google.com with SMTP id 46e09a7af769-833e671ee9fso2498648a34.0 for ; Tue, 13 Oct 2026 12:19:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791919190; x=1792523990; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=dOGTVagpmg3SkovNg8gY9NJcdR0snicKiJ3IvwwYIZg=; b=VHQ1hF/zRIZ4Dxd+HW9fj0RsBDEf2Yj/qsFCSd1ZaOF20AQ0isCq6onoxmqIe2NgDh ioXt1BslTRYZqXIiEc2WeuRqHaf4T1gKlS8L8A58j9EJeksAg1w8Ws79FIEZ+rtpHJPJ tymI1qjzKgks5FNeDOhl2wpKzoLCvWQq+liIwtCS30DdMttS9tWbMdythyLk2r3NL2Xb jZp6y61lmqm2e2GwZgnAIgipGzgTsw1Ym6IOYATSHhqeegIi8hpJxKJQRnwgmSXRbNyc hZS2Cv81SNg8nGmN/AOFv8gAXgr17tqSYgd6VOvKgQ45QvDhHOPElWSEz0W7cWavT6NE bkSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791919190; x=1792523990; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=dOGTVagpmg3SkovNg8gY9NJcdR0snicKiJ3IvwwYIZg=; b=gfjGcqPcLblHuvub8Y1JdZFue33acyB3vRZA7SrNul5Lf6SyMkVrETrP9p0rDXCjK/ b1opkBHDL0+vL6W2hm/lb+M4jtwAM3QMQN/AQhqXx3wl70aGpW33MVmVYU4xy02NhA0T OHmSFN6ionC44DdFoQ9JodSwRcEp15OCOae42TkpGeRD70Hj7i6UDhqTs/PSeBDAPU82 tJXXyhTmC+yLoPzLhyQIh+UbTGtU8xOU9gfzdb2UAokGUhRcIRzBFt8bOIgAjI6QsxVy vvPBpoB0Rc+0PKguFhWs6OC+Vhc0Ug6on9HdgeAsPJvBGNZ9Se+UWcXrsF0TRVIScDFN iGgQ== X-Forwarded-Encrypted: i=1; AKwUvBzLevRy7rDbPERsFZxvE4Pma5lA1E9uCOCw/tHFolTKY7F2Xk1voLOXK9keoUd8rZTnhpVn3BnUZ2GNNe8=@vger.kernel.org X-Gm-Message-State: AFq9FYKpyZGvxhkLOIQhadXoZmvj7BCRQmtOa9LsYf18CsC8u8AgMbVH GIw1yhaEPQP3vQSwtxa2HNgW/zsj8a55fnHHf88ufZ5DlxkNtl72GOM9 X-Gm-Gg: AYBFou2yUjVbLwAkbGH8JaC5mZ/PKrPYihCEBgXwgdE/cj1KxhJuLHanLQ06tYlG75b 6apzT/jZMx0PyXfnq2icrdQiMrkwwLa6ErBLIwc0mzrQa+QMUqqeJwPyxEKw08UMZJv+O+B3OSz vGKxP5scxjZjlb0Z9BMj5J59x7X+VEdKM5o2zY9qRhAZA6r57pOxBG5/a9+LkUDEo7pnlrcAP5/ i0sjeTXHIIz9tGZjfJKy8FWDOrlQWrDi8ZJrlPQkGkE/safbPHarXBR/qlIyQEoxzh/imLl9iFL kAmY0Ec4DshwVO9+ktdc6zYU9zKOuhLK/W7WEAdVeOBkArfvgv8r891xqWBfNDkOL4a090xsrw7 qcrWWedD0FVDCCUNSKVHmjHGai4rDOSDJDndirHB9rJuk2QueQSAuWk4jrQMNIr2pmqtRxIgspR elpLmPTKXYFAYsGVo4O6bgytAA1uDwT6RWJe7JNWpFGuhYQPtScRU1FQ0aHRVjmJeJmrDKgQcEL qwHogAKtLeb92QI0+COcYUVH99+Zgt8YSYWJI5VAViHWmScMHioMmsYo+Coud6C8p4+/P+/k/DG saB9hiJ7/KDXK8el2H3TmxTQ/WsofEerUQ5CtbRy7rC0lwyJ5deEj5OcIGJhaJOy/hYtWzAmHfP Bt5C/OQHwvPa8/RIXEcyv X-Received: by 2002:a05:6830:449f:b0:815:40bf:e777 with SMTP id 46e09a7af769-83095d20990mr13053589a34.13.1791919190457; Tue, 13 Oct 2026 12:19:50 -0700 (PDT) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-83039a3dfa1sm13280507a34.18.2026.10.13.12.19.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Oct 2026 12:19:50 -0700 (PDT) From: James Hilliard Date: Tue, 13 Oct 2026 13:19:46 -0600 Subject: [PATCH net v3 2/5] ptp: unwind partially completed virtual clock creation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20261013-ptp-vclock-sampling-v3-2-d3ee4ea62fc6@gmail.com> References: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> In-Reply-To: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> To: netdev@vger.kernel.org, Paolo Abeni , Jakub Kicinski , Richard Cochran , Andrew Lunn , Yangbo Lu , Miroslav Lichvar Cc: Eric Dumazet , "David S. Miller" , linux-kernel@vger.kernel.org, James Hilliard X-Mailer: b4 0.15.2 n_vclocks_store() publishes the new clock count only after every child has been registered. If a later registration fails, it returns without unregistering the children already created by that request. Those clocks are left out of n_vclocks, and a subsequent request can overwrite their index entries without removing them. Unregister the newly created children in reverse order and clear their index entries on failure. Leave the previously installed clocks and their count unchanged. The n_vclocks mutex serializes this rollback with other sysfs changes, and parent removal drains the store before walking the children. This was found by code inspection while adding initial PHC sample error handling to virtual clock registration. Fixes: 73f37068d540 ("ptp: support ptp physical/virtual clocks conversion") Signed-off-by: James Hilliard --- drivers/ptp/ptp_sysfs.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/ptp/ptp_sysfs.c b/drivers/ptp/ptp_sysfs.c index 53388b123198..fabc1c9b1752 100644 --- a/drivers/ptp/ptp_sysfs.c +++ b/drivers/ptp/ptp_sysfs.c @@ -225,7 +225,7 @@ static ssize_t n_vclocks_store(struct device *dev, for (i =3D 0; i < num - ptp->n_vclocks; i++) { vclock =3D ptp_vclock_register(ptp); if (!vclock) - goto out; + goto err_register; =20 *(ptp->vclock_index + ptp->n_vclocks + i) =3D vclock->clock->index; @@ -257,6 +257,12 @@ static ssize_t n_vclocks_store(struct device *dev, mutex_unlock(&ptp->n_vclocks_mux); =20 return count; +err_register: + num =3D i; + if (num) + device_for_each_child_reverse(dev, &num, unregister_vclock); + for (num =3D 0; num < i; num++) + ptp->vclock_index[ptp->n_vclocks + num] =3D -1; out: mutex_unlock(&ptp->n_vclocks_mux); return err; --=20 2.53.0 From nobody Sat Oct 24 13:19:55 2026 Received: from mail-ot1-f45.google.com (mail-ot1-f45.google.com [209.85.210.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 058F053F694 for ; Tue, 13 Oct 2026 19:19:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919195; cv=none; b=Jkb00lLRd1sV/HeiH4qaYav3lQ2fb+QduAyNZfkC7agH0MW/v5jL1jqEnZBPXR/iV14V2+rjxqTb6NjgfC7Zckgt+KD29lTVrHC+EcPdwx61uY4+H7GopBN/9D6+9No0rfINaD1yYABGXFu5yZlKPc0iecEHDZ+4wX2ZkXAp6C4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919195; c=relaxed/simple; bh=NNOB8km99ksjDrQXiRN77AtsCWuF9D8MDEppTHzofW0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IVHg+7qPOuJzEMPWEKDjr3gB1PL35+bFslyML423OlNLReBxnz4dbBoXZuE+ofpMbv4IZAwq2KZuxbHGwHA99o2w5nA6OJFZvFQ0C/kx8abb3PBnBY4KBRjhx4U+CZGJAcmVSTRZ1cXtVDlTKhLgAraJREvzuVcwSRpUtZMX6yI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=kWg5H/UW; arc=none smtp.client-ip=209.85.210.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kWg5H/UW" Received: by mail-ot1-f45.google.com with SMTP id 46e09a7af769-825b40f8a26so1652409a34.1 for ; Tue, 13 Oct 2026 12:19:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791919192; x=1792523992; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=GGgu5Q9CBMy31PnvfEMlY3Beff1FqtWYZzk/xM+Mv7Y=; b=kWg5H/UW4EdhEIcgrzzVN+G6oP34R42Do6e8D89eWv/1/Ow7yrZxKue1gLNovlzxDH aPrDUN+ZStb23ovwX8x3cCG3Xs1xZyP/4ulePx3xS5a6926ME8v4jwU146I6x0kdU7A4 X+YzWXU2XFPns6M8KvSilK0wPJAgrZtAp7bTwNf1TO4H0BUYJg4Cmpzt269hqlfld7Wn px+A9aCsBdE1Whu9W4HFZoN/tT3+3RC08VHx/RRLC7j5w8/lzSvAJ/ZHUF1Y4rMM8f8D hhq55y6Aoq6FPqkluiScBD+ZEE8wGUjIXgcL8buEPbskZ1a6ROi8VkiztsVSCMXA53Ud iP2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791919192; x=1792523992; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=GGgu5Q9CBMy31PnvfEMlY3Beff1FqtWYZzk/xM+Mv7Y=; b=ZZzdwW4LvCDVYcPJfUglgEWyp7PiO3zH/M0imU6t+egK+R+1SbgoKCiNGP8ApCVEGr llFwEHHGJqHlq3VuHcaJp8IAiP+iReIlt40+3slEwT5P2UEyLOFFRrVGFwl+PnlokLze Xn3J5x1DHB63zgmPl17nXELIAamb9TRvJff+IqUdF7Hzh89rVsgdHHcTxepe0J7X0j6a pHgk08wBnH45UlPRhVcX4xqGTMGFtd1hPQwiejgQdP1jTcglZV5LqTXf9PHA1xfKteUe eQ+IayS6VvxGtDrkxSAUpYqMT29C4B8R69mk7fuDwYZgZgJsq7NdTOdYmbnDDuldtUqc Vrog== X-Forwarded-Encrypted: i=1; AKwUvBzQ+0L/KU6NGWUKPaasxa26zOOk6JFqHz3ZuoOMvEwFnj+nEocQf/EsYmi4YFHnBVeHaa863rrG9Yx3eOc=@vger.kernel.org X-Gm-Message-State: AFq9FYKu1shOuU/igboy6sHmkGiQxtKHmMiyxQxRJV3xSQCm5fl3rBZY 1XkkyfizB619LErPFwYdrGYaW0fvw3aw6xxL7j/0ekwVqTSGfXA33lZX X-Gm-Gg: AYBFou2KSloJD0kZ0qrGzl4pU52oKBkDpjET0hj/QsjKcSBIft1ilzogy2mls6eybxb aLFs+j178CYsyWriJLRN7E1NYreClV0IvivAPhl2+XpTCp2z1w5df5E68pxKmhp96uMue3/bGnG Zmd+Kj0tn1Az8aZHtEhy0CbbQu6BZOjb/SORiFNHGUFqgfVgakh5zBIQX/ktzWk/81LidXbnIln yLbev9TdXLp6JKvZNgcb+a2+ADaE+h8NCrEJ6IkXrBpQCdr18UArzXwSjmlJeKl5s3dek001jfi NL7a4+sfplAyYoCYkury+qL3oDPlbWpTYPk8kCjQasbCw/Wswmlrsino0NBWrCkEuUDKXzZqvDh DFEBbhMX9NUyOA8fOosBtDehzsjSwpybItxGYtgfWSWfg3kcz74iGTpGvxiS9lj4YneXmqWMeDh Dn+pn6+FY0TbX9QLxwhs4rHXbvLK+wuPFAYGC9/ABbgsmSVhySuqLskTQSzAVBT4TLegc+AmZ32 6N0YYvlJ5tu0D3gszNGLbQdN07iG2GFTz0vpyd1Dv3UD64hXlfRQekfn1Ew9WE+0yNX8O5nEZfz sawid9fFVbj7qUeDLX3OoOCmv1anDr39xaIC9h148inHQtlMdQwFL3ymRpw90nRTA2mP2nUX/Nl Umkdg8WYZYhPT/3rygJEswYQYMcfnSF8= X-Received: by 2002:a05:6830:6d14:b0:81b:9d18:75c with SMTP id 46e09a7af769-8309814be8bmr12340390a34.20.1791919191633; Tue, 13 Oct 2026 12:19:51 -0700 (PDT) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-83039a3dfa1sm13280507a34.18.2026.10.13.12.19.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Oct 2026 12:19:51 -0700 (PDT) From: James Hilliard Date: Tue, 13 Oct 2026 13:19:47 -0600 Subject: [PATCH net v3 3/5] ptp: vclock: propagate physical clock sampling errors Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20261013-ptp-vclock-sampling-v3-3-d3ee4ea62fc6@gmail.com> References: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> In-Reply-To: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> To: netdev@vger.kernel.org, Paolo Abeni , Jakub Kicinski , Richard Cochran , Andrew Lunn , Yangbo Lu , Miroslav Lichvar Cc: Eric Dumazet , "David S. Miller" , linux-kernel@vger.kernel.org, James Hilliard X-Mailer: b4 0.15.2 The cyclecounter read callback cannot report errors. ptp_vclock_read() ignores the return from the physical clock and consumes its output even if the read failed. A zero sample followed by the real counter can add an extra 32-bit wrap to virtual time. This was found by code inspection of reset-time PHC access and the virtual clock callers. Sample the parent before calling timecounter_read() or timecounter_init() and have the cyclecounter callback return the cached successful sample. On failure, leave the counter and frequency adjustment unchanged and return the PHC error to the caller. The refresh worker can retry later without consuming an invalid sample. Take the initial sample and initialize the counter before publishing the clock. Return an error pointer from registration and propagate its errno through n_vclocks, including when the initial sample fails. Keep the existing cyclecounter mask, scaling and refresh interval. This does not recover elapsed time if sampling is unavailable long enough to miss a counter wrap, nor does it assume that getcycles64() exposes a full-width nanosecond counter. Fixes: 5d43f951b1ac ("ptp: add ptp virtual clock driver framework") Signed-off-by: James Hilliard --- drivers/ptp/ptp_private.h | 3 ++- drivers/ptp/ptp_sysfs.c | 4 ++- drivers/ptp/ptp_vclock.c | 66 +++++++++++++++++++++++++++++++++----------= ---- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/drivers/ptp/ptp_private.h b/drivers/ptp/ptp_private.h index ec8633126d6b..e389e0653afd 100644 --- a/drivers/ptp/ptp_private.h +++ b/drivers/ptp/ptp_private.h @@ -81,7 +81,8 @@ struct ptp_vclock { struct hlist_node vclock_hash_node; struct cyclecounter cc; struct timecounter tc; - struct mutex lock; /* protects tc/cc */ + u64 cycles; + struct mutex lock; /* protects tc/cc and the cached sample */ }; =20 /* diff --git a/drivers/ptp/ptp_sysfs.c b/drivers/ptp/ptp_sysfs.c index fabc1c9b1752..026220b112c2 100644 --- a/drivers/ptp/ptp_sysfs.c +++ b/drivers/ptp/ptp_sysfs.c @@ -224,8 +224,10 @@ static ssize_t n_vclocks_store(struct device *dev, if (num > ptp->n_vclocks) { for (i =3D 0; i < num - ptp->n_vclocks; i++) { vclock =3D ptp_vclock_register(ptp); - if (!vclock) + if (IS_ERR(vclock)) { + err =3D PTR_ERR(vclock); goto err_register; + } =20 *(ptp->vclock_index + ptp->n_vclocks + i) =3D vclock->clock->index; diff --git a/drivers/ptp/ptp_vclock.c b/drivers/ptp/ptp_vclock.c index 84cb527f59cc..eea207e5a889 100644 --- a/drivers/ptp/ptp_vclock.c +++ b/drivers/ptp/ptp_vclock.c @@ -42,21 +42,39 @@ static void ptp_vclock_hash_del(struct ptp_vclock *vclo= ck) synchronize_srcu(&vclock_srcu); } =20 +/* The caller holds vclock->lock, or has not published the clock yet. */ +static int ptp_vclock_sample(struct ptp_vclock *vclock) +{ + struct ptp_clock *ptp =3D vclock->pclock; + struct timespec64 ts; + int err; + + err =3D ptp->info->getcycles64(ptp->info, &ts); + if (!err) + vclock->cycles =3D timespec64_to_ns(&ts); + + return err; +} + static int ptp_vclock_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) { struct ptp_vclock *vclock =3D info_to_vclock(ptp); s64 adj; + int err; =20 adj =3D (s64)scaled_ppm << PTP_VCLOCK_FADJ_SHIFT; adj =3D div_s64(adj, PTP_VCLOCK_FADJ_DENOMINATOR); =20 if (mutex_lock_interruptible(&vclock->lock)) return -EINTR; - timecounter_read(&vclock->tc); - vclock->cc.mult =3D PTP_VCLOCK_CC_MULT + adj; + err =3D ptp_vclock_sample(vclock); + if (!err) { + timecounter_read(&vclock->tc); + vclock->cc.mult =3D PTP_VCLOCK_CC_MULT + adj; + } mutex_unlock(&vclock->lock); =20 - return 0; + return err; } =20 static int ptp_vclock_adjtime(struct ptp_clock_info *ptp, s64 delta) @@ -75,15 +93,16 @@ static int ptp_vclock_gettime(struct ptp_clock_info *pt= p, struct timespec64 *ts) { struct ptp_vclock *vclock =3D info_to_vclock(ptp); - u64 ns; + int err; =20 if (mutex_lock_interruptible(&vclock->lock)) return -EINTR; - ns =3D timecounter_read(&vclock->tc); + err =3D ptp_vclock_sample(vclock); + if (!err) + *ts =3D ns_to_timespec64(timecounter_read(&vclock->tc)); mutex_unlock(&vclock->lock); - *ts =3D ns_to_timespec64(ns); =20 - return 0; + return err; } =20 static int ptp_vclock_gettimex(struct ptp_clock_info *ptp, @@ -115,13 +134,16 @@ static int ptp_vclock_settime(struct ptp_clock_info *= ptp, { struct ptp_vclock *vclock =3D info_to_vclock(ptp); u64 ns =3D timespec64_to_ns(ts); + int err; =20 if (mutex_lock_interruptible(&vclock->lock)) return -EINTR; - timecounter_init(&vclock->tc, &vclock->cc, ns); + err =3D ptp_vclock_sample(vclock); + if (!err) + timecounter_init(&vclock->tc, &vclock->cc, ns); mutex_unlock(&vclock->lock); =20 - return 0; + return err; } =20 static int ptp_vclock_getcrosststamp(struct ptp_clock_info *ptp, @@ -174,12 +196,9 @@ static const struct ptp_clock_info ptp_vclock_info =3D= { static u64 ptp_vclock_read(struct cyclecounter *cc) { struct ptp_vclock *vclock =3D cc_to_vclock(cc); - struct ptp_clock *ptp =3D vclock->pclock; - struct timespec64 ts =3D {}; - - ptp->info->getcycles64(ptp->info, &ts); =20 - return timespec64_to_ns(&ts); + /* The cyclecounter callback cannot report a failed PHC read. */ + return vclock->cycles; } =20 static const struct cyclecounter ptp_vclock_cc =3D { @@ -192,10 +211,11 @@ static const struct cyclecounter ptp_vclock_cc =3D { struct ptp_vclock *ptp_vclock_register(struct ptp_clock *pclock) { struct ptp_vclock *vclock; + int err; =20 vclock =3D kzalloc_obj(*vclock); if (!vclock) - return NULL; + return ERR_PTR(-ENOMEM); =20 vclock->pclock =3D pclock; vclock->info =3D ptp_vclock_info; @@ -214,20 +234,28 @@ struct ptp_vclock *ptp_vclock_register(struct ptp_clo= ck *pclock) =20 mutex_init(&vclock->lock); =20 + err =3D ptp_vclock_sample(vclock); + if (err) + goto free_vclock; + timecounter_init(&vclock->tc, &vclock->cc, 0); + vclock->clock =3D ptp_clock_register(&vclock->info, &pclock->dev); - if (IS_ERR_OR_NULL(vclock->clock)) { - kfree(vclock); - return NULL; + if (IS_ERR(vclock->clock)) { + err =3D PTR_ERR(vclock->clock); + goto free_vclock; } =20 ptp_vclock_set_subclass(vclock->clock); =20 - timecounter_init(&vclock->tc, &vclock->cc, 0); ptp_schedule_worker(vclock->clock, PTP_VCLOCK_REFRESH_INTERVAL); =20 ptp_vclock_hash_add(vclock); =20 return vclock; + +free_vclock: + kfree(vclock); + return ERR_PTR(err); } =20 void ptp_vclock_unregister(struct ptp_vclock *vclock) --=20 2.53.0 From nobody Sat Oct 24 13:19:55 2026 Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9EE3153F6AA for ; Tue, 13 Oct 2026 19:19:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919195; cv=none; b=PDaIo4meYqlhi2TkRBGNAuToinug9Eydz+X0GXTcfphmEd0KaaPRLwiKtVHiXMi/pacPuHcxY+DytnmxjZ7erm8CTJzcHJ6xlhc+i+na2jCCgaxJYbJc98ix+1sfk2mggCe/IM01X1oEU2Ra82oP+IAf2Dt9Xwg24vebJ7cKkAM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919195; c=relaxed/simple; bh=hLB9iIREQdRTkxWuZOfXaelUczjECboBhQUK9ZkYEUI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=maZKc8Qbd+czLloLrODe4HBG/j+K/0+utkE5KCNG20CmIR47lNQ0gvoBME1JCivWXQxY2JYfMGjx5JPQaZpfvarHB6qbzn9hhbfcxPZbV87lrbkAFzvRvDjtepF+fSI6l1NRnXd5jPalGpGSjqsklaoLJvaNk1PmumjhOoROB5A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=arWQXYwA; arc=none smtp.client-ip=209.85.210.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="arWQXYwA" Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-81b54d0cb17so2614222a34.1 for ; Tue, 13 Oct 2026 12:19:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791919192; x=1792523992; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=/M/UZry9pC3NdQaj6klwezszkFb09P0aYrxru7A7Vc4=; b=arWQXYwALKwVTSY/cFB0wzfvCEr+fcuR4lyGngU14kEp4keDpOy1+bfUP925b9BiG2 Uf+f7EdoedNpuYbn0aaOR3ZzGLOqvbLD73Qqs0q4lr8Q9U/NyWPMXly9ZQQwQnvysVro T70wszSGyTyphrxDOczwqiQ+AU3zt8GBVm4dUHnTVAEJtQiQYo6eRqIFRS2LMeGKPfkq WgzOwK2fjf/Lz25A51I0Ug3kyZCTzCbfCmE0PC5wpQ9xOObBusZQjH8GnpPn3JlcYCw8 OWO9vso2Q1E61kMYHK3gHedQieMAQ2a7g/mU4qnblhvwik9pleqNdOByzXp+4ORg/2D4 oN4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791919192; x=1792523992; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=/M/UZry9pC3NdQaj6klwezszkFb09P0aYrxru7A7Vc4=; b=P+o18M6fNtdEzQskJkAhgmilamYXzn6sGcv8jlShu04CfP3hXMy3WDgy6AVv1o0e0V SLaiwzGOS44X+C/RAXNNZF2qlMOtspg/IvgZ730zPzAxRCLS5I1ukzt9YQP3OKuA7B6f eLZz1IULwD+lQ3i2iTJw3xXVzFmRfdJ4QUlbb0lXl28imIPKCUyNUqLU9j4GczbjIKVL JOdp65SONtjQD3z5ttQr88pNGA3BedH5V3AKp3OkS3jhPuj32T6BcSiKWIE1TPwPYi20 +jf6cSXDiaGVOB4nXuno1p31WzmkHzHmFma+JT78GAgNUEkPgrXMVeDGn3RAImOJ+gGn NmMA== X-Forwarded-Encrypted: i=1; AKwUvBzo0bEinbkTCldX9krfPDgaw2rS9DOlJBFUDtoYzsrbD2kP/ufUVBHr0itWlewrInTYuHhtqgCMszvci9s=@vger.kernel.org X-Gm-Message-State: AFq9FYKUqPPzwafk3CBK1NjJ2eYsxTxI6jXh2hsjon8mMB6cpfiLhSO6 eijYk1ToeTNWBVtpL+IWumI9LggTYYUx72g+Ip0gSaLaDPbbqsv2HiAI X-Gm-Gg: AYBFou3nD2azQuAjGzsEx0p4pIoN92cL4LXqrYur7ROo62nsDy3RHxdrmN131cTsov4 EbQEqN9pNV8xQJPfszrj/S1RwuJ0XUgmB5k/gApgW6DmyW5uMpbc7JqfAJrhAXawMtH/R71Mqe8 KdjoHrMLQmRHsEIoORY+zpqbum+5d/2EA71xdFggMG257VJ3FTIRD6adgy0QBMUzeC/CbhNrqa8 XHp++1exfAGhCrRuLdri6wp7awdNBUGRL+BJi4slpKMos3Kw3bj6cjR/AgNzJ8o00vkKKlwnxEz 7zoAX0LBGbLFrnEwBjDQyt8IyynDAe91DEgrq+CmzP8tnU8uPsIOpeHV1FPp7grsaO3CYwPZ4xa /T+7YpEAy9UncU7LgDCC8F96SfLnIKncB9mfE8/s54Lf/7fURcmDQqASzEJKHdjdW08W8xgIuvL WQE1K47YdGkc+iAq6lMjPQvRZuFGv3bVV4dHTXHLyv6UicBZc1zLpon44xqgQoFz9/UwaZdecsG KQxpkG+CsvptoJzjfuabuW6c91TZkxPRiq0+QPiToSIzX++nNrvDwWZuQxJRyY1pGdgiQGief3w +g2X0/5HEFr4Dzgn+PSlm/M914PM2dVhzP1NC4Ht+r6bgJjQPqlCKedruvSXXegRCdprhOGZO/A 57Ytxz/vecQsp5bidxoHl X-Received: by 2002:a05:6830:6aeb:b0:7f6:705b:ffe7 with SMTP id 46e09a7af769-83095a338eamr12524842a34.14.1791919192556; Tue, 13 Oct 2026 12:19:52 -0700 (PDT) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-83039a3dfa1sm13280507a34.18.2026.10.13.12.19.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Oct 2026 12:19:52 -0700 (PDT) From: James Hilliard Date: Tue, 13 Oct 2026 13:19:48 -0600 Subject: [PATCH net v3 4/5] ptp: vclock: serialize extended samples with counter updates Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20261013-ptp-vclock-sampling-v3-4-d3ee4ea62fc6@gmail.com> References: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> In-Reply-To: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> To: netdev@vger.kernel.org, Paolo Abeni , Jakub Kicinski , Richard Cochran , Andrew Lunn , Yangbo Lu , Miroslav Lichvar Cc: Eric Dumazet , "David S. Miller" , linux-kernel@vger.kernel.org, James Hilliard X-Mailer: b4 0.15.2 The extended and cross-timestamp callbacks sample the physical clock before taking the virtual clock mutex. A concurrent frequency adjustment can advance the timecounter and change its multiplier in between, so the older sample is converted using a different frequency than the one in effect when it was taken. Take the mutex before sampling and keep it held through the conversion. Retain timecounter_cyc2time() and its existing conversion window. A PHC sample need not advance the counter: for example, e1000e explicitly allows non-monotonic SYSTIM readings. Treating a slightly older sample as a forward delta would instead advance virtual time by nearly a full counter wrap. This race was found by code inspection of the virtual clock sampling paths. Fixes: f0067ebfc42b ("ptp: add gettimex64() to virtual clocks.") Fixes: 21fad63084c2 ("ptp: add getcrosststamp() to virtual clocks.") Signed-off-by: James Hilliard --- drivers/ptp/ptp_vclock.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/drivers/ptp/ptp_vclock.c b/drivers/ptp/ptp_vclock.c index eea207e5a889..6675466bc307 100644 --- a/drivers/ptp/ptp_vclock.c +++ b/drivers/ptp/ptp_vclock.c @@ -113,20 +113,18 @@ static int ptp_vclock_gettimex(struct ptp_clock_info = *ptp, struct ptp_clock *pptp =3D vclock->pclock; struct timespec64 pts; int err; - u64 ns; - - err =3D pptp->info->getcyclesx64(pptp->info, &pts, sts); - if (err) - return err; =20 if (mutex_lock_interruptible(&vclock->lock)) return -EINTR; - ns =3D timecounter_cyc2time(&vclock->tc, timespec64_to_ns(&pts)); - mutex_unlock(&vclock->lock); + err =3D pptp->info->getcyclesx64(pptp->info, &pts, sts); + if (!err) { + u64 ns =3D timecounter_cyc2time(&vclock->tc, timespec64_to_ns(&pts)); =20 - *ts =3D ns_to_timespec64(ns); + *ts =3D ns_to_timespec64(ns); + } + mutex_unlock(&vclock->lock); =20 - return 0; + return err; } =20 static int ptp_vclock_settime(struct ptp_clock_info *ptp, @@ -152,20 +150,18 @@ static int ptp_vclock_getcrosststamp(struct ptp_clock= _info *ptp, struct ptp_vclock *vclock =3D info_to_vclock(ptp); struct ptp_clock *pptp =3D vclock->pclock; int err; - u64 ns; - - err =3D pptp->info->getcrosscycles(pptp->info, xtstamp); - if (err) - return err; =20 if (mutex_lock_interruptible(&vclock->lock)) return -EINTR; - ns =3D timecounter_cyc2time(&vclock->tc, ktime_to_ns(xtstamp->device)); - mutex_unlock(&vclock->lock); + err =3D pptp->info->getcrosscycles(pptp->info, xtstamp); + if (!err) { + u64 ns =3D timecounter_cyc2time(&vclock->tc, ktime_to_ns(xtstamp->device= )); =20 - xtstamp->device =3D ns_to_ktime(ns); + xtstamp->device =3D ns_to_ktime(ns); + } + mutex_unlock(&vclock->lock); =20 - return 0; + return err; } =20 static long ptp_vclock_refresh(struct ptp_clock_info *ptp) --=20 2.53.0 From nobody Sat Oct 24 13:19:55 2026 Received: from mail-oo1-f49.google.com (mail-oo1-f49.google.com [209.85.161.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ACAE653FD3D for ; Tue, 13 Oct 2026 19:19:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919199; cv=none; b=AW1m0su85+NsP/23IaKVvUB5cNyF7oMD3BRR7p8SDfzo50NKSRga3kM/2taz/sQh4/m+EVmmyoapodkP7FNkqAURKW2dFQAByNqORV4BuGpq8tpvZJnrAEXoiniepRdYhnG4qQQgMOo1/Hnj1sLD7K6t3IRGjwQQg8I3fuibcKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791919199; c=relaxed/simple; bh=/ETSF3lZyVUeslXXshMG0qVlZ/o+jDPKRJEDhxYGtNw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f851goOzfmxCNLQIWTGQwJTqYphkKg9STFOEPkbqepzNVwME+gS6ywWKgKgcDwf7+cwpz3QyIXJEnWPzrjc5nE6FsREkGmF/T+iSxxHSeM49m19yDZeyzkvjxy/YVAmxmKUBN8+3e2/O6AQPsj+HLJr3yaMGiV0V+h0MuyCbMq8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=geLDVsNV; arc=none smtp.client-ip=209.85.161.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="geLDVsNV" Received: by mail-oo1-f49.google.com with SMTP id 006d021491bc7-6dd059478dcso2354506eaf.0 for ; Tue, 13 Oct 2026 12:19:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1791919193; x=1792523993; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=SBxyjlKl2tsAQ3iOaWxN0He7F0zON2T03lxEbKDGG0E=; b=geLDVsNVd/TtbtMD3PCnRfg9ie/eDj8tY+gJsy47rhUIOpRNtQsvAgoyPnA0S8TT6A 81jghnNsV45eZ8uCI/D5ITDkYvCyurQLPviLbggX+Xk5XqC+/uxHC9AC10e+fNF+TVfR 8FWP7l+HP3Oix936LP8J1THAJtpzXYtIE5TyaTizrQWqNBCqEZQXNt/u8oJ0GPp2zL3w oOrqtVtg3WKy/Kvij8cFGCp6TU/ymJGoXhdq1QUua9qHrIk31ay9zMSPaCsSnGZem2CP XzWOVE1ktLG42nD9FpQs3wIP2PDBphr/j4LONc420JIQy6Jk1UYS9sgRmKxiH6ACFySv WmRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1791919193; x=1792523993; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=SBxyjlKl2tsAQ3iOaWxN0He7F0zON2T03lxEbKDGG0E=; b=uQ9CcXu03jnaG5wOT64e7X18nZibXoGy3yoowx3aoFDl8GUF+t/SvPAu4upEz/M0ku lgzk+iVPrJD3gwFOmg2CsU3AMzeAp67exwRMonk4Jw7JA+VDFe9b43YXPeOy+jH/bYKJ 8AXVH5pCTzuQdPX/oCy4DxNssPOKfLXDoOoryYlOgQUnQHgNE7dBdn3bryWLM96EFf5l r42IHbUnaQDXe46oK5TR6J4xic37byKiWzYak4FGsO2oXAMECB2Y6q5mwiS9LSoB4Gw6 jp5WxJyQYwA/KydV7fHkKAwMSzmKfNqPpT9u5Qk4QaVjYMTOmylMZacfmIrQBUYK1W1/ CR4w== X-Forwarded-Encrypted: i=1; AKwUvBxrzwpZ1X9WWkCkWmZCBXg+PTAXoJltlCQMPzNefQ7RrgLuKAVv4qLq0PRYklyhzaR0/tiqeJXHQq92e34=@vger.kernel.org X-Gm-Message-State: AFq9FYLPlnFZUBGAi6eRAhKZ8/Jnf7yXBIV07LwB6hKoz+y7bEf8p2IP TwFc5wWwQSg5taiYKwSKyCK1gtfrOg71f70yQiv1f9eyf49ywc6E2TFX X-Gm-Gg: AYBFou3/K7mxlqCI6l8ECFcWrJIfs/Fh8Oej5bNRHn9nHi65LfycKTh4TRuOvwR1u2M ohIHOEb0PTUq1SwDKLSb2LECArapQJQjLO6Otm9yEebA5veZJeiYKsG7pJv/jIEs4fAO9vtIvgb T9aS69sPOpW0yF0Retryy+wi5PM+ddS1DV1dNu9YIiJqRzo+Pqifk6Ovv+e4eKsxjl/0SuPCsgX tdMIUEqLzbBIZ7QnFyMWDq13xQncrAqsZFT5GXbhpLsSCbhmZQNMHZFDQkCMMD+oGT6+FQaMbQb 3YWz/I0QL2vvIS9ae0y7MnFOJXU5eB6+fu34W0HfMSQMnoJUQtbHl/jcZ5ljSt+A2Mn1NHUV7me io3CsbbGMlJtTLuc8VJ8Ik1wVIwq2WrGOLr3Iw+GBfTaLKp4qEz6a0VOR15VN+y8SCdpJnvRC7C s4ESa51pUADfZOH/N73Ig3MNpXX6Eq6Z5XPW60ltv3andAlTUN8j9SjiT09hv0fH3evjfB5Nidj 0lqIFAntv950iWUdvupqjdbsmLiadZdXQcG/6PmBmpQjpBrOH8ThIkeHAh8HvMGJ14od16U3Sdz Mp1ue8tflwm4x1mz5NuHZTxNJyuZs+V1f9QBskVT2pHwiZdttpaCPW4ikL6YzU6NkP/g6TN0pd0 nwgzw3s5DTwQF86wcy8Q6 X-Received: by 2002:a05:6820:4b08:b0:6da:29e4:35a6 with SMTP id 006d021491bc7-6ef0eec6e53mr10221552eaf.52.1791919193469; Tue, 13 Oct 2026 12:19:53 -0700 (PDT) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-83039a3dfa1sm13280507a34.18.2026.10.13.12.19.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Oct 2026 12:19:53 -0700 (PDT) From: James Hilliard Date: Tue, 13 Oct 2026 13:19:49 -0600 Subject: [PATCH net v3 5/5] ptp: vclock: preserve missing hardware timestamps Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20261013-ptp-vclock-sampling-v3-5-d3ee4ea62fc6@gmail.com> References: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> In-Reply-To: <20261013-ptp-vclock-sampling-v3-0-d3ee4ea62fc6@gmail.com> To: netdev@vger.kernel.org, Paolo Abeni , Jakub Kicinski , Richard Cochran , Andrew Lunn , Yangbo Lu , Miroslav Lichvar Cc: Eric Dumazet , "David S. Miller" , linux-kernel@vger.kernel.org, James Hilliard X-Mailer: b4 0.15.2 Socket timestamp delivery converts hardware timestamps to a bound virtual clock before checking whether a hardware timestamp is present. A zero timestamp means that the packet has no hardware timestamp, but timecounter_cyc2time() can turn that zero into a nonzero virtual time. The socket then reports a hardware timestamp which was never supplied. Return zero without conversion when the input timestamp is absent. This also covers skb_get_tx_timestamp(), which checks for an absent timestamp after the same conversion. This was identified during review of virtual clock sampling changes. Fixes: d7c088265588 ("net: socket: support hardware timestamp conversion to= PHC bound") Signed-off-by: James Hilliard Reviewed-by: Vadim Fedorenko --- drivers/ptp/ptp_vclock.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/ptp/ptp_vclock.c b/drivers/ptp/ptp_vclock.c index 6675466bc307..4a62047f0ce0 100644 --- a/drivers/ptp/ptp_vclock.c +++ b/drivers/ptp/ptp_vclock.c @@ -307,6 +307,8 @@ ktime_t ptp_convert_timestamp(const ktime_t *hwtstamp, = int vclock_index) u64 ns; =20 ns =3D ktime_to_ns(*hwtstamp); + if (!ns) + return 0; =20 srcu_idx =3D srcu_read_lock(&vclock_srcu); =20 --=20 2.53.0