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

Merge branch 'SMC-tracepoints'

Tony Lu says:

====================
Tracepoints for SMC

This patch set introduces tracepoints for SMC, including the tracepoints
basic code. The tracepoitns would help us to track SMC's behaviors by
automatic tools, or other BPF tools, and zero overhead if not enabled.

Compared with kprobe and other dymatic tools, the tracepoints are
considered as stable API, and less overhead for tracing with easy-to-use
API.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+142 -2
+2
net/smc/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 + ccflags-y += -I$(src) 2 3 obj-$(CONFIG_SMC) += smc.o 3 4 obj-$(CONFIG_SMC_DIAG) += smc_diag.o 4 5 smc-y := af_smc.o smc_pnet.o smc_ib.o smc_clc.o smc_core.o smc_wr.o smc_llc.o 5 6 smc-y += smc_cdc.o smc_tx.o smc_rx.o smc_close.o smc_ism.o smc_netlink.o smc_stats.o 7 + smc-y += smc_tracepoint.o
+2
net/smc/af_smc.c
··· 50 50 #include "smc_rx.h" 51 51 #include "smc_close.h" 52 52 #include "smc_stats.h" 53 + #include "smc_tracepoint.h" 53 54 54 55 static DEFINE_MUTEX(smc_server_lgr_pending); /* serialize link group 55 56 * creation on server ··· 565 564 smc->use_fallback = true; 566 565 smc->fallback_rsn = reason_code; 567 566 smc_stat_fallback(smc); 567 + trace_smc_switch_to_fallback(smc, reason_code); 568 568 if (smc->sk.sk_socket && smc->sk.sk_socket->file) { 569 569 smc->clcsock->file = smc->sk.sk_socket->file; 570 570 smc->clcsock->file->private_data = smc->clcsock;
+7 -2
net/smc/smc_core.c
··· 34 34 #include "smc_ism.h" 35 35 #include "smc_netlink.h" 36 36 #include "smc_stats.h" 37 + #include "smc_tracepoint.h" 37 38 38 39 #define SMC_LGR_NUM_INCR 256 39 40 #define SMC_LGR_FREE_DELAY_SERV (600 * HZ) ··· 1621 1620 /* must be called under lgr->llc_conf_mutex lock */ 1622 1621 void smcr_link_down_cond(struct smc_link *lnk) 1623 1622 { 1624 - if (smc_link_downing(&lnk->state)) 1623 + if (smc_link_downing(&lnk->state)) { 1624 + trace_smcr_link_down(lnk, __builtin_return_address(0)); 1625 1625 smcr_link_down(lnk); 1626 + } 1626 1627 } 1627 1628 1628 1629 /* will get the lgr->llc_conf_mutex lock */ 1629 1630 void smcr_link_down_cond_sched(struct smc_link *lnk) 1630 1631 { 1631 - if (smc_link_downing(&lnk->state)) 1632 + if (smc_link_downing(&lnk->state)) { 1633 + trace_smcr_link_down(lnk, __builtin_return_address(0)); 1632 1634 schedule_work(&lnk->link_down_wrk); 1635 + } 1633 1636 } 1634 1637 1635 1638 void smcr_port_err(struct smc_ib_device *smcibdev, u8 ibport)
+3
net/smc/smc_rx.c
··· 22 22 #include "smc_tx.h" /* smc_tx_consumer_update() */ 23 23 #include "smc_rx.h" 24 24 #include "smc_stats.h" 25 + #include "smc_tracepoint.h" 25 26 26 27 /* callback implementation to wakeup consumers blocked with smc_rx_wait(). 27 28 * indirectly called by smc_cdc_msg_recv_action(). ··· 439 438 if (msg && smc_rx_update_consumer(smc, cons, copylen)) 440 439 goto out; 441 440 } 441 + 442 + trace_smc_rx_recvmsg(smc, copylen); 442 443 } while (read_remaining); 443 444 out: 444 445 return read_done;
+9
net/smc/smc_tracepoint.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #define CREATE_TRACE_POINTS 4 + #include "smc_tracepoint.h" 5 + 6 + EXPORT_TRACEPOINT_SYMBOL(smc_switch_to_fallback); 7 + EXPORT_TRACEPOINT_SYMBOL(smc_tx_sendmsg); 8 + EXPORT_TRACEPOINT_SYMBOL(smc_rx_recvmsg); 9 + EXPORT_TRACEPOINT_SYMBOL(smcr_link_down);
+116
net/smc/smc_tracepoint.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + 3 + #undef TRACE_SYSTEM 4 + #define TRACE_SYSTEM smc 5 + 6 + #if !defined(_TRACE_SMC_H) || defined(TRACE_HEADER_MULTI_READ) 7 + #define _TRACE_SMC_H 8 + 9 + #include <linux/ipv6.h> 10 + #include <linux/tcp.h> 11 + #include <linux/tracepoint.h> 12 + #include <net/ipv6.h> 13 + #include "smc.h" 14 + #include "smc_core.h" 15 + 16 + TRACE_EVENT(smc_switch_to_fallback, 17 + 18 + TP_PROTO(const struct smc_sock *smc, int fallback_rsn), 19 + 20 + TP_ARGS(smc, fallback_rsn), 21 + 22 + TP_STRUCT__entry( 23 + __field(const void *, sk) 24 + __field(const void *, clcsk) 25 + __field(int, fallback_rsn) 26 + ), 27 + 28 + TP_fast_assign( 29 + const struct sock *sk = &smc->sk; 30 + const struct sock *clcsk = smc->clcsock->sk; 31 + 32 + __entry->sk = sk; 33 + __entry->clcsk = clcsk; 34 + __entry->fallback_rsn = fallback_rsn; 35 + ), 36 + 37 + TP_printk("sk=%p clcsk=%p fallback_rsn=%d", 38 + __entry->sk, __entry->clcsk, __entry->fallback_rsn) 39 + ); 40 + 41 + DECLARE_EVENT_CLASS(smc_msg_event, 42 + 43 + TP_PROTO(const struct smc_sock *smc, size_t len), 44 + 45 + TP_ARGS(smc, len), 46 + 47 + TP_STRUCT__entry( 48 + __field(const void *, smc) 49 + __field(size_t, len) 50 + __string(name, smc->conn.lnk->ibname) 51 + ), 52 + 53 + TP_fast_assign( 54 + __entry->smc = smc; 55 + __entry->len = len; 56 + __assign_str(name, smc->conn.lnk->ibname); 57 + ), 58 + 59 + TP_printk("smc=%p len=%zu dev=%s", 60 + __entry->smc, __entry->len, 61 + __get_str(name)) 62 + ); 63 + 64 + DEFINE_EVENT(smc_msg_event, smc_tx_sendmsg, 65 + 66 + TP_PROTO(const struct smc_sock *smc, size_t len), 67 + 68 + TP_ARGS(smc, len) 69 + ); 70 + 71 + DEFINE_EVENT(smc_msg_event, smc_rx_recvmsg, 72 + 73 + TP_PROTO(const struct smc_sock *smc, size_t len), 74 + 75 + TP_ARGS(smc, len) 76 + ); 77 + 78 + TRACE_EVENT(smcr_link_down, 79 + 80 + TP_PROTO(const struct smc_link *lnk, void *location), 81 + 82 + TP_ARGS(lnk, location), 83 + 84 + TP_STRUCT__entry( 85 + __field(const void *, lnk) 86 + __field(const void *, lgr) 87 + __field(int, state) 88 + __string(name, lnk->ibname) 89 + __field(void *, location) 90 + ), 91 + 92 + TP_fast_assign( 93 + const struct smc_link_group *lgr = lnk->lgr; 94 + 95 + __entry->lnk = lnk; 96 + __entry->lgr = lgr; 97 + __entry->state = lnk->state; 98 + __assign_str(name, lnk->ibname); 99 + __entry->location = location; 100 + ), 101 + 102 + TP_printk("lnk=%p lgr=%p state=%d dev=%s location=%p", 103 + __entry->lnk, __entry->lgr, 104 + __entry->state, __get_str(name), 105 + __entry->location) 106 + ); 107 + 108 + #endif /* _TRACE_SMC_H */ 109 + 110 + #undef TRACE_INCLUDE_PATH 111 + #define TRACE_INCLUDE_PATH . 112 + 113 + #undef TRACE_INCLUDE_FILE 114 + #define TRACE_INCLUDE_FILE smc_tracepoint 115 + 116 + #include <trace/define_trace.h>
+3
net/smc/smc_tx.c
··· 28 28 #include "smc_ism.h" 29 29 #include "smc_tx.h" 30 30 #include "smc_stats.h" 31 + #include "smc_tracepoint.h" 31 32 32 33 #define SMC_TX_WORK_DELAY 0 33 34 #define SMC_TX_CORK_DELAY (HZ >> 2) /* 250 ms */ ··· 246 245 SMC_TX_CORK_DELAY); 247 246 else 248 247 smc_tx_sndbuf_nonempty(conn); 248 + 249 + trace_smc_tx_sendmsg(smc, copylen); 249 250 } /* while (msg_data_left(msg)) */ 250 251 251 252 return send_done;