From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794313491; b=5A398j7TTNOxpwDARGj1ZOrVrRsCl4qHfuH5szih5UqP8vEGlAff8Op8jRo9gP8J2o6I G+Qo9BLVqel5vtfIJn7oKSg90a25JOnngddgO1xREAuMEMRlLkrUbdEkHYgLdkLXoTGDm wvKu5mOrZJeqc0Mg1uwoIwVk108mmtH/RmVJ5HdtbDWeQ0sG+HSKC1G1Zqf/+mZkZrrg4 FfakpdhQ1E9PS1lABR8aZxnWIr8EBAyZxe9L+flqXzxZOD1UhDymGWAORH1aBtJ30f4C/ Ond0XFJDXBoDqUBM+OgZoL+jjGIMYCln8RuYHiuISyrqqCEQ+bNVsczt7zSethUhX+w== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794313491; h=DMARC-Filter:DKIM-Signature:Received:X-MC-Unique: X-Mimecast-MFC-AGG-ID:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Gm-Gg:X-Received: X-Received:Received:Message-ID:Date:MIME-Version:User-Agent:Subject: Content-Language:To:Cc:References:From:In-Reply-To:Content-Type: Content-Transfer-Encoding; bh=oGxVOcOZKJdSVIhjkgYRwcfA8DhUPk7Xrs1pQVfHMK4=; b=dHIQG2z33cj2jwbn2UUAsNjaE0ZhVW3P/KFFOTvrOEUTWGk+lhmMz05rGm0JvJD/OECv +4GVsgujE5MgUUQ9iKslngttfssR4OMAfxqITsan078qh3BP4fns5hLfOuniuj5XuBIfn j0mX0IGsxSNfloIQGEHN6JWxI5G+ugQ51A/xyR6i4UURVYQIU0hpqeCsw0rPagVNCCmuB VDamlWM6l5M+5A7g+s9rENEjIqXBNS9qFtZ1MWfMyR6TgLsszIawtK4rsjagJFix95u2q qtmQSxE48xnLnJncDOA+XdFX7v5X6ImGZAEo9TF3OqL9uiB6n8UbV/wwNS9RyIQFdyg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b="IGXR5J/f"; dkim=pass header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=google header.b=Znbv1O2I; arc=none smtp.remote-ip=170.10.133.124 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C3401606A32E for ; Tue, 10 Nov 2026 12:24:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org C3401606A32E Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=IGXR5J/f; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=google header.b=Znbv1O2I DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1794313490; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oGxVOcOZKJdSVIhjkgYRwcfA8DhUPk7Xrs1pQVfHMK4=; b=IGXR5J/fH0fvnBdYZrBHddM7QJFsQ2ACLoHw+ZpIvdL0s97xBPY/mX1XjwKnawS4TgCh+v T6iLXya5woE7QOA4l3mkuWhFq56Di5VSEa6KLb47z/CXHK5EI6HSZQ+o6AKcnyrQdhlW+I faQ6/g+nwEGLfFJK27acoLx/JBxhF+I= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-630-BCDqWiVrNPOeu5AOyBLdkA-1; Tue, 10 Nov 2026 07:24:48 -0500 X-MC-Unique: BCDqWiVrNPOeu5AOyBLdkA-1 X-Mimecast-MFC-AGG-ID: BCDqWiVrNPOeu5AOyBLdkA_1794313487 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4a204f135ffso11361915e9.1 for ; Tue, 10 Nov 2026 04:24:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1794313487; x=1794918287; darn=vger.kernel.org; h=content-transfer-encoding:content-type:in-reply-to:from:references :cc:to:content-language:subject:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to:content-type; bh=oGxVOcOZKJdSVIhjkgYRwcfA8DhUPk7Xrs1pQVfHMK4=; b=Znbv1O2Izs7LoHwe4uvM0TQYevCK3P91i6Nt28X4e6BvC8r1sY/wc333tDL7w+gHBi Qvb3ev6KEDKLo+/pwyV88U0TjB5epP1Rwrzk8o2+Kv1kKR3+fp9fph474pkfDM8bAZPU T/MZ83SCqBBZ3aX2ZaY+L2C+Rkxuswed3DN51iPOzGNeXGnMZfkDuw3Q5HLchp8Lmdn7 Y7bY8jU49Jtj4WNTO2O4mlYmOErB8L6pF250gnp51HgB15FCsT0Rc7cW13iCSV1av6sp cEUrTE7fE3JNX/7tHA1Rb1wzEZ9jNfH2JIIn1Jq66pDvphPfPbUaCaeuyeK06h2lHvJI pARg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794313487; x=1794918287; h=content-transfer-encoding:content-type:in-reply-to:from:references :cc:to:content-language:subject:user-agent:mime-version:date :message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=oGxVOcOZKJdSVIhjkgYRwcfA8DhUPk7Xrs1pQVfHMK4=; b=G8dUplCcUyI8ljO4RjHi4DXH+xiAPLaH2BwprNEdBWQily+c0tRYCKFQAzflT3Rv4A 15E//767oaB+X/lK2MVp/lh/tGRHKj55xyobM6qnaoRhAa026/MIn0m6ZYhjTSMsK2/v pc8wIH1cqZNCm0qZOW1UqivZ5xzwEoZokxkhFTnyjLUh+20Gh4LqEr6PSIKdEmX/0uuX aoDecQ3pvjsM0wQhXYtESM0YlnXw03KrvN9jVfh0DaF9uVIbxso9z5R511Hy4NUpWrux wYbV5rHGbslFpLwigLXMdIYH50l/Fdy+wt1L5ucFE3qSeDrdCYELdGOSr1Xbcq0JQD+8 W8DQ== X-Forwarded-Encrypted: i=1; AL+hErFDBTvUxPyUeqdxmvTeUevTbnhBTYDRbp0MsArgb2xQhjJjlyO819HR6ZUYPi2s2RlnCpdtmFps3g1ltOA=@vger.kernel.org X-Gm-Message-State: APuU4Z/sXoIWWpwV9DJFv4qXuvMSzb3RZrJvEowaSlKXY8LPclfq14fz KB4eDBVKkqNZaWOlAvD5zHkPZvWGSnBhFCX/usQuto3lR4svbS1YlHLq3o5MuPRiilMsYQTr9ki YFgQ8MrnPtdW4rKAY9jQgnL7O+PmIE9Alv791saz3x4HM8lkiDeRoVVh+hxn1vS6b6Q== X-Gm-Gg: AYBFou2fln/xYhTxLjffbu0bDJ8fTMYYKGaKESLzBGOVORypqVBogrFmwKcdQexNM4e SOQGIUAkaQvIMBJRHD4+c4LFSjupSM8bsVpIS43LTb9rcnivyNbknAkWZyvns7CYQBoXx1YkSpZ /ajSirHnNPBwjFJPQSFbG2ZtzR/ejbWQPXi6KNC+opSWbngPYbConzceyshoAg905PKsNOj4LDV VEuJIuPw7vZu9NzFjJ3gTqgLNZn5u18pEhyt1SCYcNbNggZOYTnMyNJDaT0XJsgSlNbyY3r8d6P 6iVpf/h4xKrOaJxRXPzFOW48HwSezIkCxpEJdfNIBHkr4n7/4l5fBD2Fv/O8L59nX3+2qdnQ4OP uZI5Y4EmGM/CzHhf5lIUVHjn8fYSZwX6PBJM= X-Received: by 2002:a05:600c:4e55:b0:4a7:6425:c274 with SMTP id 5b1f17b1804b1-4ba023052a8mr41188465e9.2.1794313487135; Tue, 10 Nov 2026 04:24:47 -0800 (PST) X-Received: by 2002:a05:600c:4e55:b0:4a7:6425:c274 with SMTP id 5b1f17b1804b1-4ba023052a8mr41187875e9.2.1794313486647; Tue, 10 Nov 2026 04:24:46 -0800 (PST) Received: from [10.43.3.161] ([213.175.46.86]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4ba0223c41csm62198205e9.14.2026.11.10.04.24.44 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 10 Nov 2026 04:24:45 -0800 (PST) Message-ID: Date: Tue, 10 Nov 2026 13:24:44 +0100 X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH net-next 07/10] dpll: reject measured_freq_get for foreign and on-pin registrations Content-Language: en-US To: Ivan Vecera , netdev@vger.kernel.org Cc: Vadim Fedorenko , Arkadiusz Kubalewski , Jiri Pirko , Jonathan Corbet , Shuah Khan , Randy Dunlap , Min Li , Tony Nguyen , Przemek Kitszel , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, Grzegorz Nitka , Karol Kolacinski , Saeed Mahameed , Tariq Toukan References: <20261106121005.1327603-1-ivecera@redhat.com> <20261106121005.1327603-8-ivecera@redhat.com> From: Petr Oros In-Reply-To: <20261106121005.1327603-8-ivecera@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 11/6/26 1:10 PM, Ivan Vecera wrote: > A message about a pin with .measured_freq_get calls .freq_monitor_get of > a dpll of the pin. For a pin of another domain, this device callback > would run outside the domain of the dpll, so dpll_pin_register() now > rejects such ops. > > dpll_pin_on_pin_register() checks nothing about them. The message would > call .freq_monitor_get with no NULL check, on a dpll of the parent pin > that can belong to another driver, so reject them there as well. > > No in-tree driver passes such ops. Add KUnit tests: the ops work on a dpll > of the domain of the pin, and are rejected on a dpll of another domain and > under a parent pin. > > Signed-off-by: Ivan Vecera > --- > drivers/dpll/dpll_core.c | 6 +- > drivers/dpll/dpll_core_kunit.c | 112 +++++++++++++++++++++++++++++++-- > 2 files changed, 111 insertions(+), 7 deletions(-) > > diff --git a/drivers/dpll/dpll_core.c b/drivers/dpll/dpll_core.c > index 8eb74682343156..84377f8ba16036 100644 > --- a/drivers/dpll/dpll_core.c > +++ b/drivers/dpll/dpll_core.c > @@ -958,7 +958,8 @@ dpll_pin_register(struct dpll_device *dpll, struct dpll_pin *pin, > > dev_ops = dpll_device_ops(dpll); > if (WARN_ON(ops->measured_freq_get && > - (!dev_ops || !dev_ops->freq_monitor_get || > + (pin->domain != dpll->domain || !dev_ops || > + !dev_ops->freq_monitor_get || > !dev_ops->freq_monitor_set))) { > ret = -EINVAL; > goto out_unlock; > @@ -1065,7 +1066,8 @@ int dpll_pin_on_pin_register(struct dpll_pin *parent, struct dpll_pin *pin, > > if (WARN_ON(!ops) || > WARN_ON(!ops->state_on_pin_get) || > - WARN_ON(!ops->direction_get)) > + WARN_ON(!ops->direction_get) || > + WARN_ON(ops->measured_freq_get)) > return -EINVAL; > > down_write(&dpll_lock); > diff --git a/drivers/dpll/dpll_core_kunit.c b/drivers/dpll/dpll_core_kunit.c > index a58800eda5ff51..84c405f855d8cb 100644 > --- a/drivers/dpll/dpll_core_kunit.c > +++ b/drivers/dpll/dpll_core_kunit.c > @@ -87,6 +87,7 @@ struct dt_reg { > struct dt_dev *dev; > struct dt_pin *parent; > struct dt_pin *notify; > + const struct dpll_pin_ops *ops; > struct dpll_domain *forbid; > enum dpll_pin_state state; > enum dpll_pin_direction direction; > @@ -276,11 +277,33 @@ static int dt_lock_status_get(const struct dpll_device *dpll, void *priv, > return 0; > } > > +static int dt_freq_monitor_set(const struct dpll_device *dpll, void *priv, > + enum dpll_feature_state state, > + struct netlink_ext_ack *extack) > +{ > + return 0; > +} > + > +static int dt_freq_monitor_get(const struct dpll_device *dpll, void *priv, > + enum dpll_feature_state *state, > + struct netlink_ext_ack *extack) > +{ > + struct dt_dev *dev = priv; > + > + dt_dev_enter(dev, dpll); > + *state = DPLL_FEATURE_STATE_ENABLE; > + dt_leave(dev->dom); > + > + return 0; > +} > + > static const struct dpll_device_ops dt_dev_ops = { > .mode_get = dt_mode_get, > .mode_set = dt_mode_set, > .supported_modes_get = dt_supported_modes_get, > .lock_status_get = dt_lock_status_get, > + .freq_monitor_set = dt_freq_monitor_set, > + .freq_monitor_get = dt_freq_monitor_get, > }; > > static int dt_frequency_get(const struct dpll_pin *pin, void *pin_priv, > @@ -433,6 +456,21 @@ static int dt_ref_sync_get(const struct dpll_pin *pin, void *pin_priv, > return 0; > } > > +static int dt_measured_freq_get(const struct dpll_pin *pin, void *pin_priv, > + const struct dpll_device *dpll, void *dpll_priv, > + u64 *measured_freq, > + struct netlink_ext_ack *extack) > +{ > + struct dt_reg *reg = pin_priv; > + > + dt_pin_enter(reg, pin); > + atomic_inc(®->freq_gets); > + *measured_freq = 1; > + dt_leave(reg->dom); > + > + return 0; > +} > + > static const struct dpll_pin_ops dt_pin_ops = { > .frequency_get = dt_frequency_get, > .state_on_dpll_get = dt_state_on_dpll_get, > @@ -446,6 +484,13 @@ static const struct dpll_pin_ops dt_pin_ops = { > .ref_sync_get = dt_ref_sync_get, > }; > > +static const struct dpll_pin_ops dt_pin_ops_measured = { > + .measured_freq_get = dt_measured_freq_get, > + .state_on_dpll_get = dt_state_on_dpll_get, > + .state_on_pin_get = dt_state_on_pin_get, > + .direction_get = dt_direction_get, > +}; > + > static const struct dpll_pin_properties dt_prop = { > .type = DPLL_PIN_TYPE_EXT, > .capabilities = DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE | > @@ -570,9 +615,9 @@ static void dt_reg_release(void *data) > > if (reg->parent) > dpll_pin_on_pin_unregister(reg->parent->pin, reg->pin->pin, > - &dt_pin_ops, reg); > + reg->ops, reg); > else > - dpll_pin_unregister(reg->dev->dpll, reg->pin->pin, &dt_pin_ops, > + dpll_pin_unregister(reg->dev->dpll, reg->pin->pin, reg->ops, > reg); > } > > @@ -588,12 +633,14 @@ static void dt_reg_add(struct kunit *test, struct dt_reg *reg, > reg->parent = parent; > reg->state = DPLL_PIN_STATE_SELECTABLE; > reg->direction = DPLL_PIN_DIRECTION_INPUT; > + if (!reg->ops) > + reg->ops = &dt_pin_ops; > > if (parent) > - ret = dpll_pin_on_pin_register(parent->pin, pin->pin, > - &dt_pin_ops, reg); > + ret = dpll_pin_on_pin_register(parent->pin, pin->pin, reg->ops, > + reg); > else > - ret = dpll_pin_register(dev->dpll, pin->pin, &dt_pin_ops, reg); > + ret = dpll_pin_register(dev->dpll, pin->pin, reg->ops, reg); > KUNIT_ASSERT_EQ(test, ret, 0); > KUNIT_ASSERT_EQ(test, kunit_add_action_or_reset(test, dt_reg_release, > reg), 0); > @@ -1432,6 +1479,59 @@ static void dt_test_ref_sync_pair(struct kunit *test) > dt_expect_events(test, (void *[]){ ctx->p.pin }, 1); > } > > +/* A pin with a measured frequency must be in the domain of its dpll */ > +static void dt_test_measured_freq_foreign(struct kunit *test) > +{ > + struct kunit_suppressed_warning *w; > + struct dt_ctx *ctx = test->priv; > + struct dt_reg *reg; > + int ret; > + > + dt_dev_add(test, &ctx->e0, &ctx->dom_e, DT_CLOCK_ID_E, 0, > + DPLL_TYPE_PPS); > + dt_dev_add(test, &ctx->f0, &ctx->dom_f, DT_CLOCK_ID_F, 0, > + DPLL_TYPE_PPS); > + dt_fwnode_pin_add(test, &ctx->x, DT_CLOCK_ID_E, DT_PIN_IDX_X); > + > + reg = &ctx->reg_x_e0; > + reg->ops = &dt_pin_ops_measured; > + dt_reg_add(test, reg, &ctx->dom_e, &ctx->x, &ctx->e0, NULL); > + atomic_set(®->freq_gets, 0); > + KUNIT_EXPECT_EQ(test, dt_run(test, dt_pin_ntf, &ctx->x), 0); > + KUNIT_EXPECT_GT(test, atomic_read(®->freq_gets), 0); > + > + w = kunit_start_suppress_warning(test); > + ret = dpll_pin_register(ctx->f0.dpll, ctx->x.pin, reg->ops, reg); > + kunit_end_suppress_warning(test, w); > + > + KUNIT_EXPECT_EQ(test, ret, -EINVAL); > + if (!ret) > + dpll_pin_unregister(ctx->f0.dpll, ctx->x.pin, reg->ops, reg); > +} > + > +/* A pin under a parent pin cannot have a measured frequency */ > +static void dt_test_measured_freq_on_pin(struct kunit *test) > +{ > + struct kunit_suppressed_warning *w; > + struct dt_ctx *ctx = test->priv; > + struct dt_reg *reg; > + int ret; > + > + dt_on_pin_add(test); > + dt_pin_add(test, &ctx->y, DT_CLOCK_ID_G, DT_PIN_IDX_Y, &dt_prop); > + reg = &ctx->reg_c_m; > + > + w = kunit_start_suppress_warning(test); > + ret = dpll_pin_on_pin_register(ctx->m.pin, ctx->y.pin, > + &dt_pin_ops_measured, reg); > + kunit_end_suppress_warning(test, w); > + > + KUNIT_EXPECT_EQ(test, ret, -EINVAL); > + if (!ret) > + dpll_pin_on_pin_unregister(ctx->m.pin, ctx->y.pin, > + &dt_pin_ops_measured, reg); > +} > + > static struct kunit_case dt_cases[] = { > KUNIT_CASE(dt_test_domain_sharing), > KUNIT_CASE(dt_test_domain_per_module), > @@ -1456,6 +1556,8 @@ static struct kunit_case dt_cases[] = { > KUNIT_CASE(dt_test_set_on_pin), > KUNIT_CASE(dt_test_device_set_ntf), > KUNIT_CASE(dt_test_ref_sync_pair), > + KUNIT_CASE(dt_test_measured_freq_foreign), > + KUNIT_CASE(dt_test_measured_freq_on_pin), > {} > }; > Reviewed-by: Petr Oros