Message ID | 20240229190515.2740221-1-kuba@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] dpll: fix build failure due to rcu_dereference_check() on unknown type | expand |
On 29/02/2024 19:05, Jakub Kicinski wrote: > From: Eric Dumazet <edumazet@google.com> > > Tasmiya reports that their compiler complains that we deref > a pointer to unknown type with rcu_dereference_rtnl(): > > include/linux/rcupdate.h:439:9: error: dereferencing pointer to incomplete type ‘struct dpll_pin’ > > Unclear what compiler it is, at the moment, and we can't report > but since DPLL can't be a module - move the code from the header > into the source file. > > Fixes: 0d60d8df6f49 ("dpll: rely on rcu for netdev_dpll_pin()") > Reported-by: Tasmiya Nalatwad <tasmiya@linux.vnet.ibm.com> > Link: https://lore.kernel.org/all/3fcf3a2c-1c1b-42c1-bacb-78fdcd700389@linux.vnet.ibm.com/ > Signed-off-by: Eric Dumazet <edumazet@google.com> > Signed-off-by: Jakub Kicinski <kuba@kernel.org> > --- > Sending officially the solution Eric suggested in the report > thread. The bug is pending in the net tree, so I'd like to > put this on an express path, to make today's PR... > > CC: vadim.fedorenko@linux.dev > CC: arkadiusz.kubalewski@intel.com > CC: jiri@resnulli.us > --- > drivers/dpll/dpll_core.c | 5 +++++ > include/linux/dpll.h | 8 ++++---- > 2 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/drivers/dpll/dpll_core.c b/drivers/dpll/dpll_core.c > index 4c2bb27c99fe..507dd9cfb075 100644 > --- a/drivers/dpll/dpll_core.c > +++ b/drivers/dpll/dpll_core.c > @@ -42,6 +42,11 @@ struct dpll_pin_registration { > void *priv; > }; > > +struct dpll_pin *netdev_dpll_pin(const struct net_device *dev) > +{ > + return rcu_dereference_rtnl(dev->dpll_pin); > +} > + > struct dpll_device *dpll_device_get_by_id(int id) > { > if (xa_get_mark(&dpll_device_xa, id, DPLL_REGISTERED)) > diff --git a/include/linux/dpll.h b/include/linux/dpll.h > index 4ec2fe9caf5a..c60591308ae8 100644 > --- a/include/linux/dpll.h > +++ b/include/linux/dpll.h > @@ -169,13 +169,13 @@ int dpll_device_change_ntf(struct dpll_device *dpll); > > int dpll_pin_change_ntf(struct dpll_pin *pin); > > +#if !IS_ENABLED(CONFIG_DPLL) > static inline struct dpll_pin *netdev_dpll_pin(const struct net_device *dev) > { > -#if IS_ENABLED(CONFIG_DPLL) > - return rcu_dereference_rtnl(dev->dpll_pin); > -#else > return NULL; > -#endif > } > +#else > +struct dpll_pin *netdev_dpll_pin(const struct net_device *dev); > +#endif > > #endif That also works (as well as void *), Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
On Thu, 29 Feb 2024 11:05:15 -0800 Jakub Kicinski wrote: > From: Eric Dumazet <edumazet@google.com> > > Tasmiya reports that their compiler complains that we deref > a pointer to unknown type with rcu_dereference_rtnl(): > > include/linux/rcupdate.h:439:9: error: dereferencing pointer to incomplete type ‘struct dpll_pin’ > > Unclear what compiler it is, at the moment, and we can't report > but since DPLL can't be a module - move the code from the header > into the source file. Applied, and pushed for the PR..
diff --git a/drivers/dpll/dpll_core.c b/drivers/dpll/dpll_core.c index 4c2bb27c99fe..507dd9cfb075 100644 --- a/drivers/dpll/dpll_core.c +++ b/drivers/dpll/dpll_core.c @@ -42,6 +42,11 @@ struct dpll_pin_registration { void *priv; }; +struct dpll_pin *netdev_dpll_pin(const struct net_device *dev) +{ + return rcu_dereference_rtnl(dev->dpll_pin); +} + struct dpll_device *dpll_device_get_by_id(int id) { if (xa_get_mark(&dpll_device_xa, id, DPLL_REGISTERED)) diff --git a/include/linux/dpll.h b/include/linux/dpll.h index 4ec2fe9caf5a..c60591308ae8 100644 --- a/include/linux/dpll.h +++ b/include/linux/dpll.h @@ -169,13 +169,13 @@ int dpll_device_change_ntf(struct dpll_device *dpll); int dpll_pin_change_ntf(struct dpll_pin *pin); +#if !IS_ENABLED(CONFIG_DPLL) static inline struct dpll_pin *netdev_dpll_pin(const struct net_device *dev) { -#if IS_ENABLED(CONFIG_DPLL) - return rcu_dereference_rtnl(dev->dpll_pin); -#else return NULL; -#endif } +#else +struct dpll_pin *netdev_dpll_pin(const struct net_device *dev); +#endif #endif