Messages in this thread Patch in this message | | | From | Tobias Waldekranz <> | Subject | [PATCH v2] net: phy: add tracepoints | Date | Thu, 16 Aug 2018 17:24:48 +0200 |
| |
Two tracepoints for now:
* `phy_interrupt` Pretty self-explanatory.
* `phy_state_change` Whenever the PHY's state machine is run, trace the old and the new state.
Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> --- v1 -> v2: * Actually include the entire patch, based on current net-next. * Pretty print the PHY's state according to Steven's suggestion. --- drivers/net/phy/phy.c | 8 ++- include/trace/events/phy.h | 100 +++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 include/trace/events/phy.h
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 1ee25877c4d1..74fc7151802c 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -38,6 +38,9 @@ #include <asm/irq.h> +#define CREATE_TRACE_POINTS +#include <trace/events/phy.h> + #define PHY_STATE_STR(_state) \ case PHY_##_state: \ return __stringify(_state); \ @@ -783,6 +786,7 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat) if (PHY_HALTED == phydev->state) return IRQ_NONE; /* It can't be ours. */ + trace_phy_interrupt(irq, phydev); return phy_change(phydev); } @@ -1114,10 +1118,12 @@ void phy_state_machine(struct work_struct *work) if (err < 0) phy_error(phydev); - if (old_state != phydev->state) + if (old_state != phydev->state) { + trace_phy_state_change(phydev, old_state); phydev_dbg(phydev, "PHY state change %s -> %s\n", phy_state_to_str(old_state), phy_state_to_str(phydev->state)); + } /* Only re-schedule a PHY state machine change if we are polling the * PHY, if PHY_IGNORE_INTERRUPT is set, then we will be moving diff --git a/include/trace/events/phy.h b/include/trace/events/phy.h new file mode 100644 index 000000000000..c5a0c5739d4a --- /dev/null +++ b/include/trace/events/phy.h @@ -0,0 +1,100 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM phy + +#if !defined(_TRACE_PHY_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_PHY_H + +#include <linux/tracepoint.h> + +#define PHY_STATE_ENUMS \ + EM( DOWN ) \ + EM( STARTING ) \ + EM( READY ) \ + EM( PENDING ) \ + EM( UP ) \ + EM( AN ) \ + EM( RUNNING ) \ + EM( NOLINK ) \ + EM( FORCING ) \ + EM( CHANGELINK )\ + EM( HALTED ) \ + EMe(RESUMING) + +#undef EM +#undef EMe + +#define EM(a) TRACE_DEFINE_ENUM( PHY_##a ); +#define EMe(a) TRACE_DEFINE_ENUM( PHY_##a ); + +PHY_STATE_ENUMS + +#undef EM +#undef EMe + +#define EM(a) { PHY_##a, #a }, +#define EMe(a) { PHY_##a, #a } + +TRACE_EVENT(phy_interrupt, + TP_PROTO(int irq, struct phy_device *phydev), + TP_ARGS(irq, phydev), + TP_STRUCT__entry( + __field(int, irq) + __field(int, addr) + __field(int, state) + __array(char, ifname, IFNAMSIZ) + ), + TP_fast_assign( + __entry->irq = irq; + __entry->addr = phydev->mdio.addr; + __entry->state = phydev->state; + if (phydev->attached_dev) + memcpy(__entry->ifname, + netdev_name(phydev->attached_dev), + IFNAMSIZ); + else + memset(__entry->ifname, 0, IFNAMSIZ); + ), + TP_printk("phy-%d-irq irq=%d ifname=%-.16s state=%s", + __entry->addr, + __entry->irq, + __entry->ifname, + __print_symbolic(__entry->state, PHY_STATE_ENUMS) + ) + ); + +TRACE_EVENT(phy_state_change, + TP_PROTO(struct phy_device *phydev, enum phy_state old_state), + TP_ARGS(phydev, old_state), + TP_STRUCT__entry( + __field(int, addr) + __field(int, state) + __field(int, old_state) + __array(char, ifname, IFNAMSIZ) + ), + TP_fast_assign( + __entry->addr = phydev->mdio.addr; + __entry->state = phydev->state; + __entry->old_state = old_state; + if (phydev->attached_dev) + memcpy(__entry->ifname, + netdev_name(phydev->attached_dev), + IFNAMSIZ); + else + memset(__entry->ifname, 0, IFNAMSIZ); + ), + TP_printk("phy-%d-change ifname=%-.16s old_state=%s state=%s", + __entry->addr, + __entry->ifname, + __print_symbolic(__entry->old_state, PHY_STATE_ENUMS), + __print_symbolic(__entry->state, PHY_STATE_ENUMS) + ) + ); + +#undef EM +#undef EMe +#undef PHY_STATE_ENUMS + +#endif /* _TRACE_PHY_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> -- 2.17.1
| |