Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ieee802154: Add trace events for rdev->ops

Enabling tracing via

echo 1 > /sys/kernel/debug/tracing/events/cfg802154/enable

enables event tracing like

iwpan dev wpan0 set pan_id 0xbeef
cat /sys/kernel/debug/tracing/trace
# tracer: nop
#
# entries-in-buffer/entries-written: 2/2 #P:1
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
iwpan-2663 [000] .... 170.369142: 802154_rdev_set_pan_id: phy0, wpan_dev(1), pan id: 0xbeef
iwpan-2663 [000] .... 170.369177: 802154_rdev_return_int: phy0, returned: 0

Signed-off-by: Guido Günther <agx@sigxcpu.org>
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

authored by

Guido Günther and committed by
Marcel Holtmann
1cc800e7 42fb23e2

+322 -12
+3 -1
net/ieee802154/Makefile
··· 3 3 obj-y += 6lowpan/ 4 4 5 5 ieee802154-y := netlink.o nl-mac.o nl-phy.o nl_policy.o core.o \ 6 - header_ops.o sysfs.o nl802154.o 6 + header_ops.o sysfs.o nl802154.o trace.o 7 7 ieee802154_socket-y := socket.o 8 + 9 + CFLAGS_trace.o := -I$(src) 8 10 9 11 ccflags-y += -D__CHECK_ENDIAN__
+66 -11
net/ieee802154/rdev-ops.h
··· 4 4 #include <net/cfg802154.h> 5 5 6 6 #include "core.h" 7 + #include "trace.h" 7 8 8 9 static inline struct net_device * 9 10 rdev_add_virtual_intf_deprecated(struct cfg802154_registered_device *rdev, ··· 25 24 rdev_add_virtual_intf(struct cfg802154_registered_device *rdev, char *name, 26 25 enum nl802154_iftype type, __le64 extended_addr) 27 26 { 28 - return rdev->ops->add_virtual_intf(&rdev->wpan_phy, name, type, 27 + int ret; 28 + 29 + trace_802154_rdev_add_virtual_intf(&rdev->wpan_phy, name, type, 29 30 extended_addr); 31 + ret = rdev->ops->add_virtual_intf(&rdev->wpan_phy, name, type, 32 + extended_addr); 33 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 34 + return ret; 30 35 } 31 36 32 37 static inline int 33 38 rdev_del_virtual_intf(struct cfg802154_registered_device *rdev, 34 39 struct wpan_dev *wpan_dev) 35 40 { 36 - return rdev->ops->del_virtual_intf(&rdev->wpan_phy, wpan_dev); 41 + int ret; 42 + 43 + trace_802154_rdev_del_virtual_intf(&rdev->wpan_phy, wpan_dev); 44 + ret = rdev->ops->del_virtual_intf(&rdev->wpan_phy, wpan_dev); 45 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 46 + return ret; 37 47 } 38 48 39 49 static inline int 40 50 rdev_set_channel(struct cfg802154_registered_device *rdev, u8 page, u8 channel) 41 51 { 42 - return rdev->ops->set_channel(&rdev->wpan_phy, page, channel); 52 + int ret; 53 + 54 + trace_802154_rdev_set_channel(&rdev->wpan_phy, page, channel); 55 + ret = rdev->ops->set_channel(&rdev->wpan_phy, page, channel); 56 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 57 + return ret; 43 58 } 44 59 45 60 static inline int 46 61 rdev_set_cca_mode(struct cfg802154_registered_device *rdev, 47 62 const struct wpan_phy_cca *cca) 48 63 { 49 - return rdev->ops->set_cca_mode(&rdev->wpan_phy, cca); 64 + int ret; 65 + 66 + trace_802154_rdev_set_cca_mode(&rdev->wpan_phy, cca); 67 + ret = rdev->ops->set_cca_mode(&rdev->wpan_phy, cca); 68 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 69 + return ret; 50 70 } 51 71 52 72 static inline int 53 73 rdev_set_pan_id(struct cfg802154_registered_device *rdev, 54 74 struct wpan_dev *wpan_dev, __le16 pan_id) 55 75 { 56 - return rdev->ops->set_pan_id(&rdev->wpan_phy, wpan_dev, pan_id); 76 + int ret; 77 + 78 + trace_802154_rdev_set_pan_id(&rdev->wpan_phy, wpan_dev, pan_id); 79 + ret = rdev->ops->set_pan_id(&rdev->wpan_phy, wpan_dev, pan_id); 80 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 81 + return ret; 57 82 } 58 83 59 84 static inline int 60 85 rdev_set_short_addr(struct cfg802154_registered_device *rdev, 61 86 struct wpan_dev *wpan_dev, __le16 short_addr) 62 87 { 63 - return rdev->ops->set_short_addr(&rdev->wpan_phy, wpan_dev, short_addr); 88 + int ret; 89 + 90 + trace_802154_rdev_set_short_addr(&rdev->wpan_phy, wpan_dev, short_addr); 91 + ret = rdev->ops->set_short_addr(&rdev->wpan_phy, wpan_dev, short_addr); 92 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 93 + return ret; 64 94 } 65 95 66 96 static inline int 67 97 rdev_set_backoff_exponent(struct cfg802154_registered_device *rdev, 68 98 struct wpan_dev *wpan_dev, u8 min_be, u8 max_be) 69 99 { 70 - return rdev->ops->set_backoff_exponent(&rdev->wpan_phy, wpan_dev, 100 + int ret; 101 + 102 + trace_802154_rdev_set_backoff_exponent(&rdev->wpan_phy, wpan_dev, 71 103 min_be, max_be); 104 + ret = rdev->ops->set_backoff_exponent(&rdev->wpan_phy, wpan_dev, 105 + min_be, max_be); 106 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 107 + return ret; 72 108 } 73 109 74 110 static inline int 75 111 rdev_set_max_csma_backoffs(struct cfg802154_registered_device *rdev, 76 112 struct wpan_dev *wpan_dev, u8 max_csma_backoffs) 77 113 { 78 - return rdev->ops->set_max_csma_backoffs(&rdev->wpan_phy, wpan_dev, 79 - max_csma_backoffs); 114 + int ret; 115 + 116 + trace_802154_rdev_set_csma_backoffs(&rdev->wpan_phy, wpan_dev, 117 + max_csma_backoffs); 118 + ret = rdev->ops->set_max_csma_backoffs(&rdev->wpan_phy, wpan_dev, 119 + max_csma_backoffs); 120 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 121 + return ret; 80 122 } 81 123 82 124 static inline int 83 125 rdev_set_max_frame_retries(struct cfg802154_registered_device *rdev, 84 126 struct wpan_dev *wpan_dev, s8 max_frame_retries) 85 127 { 86 - return rdev->ops->set_max_frame_retries(&rdev->wpan_phy, wpan_dev, 128 + int ret; 129 + 130 + trace_802154_rdev_set_max_frame_retries(&rdev->wpan_phy, wpan_dev, 87 131 max_frame_retries); 132 + ret = rdev->ops->set_max_frame_retries(&rdev->wpan_phy, wpan_dev, 133 + max_frame_retries); 134 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 135 + return ret; 88 136 } 89 137 90 138 static inline int 91 139 rdev_set_lbt_mode(struct cfg802154_registered_device *rdev, 92 140 struct wpan_dev *wpan_dev, bool mode) 93 141 { 94 - return rdev->ops->set_lbt_mode(&rdev->wpan_phy, wpan_dev, mode); 142 + int ret; 143 + 144 + trace_802154_rdev_set_lbt_mode(&rdev->wpan_phy, wpan_dev, mode); 145 + ret = rdev->ops->set_lbt_mode(&rdev->wpan_phy, wpan_dev, mode); 146 + trace_802154_rdev_return_int(&rdev->wpan_phy, ret); 147 + return ret; 95 148 } 96 149 97 150 #endif /* __CFG802154_RDEV_OPS */
+7
net/ieee802154/trace.c
··· 1 + #include <linux/module.h> 2 + 3 + #ifndef __CHECKER__ 4 + #define CREATE_TRACE_POINTS 5 + #include "trace.h" 6 + 7 + #endif
+246
net/ieee802154/trace.h
··· 1 + /* Based on net/wireless/tracing.h */ 2 + 3 + #undef TRACE_SYSTEM 4 + #define TRACE_SYSTEM cfg802154 5 + 6 + #if !defined(__RDEV_CFG802154_OPS_TRACE) || defined(TRACE_HEADER_MULTI_READ) 7 + #define __RDEV_CFG802154_OPS_TRACE 8 + 9 + #include <linux/tracepoint.h> 10 + 11 + #include <net/cfg802154.h> 12 + 13 + #define MAXNAME 32 14 + #define WPAN_PHY_ENTRY __array(char, wpan_phy_name, MAXNAME) 15 + #define WPAN_PHY_ASSIGN strlcpy(__entry->wpan_phy_name, \ 16 + wpan_phy_name(wpan_phy), \ 17 + MAXNAME) 18 + #define WPAN_PHY_PR_FMT "%s" 19 + #define WPAN_PHY_PR_ARG __entry->wpan_phy_name 20 + 21 + #define WPAN_DEV_ENTRY __field(u32, identifier) 22 + #define WPAN_DEV_ASSIGN (__entry->identifier) = (!IS_ERR_OR_NULL(wpan_dev) \ 23 + ? wpan_dev->identifier : 0) 24 + #define WPAN_DEV_PR_FMT "wpan_dev(%u)" 25 + #define WPAN_DEV_PR_ARG (__entry->identifier) 26 + 27 + #define WPAN_CCA_ENTRY __field(enum nl802154_cca_modes, cca_mode) \ 28 + __field(enum nl802154_cca_opts, cca_opt) 29 + #define WPAN_CCA_ASSIGN \ 30 + do { \ 31 + (__entry->cca_mode) = cca->mode; \ 32 + (__entry->cca_opt) = cca->opt; \ 33 + } while (0) 34 + #define WPAN_CCA_PR_FMT "cca_mode: %d, cca_opt: %d" 35 + #define WPAN_CCA_PR_ARG __entry->cca_mode, __entry->cca_opt 36 + 37 + #define BOOL_TO_STR(bo) (bo) ? "true" : "false" 38 + 39 + /************************************************************* 40 + * rdev->ops traces * 41 + *************************************************************/ 42 + 43 + TRACE_EVENT(802154_rdev_add_virtual_intf, 44 + TP_PROTO(struct wpan_phy *wpan_phy, char *name, 45 + enum nl802154_iftype type, __le64 extended_addr), 46 + TP_ARGS(wpan_phy, name, type, extended_addr), 47 + TP_STRUCT__entry( 48 + WPAN_PHY_ENTRY 49 + __string(vir_intf_name, name ? name : "<noname>") 50 + __field(enum nl802154_iftype, type) 51 + __field(__le64, extended_addr) 52 + ), 53 + TP_fast_assign( 54 + WPAN_PHY_ASSIGN; 55 + __assign_str(vir_intf_name, name ? name : "<noname>"); 56 + __entry->type = type; 57 + __entry->extended_addr = extended_addr; 58 + ), 59 + TP_printk(WPAN_PHY_PR_FMT ", virtual intf name: %s, type: %d, ea %llx", 60 + WPAN_PHY_PR_ARG, __get_str(vir_intf_name), __entry->type, 61 + __entry->extended_addr) 62 + ); 63 + 64 + TRACE_EVENT(802154_rdev_del_virtual_intf, 65 + TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev), 66 + TP_ARGS(wpan_phy, wpan_dev), 67 + TP_STRUCT__entry( 68 + WPAN_PHY_ENTRY 69 + WPAN_DEV_ENTRY 70 + ), 71 + TP_fast_assign( 72 + WPAN_PHY_ASSIGN; 73 + WPAN_DEV_ASSIGN; 74 + ), 75 + TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT, WPAN_PHY_PR_ARG, 76 + WPAN_DEV_PR_ARG) 77 + ); 78 + 79 + TRACE_EVENT(802154_rdev_set_channel, 80 + TP_PROTO(struct wpan_phy *wpan_phy, u8 page, u8 channel), 81 + TP_ARGS(wpan_phy, page, channel), 82 + TP_STRUCT__entry( 83 + WPAN_PHY_ENTRY 84 + __field(u8, page) 85 + __field(u8, channel) 86 + ), 87 + TP_fast_assign( 88 + WPAN_PHY_ASSIGN; 89 + __entry->page = page; 90 + __entry->channel = channel; 91 + ), 92 + TP_printk(WPAN_PHY_PR_FMT ", page: %d, channel: %d", WPAN_PHY_PR_ARG, 93 + __entry->page, __entry->channel) 94 + ); 95 + 96 + TRACE_EVENT(802154_rdev_set_cca_mode, 97 + TP_PROTO(struct wpan_phy *wpan_phy, const struct wpan_phy_cca *cca), 98 + TP_ARGS(wpan_phy, cca), 99 + TP_STRUCT__entry( 100 + WPAN_PHY_ENTRY 101 + WPAN_CCA_ENTRY 102 + ), 103 + TP_fast_assign( 104 + WPAN_PHY_ASSIGN; 105 + WPAN_CCA_ASSIGN; 106 + ), 107 + TP_printk(WPAN_PHY_PR_FMT ", " WPAN_CCA_PR_FMT, WPAN_PHY_PR_ARG, 108 + WPAN_CCA_PR_ARG) 109 + ); 110 + 111 + DECLARE_EVENT_CLASS(802154_le16_template, 112 + TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 113 + __le16 le16arg), 114 + TP_ARGS(wpan_phy, wpan_dev, le16arg), 115 + TP_STRUCT__entry( 116 + WPAN_PHY_ENTRY 117 + WPAN_DEV_ENTRY 118 + __field(__le16, le16arg) 119 + ), 120 + TP_fast_assign( 121 + WPAN_PHY_ASSIGN; 122 + WPAN_DEV_ASSIGN; 123 + __entry->le16arg = le16arg; 124 + ), 125 + TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT ", pan id: 0x%04x", 126 + WPAN_PHY_PR_ARG, WPAN_DEV_PR_ARG, 127 + __le16_to_cpu(__entry->le16arg)) 128 + ); 129 + 130 + DEFINE_EVENT(802154_le16_template, 802154_rdev_set_pan_id, 131 + TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 132 + __le16 le16arg), 133 + TP_ARGS(wpan_phy, wpan_dev, le16arg) 134 + ); 135 + 136 + DEFINE_EVENT_PRINT(802154_le16_template, 802154_rdev_set_short_addr, 137 + TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 138 + __le16 le16arg), 139 + TP_ARGS(wpan_phy, wpan_dev, le16arg), 140 + TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT ", sa: 0x%04x", 141 + WPAN_PHY_PR_ARG, WPAN_DEV_PR_ARG, __entry->le16arg) 142 + ); 143 + 144 + TRACE_EVENT(802154_rdev_set_backoff_exponent, 145 + TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 146 + u8 min_be, u8 max_be), 147 + TP_ARGS(wpan_phy, wpan_dev, min_be, max_be), 148 + TP_STRUCT__entry( 149 + WPAN_PHY_ENTRY 150 + WPAN_DEV_ENTRY 151 + __field(u8, min_be) 152 + __field(u8, max_be) 153 + ), 154 + TP_fast_assign( 155 + WPAN_PHY_ASSIGN; 156 + WPAN_DEV_ASSIGN; 157 + __entry->min_be = min_be; 158 + __entry->max_be = max_be; 159 + ), 160 + 161 + TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT 162 + ", min be: %d, max_be: %d", WPAN_PHY_PR_ARG, 163 + WPAN_DEV_PR_ARG, __entry->min_be, __entry->max_be) 164 + ); 165 + 166 + TRACE_EVENT(802154_rdev_set_csma_backoffs, 167 + TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 168 + u8 max_csma_backoffs), 169 + TP_ARGS(wpan_phy, wpan_dev, max_csma_backoffs), 170 + TP_STRUCT__entry( 171 + WPAN_PHY_ENTRY 172 + WPAN_DEV_ENTRY 173 + __field(u8, max_csma_backoffs) 174 + ), 175 + TP_fast_assign( 176 + WPAN_PHY_ASSIGN; 177 + WPAN_DEV_ASSIGN; 178 + __entry->max_csma_backoffs = max_csma_backoffs; 179 + ), 180 + 181 + TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT 182 + ", max csma backoffs: %d", WPAN_PHY_PR_ARG, 183 + WPAN_DEV_PR_ARG, __entry->max_csma_backoffs) 184 + ); 185 + 186 + TRACE_EVENT(802154_rdev_set_max_frame_retries, 187 + TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 188 + s8 max_frame_retries), 189 + TP_ARGS(wpan_phy, wpan_dev, max_frame_retries), 190 + TP_STRUCT__entry( 191 + WPAN_PHY_ENTRY 192 + WPAN_DEV_ENTRY 193 + __field(s8, max_frame_retries) 194 + ), 195 + TP_fast_assign( 196 + WPAN_PHY_ASSIGN; 197 + WPAN_DEV_ASSIGN; 198 + __entry->max_frame_retries = max_frame_retries; 199 + ), 200 + 201 + TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT 202 + ", max frame retries: %d", WPAN_PHY_PR_ARG, 203 + WPAN_DEV_PR_ARG, __entry->max_frame_retries) 204 + ); 205 + 206 + TRACE_EVENT(802154_rdev_set_lbt_mode, 207 + TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 208 + bool mode), 209 + TP_ARGS(wpan_phy, wpan_dev, mode), 210 + TP_STRUCT__entry( 211 + WPAN_PHY_ENTRY 212 + WPAN_DEV_ENTRY 213 + __field(bool, mode) 214 + ), 215 + TP_fast_assign( 216 + WPAN_PHY_ASSIGN; 217 + WPAN_DEV_ASSIGN; 218 + __entry->mode = mode; 219 + ), 220 + TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT 221 + ", lbt mode: %s", WPAN_PHY_PR_ARG, 222 + WPAN_DEV_PR_ARG, BOOL_TO_STR(__entry->mode)) 223 + ); 224 + 225 + TRACE_EVENT(802154_rdev_return_int, 226 + TP_PROTO(struct wpan_phy *wpan_phy, int ret), 227 + TP_ARGS(wpan_phy, ret), 228 + TP_STRUCT__entry( 229 + WPAN_PHY_ENTRY 230 + __field(int, ret) 231 + ), 232 + TP_fast_assign( 233 + WPAN_PHY_ASSIGN; 234 + __entry->ret = ret; 235 + ), 236 + TP_printk(WPAN_PHY_PR_FMT ", returned: %d", WPAN_PHY_PR_ARG, 237 + __entry->ret) 238 + ); 239 + 240 + #endif /* !__RDEV_CFG802154_OPS_TRACE || TRACE_HEADER_MULTI_READ */ 241 + 242 + #undef TRACE_INCLUDE_PATH 243 + #define TRACE_INCLUDE_PATH . 244 + #undef TRACE_INCLUDE_FILE 245 + #define TRACE_INCLUDE_FILE trace 246 + #include <trace/define_trace.h>