* [PATCH v3 net-next 0/2] net: print net_device name/state more often @ 2014-07-17 17:46 Veaceslav Falico 2014-07-17 17:46 ` [PATCH v3 net-next 1/2] net: use dev->name in netdev_pr* when it's available Veaceslav Falico ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Veaceslav Falico @ 2014-07-17 17:46 UTC (permalink / raw) To: netdev Cc: David S. Miller, Jason Baron, Eric Dumazet, Vlad Yasevich, stephen hemminger, Jerry Chu, Ben Hutchings, Joe Perches, Veaceslav Falico Hi, Currently we use net_device->name only if it's the NETREG_REGISTERED reg_state, otherwise we return "(unregistered device)". However, we always populate net_device->name on creation, so it's always available to us for use. The only caveat is that we might have a name like "eth%d", in which case we cannot use it as it might change in the future. Also, the net_device might not be NETREG_UNREGISTERED when the function is called (_UNINITIALIZED, _UNREGISTERING, _RELEASED, _DUMMY), so it's misleading. So, a better way would be to always return the dev->name in netdev_name(), unless it's in the form of "eth%d" or it's empty, then return "unnamed net_device". This way we'll always return the name in NETREG_REGISTERED reg_state, and also return it in other states, when possible. Also, to be more verbose on non-NETREG_REGISTERED states, add a function netdev_reg_state(), which returns a string describing the state, and use it in netdev_printk()-related functions. If the dev is in NETREG_REGISTERED state then a void string is regurned and, thus, nothing changes. After these two patches we'll have the same behaviour in the usual cases, and more verbose in non-standardad/buggy ones. v2->v3: Correct the string for _UNINITIALIZED and warn on a bad reg_state, per Joe Perches's comments. v1->v2: As Tom Gundersen suggested, there might be a case when we have an empty string as a name for a device, so account this also and return "unnamed device" for that case too. CC: "David S. Miller" <davem@davemloft.net> CC: Jason Baron <jbaron@akamai.com> CC: Eric Dumazet <edumazet@google.com> CC: Vlad Yasevich <vyasevic@redhat.com> CC: stephen hemminger <stephen@networkplumber.org> CC: Jerry Chu <hkchu@google.com> CC: Ben Hutchings <bhutchings@solarflare.com> CC: Joe Perches <joe@perches.com> Signed-off-by: Veaceslav Falico <vfalico@gmail.com> --- include/linux/netdevice.h | 22 +++++++++++++++++++--- lib/dynamic_debug.c | 8 +++++--- net/core/dev.c | 8 +++++--- 3 files changed, 29 insertions(+), 9 deletions(-) ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 net-next 1/2] net: use dev->name in netdev_pr* when it's available 2014-07-17 17:46 [PATCH v3 net-next 0/2] net: print net_device name/state more often Veaceslav Falico @ 2014-07-17 17:46 ` Veaceslav Falico 2014-07-18 9:01 ` Tom Gundersen 2014-07-17 17:46 ` [PATCH v3 net-next 2/2] net: print net_device reg_state in netdev_* unless it's registered Veaceslav Falico 2014-07-21 3:39 ` [PATCH v3 net-next 0/2] net: print net_device name/state more often David Miller 2 siblings, 1 reply; 7+ messages in thread From: Veaceslav Falico @ 2014-07-17 17:46 UTC (permalink / raw) To: netdev; +Cc: Veaceslav Falico, David S. Miller, Tom Gundersen netdev_name() returns dev->name only when the net_device is in NETREG_REGISTERED state. However, dev->name is always populated on creation, so we can easily use it. There are two cases when there's no real name - when it's an empty string or when the name is in form of "eth%d", then netdev_name() returns "unnamed net_device". CC: "David S. Miller" <davem@davemloft.net> CC: Tom Gundersen <teg@jklm.no> Signed-off-by: Veaceslav Falico <vfalico@gmail.com> --- Notes: v1->v2: Also account for an empty string, as Tom Gundersen suggested. include/linux/netdevice.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 15ed750..70256aa 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3383,8 +3383,8 @@ extern struct pernet_operations __net_initdata loopback_net_ops; static inline const char *netdev_name(const struct net_device *dev) { - if (dev->reg_state != NETREG_REGISTERED) - return "(unregistered net_device)"; + if (!dev->name[0] || strchr(dev->name, '%')) + return "(unnamed net_device)"; return dev->name; } -- 1.8.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 net-next 1/2] net: use dev->name in netdev_pr* when it's available 2014-07-17 17:46 ` [PATCH v3 net-next 1/2] net: use dev->name in netdev_pr* when it's available Veaceslav Falico @ 2014-07-18 9:01 ` Tom Gundersen 0 siblings, 0 replies; 7+ messages in thread From: Tom Gundersen @ 2014-07-18 9:01 UTC (permalink / raw) To: Veaceslav Falico; +Cc: netdev, David S. Miller On Thu, Jul 17, 2014 at 7:46 PM, Veaceslav Falico <vfalico@gmail.com> wrote: > netdev_name() returns dev->name only when the net_device is in > NETREG_REGISTERED state. > > However, dev->name is always populated on creation, so we can easily use > it. > > There are two cases when there's no real name - when it's an empty string > or when the name is in form of "eth%d", then netdev_name() returns "unnamed > net_device". > > CC: "David S. Miller" <davem@davemloft.net> > CC: Tom Gundersen <teg@jklm.no> Acked-by: Tom Gundersen <teg@jklm.no> > Signed-off-by: Veaceslav Falico <vfalico@gmail.com> > --- > > Notes: > v1->v2: > Also account for an empty string, as Tom Gundersen suggested. > > include/linux/netdevice.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index 15ed750..70256aa 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -3383,8 +3383,8 @@ extern struct pernet_operations __net_initdata loopback_net_ops; > > static inline const char *netdev_name(const struct net_device *dev) > { > - if (dev->reg_state != NETREG_REGISTERED) > - return "(unregistered net_device)"; > + if (!dev->name[0] || strchr(dev->name, '%')) > + return "(unnamed net_device)"; > return dev->name; > } > > -- > 1.8.4 > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 net-next 2/2] net: print net_device reg_state in netdev_* unless it's registered 2014-07-17 17:46 [PATCH v3 net-next 0/2] net: print net_device name/state more often Veaceslav Falico 2014-07-17 17:46 ` [PATCH v3 net-next 1/2] net: use dev->name in netdev_pr* when it's available Veaceslav Falico @ 2014-07-17 17:46 ` Veaceslav Falico 2014-07-17 19:21 ` Joe Perches 2014-07-21 3:39 ` [PATCH v3 net-next 0/2] net: print net_device name/state more often David Miller 2 siblings, 1 reply; 7+ messages in thread From: Veaceslav Falico @ 2014-07-17 17:46 UTC (permalink / raw) To: netdev Cc: Veaceslav Falico, David S. Miller, Jason Baron, Eric Dumazet, Vlad Yasevich, stephen hemminger, Jerry Chu, Ben Hutchings, Joe Perches This way we'll always know in what status the device is, unless it's running normally (i.e. NETDEV_REGISTERED). Also, emit a warning once in case of a bad reg_state. CC: "David S. Miller" <davem@davemloft.net> CC: Jason Baron <jbaron@akamai.com> CC: Eric Dumazet <edumazet@google.com> CC: Vlad Yasevich <vyasevic@redhat.com> CC: stephen hemminger <stephen@networkplumber.org> CC: Jerry Chu <hkchu@google.com> CC: Ben Hutchings <bhutchings@solarflare.com> CC: Joe Perches <joe@perches.com> Signed-off-by: Veaceslav Falico <vfalico@gmail.com> --- Notes: v2->v3: Correct the string for _UNINITIALIZED and warn on a bad reg_state, per Joe Perches's comments. include/linux/netdevice.h | 18 +++++++++++++++++- lib/dynamic_debug.c | 8 +++++--- net/core/dev.c | 8 +++++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 70256aa..8e8fb3e 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3388,6 +3388,21 @@ static inline const char *netdev_name(const struct net_device *dev) return dev->name; } +static inline const char *netdev_reg_state(const struct net_device *dev) +{ + switch (dev->reg_state) { + case NETREG_UNINITIALIZED: return " (uninitialized)"; + case NETREG_REGISTERED: return ""; + case NETREG_UNREGISTERING: return " (unregistering)"; + case NETREG_UNREGISTERED: return " (unregistered)"; + case NETREG_RELEASED: return " (released)"; + case NETREG_DUMMY: return " (dummy)"; + } + + WARN_ONCE(1, "%s: unknown reg_state %d\n", dev->name, dev->reg_state); + return " (unknown)"; +} + __printf(3, 4) int netdev_printk(const char *level, const struct net_device *dev, const char *format, ...); @@ -3444,7 +3459,8 @@ do { \ * file/line information and a backtrace. */ #define netdev_WARN(dev, format, args...) \ - WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args) + WARN(1, "netdevice: %s%s\n" format, netdev_name(dev), \ + netdev_reg_state(dev), ##args) /* netif printk helpers, similar to netdev_printk */ diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 7288e38..c9afbe2 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -614,13 +614,15 @@ int __dynamic_netdev_dbg(struct _ddebug *descriptor, char buf[PREFIX_SIZE]; res = dev_printk_emit(7, dev->dev.parent, - "%s%s %s %s: %pV", + "%s%s %s %s%s: %pV", dynamic_emit_prefix(descriptor, buf), dev_driver_string(dev->dev.parent), dev_name(dev->dev.parent), - netdev_name(dev), &vaf); + netdev_name(dev), netdev_reg_state(dev), + &vaf); } else if (dev) { - res = printk(KERN_DEBUG "%s: %pV", netdev_name(dev), &vaf); + res = printk(KERN_DEBUG "%s%s: %pV", netdev_name(dev), + netdev_reg_state(dev), &vaf); } else { res = printk(KERN_DEBUG "(NULL net_device): %pV", &vaf); } diff --git a/net/core/dev.c b/net/core/dev.c index 239722a..81d6101 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -6950,12 +6950,14 @@ static int __netdev_printk(const char *level, const struct net_device *dev, if (dev && dev->dev.parent) { r = dev_printk_emit(level[1] - '0', dev->dev.parent, - "%s %s %s: %pV", + "%s %s %s%s: %pV", dev_driver_string(dev->dev.parent), dev_name(dev->dev.parent), - netdev_name(dev), vaf); + netdev_name(dev), netdev_reg_state(dev), + vaf); } else if (dev) { - r = printk("%s%s: %pV", level, netdev_name(dev), vaf); + r = printk("%s%s%s: %pV", level, netdev_name(dev), + netdev_reg_state(dev), vaf); } else { r = printk("%s(NULL net_device): %pV", level, vaf); } -- 1.8.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 net-next 2/2] net: print net_device reg_state in netdev_* unless it's registered 2014-07-17 17:46 ` [PATCH v3 net-next 2/2] net: print net_device reg_state in netdev_* unless it's registered Veaceslav Falico @ 2014-07-17 19:21 ` Joe Perches 2014-07-17 19:39 ` Veaceslav Falico 0 siblings, 1 reply; 7+ messages in thread From: Joe Perches @ 2014-07-17 19:21 UTC (permalink / raw) To: Veaceslav Falico Cc: netdev, David S. Miller, Jason Baron, Eric Dumazet, Vlad Yasevich, stephen hemminger, Jerry Chu, Ben Hutchings On Thu, 2014-07-17 at 19:46 +0200, Veaceslav Falico wrote: [] > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h [] > @@ -3444,7 +3459,8 @@ do { \ > * file/line information and a backtrace. > */ > #define netdev_WARN(dev, format, args...) \ > - WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args) > + WARN(1, "netdevice: %s%s\n" format, netdev_name(dev), \ > + netdev_reg_state(dev), ##args) trivia: My preference for style here is to have the format and args on one line when it fits and separate the format and args lines when they don't. WARN(1, "netdevice: %s%s\n" format, netdev_name(dev), netdev_reg_state(dev), ##args) Unrelated: maybe it'd be better to change the '\n' to ": " > diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c [] > - res = printk(KERN_DEBUG "%s: %pV", netdev_name(dev), &vaf); > + res = printk(KERN_DEBUG "%s%s: %pV", netdev_name(dev), > + netdev_reg_state(dev), &vaf); etc... ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 net-next 2/2] net: print net_device reg_state in netdev_* unless it's registered 2014-07-17 19:21 ` Joe Perches @ 2014-07-17 19:39 ` Veaceslav Falico 0 siblings, 0 replies; 7+ messages in thread From: Veaceslav Falico @ 2014-07-17 19:39 UTC (permalink / raw) To: Joe Perches Cc: netdev, David S. Miller, Jason Baron, Eric Dumazet, Vlad Yasevich, stephen hemminger, Jerry Chu, Ben Hutchings On Thu, Jul 17, 2014 at 12:21:39PM -0700, Joe Perches wrote: >On Thu, 2014-07-17 at 19:46 +0200, Veaceslav Falico wrote: >[] >> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h >[] >> @@ -3444,7 +3459,8 @@ do { \ >> * file/line information and a backtrace. >> */ >> #define netdev_WARN(dev, format, args...) \ >> - WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args) >> + WARN(1, "netdevice: %s%s\n" format, netdev_name(dev), \ >> + netdev_reg_state(dev), ##args) > >trivia: > >My preference for style here is to have the format >and args on one line when it fits and separate >the format and args lines when they don't. > > WARN(1, "netdevice: %s%s\n" format, > netdev_name(dev), netdev_reg_state(dev), ##args) > >Unrelated: maybe it'd be better to change the '\n' to ": " Good points, but I guess they're minor. If I'll send v4 I'll include them. > >> diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c >[] >> - res = printk(KERN_DEBUG "%s: %pV", netdev_name(dev), &vaf); >> + res = printk(KERN_DEBUG "%s%s: %pV", netdev_name(dev), >> + netdev_reg_state(dev), &vaf); > >etc... > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 net-next 0/2] net: print net_device name/state more often 2014-07-17 17:46 [PATCH v3 net-next 0/2] net: print net_device name/state more often Veaceslav Falico 2014-07-17 17:46 ` [PATCH v3 net-next 1/2] net: use dev->name in netdev_pr* when it's available Veaceslav Falico 2014-07-17 17:46 ` [PATCH v3 net-next 2/2] net: print net_device reg_state in netdev_* unless it's registered Veaceslav Falico @ 2014-07-21 3:39 ` David Miller 2 siblings, 0 replies; 7+ messages in thread From: David Miller @ 2014-07-21 3:39 UTC (permalink / raw) To: vfalico; +Cc: netdev, jbaron, edumazet, vyasevic, stephen, hkchu, bhutchings, joe From: Veaceslav Falico <vfalico@gmail.com> Date: Thu, 17 Jul 2014 19:46:08 +0200 > Currently we use net_device->name only if it's the NETREG_REGISTERED > reg_state, otherwise we return "(unregistered device)". > > However, we always populate net_device->name on creation, so it's always > available to us for use. The only caveat is that we might have a name like > "eth%d", in which case we cannot use it as it might change in the future. > > Also, the net_device might not be NETREG_UNREGISTERED when the function is > called (_UNINITIALIZED, _UNREGISTERING, _RELEASED, _DUMMY), so it's > misleading. > > So, a better way would be to always return the dev->name in netdev_name(), > unless it's in the form of "eth%d" or it's empty, then return > "unnamed net_device". This way we'll always return the name in > NETREG_REGISTERED reg_state, and also return it in other states, when > possible. > > Also, to be more verbose on non-NETREG_REGISTERED states, add a function > netdev_reg_state(), which returns a string describing the state, and use it > in netdev_printk()-related functions. If the dev is in NETREG_REGISTERED > state then a void string is regurned and, thus, nothing changes. > > After these two patches we'll have the same behaviour in the usual cases, > and more verbose in non-standardad/buggy ones. > > v2->v3: > Correct the string for _UNINITIALIZED and warn on a bad reg_state, > per Joe Perches's comments. > > v1->v2: > As Tom Gundersen suggested, there might be a case when we have an empty > string as a name for a device, so account this also and return "unnamed > device" for that case too. Series applied, thanks. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-07-21 3:39 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-07-17 17:46 [PATCH v3 net-next 0/2] net: print net_device name/state more often Veaceslav Falico 2014-07-17 17:46 ` [PATCH v3 net-next 1/2] net: use dev->name in netdev_pr* when it's available Veaceslav Falico 2014-07-18 9:01 ` Tom Gundersen 2014-07-17 17:46 ` [PATCH v3 net-next 2/2] net: print net_device reg_state in netdev_* unless it's registered Veaceslav Falico 2014-07-17 19:21 ` Joe Perches 2014-07-17 19:39 ` Veaceslav Falico 2014-07-21 3:39 ` [PATCH v3 net-next 0/2] net: print net_device name/state more often David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).