drivers/dpll/dpll_netlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
The DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EPRC is not reported via netlink
due to bug in dpll_msg_add_clock_quality_level(). The usage of
DPLL_CLOCK_QUALITY_LEVEL_MAX for both DECLARE_BITMAP() and
for_each_set_bit() is not correct because these macros requires bitmap
size and not the highest valid bit in the bitmap.
Use correct bitmap size to fix this issue.
Fixes: a1afb959add1 ("dpll: add clock quality level attribute and op")
Signed-off-by: Ivan Vecera <ivecera@redhat.com>
---
drivers/dpll/dpll_netlink.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c
index 036f21cac0a9..0a852011653c 100644
--- a/drivers/dpll/dpll_netlink.c
+++ b/drivers/dpll/dpll_netlink.c
@@ -211,8 +211,8 @@ static int
dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device *dpll,
struct netlink_ext_ack *extack)
{
+ DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1) = { 0 };
const struct dpll_device_ops *ops = dpll_device_ops(dpll);
- DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 };
enum dpll_clock_quality_level ql;
int ret;
@@ -221,7 +221,7 @@ dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device *dpll,
ret = ops->clock_quality_level_get(dpll, dpll_priv(dpll), qls, extack);
if (ret)
return ret;
- for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX)
+ for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1)
if (nla_put_u32(msg, DPLL_A_CLOCK_QUALITY_LEVEL, ql))
return -EMSGSIZE;
--
2.49.1
On 12.09.2025 10:33, Ivan Vecera wrote: > The DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EPRC is not reported via netlink > due to bug in dpll_msg_add_clock_quality_level(). The usage of > DPLL_CLOCK_QUALITY_LEVEL_MAX for both DECLARE_BITMAP() and > for_each_set_bit() is not correct because these macros requires bitmap > size and not the highest valid bit in the bitmap. > > Use correct bitmap size to fix this issue. > > Fixes: a1afb959add1 ("dpll: add clock quality level attribute and op") > Signed-off-by: Ivan Vecera <ivecera@redhat.com> > --- > drivers/dpll/dpll_netlink.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c > index 036f21cac0a9..0a852011653c 100644 > --- a/drivers/dpll/dpll_netlink.c > +++ b/drivers/dpll/dpll_netlink.c > @@ -211,8 +211,8 @@ static int > dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device *dpll, > struct netlink_ext_ack *extack) > { > + DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1) = { 0 }; > const struct dpll_device_ops *ops = dpll_device_ops(dpll); > - DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 }; I believe __DPLL_CLOCK_QUALITY_LEVEL_MAX should be used in both places > enum dpll_clock_quality_level ql; > int ret; > > @@ -221,7 +221,7 @@ dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device *dpll, > ret = ops->clock_quality_level_get(dpll, dpll_priv(dpll), qls, extack); > if (ret) > return ret; > - for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) > + for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1) > if (nla_put_u32(msg, DPLL_A_CLOCK_QUALITY_LEVEL, ql)) > return -EMSGSIZE; >
On 12. 09. 25 9:37 odp., Vadim Fedorenko wrote: > On 12.09.2025 10:33, Ivan Vecera wrote: >> The DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EPRC is not reported via netlink >> due to bug in dpll_msg_add_clock_quality_level(). The usage of >> DPLL_CLOCK_QUALITY_LEVEL_MAX for both DECLARE_BITMAP() and >> for_each_set_bit() is not correct because these macros requires bitmap >> size and not the highest valid bit in the bitmap. >> >> Use correct bitmap size to fix this issue. >> >> Fixes: a1afb959add1 ("dpll: add clock quality level attribute and op") >> Signed-off-by: Ivan Vecera <ivecera@redhat.com> >> --- >> drivers/dpll/dpll_netlink.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c >> index 036f21cac0a9..0a852011653c 100644 >> --- a/drivers/dpll/dpll_netlink.c >> +++ b/drivers/dpll/dpll_netlink.c >> @@ -211,8 +211,8 @@ static int >> dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct >> dpll_device *dpll, >> struct netlink_ext_ack *extack) >> { >> + DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1) = { 0 }; >> const struct dpll_device_ops *ops = dpll_device_ops(dpll); >> - DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 }; > > I believe __DPLL_CLOCK_QUALITY_LEVEL_MAX should be used in both places I don't think so. I consider __DPLL_CLOCK_QUALITY_LEVEL_MAX to be an auxiliary value that should not be used directly. But it would be possible to rename it to DPLL_CLOCK_QUALITY_LEVEL_COUNT and use this. Thoughts? Ivan
On Sat, 13 Sep 2025 13:09:03 +0200 Ivan Vecera wrote: > >> + DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1) = { 0 }; > >> const struct dpll_device_ops *ops = dpll_device_ops(dpll); > >> - DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 }; > > > > I believe __DPLL_CLOCK_QUALITY_LEVEL_MAX should be used in both places > > I don't think so. I consider __DPLL_CLOCK_QUALITY_LEVEL_MAX to be an > auxiliary value that should not be used directly. > > But it would be possible to rename it to DPLL_CLOCK_QUALITY_LEVEL_COUNT > and use this. > > Thoughts? I think we should leave it as is. The naming convention is a bit weird but it's what has been done for Netlink historically
>From: Ivan Vecera <ivecera@redhat.com> >Sent: Friday, September 12, 2025 11:34 AM >To: netdev@vger.kernel.org >Cc: Vadim Fedorenko <vadim.fedorenko@linux.dev>; Kubalewski, Arkadiusz ><arkadiusz.kubalewski@intel.com>; Jiri Pirko <jiri@resnulli.us>; Jakub >Kicinski <kuba@kernel.org>; open list <linux-kernel@vger.kernel.org> >Subject: [PATCH net] dpll: fix clock quality level reporting > >The DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EPRC is not reported via netlink due >to bug in dpll_msg_add_clock_quality_level(). The usage of >DPLL_CLOCK_QUALITY_LEVEL_MAX for both DECLARE_BITMAP() and >for_each_set_bit() is not correct because these macros requires bitmap size >and not the highest valid bit in the bitmap. > >Use correct bitmap size to fix this issue. > >Fixes: a1afb959add1 ("dpll: add clock quality level attribute and op") >Signed-off-by: Ivan Vecera <ivecera@redhat.com> LGTM, Thanks! Reviewed-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com> >--- > drivers/dpll/dpll_netlink.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > >diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c >index 036f21cac0a9..0a852011653c 100644 >--- a/drivers/dpll/dpll_netlink.c >+++ b/drivers/dpll/dpll_netlink.c >@@ -211,8 +211,8 @@ static int > dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device >*dpll, > struct netlink_ext_ack *extack) > { >+ DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1) = { 0 }; > const struct dpll_device_ops *ops = dpll_device_ops(dpll); >- DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 }; > enum dpll_clock_quality_level ql; > int ret; > >@@ -221,7 +221,7 @@ dpll_msg_add_clock_quality_level(struct sk_buff *msg, >struct dpll_device *dpll, > ret = ops->clock_quality_level_get(dpll, dpll_priv(dpll), qls, >extack); > if (ret) > return ret; >- for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) >+ for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1) > if (nla_put_u32(msg, DPLL_A_CLOCK_QUALITY_LEVEL, ql)) > return -EMSGSIZE; > >-- >2.49.1
© 2016 - 2025 Red Hat, Inc.