1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2e5224f0fSJiri Pirko #if IS_ENABLED(CONFIG_NET_DEVLINK)
3e5224f0fSJiri Pirko
4e5224f0fSJiri Pirko #undef TRACE_SYSTEM
5e5224f0fSJiri Pirko #define TRACE_SYSTEM devlink
6e5224f0fSJiri Pirko
7e5224f0fSJiri Pirko #if !defined(_TRACE_DEVLINK_H) || defined(TRACE_HEADER_MULTI_READ)
8e5224f0fSJiri Pirko #define _TRACE_DEVLINK_H
9e5224f0fSJiri Pirko
10e5224f0fSJiri Pirko #include <linux/device.h>
11e5224f0fSJiri Pirko #include <net/devlink.h>
12e5224f0fSJiri Pirko #include <linux/tracepoint.h>
13e5224f0fSJiri Pirko
14e5224f0fSJiri Pirko /*
15e5224f0fSJiri Pirko * Tracepoint for devlink hardware message:
16e5224f0fSJiri Pirko */
17e5224f0fSJiri Pirko TRACE_EVENT(devlink_hwmsg,
18e5224f0fSJiri Pirko TP_PROTO(const struct devlink *devlink, bool incoming,
19e5224f0fSJiri Pirko unsigned long type, const u8 *buf, size_t len),
20e5224f0fSJiri Pirko
21e5224f0fSJiri Pirko TP_ARGS(devlink, incoming, type, buf, len),
22e5224f0fSJiri Pirko
23e5224f0fSJiri Pirko TP_STRUCT__entry(
2421314638SLeon Romanovsky __string(bus_name, devlink_to_dev(devlink)->bus->name)
2521314638SLeon Romanovsky __string(dev_name, dev_name(devlink_to_dev(devlink)))
2621314638SLeon Romanovsky __string(driver_name, devlink_to_dev(devlink)->driver->name)
27e5224f0fSJiri Pirko __field(bool, incoming)
28e5224f0fSJiri Pirko __field(unsigned long, type)
29e5224f0fSJiri Pirko __dynamic_array(u8, buf, len)
30e5224f0fSJiri Pirko __field(size_t, len)
31e5224f0fSJiri Pirko ),
32e5224f0fSJiri Pirko
33e5224f0fSJiri Pirko TP_fast_assign(
34*2c92ca84SSteven Rostedt (Google) __assign_str(bus_name);
35*2c92ca84SSteven Rostedt (Google) __assign_str(dev_name);
36*2c92ca84SSteven Rostedt (Google) __assign_str(driver_name);
37e5224f0fSJiri Pirko __entry->incoming = incoming;
38e5224f0fSJiri Pirko __entry->type = type;
39e5224f0fSJiri Pirko memcpy(__get_dynamic_array(buf), buf, len);
40e5224f0fSJiri Pirko __entry->len = len;
41e5224f0fSJiri Pirko ),
42e5224f0fSJiri Pirko
43caeccd51SArnd Bergmann TP_printk("bus_name=%s dev_name=%s driver_name=%s incoming=%d type=%lu buf=0x[%*phD] len=%zu",
44e5224f0fSJiri Pirko __get_str(bus_name), __get_str(dev_name),
450e1824c9SJiri Pirko __get_str(driver_name), __entry->incoming, __entry->type,
46e5224f0fSJiri Pirko (int) __entry->len, __get_dynamic_array(buf), __entry->len)
47e5224f0fSJiri Pirko );
48e5224f0fSJiri Pirko
4957186a5fSNir Dotan /*
5057186a5fSNir Dotan * Tracepoint for devlink hardware error:
5157186a5fSNir Dotan */
5257186a5fSNir Dotan TRACE_EVENT(devlink_hwerr,
5357186a5fSNir Dotan TP_PROTO(const struct devlink *devlink, int err, const char *msg),
5457186a5fSNir Dotan
5557186a5fSNir Dotan TP_ARGS(devlink, err, msg),
5657186a5fSNir Dotan
5757186a5fSNir Dotan TP_STRUCT__entry(
5821314638SLeon Romanovsky __string(bus_name, devlink_to_dev(devlink)->bus->name)
5921314638SLeon Romanovsky __string(dev_name, dev_name(devlink_to_dev(devlink)))
6021314638SLeon Romanovsky __string(driver_name, devlink_to_dev(devlink)->driver->name)
6157186a5fSNir Dotan __field(int, err)
6257186a5fSNir Dotan __string(msg, msg)
6357186a5fSNir Dotan ),
6457186a5fSNir Dotan
6557186a5fSNir Dotan TP_fast_assign(
66*2c92ca84SSteven Rostedt (Google) __assign_str(bus_name);
67*2c92ca84SSteven Rostedt (Google) __assign_str(dev_name);
68*2c92ca84SSteven Rostedt (Google) __assign_str(driver_name);
6957186a5fSNir Dotan __entry->err = err;
70*2c92ca84SSteven Rostedt (Google) __assign_str(msg);
7157186a5fSNir Dotan ),
7257186a5fSNir Dotan
7357186a5fSNir Dotan TP_printk("bus_name=%s dev_name=%s driver_name=%s err=%d %s",
7457186a5fSNir Dotan __get_str(bus_name), __get_str(dev_name),
7557186a5fSNir Dotan __get_str(driver_name), __entry->err, __get_str(msg))
7657186a5fSNir Dotan );
7757186a5fSNir Dotan
78c8e1da0bSEran Ben Elisha /*
79c8e1da0bSEran Ben Elisha * Tracepoint for devlink health message:
80c8e1da0bSEran Ben Elisha */
81c8e1da0bSEran Ben Elisha TRACE_EVENT(devlink_health_report,
82c8e1da0bSEran Ben Elisha TP_PROTO(const struct devlink *devlink, const char *reporter_name,
83c8e1da0bSEran Ben Elisha const char *msg),
84c8e1da0bSEran Ben Elisha
85c8e1da0bSEran Ben Elisha TP_ARGS(devlink, reporter_name, msg),
86c8e1da0bSEran Ben Elisha
87c8e1da0bSEran Ben Elisha TP_STRUCT__entry(
8821314638SLeon Romanovsky __string(bus_name, devlink_to_dev(devlink)->bus->name)
8921314638SLeon Romanovsky __string(dev_name, dev_name(devlink_to_dev(devlink)))
9021314638SLeon Romanovsky __string(driver_name, devlink_to_dev(devlink)->driver->name)
91d0ab772cSMoshe Shemesh __string(reporter_name, reporter_name)
92c8e1da0bSEran Ben Elisha __string(msg, msg)
93c8e1da0bSEran Ben Elisha ),
94c8e1da0bSEran Ben Elisha
95c8e1da0bSEran Ben Elisha TP_fast_assign(
96*2c92ca84SSteven Rostedt (Google) __assign_str(bus_name);
97*2c92ca84SSteven Rostedt (Google) __assign_str(dev_name);
98*2c92ca84SSteven Rostedt (Google) __assign_str(driver_name);
99*2c92ca84SSteven Rostedt (Google) __assign_str(reporter_name);
100*2c92ca84SSteven Rostedt (Google) __assign_str(msg);
101c8e1da0bSEran Ben Elisha ),
102c8e1da0bSEran Ben Elisha
103c8e1da0bSEran Ben Elisha TP_printk("bus_name=%s dev_name=%s driver_name=%s reporter_name=%s: %s",
104c8e1da0bSEran Ben Elisha __get_str(bus_name), __get_str(dev_name),
105c8e1da0bSEran Ben Elisha __get_str(driver_name), __get_str(reporter_name),
106c8e1da0bSEran Ben Elisha __get_str(msg))
107c8e1da0bSEran Ben Elisha );
108c8e1da0bSEran Ben Elisha
109c8e1da0bSEran Ben Elisha /*
110c8e1da0bSEran Ben Elisha * Tracepoint for devlink health recover aborted message:
111c8e1da0bSEran Ben Elisha */
112c8e1da0bSEran Ben Elisha TRACE_EVENT(devlink_health_recover_aborted,
113c8e1da0bSEran Ben Elisha TP_PROTO(const struct devlink *devlink, const char *reporter_name,
114c8e1da0bSEran Ben Elisha bool health_state, u64 time_since_last_recover),
115c8e1da0bSEran Ben Elisha
116c8e1da0bSEran Ben Elisha TP_ARGS(devlink, reporter_name, health_state, time_since_last_recover),
117c8e1da0bSEran Ben Elisha
118c8e1da0bSEran Ben Elisha TP_STRUCT__entry(
11921314638SLeon Romanovsky __string(bus_name, devlink_to_dev(devlink)->bus->name)
12021314638SLeon Romanovsky __string(dev_name, dev_name(devlink_to_dev(devlink)))
12121314638SLeon Romanovsky __string(driver_name, devlink_to_dev(devlink)->driver->name)
122c8e1da0bSEran Ben Elisha __string(reporter_name, reporter_name)
123c8e1da0bSEran Ben Elisha __field(bool, health_state)
124c8e1da0bSEran Ben Elisha __field(u64, time_since_last_recover)
125c8e1da0bSEran Ben Elisha ),
126c8e1da0bSEran Ben Elisha
127c8e1da0bSEran Ben Elisha TP_fast_assign(
128*2c92ca84SSteven Rostedt (Google) __assign_str(bus_name);
129*2c92ca84SSteven Rostedt (Google) __assign_str(dev_name);
130*2c92ca84SSteven Rostedt (Google) __assign_str(driver_name);
131*2c92ca84SSteven Rostedt (Google) __assign_str(reporter_name);
132c8e1da0bSEran Ben Elisha __entry->health_state = health_state;
133c8e1da0bSEran Ben Elisha __entry->time_since_last_recover = time_since_last_recover;
134c8e1da0bSEran Ben Elisha ),
135c8e1da0bSEran Ben Elisha
136c8e1da0bSEran Ben Elisha TP_printk("bus_name=%s dev_name=%s driver_name=%s reporter_name=%s: health_state=%d time_since_last_recover=%llu recover aborted",
137c8e1da0bSEran Ben Elisha __get_str(bus_name), __get_str(dev_name),
138c8e1da0bSEran Ben Elisha __get_str(driver_name), __get_str(reporter_name),
139c8e1da0bSEran Ben Elisha __entry->health_state,
140c8e1da0bSEran Ben Elisha __entry->time_since_last_recover)
141c8e1da0bSEran Ben Elisha );
142c8e1da0bSEran Ben Elisha
1433167b27aSEran Ben Elisha /*
1443167b27aSEran Ben Elisha * Tracepoint for devlink health reporter state update:
1453167b27aSEran Ben Elisha */
1463167b27aSEran Ben Elisha TRACE_EVENT(devlink_health_reporter_state_update,
1473167b27aSEran Ben Elisha TP_PROTO(const struct devlink *devlink, const char *reporter_name,
1483167b27aSEran Ben Elisha bool new_state),
1493167b27aSEran Ben Elisha
1503167b27aSEran Ben Elisha TP_ARGS(devlink, reporter_name, new_state),
1513167b27aSEran Ben Elisha
1523167b27aSEran Ben Elisha TP_STRUCT__entry(
15321314638SLeon Romanovsky __string(bus_name, devlink_to_dev(devlink)->bus->name)
15421314638SLeon Romanovsky __string(dev_name, dev_name(devlink_to_dev(devlink)))
15521314638SLeon Romanovsky __string(driver_name, devlink_to_dev(devlink)->driver->name)
1563167b27aSEran Ben Elisha __string(reporter_name, reporter_name)
1573167b27aSEran Ben Elisha __field(u8, new_state)
1583167b27aSEran Ben Elisha ),
1593167b27aSEran Ben Elisha
1603167b27aSEran Ben Elisha TP_fast_assign(
161*2c92ca84SSteven Rostedt (Google) __assign_str(bus_name);
162*2c92ca84SSteven Rostedt (Google) __assign_str(dev_name);
163*2c92ca84SSteven Rostedt (Google) __assign_str(driver_name);
164*2c92ca84SSteven Rostedt (Google) __assign_str(reporter_name);
1653167b27aSEran Ben Elisha __entry->new_state = new_state;
1663167b27aSEran Ben Elisha ),
1673167b27aSEran Ben Elisha
1683167b27aSEran Ben Elisha TP_printk("bus_name=%s dev_name=%s driver_name=%s reporter_name=%s: new_state=%d",
1693167b27aSEran Ben Elisha __get_str(bus_name), __get_str(dev_name),
1703167b27aSEran Ben Elisha __get_str(driver_name), __get_str(reporter_name),
1713167b27aSEran Ben Elisha __entry->new_state)
1723167b27aSEran Ben Elisha );
1733167b27aSEran Ben Elisha
1745b88823bSIdo Schimmel /*
1755b88823bSIdo Schimmel * Tracepoint for devlink packet trap:
1765b88823bSIdo Schimmel */
1775b88823bSIdo Schimmel TRACE_EVENT(devlink_trap_report,
1785b88823bSIdo Schimmel TP_PROTO(const struct devlink *devlink, struct sk_buff *skb,
1795b88823bSIdo Schimmel const struct devlink_trap_metadata *metadata),
1805b88823bSIdo Schimmel
1815b88823bSIdo Schimmel TP_ARGS(devlink, skb, metadata),
1825b88823bSIdo Schimmel
1835b88823bSIdo Schimmel TP_STRUCT__entry(
18421314638SLeon Romanovsky __string(bus_name, devlink_to_dev(devlink)->bus->name)
18521314638SLeon Romanovsky __string(dev_name, dev_name(devlink_to_dev(devlink)))
18621314638SLeon Romanovsky __string(driver_name, devlink_to_dev(devlink)->driver->name)
1875b88823bSIdo Schimmel __string(trap_name, metadata->trap_name)
1885b88823bSIdo Schimmel __string(trap_group_name, metadata->trap_group_name)
1892a04b8d8SSteven Rostedt (Google) __array(char, input_dev_name, IFNAMSIZ)
1905b88823bSIdo Schimmel ),
1915b88823bSIdo Schimmel
1925b88823bSIdo Schimmel TP_fast_assign(
1935b88823bSIdo Schimmel struct net_device *input_dev = metadata->input_dev;
1945b88823bSIdo Schimmel
195*2c92ca84SSteven Rostedt (Google) __assign_str(bus_name);
196*2c92ca84SSteven Rostedt (Google) __assign_str(dev_name);
197*2c92ca84SSteven Rostedt (Google) __assign_str(driver_name);
198*2c92ca84SSteven Rostedt (Google) __assign_str(trap_name);
199*2c92ca84SSteven Rostedt (Google) __assign_str(trap_group_name);
2002a04b8d8SSteven Rostedt (Google) strscpy(__entry->input_dev_name, input_dev ? input_dev->name : "NULL", IFNAMSIZ);
2015b88823bSIdo Schimmel ),
2025b88823bSIdo Schimmel
2035b88823bSIdo Schimmel TP_printk("bus_name=%s dev_name=%s driver_name=%s trap_name=%s "
2045b88823bSIdo Schimmel "trap_group_name=%s input_dev_name=%s", __get_str(bus_name),
2055b88823bSIdo Schimmel __get_str(dev_name), __get_str(driver_name),
2065b88823bSIdo Schimmel __get_str(trap_name), __get_str(trap_group_name),
2072a04b8d8SSteven Rostedt (Google) __entry->input_dev_name)
2085b88823bSIdo Schimmel );
2095b88823bSIdo Schimmel
210e5224f0fSJiri Pirko #endif /* _TRACE_DEVLINK_H */
211e5224f0fSJiri Pirko
212e5224f0fSJiri Pirko /* This part must be outside protection */
213e5224f0fSJiri Pirko #include <trace/define_trace.h>
214e5224f0fSJiri Pirko
215e5224f0fSJiri Pirko #else /* CONFIG_NET_DEVLINK */
216e5224f0fSJiri Pirko
217e5224f0fSJiri Pirko #if !defined(_TRACE_DEVLINK_H)
218e5224f0fSJiri Pirko #define _TRACE_DEVLINK_H
219e5224f0fSJiri Pirko
220e5224f0fSJiri Pirko #include <net/devlink.h>
221e5224f0fSJiri Pirko
trace_devlink_hwmsg(const struct devlink * devlink,bool incoming,unsigned long type,const u8 * buf,size_t len)222e5224f0fSJiri Pirko static inline void trace_devlink_hwmsg(const struct devlink *devlink,
223e5224f0fSJiri Pirko bool incoming, unsigned long type,
224e5224f0fSJiri Pirko const u8 *buf, size_t len)
225e5224f0fSJiri Pirko {
226e5224f0fSJiri Pirko }
227e5224f0fSJiri Pirko
trace_devlink_hwerr(const struct devlink * devlink,int err,const char * msg)22857186a5fSNir Dotan static inline void trace_devlink_hwerr(const struct devlink *devlink,
22957186a5fSNir Dotan int err, const char *msg)
23057186a5fSNir Dotan {
23157186a5fSNir Dotan }
232e5224f0fSJiri Pirko #endif /* _TRACE_DEVLINK_H */
233e5224f0fSJiri Pirko
234e5224f0fSJiri Pirko #endif
235