On 01/15/2017 03:07 AM, Greg KH wrote: > On Sat, Jan 14, 2017 at 01:47:10PM -0800, Florian Fainelli wrote: >> dev_to_net_device() is moved from net/dsa/dsa.c to net/core/dev.c since >> it going to be used by net/dsa/dsa2.c and the namespace of the function >> justifies making it available to other users potentially. >> >> Signed-off-by: Florian Fainelli <f.faine...@gmail.com> >> --- >> include/linux/netdevice.h | 2 ++ >> net/core/dev.c | 19 +++++++++++++++++++ >> net/dsa/dsa.c | 18 ------------------ >> 3 files changed, 21 insertions(+), 18 deletions(-) >> >> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h >> index 97ae0ac513ee..6d021c37b774 100644 >> --- a/include/linux/netdevice.h >> +++ b/include/linux/netdevice.h >> @@ -4390,4 +4390,6 @@ do { >> \ >> #define PTYPE_HASH_SIZE (16) >> #define PTYPE_HASH_MASK (PTYPE_HASH_SIZE - 1) >> >> +struct net_device *dev_to_net_device(struct device *dev); >> + >> #endif /* _LINUX_NETDEVICE_H */ >> diff --git a/net/core/dev.c b/net/core/dev.c >> index ad5959e56116..7547e2ccc06b 100644 >> --- a/net/core/dev.c >> +++ b/net/core/dev.c >> @@ -8128,6 +8128,25 @@ const char *netdev_drivername(const struct net_device >> *dev) >> return empty; >> } >> >> +struct net_device *dev_to_net_device(struct device *dev) >> +{ >> + struct device *d; >> + >> + d = device_find_class(dev, "net"); >> + if (d) { >> + struct net_device *nd; >> + >> + nd = to_net_dev(d); >> + dev_hold(nd); >> + put_device(d); >> + >> + return nd; >> + } >> + >> + return NULL; >> +} >> +EXPORT_SYMBOL_GPL(dev_to_net_device); > > This really isn't just a "struct device to net device cast" type > function, (otherwise a simple container_of() would work). You are > walking the device tree and assuming it is in a specific order so that > this function works. You better document the hell out of this, > otherwise people are going to try to use this and get very confused, > very quickly...
Fair enough. Does that make it clearer how the device_find_class() is used though? Maybe device_find_class() should be named device_find_by_class_name() instead? -- Florian