From 6e6eda44b939c0931533d6681d9f2ed41b44cde9 Mon Sep 17 00:00:00 2001 From: Yunhui Cui Date: Wed, 11 Jan 2023 14:59:30 +0800 Subject: sock: add tracepoint for send recv length Add 2 tracepoints to monitor the tcp/udp traffic of per process and per cgroup. Regarding monitoring the tcp/udp traffic of each process, there are two existing solutions, the first one is https://www.atoptool.nl/netatop.php. The second is via kprobe/kretprobe. Netatop solution is implemented by registering the hook function at the hook point provided by the netfilter framework. These hook functions may be in the soft interrupt context and cannot directly obtain the pid. Some data structures are added to bind packets and processes. For example, struct taskinfobucket, struct taskinfo ... Every time the process sends and receives packets it needs multiple hashmaps,resulting in low performance and it has the problem fo inaccurate tcp/udp traffic statistics(for example: multiple threads share sockets). We can obtain the information with kretprobe, but as we know, kprobe gets the result by trappig in an exception, which loses performance compared to tracepoint. We compared the performance of tracepoints with the above two methods, and the results are as follows: ab -n 1000000 -c 1000 -r http://127.0.0.1/index.html without trace: Time per request: 39.660 [ms] (mean) Time per request: 0.040 [ms] (mean, across all concurrent requests) netatop: Time per request: 50.717 [ms] (mean) Time per request: 0.051 [ms] (mean, across all concurrent requests) kr: Time per request: 43.168 [ms] (mean) Time per request: 0.043 [ms] (mean, across all concurrent requests) tracepoint: Time per request: 41.004 [ms] (mean) Time per request: 0.041 [ms] (mean, across all concurrent requests It can be seen that tracepoint has better performance. Signed-off-by: Yunhui Cui Signed-off-by: Xiongchun Duan Reviewed-by: Steven Rostedt (Google) Signed-off-by: David S. Miller --- include/trace/events/sock.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'include/trace') diff --git a/include/trace/events/sock.h b/include/trace/events/sock.h index 777ee6cbe933..71492e8276da 100644 --- a/include/trace/events/sock.h +++ b/include/trace/events/sock.h @@ -263,6 +263,51 @@ TRACE_EVENT(inet_sk_error_report, __entry->error) ); +/* + * sock send/recv msg length + */ +DECLARE_EVENT_CLASS(sock_msg_length, + + TP_PROTO(struct sock *sk, int ret, int flags), + + TP_ARGS(sk, ret, flags), + + TP_STRUCT__entry( + __field(void *, sk) + __field(__u16, family) + __field(__u16, protocol) + __field(int, ret) + __field(int, flags) + ), + + TP_fast_assign( + __entry->sk = sk; + __entry->family = sk->sk_family; + __entry->protocol = sk->sk_protocol; + __entry->ret = ret; + __entry->flags = flags; + ), + + TP_printk("sk address = %p, family = %s protocol = %s, length = %d, error = %d, flags = 0x%x", + __entry->sk, show_family_name(__entry->family), + show_inet_protocol_name(__entry->protocol), + !(__entry->flags & MSG_PEEK) ? + (__entry->ret > 0 ? __entry->ret : 0) : 0, + __entry->ret < 0 ? __entry->ret : 0, + __entry->flags) +); + +DEFINE_EVENT(sock_msg_length, sock_send_length, + TP_PROTO(struct sock *sk, int ret, int flags), + + TP_ARGS(sk, ret, flags) +); + +DEFINE_EVENT(sock_msg_length, sock_recv_length, + TP_PROTO(struct sock *sk, int ret, int flags), + + TP_ARGS(sk, ret, flags) +); #endif /* _TRACE_SOCK_H */ /* This part must be outside protection */ -- cgit From 40e0b09081420853542571c38875b48b60404ebb Mon Sep 17 00:00:00 2001 From: Peilin Ye Date: Thu, 19 Jan 2023 16:45:16 -0800 Subject: net/sock: Introduce trace_sk_data_ready() As suggested by Cong, introduce a tracepoint for all ->sk_data_ready() callback implementations. For example: <...> iperf-609 [002] ..... 70.660425: sk_data_ready: family=2 protocol=6 func=sock_def_readable iperf-609 [002] ..... 70.660436: sk_data_ready: family=2 protocol=6 func=sock_def_readable <...> Suggested-by: Cong Wang Signed-off-by: Peilin Ye Signed-off-by: David S. Miller --- drivers/infiniband/hw/erdma/erdma_cm.c | 3 +++ drivers/infiniband/sw/siw/siw_cm.c | 5 +++++ drivers/infiniband/sw/siw/siw_qp.c | 3 +++ drivers/nvme/host/tcp.c | 3 +++ drivers/nvme/target/tcp.c | 5 +++++ drivers/scsi/iscsi_tcp.c | 3 +++ drivers/soc/qcom/qmi_interface.c | 3 +++ drivers/target/iscsi/iscsi_target_nego.c | 2 ++ drivers/xen/pvcalls-back.c | 5 +++++ fs/dlm/lowcomms.c | 5 +++++ fs/ocfs2/cluster/tcp.c | 5 +++++ include/trace/events/sock.h | 24 ++++++++++++++++++++++++ net/bluetooth/rfcomm/core.c | 4 ++++ net/ceph/messenger.c | 4 ++++ net/core/net-traces.c | 2 ++ net/core/skmsg.c | 5 +++++ net/core/sock.c | 2 ++ net/kcm/kcmsock.c | 3 +++ net/mptcp/subflow.c | 3 +++ net/phonet/pep-gprs.c | 4 ++++ net/qrtr/ns.c | 3 +++ net/rds/tcp_listen.c | 2 ++ net/rds/tcp_recv.c | 2 ++ net/sctp/socket.c | 3 +++ net/smc/smc_rx.c | 3 +++ net/sunrpc/svcsock.c | 5 +++++ net/sunrpc/xprtsock.c | 3 +++ net/tipc/socket.c | 3 +++ net/tipc/topsrv.c | 5 +++++ net/tls/tls_sw.c | 3 +++ net/xfrm/espintcp.c | 3 +++ 31 files changed, 128 insertions(+) (limited to 'include/trace') diff --git a/drivers/infiniband/hw/erdma/erdma_cm.c b/drivers/infiniband/hw/erdma/erdma_cm.c index 74f6348f240a..771059a8eb7d 100644 --- a/drivers/infiniband/hw/erdma/erdma_cm.c +++ b/drivers/infiniband/hw/erdma/erdma_cm.c @@ -11,6 +11,7 @@ /* Copyright (c) 2017, Open Grid Computing, Inc. */ #include +#include #include "erdma.h" #include "erdma_cm.h" @@ -925,6 +926,8 @@ static void erdma_cm_llp_data_ready(struct sock *sk) { struct erdma_cep *cep; + trace_sk_data_ready(sk); + read_lock(&sk->sk_callback_lock); cep = sk_to_cep(sk); diff --git a/drivers/infiniband/sw/siw/siw_cm.c b/drivers/infiniband/sw/siw/siw_cm.c index f88d2971c2c6..da530c0404da 100644 --- a/drivers/infiniband/sw/siw/siw_cm.c +++ b/drivers/infiniband/sw/siw/siw_cm.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -109,6 +110,8 @@ static void siw_rtr_data_ready(struct sock *sk) struct siw_qp *qp = NULL; read_descriptor_t rd_desc; + trace_sk_data_ready(sk); + read_lock(&sk->sk_callback_lock); cep = sk_to_cep(sk); @@ -1216,6 +1219,8 @@ static void siw_cm_llp_data_ready(struct sock *sk) { struct siw_cep *cep; + trace_sk_data_ready(sk); + read_lock(&sk->sk_callback_lock); cep = sk_to_cep(sk); diff --git a/drivers/infiniband/sw/siw/siw_qp.c b/drivers/infiniband/sw/siw/siw_qp.c index e6f634971228..81e9bbd9ebda 100644 --- a/drivers/infiniband/sw/siw/siw_qp.c +++ b/drivers/infiniband/sw/siw/siw_qp.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "siw.h" #include "siw_verbs.h" @@ -94,6 +95,8 @@ void siw_qp_llp_data_ready(struct sock *sk) { struct siw_qp *qp; + trace_sk_data_ready(sk); + read_lock(&sk->sk_callback_lock); if (unlikely(!sk->sk_user_data || !sk_to_qp(sk))) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 8cedc1ef496c..70e273b565de 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "nvme.h" #include "fabrics.h" @@ -905,6 +906,8 @@ static void nvme_tcp_data_ready(struct sock *sk) { struct nvme_tcp_queue *queue; + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); queue = sk->sk_user_data; if (likely(queue && queue->rd_enabled) && diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index cc05c094de22..4a161c8cb531 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "nvmet.h" @@ -1470,6 +1471,8 @@ static void nvmet_tcp_data_ready(struct sock *sk) { struct nvmet_tcp_queue *queue; + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); queue = sk->sk_user_data; if (likely(queue)) @@ -1667,6 +1670,8 @@ static void nvmet_tcp_listen_data_ready(struct sock *sk) { struct nvmet_tcp_port *port; + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); port = sk->sk_user_data; if (!port) diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 1d1cf641937c..08f204ba9cd1 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "iscsi_tcp.h" @@ -170,6 +171,8 @@ static void iscsi_sw_tcp_data_ready(struct sock *sk) struct iscsi_tcp_conn *tcp_conn; struct iscsi_conn *conn; + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); conn = sk->sk_user_data; if (!conn) { diff --git a/drivers/soc/qcom/qmi_interface.c b/drivers/soc/qcom/qmi_interface.c index 57052726299d..820bdd9f8e46 100644 --- a/drivers/soc/qcom/qmi_interface.c +++ b/drivers/soc/qcom/qmi_interface.c @@ -12,6 +12,7 @@ #include #include #include +#include #include static struct socket *qmi_sock_create(struct qmi_handle *qmi, @@ -569,6 +570,8 @@ static void qmi_data_ready(struct sock *sk) { struct qmi_handle *qmi = sk->sk_user_data; + trace_sk_data_ready(sk); + /* * This will be NULL if we receive data while being in * qmi_handle_release() diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c index ff49c8f3fe24..24040c118e49 100644 --- a/drivers/target/iscsi/iscsi_target_nego.c +++ b/drivers/target/iscsi/iscsi_target_nego.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -384,6 +385,7 @@ static void iscsi_target_sk_data_ready(struct sock *sk) struct iscsit_conn *conn = sk->sk_user_data; bool rc; + trace_sk_data_ready(sk); pr_debug("Entering iscsi_target_sk_data_ready: conn: %p\n", conn); write_lock_bh(&sk->sk_callback_lock); diff --git a/drivers/xen/pvcalls-back.c b/drivers/xen/pvcalls-back.c index 0d4f8f4f4948..e2abc3474d85 100644 --- a/drivers/xen/pvcalls-back.c +++ b/drivers/xen/pvcalls-back.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -300,6 +301,8 @@ static void pvcalls_sk_data_ready(struct sock *sock) struct sock_mapping *map = sock->sk_user_data; struct pvcalls_ioworker *iow; + trace_sk_data_ready(sock); + if (map == NULL) return; @@ -588,6 +591,8 @@ static void pvcalls_pass_sk_data_ready(struct sock *sock) unsigned long flags; int notify; + trace_sk_data_ready(sock); + if (mappass == NULL) return; diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 4450721ec83c..7920c655173c 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -54,6 +54,7 @@ #include #include +#include #include "dlm_internal.h" #include "lowcomms.h" @@ -499,6 +500,8 @@ static void lowcomms_data_ready(struct sock *sk) { struct connection *con = sock2con(sk); + trace_sk_data_ready(sk); + set_bit(CF_RECV_INTR, &con->flags); lowcomms_queue_rwork(con); } @@ -530,6 +533,8 @@ static void lowcomms_state_change(struct sock *sk) static void lowcomms_listen_data_ready(struct sock *sk) { + trace_sk_data_ready(sk); + queue_work(io_workqueue, &listen_con.rwork); } diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index a07b24d170f2..aecbd712a00c 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c @@ -46,6 +46,7 @@ #include #include #include +#include #include @@ -585,6 +586,8 @@ static void o2net_data_ready(struct sock *sk) void (*ready)(struct sock *sk); struct o2net_sock_container *sc; + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); sc = sk->sk_user_data; if (sc) { @@ -1931,6 +1934,8 @@ static void o2net_listen_data_ready(struct sock *sk) { void (*ready)(struct sock *sk); + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); ready = sk->sk_user_data; if (ready == NULL) { /* check for teardown race */ diff --git a/include/trace/events/sock.h b/include/trace/events/sock.h index 71492e8276da..03d19fc562f8 100644 --- a/include/trace/events/sock.h +++ b/include/trace/events/sock.h @@ -263,6 +263,30 @@ TRACE_EVENT(inet_sk_error_report, __entry->error) ); +TRACE_EVENT(sk_data_ready, + + TP_PROTO(const struct sock *sk), + + TP_ARGS(sk), + + TP_STRUCT__entry( + __field(const void *, skaddr) + __field(__u16, family) + __field(__u16, protocol) + __field(unsigned long, ip) + ), + + TP_fast_assign( + __entry->skaddr = sk; + __entry->family = sk->sk_family; + __entry->protocol = sk->sk_protocol; + __entry->ip = _RET_IP_; + ), + + TP_printk("family=%u protocol=%u func=%ps", + __entry->family, __entry->protocol, (void *)__entry->ip) +); + /* * sock send/recv msg length */ diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 8d6fce9005bd..053ef8f25fae 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c @@ -35,6 +35,8 @@ #include #include +#include + #define VERSION "1.11" static bool disable_cfc; @@ -186,6 +188,8 @@ static void rfcomm_l2state_change(struct sock *sk) static void rfcomm_l2data_ready(struct sock *sk) { + trace_sk_data_ready(sk); + BT_DBG("%p", sk); rfcomm_schedule(); } diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 1d06e114ba3f..cd7b0bf5369e 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -17,6 +17,7 @@ #endif /* CONFIG_BLOCK */ #include #include +#include #include #include @@ -344,6 +345,9 @@ static void con_sock_state_closed(struct ceph_connection *con) static void ceph_sock_data_ready(struct sock *sk) { struct ceph_connection *con = sk->sk_user_data; + + trace_sk_data_ready(sk); + if (atomic_read(&con->msgr->stopping)) { return; } diff --git a/net/core/net-traces.c b/net/core/net-traces.c index c40cd8dd75c7..ee7006bbe49b 100644 --- a/net/core/net-traces.c +++ b/net/core/net-traces.c @@ -61,3 +61,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(napi_poll); EXPORT_TRACEPOINT_SYMBOL_GPL(tcp_send_reset); EXPORT_TRACEPOINT_SYMBOL_GPL(tcp_bad_csum); + +EXPORT_TRACEPOINT_SYMBOL_GPL(sk_data_ready); diff --git a/net/core/skmsg.c b/net/core/skmsg.c index 53d0251788aa..f81883759d38 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -8,6 +8,7 @@ #include #include #include +#include static bool sk_msg_try_coalesce_ok(struct sk_msg *msg, int elem_first_coalesce) { @@ -1114,6 +1115,8 @@ static void sk_psock_strp_data_ready(struct sock *sk) { struct sk_psock *psock; + trace_sk_data_ready(sk); + rcu_read_lock(); psock = sk_psock(sk); if (likely(psock)) { @@ -1210,6 +1213,8 @@ static void sk_psock_verdict_data_ready(struct sock *sk) { struct socket *sock = sk->sk_socket; + trace_sk_data_ready(sk); + if (unlikely(!sock || !sock->ops || !sock->ops->read_skb)) return; sock->ops->read_skb(sk, sk_psock_verdict_recv); diff --git a/net/core/sock.c b/net/core/sock.c index f954d5893e79..7ba4891460ad 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -3291,6 +3291,8 @@ void sock_def_readable(struct sock *sk) { struct socket_wq *wq; + trace_sk_data_ready(sk); + rcu_read_lock(); wq = rcu_dereference(sk->sk_wq); if (skwq_has_sleeper(wq)) diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index 890a2423f559..cfe828bd7fc6 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c @@ -28,6 +28,7 @@ #include #include #include +#include unsigned int kcm_net_id; @@ -349,6 +350,8 @@ static void psock_data_ready(struct sock *sk) { struct kcm_psock *psock; + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); psock = (struct kcm_psock *)sk->sk_user_data; diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index ec54413fb31f..beaec843f5ca 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -26,6 +26,7 @@ #include "mib.h" #include +#include static void mptcp_subflow_ops_undo_override(struct sock *ssk); @@ -1438,6 +1439,8 @@ static void subflow_data_ready(struct sock *sk) struct sock *parent = subflow->conn; struct mptcp_sock *msk; + trace_sk_data_ready(sk); + msk = mptcp_sk(parent); if (state & TCPF_LISTEN) { /* MPJ subflow are removed from accept queue before reaching here, diff --git a/net/phonet/pep-gprs.c b/net/phonet/pep-gprs.c index 1f5df0432d37..7f68d8662cfb 100644 --- a/net/phonet/pep-gprs.c +++ b/net/phonet/pep-gprs.c @@ -19,6 +19,8 @@ #include #include +#include + #define GPRS_DEFAULT_MTU 1400 struct gprs_dev { @@ -138,6 +140,8 @@ static void gprs_data_ready(struct sock *sk) struct gprs_dev *gp = sk->sk_user_data; struct sk_buff *skb; + trace_sk_data_ready(sk); + while ((skb = pep_read(sk)) != NULL) { skb_orphan(skb); gprs_recv(gp, skb); diff --git a/net/qrtr/ns.c b/net/qrtr/ns.c index 1990d496fcfc..97bfdf9fd028 100644 --- a/net/qrtr/ns.c +++ b/net/qrtr/ns.c @@ -12,6 +12,7 @@ #include "qrtr.h" +#include #define CREATE_TRACE_POINTS #include @@ -752,6 +753,8 @@ static void qrtr_ns_worker(struct work_struct *work) static void qrtr_ns_data_ready(struct sock *sk) { + trace_sk_data_ready(sk); + queue_work(qrtr_ns.workqueue, &qrtr_ns.work); } diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c index 7edf2e69d3fe..014fa24418c1 100644 --- a/net/rds/tcp_listen.c +++ b/net/rds/tcp_listen.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "rds.h" #include "tcp.h" @@ -234,6 +235,7 @@ void rds_tcp_listen_data_ready(struct sock *sk) { void (*ready)(struct sock *sk); + trace_sk_data_ready(sk); rdsdebug("listen data ready sk %p\n", sk); read_lock_bh(&sk->sk_callback_lock); diff --git a/net/rds/tcp_recv.c b/net/rds/tcp_recv.c index f4ee13da90c7..c00f04a1a534 100644 --- a/net/rds/tcp_recv.c +++ b/net/rds/tcp_recv.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "rds.h" #include "tcp.h" @@ -309,6 +310,7 @@ void rds_tcp_data_ready(struct sock *sk) struct rds_conn_path *cp; struct rds_tcp_connection *tc; + trace_sk_data_ready(sk); rdsdebug("data ready sk %p\n", sk); read_lock_bh(&sk->sk_callback_lock); diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 84021a6c4f9d..a98511b676cd 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -59,6 +59,7 @@ #include #include #include +#include #include /* for sa_family_t */ #include @@ -9244,6 +9245,8 @@ void sctp_data_ready(struct sock *sk) { struct socket_wq *wq; + trace_sk_data_ready(sk); + rcu_read_lock(); wq = rcu_dereference(sk->sk_wq); if (skwq_has_sleeper(wq)) diff --git a/net/smc/smc_rx.c b/net/smc/smc_rx.c index 17c5aee7ee4f..0a6e615f000c 100644 --- a/net/smc/smc_rx.c +++ b/net/smc/smc_rx.c @@ -15,6 +15,7 @@ #include #include +#include #include "smc.h" #include "smc_core.h" @@ -31,6 +32,8 @@ static void smc_rx_wake_up(struct sock *sk) { struct socket_wq *wq; + trace_sk_data_ready(sk); + /* derived from sock_def_readable() */ /* called already in smc_listen_work() */ rcu_read_lock(); diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 815baf308236..99eafe87b1d5 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -55,6 +55,7 @@ #include #include +#include #include #include "socklib.h" @@ -310,6 +311,8 @@ static void svc_data_ready(struct sock *sk) { struct svc_sock *svsk = (struct svc_sock *)sk->sk_user_data; + trace_sk_data_ready(sk); + if (svsk) { /* Refer to svc_setup_socket() for details. */ rmb(); @@ -687,6 +690,8 @@ static void svc_tcp_listen_data_ready(struct sock *sk) { struct svc_sock *svsk = (struct svc_sock *)sk->sk_user_data; + trace_sk_data_ready(sk); + if (svsk) { /* Refer to svc_setup_socket() for details. */ rmb(); diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index aaa5b2741b79..adcbedc244d6 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -52,6 +52,7 @@ #include #include +#include #include #include "socklib.h" @@ -1378,6 +1379,8 @@ static void xs_data_ready(struct sock *sk) { struct rpc_xprt *xprt; + trace_sk_data_ready(sk); + xprt = xprt_from_sock(sk); if (xprt != NULL) { struct sock_xprt *transport = container_of(xprt, diff --git a/net/tipc/socket.c b/net/tipc/socket.c index b35c8701876a..07c9bf5f7f5c 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -37,6 +37,7 @@ #include #include +#include #include "core.h" #include "name_table.h" @@ -2130,6 +2131,8 @@ static void tipc_data_ready(struct sock *sk) { struct socket_wq *wq; + trace_sk_data_ready(sk); + rcu_read_lock(); wq = rcu_dereference(sk->sk_wq); if (skwq_has_sleeper(wq)) diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c index 69c88cc03887..8ee0c07d00e9 100644 --- a/net/tipc/topsrv.c +++ b/net/tipc/topsrv.c @@ -43,6 +43,7 @@ #include "bearer.h" #include #include +#include /* Number of messages to send before rescheduling */ #define MAX_SEND_MSG_COUNT 25 @@ -439,6 +440,8 @@ static void tipc_conn_data_ready(struct sock *sk) { struct tipc_conn *con; + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); con = sk->sk_user_data; if (connected(con)) { @@ -496,6 +499,8 @@ static void tipc_topsrv_listener_data_ready(struct sock *sk) { struct tipc_topsrv *srv; + trace_sk_data_ready(sk); + read_lock_bh(&sk->sk_callback_lock); srv = sk->sk_user_data; if (srv) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 9ed978634125..fa137063aaa0 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -43,6 +43,7 @@ #include #include +#include #include "tls.h" @@ -2284,6 +2285,8 @@ static void tls_data_ready(struct sock *sk) struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx); struct sk_psock *psock; + trace_sk_data_ready(sk); + tls_strp_data_ready(&ctx->strp); psock = sk_psock_get(sk); diff --git a/net/xfrm/espintcp.c b/net/xfrm/espintcp.c index 74a54295c164..872b80188e83 100644 --- a/net/xfrm/espintcp.c +++ b/net/xfrm/espintcp.c @@ -6,6 +6,7 @@ #include #include #include +#include #if IS_ENABLED(CONFIG_IPV6) #include #endif @@ -397,6 +398,8 @@ static void espintcp_data_ready(struct sock *sk) { struct espintcp_ctx *ctx = espintcp_getctx(sk); + trace_sk_data_ready(sk); + strp_data_ready(&ctx->strp); } -- cgit From 8395406b3495235d73c7aa86ef8df97830e036d6 Mon Sep 17 00:00:00 2001 From: David Howells Date: Mon, 19 Dec 2022 14:22:12 +0000 Subject: rxrpc: Fix trace string Fix a trace string to indicate that it's discarding the local endpoint for a preallocated peer, not a preallocated connection. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- include/trace/events/rxrpc.h | 2 +- net/rxrpc/call_accept.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index 283db0ea3db4..31524d605319 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -163,7 +163,7 @@ EM(rxrpc_local_put_for_use, "PUT for-use ") \ EM(rxrpc_local_put_kill_conn, "PUT conn-kil") \ EM(rxrpc_local_put_peer, "PUT peer ") \ - EM(rxrpc_local_put_prealloc_conn, "PUT conn-pre") \ + EM(rxrpc_local_put_prealloc_peer, "PUT peer-pre") \ EM(rxrpc_local_put_release_sock, "PUT rel-sock") \ EM(rxrpc_local_stop, "STOP ") \ EM(rxrpc_local_stopped, "STOPPED ") \ diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c index 3e8689fdc437..0f5a1d77b890 100644 --- a/net/rxrpc/call_accept.c +++ b/net/rxrpc/call_accept.c @@ -195,7 +195,7 @@ void rxrpc_discard_prealloc(struct rxrpc_sock *rx) tail = b->peer_backlog_tail; while (CIRC_CNT(head, tail, size) > 0) { struct rxrpc_peer *peer = b->peer_backlog[tail]; - rxrpc_put_local(peer->local, rxrpc_local_put_prealloc_conn); + rxrpc_put_local(peer->local, rxrpc_local_put_prealloc_peer); kfree(peer); tail = (tail + 1) & (size - 1); } -- cgit From 371e68ba0306f6279b03990c2e721e7634f0fe33 Mon Sep 17 00:00:00 2001 From: David Howells Date: Tue, 31 Jan 2023 08:35:16 +0000 Subject: rxrpc: Remove whitespace before ')' in trace header Work around checkpatch warnings in the rxrpc trace header by removing whitespace before ')' on lines defining the trace record struct. Signed-off-by: David Howells --- include/trace/events/rxrpc.h | 426 +++++++++++++++++++++---------------------- 1 file changed, 213 insertions(+), 213 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index 31524d605319..788bfe7446d9 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -552,10 +552,10 @@ TRACE_EVENT(rxrpc_local, TP_ARGS(local_debug_id, op, ref, usage), TP_STRUCT__entry( - __field(unsigned int, local ) - __field(int, op ) - __field(int, ref ) - __field(int, usage ) + __field(unsigned int, local) + __field(int, op) + __field(int, ref) + __field(int, usage) ), TP_fast_assign( @@ -578,9 +578,9 @@ TRACE_EVENT(rxrpc_peer, TP_ARGS(peer_debug_id, ref, why), TP_STRUCT__entry( - __field(unsigned int, peer ) - __field(int, ref ) - __field(enum rxrpc_peer_trace, why ) + __field(unsigned int, peer) + __field(int, ref) + __field(enum rxrpc_peer_trace, why) ), TP_fast_assign( @@ -601,9 +601,9 @@ TRACE_EVENT(rxrpc_bundle, TP_ARGS(bundle_debug_id, ref, why), TP_STRUCT__entry( - __field(unsigned int, bundle ) - __field(int, ref ) - __field(int, why ) + __field(unsigned int, bundle) + __field(int, ref) + __field(int, why) ), TP_fast_assign( @@ -624,9 +624,9 @@ TRACE_EVENT(rxrpc_conn, TP_ARGS(conn_debug_id, ref, why), TP_STRUCT__entry( - __field(unsigned int, conn ) - __field(int, ref ) - __field(int, why ) + __field(unsigned int, conn) + __field(int, ref) + __field(int, why) ), TP_fast_assign( @@ -648,11 +648,11 @@ TRACE_EVENT(rxrpc_client, TP_ARGS(conn, channel, op), TP_STRUCT__entry( - __field(unsigned int, conn ) - __field(u32, cid ) - __field(int, channel ) - __field(int, usage ) - __field(enum rxrpc_client_trace, op ) + __field(unsigned int, conn) + __field(u32, cid) + __field(int, channel) + __field(int, usage) + __field(enum rxrpc_client_trace, op) ), TP_fast_assign( @@ -678,10 +678,10 @@ TRACE_EVENT(rxrpc_call, TP_ARGS(call_debug_id, ref, aux, why), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(int, ref ) - __field(int, why ) - __field(unsigned long, aux ) + __field(unsigned int, call) + __field(int, ref) + __field(int, why) + __field(unsigned long, aux) ), TP_fast_assign( @@ -705,10 +705,10 @@ TRACE_EVENT(rxrpc_skb, TP_ARGS(skb, usage, mod_count, why), TP_STRUCT__entry( - __field(struct sk_buff *, skb ) - __field(int, usage ) - __field(int, mod_count ) - __field(enum rxrpc_skb_trace, why ) + __field(struct sk_buff *, skb) + __field(int, usage) + __field(int, mod_count) + __field(enum rxrpc_skb_trace, why) ), TP_fast_assign( @@ -731,7 +731,7 @@ TRACE_EVENT(rxrpc_rx_packet, TP_ARGS(sp), TP_STRUCT__entry( - __field_struct(struct rxrpc_host_header, hdr ) + __field_struct(struct rxrpc_host_header, hdr) ), TP_fast_assign( @@ -753,8 +753,8 @@ TRACE_EVENT(rxrpc_rx_done, TP_ARGS(result, abort_code), TP_STRUCT__entry( - __field(int, result ) - __field(int, abort_code ) + __field(int, result) + __field(int, abort_code) ), TP_fast_assign( @@ -772,13 +772,13 @@ TRACE_EVENT(rxrpc_abort, TP_ARGS(call_nr, why, cid, call_id, seq, abort_code, error), TP_STRUCT__entry( - __field(unsigned int, call_nr ) - __field(enum rxrpc_abort_reason, why ) - __field(u32, cid ) - __field(u32, call_id ) - __field(rxrpc_seq_t, seq ) - __field(int, abort_code ) - __field(int, error ) + __field(unsigned int, call_nr) + __field(enum rxrpc_abort_reason, why) + __field(u32, cid) + __field(u32, call_id) + __field(rxrpc_seq_t, seq) + __field(int, abort_code) + __field(int, error) ), TP_fast_assign( @@ -804,10 +804,10 @@ TRACE_EVENT(rxrpc_call_complete, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_call_completion, compl ) - __field(int, error ) - __field(u32, abort_code ) + __field(unsigned int, call) + __field(enum rxrpc_call_completion, compl) + __field(int, error) + __field(u32, abort_code) ), TP_fast_assign( @@ -830,13 +830,13 @@ TRACE_EVENT(rxrpc_txqueue, TP_ARGS(call, why), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_txqueue_trace, why ) - __field(rxrpc_seq_t, acks_hard_ack ) - __field(rxrpc_seq_t, tx_bottom ) - __field(rxrpc_seq_t, tx_top ) - __field(rxrpc_seq_t, tx_prepared ) - __field(int, tx_winsize ) + __field(unsigned int, call) + __field(enum rxrpc_txqueue_trace, why) + __field(rxrpc_seq_t, acks_hard_ack) + __field(rxrpc_seq_t, tx_bottom) + __field(rxrpc_seq_t, tx_top) + __field(rxrpc_seq_t, tx_prepared) + __field(int, tx_winsize) ), TP_fast_assign( @@ -867,10 +867,10 @@ TRACE_EVENT(rxrpc_rx_data, TP_ARGS(call, seq, serial, flags), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(rxrpc_seq_t, seq ) - __field(rxrpc_serial_t, serial ) - __field(u8, flags ) + __field(unsigned int, call) + __field(rxrpc_seq_t, seq) + __field(rxrpc_serial_t, serial) + __field(u8, flags) ), TP_fast_assign( @@ -895,13 +895,13 @@ TRACE_EVENT(rxrpc_rx_ack, TP_ARGS(call, serial, ack_serial, first, prev, reason, n_acks), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(rxrpc_serial_t, serial ) - __field(rxrpc_serial_t, ack_serial ) - __field(rxrpc_seq_t, first ) - __field(rxrpc_seq_t, prev ) - __field(u8, reason ) - __field(u8, n_acks ) + __field(unsigned int, call) + __field(rxrpc_serial_t, serial) + __field(rxrpc_serial_t, ack_serial) + __field(rxrpc_seq_t, first) + __field(rxrpc_seq_t, prev) + __field(u8, reason) + __field(u8, n_acks) ), TP_fast_assign( @@ -931,9 +931,9 @@ TRACE_EVENT(rxrpc_rx_abort, TP_ARGS(call, serial, abort_code), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(rxrpc_serial_t, serial ) - __field(u32, abort_code ) + __field(unsigned int, call) + __field(rxrpc_serial_t, serial) + __field(u32, abort_code) ), TP_fast_assign( @@ -955,11 +955,11 @@ TRACE_EVENT(rxrpc_rx_challenge, TP_ARGS(conn, serial, version, nonce, min_level), TP_STRUCT__entry( - __field(unsigned int, conn ) - __field(rxrpc_serial_t, serial ) - __field(u32, version ) - __field(u32, nonce ) - __field(u32, min_level ) + __field(unsigned int, conn) + __field(rxrpc_serial_t, serial) + __field(u32, version) + __field(u32, nonce) + __field(u32, min_level) ), TP_fast_assign( @@ -985,11 +985,11 @@ TRACE_EVENT(rxrpc_rx_response, TP_ARGS(conn, serial, version, kvno, ticket_len), TP_STRUCT__entry( - __field(unsigned int, conn ) - __field(rxrpc_serial_t, serial ) - __field(u32, version ) - __field(u32, kvno ) - __field(u32, ticket_len ) + __field(unsigned int, conn) + __field(rxrpc_serial_t, serial) + __field(u32, version) + __field(u32, kvno) + __field(u32, ticket_len) ), TP_fast_assign( @@ -1015,10 +1015,10 @@ TRACE_EVENT(rxrpc_rx_rwind_change, TP_ARGS(call, serial, rwind, wake), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(rxrpc_serial_t, serial ) - __field(u32, rwind ) - __field(bool, wake ) + __field(unsigned int, call) + __field(rxrpc_serial_t, serial) + __field(u32, rwind) + __field(bool, wake) ), TP_fast_assign( @@ -1042,9 +1042,9 @@ TRACE_EVENT(rxrpc_tx_packet, TP_ARGS(call_id, whdr, where), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_tx_point, where ) - __field_struct(struct rxrpc_wire_header, whdr ) + __field(unsigned int, call) + __field(enum rxrpc_tx_point, where) + __field_struct(struct rxrpc_wire_header, whdr) ), TP_fast_assign( @@ -1074,14 +1074,14 @@ TRACE_EVENT(rxrpc_tx_data, TP_ARGS(call, seq, serial, flags, retrans, lose), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(rxrpc_seq_t, seq ) - __field(rxrpc_serial_t, serial ) - __field(u32, cid ) - __field(u32, call_id ) - __field(u8, flags ) - __field(bool, retrans ) - __field(bool, lose ) + __field(unsigned int, call) + __field(rxrpc_seq_t, seq) + __field(rxrpc_serial_t, serial) + __field(u32, cid) + __field(u32, call_id) + __field(u8, flags) + __field(bool, retrans) + __field(bool, lose) ), TP_fast_assign( @@ -1114,12 +1114,12 @@ TRACE_EVENT(rxrpc_tx_ack, TP_ARGS(call, serial, ack_first, ack_serial, reason, n_acks), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(rxrpc_serial_t, serial ) - __field(rxrpc_seq_t, ack_first ) - __field(rxrpc_serial_t, ack_serial ) - __field(u8, reason ) - __field(u8, n_acks ) + __field(unsigned int, call) + __field(rxrpc_serial_t, serial) + __field(rxrpc_seq_t, ack_first) + __field(rxrpc_serial_t, ack_serial) + __field(u8, reason) + __field(u8, n_acks) ), TP_fast_assign( @@ -1147,11 +1147,11 @@ TRACE_EVENT(rxrpc_receive, TP_ARGS(call, why, serial, seq), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_receive_trace, why ) - __field(rxrpc_serial_t, serial ) - __field(rxrpc_seq_t, seq ) - __field(u64, window ) + __field(unsigned int, call) + __field(enum rxrpc_receive_trace, why) + __field(rxrpc_serial_t, serial) + __field(rxrpc_seq_t, seq) + __field(u64, window) ), TP_fast_assign( @@ -1178,9 +1178,9 @@ TRACE_EVENT(rxrpc_recvmsg, TP_ARGS(call_debug_id, why, ret), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_recvmsg_trace, why ) - __field(int, ret ) + __field(unsigned int, call) + __field(enum rxrpc_recvmsg_trace, why) + __field(int, ret) ), TP_fast_assign( @@ -1203,12 +1203,12 @@ TRACE_EVENT(rxrpc_recvdata, TP_ARGS(call, why, seq, offset, len, ret), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_recvmsg_trace, why ) - __field(rxrpc_seq_t, seq ) - __field(unsigned int, offset ) - __field(unsigned int, len ) - __field(int, ret ) + __field(unsigned int, call) + __field(enum rxrpc_recvmsg_trace, why) + __field(rxrpc_seq_t, seq) + __field(unsigned int, offset) + __field(unsigned int, len) + __field(int, ret) ), TP_fast_assign( @@ -1236,10 +1236,10 @@ TRACE_EVENT(rxrpc_rtt_tx, TP_ARGS(call, why, slot, send_serial), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_rtt_tx_trace, why ) - __field(int, slot ) - __field(rxrpc_serial_t, send_serial ) + __field(unsigned int, call) + __field(enum rxrpc_rtt_tx_trace, why) + __field(int, slot) + __field(rxrpc_serial_t, send_serial) ), TP_fast_assign( @@ -1265,13 +1265,13 @@ TRACE_EVENT(rxrpc_rtt_rx, TP_ARGS(call, why, slot, send_serial, resp_serial, rtt, rto), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_rtt_rx_trace, why ) - __field(int, slot ) - __field(rxrpc_serial_t, send_serial ) - __field(rxrpc_serial_t, resp_serial ) - __field(u32, rtt ) - __field(u32, rto ) + __field(unsigned int, call) + __field(enum rxrpc_rtt_rx_trace, why) + __field(int, slot) + __field(rxrpc_serial_t, send_serial) + __field(rxrpc_serial_t, resp_serial) + __field(u32, rtt) + __field(u32, rto) ), TP_fast_assign( @@ -1301,17 +1301,17 @@ TRACE_EVENT(rxrpc_timer, TP_ARGS(call, why, now), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_timer_trace, why ) - __field(long, now ) - __field(long, ack_at ) - __field(long, ack_lost_at ) - __field(long, resend_at ) - __field(long, ping_at ) - __field(long, expect_rx_by ) - __field(long, expect_req_by ) - __field(long, expect_term_by ) - __field(long, timer ) + __field(unsigned int, call) + __field(enum rxrpc_timer_trace, why) + __field(long, now) + __field(long, ack_at) + __field(long, ack_lost_at) + __field(long, resend_at) + __field(long, ping_at) + __field(long, expect_rx_by) + __field(long, expect_req_by) + __field(long, expect_term_by) + __field(long, timer) ), TP_fast_assign( @@ -1345,16 +1345,16 @@ TRACE_EVENT(rxrpc_timer_expired, TP_ARGS(call, now), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(long, now ) - __field(long, ack_at ) - __field(long, ack_lost_at ) - __field(long, resend_at ) - __field(long, ping_at ) - __field(long, expect_rx_by ) - __field(long, expect_req_by ) - __field(long, expect_term_by ) - __field(long, timer ) + __field(unsigned int, call) + __field(long, now) + __field(long, ack_at) + __field(long, ack_lost_at) + __field(long, resend_at) + __field(long, ping_at) + __field(long, expect_rx_by) + __field(long, expect_req_by) + __field(long, expect_term_by) + __field(long, timer) ), TP_fast_assign( @@ -1386,7 +1386,7 @@ TRACE_EVENT(rxrpc_rx_lose, TP_ARGS(sp), TP_STRUCT__entry( - __field_struct(struct rxrpc_host_header, hdr ) + __field_struct(struct rxrpc_host_header, hdr) ), TP_fast_assign( @@ -1409,10 +1409,10 @@ TRACE_EVENT(rxrpc_propose_ack, TP_ARGS(call, why, ack_reason, serial), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_propose_ack_trace, why ) - __field(rxrpc_serial_t, serial ) - __field(u8, ack_reason ) + __field(unsigned int, call) + __field(enum rxrpc_propose_ack_trace, why) + __field(rxrpc_serial_t, serial) + __field(u8, ack_reason) ), TP_fast_assign( @@ -1436,10 +1436,10 @@ TRACE_EVENT(rxrpc_send_ack, TP_ARGS(call, why, ack_reason, serial), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_propose_ack_trace, why ) - __field(rxrpc_serial_t, serial ) - __field(u8, ack_reason ) + __field(unsigned int, call) + __field(enum rxrpc_propose_ack_trace, why) + __field(rxrpc_serial_t, serial) + __field(u8, ack_reason) ), TP_fast_assign( @@ -1463,11 +1463,11 @@ TRACE_EVENT(rxrpc_drop_ack, TP_ARGS(call, why, ack_reason, serial, nobuf), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_propose_ack_trace, why ) - __field(rxrpc_serial_t, serial ) - __field(u8, ack_reason ) - __field(bool, nobuf ) + __field(unsigned int, call) + __field(enum rxrpc_propose_ack_trace, why) + __field(rxrpc_serial_t, serial) + __field(u8, ack_reason) + __field(bool, nobuf) ), TP_fast_assign( @@ -1491,9 +1491,9 @@ TRACE_EVENT(rxrpc_retransmit, TP_ARGS(call, seq, expiry), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(rxrpc_seq_t, seq ) - __field(s64, expiry ) + __field(unsigned int, call) + __field(rxrpc_seq_t, seq) + __field(s64, expiry) ), TP_fast_assign( @@ -1515,13 +1515,13 @@ TRACE_EVENT(rxrpc_congest, TP_ARGS(call, summary, ack_serial, change), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_congest_change, change ) - __field(rxrpc_seq_t, hard_ack ) - __field(rxrpc_seq_t, top ) - __field(rxrpc_seq_t, lowest_nak ) - __field(rxrpc_serial_t, ack_serial ) - __field_struct(struct rxrpc_ack_summary, sum ) + __field(unsigned int, call) + __field(enum rxrpc_congest_change, change) + __field(rxrpc_seq_t, hard_ack) + __field(rxrpc_seq_t, top) + __field(rxrpc_seq_t, lowest_nak) + __field(rxrpc_serial_t, ack_serial) + __field_struct(struct rxrpc_ack_summary, sum) ), TP_fast_assign( @@ -1559,14 +1559,14 @@ TRACE_EVENT(rxrpc_reset_cwnd, TP_ARGS(call, now), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(enum rxrpc_congest_mode, mode ) - __field(unsigned short, cwnd ) - __field(unsigned short, extra ) - __field(rxrpc_seq_t, hard_ack ) - __field(rxrpc_seq_t, prepared ) - __field(ktime_t, since_last_tx ) - __field(bool, has_data ) + __field(unsigned int, call) + __field(enum rxrpc_congest_mode, mode) + __field(unsigned short, cwnd) + __field(unsigned short, extra) + __field(rxrpc_seq_t, hard_ack) + __field(rxrpc_seq_t, prepared) + __field(ktime_t, since_last_tx) + __field(bool, has_data) ), TP_fast_assign( @@ -1597,8 +1597,8 @@ TRACE_EVENT(rxrpc_disconnect_call, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(u32, abort_code ) + __field(unsigned int, call) + __field(u32, abort_code) ), TP_fast_assign( @@ -1617,8 +1617,8 @@ TRACE_EVENT(rxrpc_improper_term, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(u32, abort_code ) + __field(unsigned int, call) + __field(u32, abort_code) ), TP_fast_assign( @@ -1637,11 +1637,11 @@ TRACE_EVENT(rxrpc_connect_call, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(unsigned long, user_call_ID ) - __field(u32, cid ) - __field(u32, call_id ) - __field_struct(struct sockaddr_rxrpc, srx ) + __field(unsigned int, call) + __field(unsigned long, user_call_ID) + __field(u32, cid) + __field(u32, call_id) + __field_struct(struct sockaddr_rxrpc, srx) ), TP_fast_assign( @@ -1666,10 +1666,10 @@ TRACE_EVENT(rxrpc_resend, TP_ARGS(call, ack), TP_STRUCT__entry( - __field(unsigned int, call ) - __field(rxrpc_seq_t, seq ) - __field(rxrpc_seq_t, transmitted ) - __field(rxrpc_serial_t, ack_serial ) + __field(unsigned int, call) + __field(rxrpc_seq_t, seq) + __field(rxrpc_seq_t, transmitted) + __field(rxrpc_serial_t, ack_serial) ), TP_fast_assign( @@ -1694,9 +1694,9 @@ TRACE_EVENT(rxrpc_rx_icmp, TP_ARGS(peer, ee, srx), TP_STRUCT__entry( - __field(unsigned int, peer ) - __field_struct(struct sock_extended_err, ee ) - __field_struct(struct sockaddr_rxrpc, srx ) + __field(unsigned int, peer) + __field_struct(struct sock_extended_err, ee) + __field_struct(struct sockaddr_rxrpc, srx) ), TP_fast_assign( @@ -1723,10 +1723,10 @@ TRACE_EVENT(rxrpc_tx_fail, TP_ARGS(debug_id, serial, ret, where), TP_STRUCT__entry( - __field(unsigned int, debug_id ) - __field(rxrpc_serial_t, serial ) - __field(int, ret ) - __field(enum rxrpc_tx_point, where ) + __field(unsigned int, debug_id) + __field(rxrpc_serial_t, serial) + __field(int, ret) + __field(enum rxrpc_tx_point, where) ), TP_fast_assign( @@ -1749,13 +1749,13 @@ TRACE_EVENT(rxrpc_call_reset, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, debug_id ) - __field(u32, cid ) - __field(u32, call_id ) - __field(rxrpc_serial_t, call_serial ) - __field(rxrpc_serial_t, conn_serial ) - __field(rxrpc_seq_t, tx_seq ) - __field(rxrpc_seq_t, rx_seq ) + __field(unsigned int, debug_id) + __field(u32, cid) + __field(u32, call_id) + __field(rxrpc_serial_t, call_serial) + __field(rxrpc_serial_t, conn_serial) + __field(rxrpc_seq_t, tx_seq) + __field(rxrpc_seq_t, rx_seq) ), TP_fast_assign( @@ -1781,8 +1781,8 @@ TRACE_EVENT(rxrpc_notify_socket, TP_ARGS(debug_id, serial), TP_STRUCT__entry( - __field(unsigned int, debug_id ) - __field(rxrpc_serial_t, serial ) + __field(unsigned int, debug_id) + __field(rxrpc_serial_t, serial) ), TP_fast_assign( @@ -1804,8 +1804,8 @@ TRACE_EVENT(rxrpc_rx_discard_ack, prev_pkt, call_ackr_prev), TP_STRUCT__entry( - __field(unsigned int, debug_id ) - __field(rxrpc_serial_t, serial ) + __field(unsigned int, debug_id) + __field(rxrpc_serial_t, serial) __field(rxrpc_seq_t, first_soft_ack) __field(rxrpc_seq_t, call_ackr_first) __field(rxrpc_seq_t, prev_pkt) @@ -1837,9 +1837,9 @@ TRACE_EVENT(rxrpc_req_ack, TP_ARGS(call_debug_id, seq, why), TP_STRUCT__entry( - __field(unsigned int, call_debug_id ) - __field(rxrpc_seq_t, seq ) - __field(enum rxrpc_req_ack_trace, why ) + __field(unsigned int, call_debug_id) + __field(rxrpc_seq_t, seq) + __field(enum rxrpc_req_ack_trace, why) ), TP_fast_assign( @@ -1862,11 +1862,11 @@ TRACE_EVENT(rxrpc_txbuf, TP_ARGS(debug_id, call_debug_id, seq, ref, what), TP_STRUCT__entry( - __field(unsigned int, debug_id ) - __field(unsigned int, call_debug_id ) - __field(rxrpc_seq_t, seq ) - __field(int, ref ) - __field(enum rxrpc_txbuf_trace, what ) + __field(unsigned int, debug_id) + __field(unsigned int, call_debug_id) + __field(rxrpc_seq_t, seq) + __field(int, ref) + __field(enum rxrpc_txbuf_trace, what) ), TP_fast_assign( @@ -1892,9 +1892,9 @@ TRACE_EVENT(rxrpc_poke_call, TP_ARGS(call, busy, what), TP_STRUCT__entry( - __field(unsigned int, call_debug_id ) - __field(bool, busy ) - __field(enum rxrpc_call_poke_trace, what ) + __field(unsigned int, call_debug_id) + __field(bool, busy) + __field(enum rxrpc_call_poke_trace, what) ), TP_fast_assign( @@ -1915,7 +1915,7 @@ TRACE_EVENT(rxrpc_call_poked, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call_debug_id ) + __field(unsigned int, call_debug_id) ), TP_fast_assign( -- cgit From 828bebc80a031b9c07c0d5f2465910b6350cd616 Mon Sep 17 00:00:00 2001 From: David Howells Date: Tue, 31 Jan 2023 08:39:46 +0000 Subject: rxrpc: Shrink the tabulation in the rxrpc trace header a bit Shrink the tabulation in the rxrpc trace header a bit to allow for fields with long type names that have been removed. Signed-off-by: David Howells --- include/trace/events/rxrpc.h | 196 +++++++++++++++++++++---------------------- 1 file changed, 98 insertions(+), 98 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index 788bfe7446d9..cdcadb1345dc 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -678,10 +678,10 @@ TRACE_EVENT(rxrpc_call, TP_ARGS(call_debug_id, ref, aux, why), TP_STRUCT__entry( - __field(unsigned int, call) - __field(int, ref) - __field(int, why) - __field(unsigned long, aux) + __field(unsigned int, call) + __field(int, ref) + __field(int, why) + __field(unsigned long, aux) ), TP_fast_assign( @@ -753,8 +753,8 @@ TRACE_EVENT(rxrpc_rx_done, TP_ARGS(result, abort_code), TP_STRUCT__entry( - __field(int, result) - __field(int, abort_code) + __field(int, result) + __field(int, abort_code) ), TP_fast_assign( @@ -867,10 +867,10 @@ TRACE_EVENT(rxrpc_rx_data, TP_ARGS(call, seq, serial, flags), TP_STRUCT__entry( - __field(unsigned int, call) - __field(rxrpc_seq_t, seq) - __field(rxrpc_serial_t, serial) - __field(u8, flags) + __field(unsigned int, call) + __field(rxrpc_seq_t, seq) + __field(rxrpc_serial_t, serial) + __field(u8, flags) ), TP_fast_assign( @@ -895,13 +895,13 @@ TRACE_EVENT(rxrpc_rx_ack, TP_ARGS(call, serial, ack_serial, first, prev, reason, n_acks), TP_STRUCT__entry( - __field(unsigned int, call) - __field(rxrpc_serial_t, serial) - __field(rxrpc_serial_t, ack_serial) - __field(rxrpc_seq_t, first) - __field(rxrpc_seq_t, prev) - __field(u8, reason) - __field(u8, n_acks) + __field(unsigned int, call) + __field(rxrpc_serial_t, serial) + __field(rxrpc_serial_t, ack_serial) + __field(rxrpc_seq_t, first) + __field(rxrpc_seq_t, prev) + __field(u8, reason) + __field(u8, n_acks) ), TP_fast_assign( @@ -931,9 +931,9 @@ TRACE_EVENT(rxrpc_rx_abort, TP_ARGS(call, serial, abort_code), TP_STRUCT__entry( - __field(unsigned int, call) - __field(rxrpc_serial_t, serial) - __field(u32, abort_code) + __field(unsigned int, call) + __field(rxrpc_serial_t, serial) + __field(u32, abort_code) ), TP_fast_assign( @@ -955,11 +955,11 @@ TRACE_EVENT(rxrpc_rx_challenge, TP_ARGS(conn, serial, version, nonce, min_level), TP_STRUCT__entry( - __field(unsigned int, conn) - __field(rxrpc_serial_t, serial) - __field(u32, version) - __field(u32, nonce) - __field(u32, min_level) + __field(unsigned int, conn) + __field(rxrpc_serial_t, serial) + __field(u32, version) + __field(u32, nonce) + __field(u32, min_level) ), TP_fast_assign( @@ -985,11 +985,11 @@ TRACE_EVENT(rxrpc_rx_response, TP_ARGS(conn, serial, version, kvno, ticket_len), TP_STRUCT__entry( - __field(unsigned int, conn) - __field(rxrpc_serial_t, serial) - __field(u32, version) - __field(u32, kvno) - __field(u32, ticket_len) + __field(unsigned int, conn) + __field(rxrpc_serial_t, serial) + __field(u32, version) + __field(u32, kvno) + __field(u32, ticket_len) ), TP_fast_assign( @@ -1015,10 +1015,10 @@ TRACE_EVENT(rxrpc_rx_rwind_change, TP_ARGS(call, serial, rwind, wake), TP_STRUCT__entry( - __field(unsigned int, call) - __field(rxrpc_serial_t, serial) - __field(u32, rwind) - __field(bool, wake) + __field(unsigned int, call) + __field(rxrpc_serial_t, serial) + __field(u32, rwind) + __field(bool, wake) ), TP_fast_assign( @@ -1074,14 +1074,14 @@ TRACE_EVENT(rxrpc_tx_data, TP_ARGS(call, seq, serial, flags, retrans, lose), TP_STRUCT__entry( - __field(unsigned int, call) - __field(rxrpc_seq_t, seq) - __field(rxrpc_serial_t, serial) - __field(u32, cid) - __field(u32, call_id) - __field(u8, flags) - __field(bool, retrans) - __field(bool, lose) + __field(unsigned int, call) + __field(rxrpc_seq_t, seq) + __field(rxrpc_serial_t, serial) + __field(u32, cid) + __field(u32, call_id) + __field(u8, flags) + __field(bool, retrans) + __field(bool, lose) ), TP_fast_assign( @@ -1114,12 +1114,12 @@ TRACE_EVENT(rxrpc_tx_ack, TP_ARGS(call, serial, ack_first, ack_serial, reason, n_acks), TP_STRUCT__entry( - __field(unsigned int, call) - __field(rxrpc_serial_t, serial) - __field(rxrpc_seq_t, ack_first) - __field(rxrpc_serial_t, ack_serial) - __field(u8, reason) - __field(u8, n_acks) + __field(unsigned int, call) + __field(rxrpc_serial_t, serial) + __field(rxrpc_seq_t, ack_first) + __field(rxrpc_serial_t, ack_serial) + __field(u8, reason) + __field(u8, n_acks) ), TP_fast_assign( @@ -1301,17 +1301,17 @@ TRACE_EVENT(rxrpc_timer, TP_ARGS(call, why, now), TP_STRUCT__entry( - __field(unsigned int, call) - __field(enum rxrpc_timer_trace, why) - __field(long, now) - __field(long, ack_at) - __field(long, ack_lost_at) - __field(long, resend_at) - __field(long, ping_at) - __field(long, expect_rx_by) - __field(long, expect_req_by) - __field(long, expect_term_by) - __field(long, timer) + __field(unsigned int, call) + __field(enum rxrpc_timer_trace, why) + __field(long, now) + __field(long, ack_at) + __field(long, ack_lost_at) + __field(long, resend_at) + __field(long, ping_at) + __field(long, expect_rx_by) + __field(long, expect_req_by) + __field(long, expect_term_by) + __field(long, timer) ), TP_fast_assign( @@ -1345,16 +1345,16 @@ TRACE_EVENT(rxrpc_timer_expired, TP_ARGS(call, now), TP_STRUCT__entry( - __field(unsigned int, call) - __field(long, now) - __field(long, ack_at) - __field(long, ack_lost_at) - __field(long, resend_at) - __field(long, ping_at) - __field(long, expect_rx_by) - __field(long, expect_req_by) - __field(long, expect_term_by) - __field(long, timer) + __field(unsigned int, call) + __field(long, now) + __field(long, ack_at) + __field(long, ack_lost_at) + __field(long, resend_at) + __field(long, ping_at) + __field(long, expect_rx_by) + __field(long, expect_req_by) + __field(long, expect_term_by) + __field(long, timer) ), TP_fast_assign( @@ -1491,9 +1491,9 @@ TRACE_EVENT(rxrpc_retransmit, TP_ARGS(call, seq, expiry), TP_STRUCT__entry( - __field(unsigned int, call) - __field(rxrpc_seq_t, seq) - __field(s64, expiry) + __field(unsigned int, call) + __field(rxrpc_seq_t, seq) + __field(s64, expiry) ), TP_fast_assign( @@ -1559,14 +1559,14 @@ TRACE_EVENT(rxrpc_reset_cwnd, TP_ARGS(call, now), TP_STRUCT__entry( - __field(unsigned int, call) - __field(enum rxrpc_congest_mode, mode) - __field(unsigned short, cwnd) - __field(unsigned short, extra) - __field(rxrpc_seq_t, hard_ack) - __field(rxrpc_seq_t, prepared) - __field(ktime_t, since_last_tx) - __field(bool, has_data) + __field(unsigned int, call) + __field(enum rxrpc_congest_mode, mode) + __field(unsigned short, cwnd) + __field(unsigned short, extra) + __field(rxrpc_seq_t, hard_ack) + __field(rxrpc_seq_t, prepared) + __field(ktime_t, since_last_tx) + __field(bool, has_data) ), TP_fast_assign( @@ -1597,8 +1597,8 @@ TRACE_EVENT(rxrpc_disconnect_call, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call) - __field(u32, abort_code) + __field(unsigned int, call) + __field(u32, abort_code) ), TP_fast_assign( @@ -1617,8 +1617,8 @@ TRACE_EVENT(rxrpc_improper_term, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call) - __field(u32, abort_code) + __field(unsigned int, call) + __field(u32, abort_code) ), TP_fast_assign( @@ -1666,10 +1666,10 @@ TRACE_EVENT(rxrpc_resend, TP_ARGS(call, ack), TP_STRUCT__entry( - __field(unsigned int, call) - __field(rxrpc_seq_t, seq) - __field(rxrpc_seq_t, transmitted) - __field(rxrpc_serial_t, ack_serial) + __field(unsigned int, call) + __field(rxrpc_seq_t, seq) + __field(rxrpc_seq_t, transmitted) + __field(rxrpc_serial_t, ack_serial) ), TP_fast_assign( @@ -1749,13 +1749,13 @@ TRACE_EVENT(rxrpc_call_reset, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, debug_id) - __field(u32, cid) - __field(u32, call_id) - __field(rxrpc_serial_t, call_serial) - __field(rxrpc_serial_t, conn_serial) - __field(rxrpc_seq_t, tx_seq) - __field(rxrpc_seq_t, rx_seq) + __field(unsigned int, debug_id) + __field(u32, cid) + __field(u32, call_id) + __field(rxrpc_serial_t, call_serial) + __field(rxrpc_serial_t, conn_serial) + __field(rxrpc_seq_t, tx_seq) + __field(rxrpc_seq_t, rx_seq) ), TP_fast_assign( @@ -1781,8 +1781,8 @@ TRACE_EVENT(rxrpc_notify_socket, TP_ARGS(debug_id, serial), TP_STRUCT__entry( - __field(unsigned int, debug_id) - __field(rxrpc_serial_t, serial) + __field(unsigned int, debug_id) + __field(rxrpc_serial_t, serial) ), TP_fast_assign( @@ -1915,7 +1915,7 @@ TRACE_EVENT(rxrpc_call_poked, TP_ARGS(call), TP_STRUCT__entry( - __field(unsigned int, call_debug_id) + __field(unsigned int, call_debug_id) ), TP_fast_assign( -- cgit From 84e28aa513af814807a5e9a0e5f3cab773946f3c Mon Sep 17 00:00:00 2001 From: David Howells Date: Mon, 17 Oct 2022 10:55:41 +0100 Subject: rxrpc: Generate extra pings for RTT during heavy-receive call When doing a call that has a single transmitted data packet and a massive amount of received data packets, we only ping for one RTT sample, which means we don't get a good reading on it. Fix this by converting occasional IDLE ACKs into PING ACKs to elicit a response. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- include/trace/events/rxrpc.h | 3 ++- net/rxrpc/call_event.c | 15 ++++++++++++--- net/rxrpc/output.c | 7 +++++-- 3 files changed, 19 insertions(+), 6 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index cdcadb1345dc..450b8f345814 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -360,11 +360,12 @@ EM(rxrpc_propose_ack_client_tx_end, "ClTxEnd") \ EM(rxrpc_propose_ack_input_data, "DataIn ") \ EM(rxrpc_propose_ack_input_data_hole, "DataInH") \ - EM(rxrpc_propose_ack_ping_for_check_life, "ChkLife") \ EM(rxrpc_propose_ack_ping_for_keepalive, "KeepAlv") \ EM(rxrpc_propose_ack_ping_for_lost_ack, "LostAck") \ EM(rxrpc_propose_ack_ping_for_lost_reply, "LostRpl") \ + EM(rxrpc_propose_ack_ping_for_old_rtt, "OldRtt ") \ EM(rxrpc_propose_ack_ping_for_params, "Params ") \ + EM(rxrpc_propose_ack_ping_for_rtt, "Rtt ") \ EM(rxrpc_propose_ack_processing_op, "ProcOp ") \ EM(rxrpc_propose_ack_respond_to_ack, "Rsp2Ack") \ EM(rxrpc_propose_ack_respond_to_ping, "Rsp2Png") \ diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c index 1abdef15debc..cf9799be4286 100644 --- a/net/rxrpc/call_event.c +++ b/net/rxrpc/call_event.c @@ -498,9 +498,18 @@ bool rxrpc_input_call_event(struct rxrpc_call *call, struct sk_buff *skb) rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0, rxrpc_propose_ack_rx_idle); - if (atomic_read(&call->ackr_nr_unacked) > 2) - rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0, - rxrpc_propose_ack_input_data); + if (atomic_read(&call->ackr_nr_unacked) > 2) { + if (call->peer->rtt_count < 3) + rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, + rxrpc_propose_ack_ping_for_rtt); + else if (ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), + ktime_get_real())) + rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, + rxrpc_propose_ack_ping_for_old_rtt); + else + rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0, + rxrpc_propose_ack_input_data); + } /* Make sure the timer is restarted */ if (!__rxrpc_call_is_complete(call)) { diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index a9746be29634..98b5d0db7761 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c @@ -253,12 +253,15 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) iov_iter_kvec(&msg.msg_iter, WRITE, iov, 1, len); ret = do_udp_sendmsg(conn->local->socket, &msg, len); call->peer->last_tx_at = ktime_get_seconds(); - if (ret < 0) + if (ret < 0) { trace_rxrpc_tx_fail(call->debug_id, serial, ret, rxrpc_tx_point_call_ack); - else + } else { trace_rxrpc_tx_packet(call->debug_id, &txb->wire, rxrpc_tx_point_call_ack); + if (txb->wire.flags & RXRPC_REQUEST_ACK) + call->peer->rtt_last_req = ktime_get_real(); + } rxrpc_tx_backoff(call, ret); if (!__rxrpc_call_is_complete(call)) { -- cgit From 5bbf953382bec6d3b7003e9389668c1d0863db31 Mon Sep 17 00:00:00 2001 From: David Howells Date: Mon, 17 Oct 2022 11:44:22 +0100 Subject: rxrpc: De-atomic call->ackr_window and call->ackr_nr_unacked call->ackr_window doesn't need to be atomic as ACK generation and ACK transmission are now done in the same thread, so drop the atomic64 handling and split it into two separate members. Similarly, call->ackr_nr_unacked doesn't need to be atomic now either. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- include/trace/events/rxrpc.h | 10 ++++++---- net/rxrpc/ar-internal.h | 5 +++-- net/rxrpc/call_event.c | 2 +- net/rxrpc/call_object.c | 3 ++- net/rxrpc/input.c | 14 +++++++------- net/rxrpc/output.c | 13 +++++-------- net/rxrpc/proc.c | 4 +--- net/rxrpc/recvmsg.c | 6 +++--- 8 files changed, 28 insertions(+), 29 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index 450b8f345814..e51a84f349d8 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -1152,7 +1152,8 @@ TRACE_EVENT(rxrpc_receive, __field(enum rxrpc_receive_trace, why) __field(rxrpc_serial_t, serial) __field(rxrpc_seq_t, seq) - __field(u64, window) + __field(rxrpc_seq_t, window) + __field(rxrpc_seq_t, wtop) ), TP_fast_assign( @@ -1160,7 +1161,8 @@ TRACE_EVENT(rxrpc_receive, __entry->why = why; __entry->serial = serial; __entry->seq = seq; - __entry->window = atomic64_read(&call->ackr_window); + __entry->window = call->ackr_window; + __entry->wtop = call->ackr_wtop; ), TP_printk("c=%08x %s r=%08x q=%08x w=%08x-%08x", @@ -1168,8 +1170,8 @@ TRACE_EVENT(rxrpc_receive, __print_symbolic(__entry->why, rxrpc_receive_traces), __entry->serial, __entry->seq, - lower_32_bits(__entry->window), - upper_32_bits(__entry->window)) + __entry->window, + __entry->wtop) ); TRACE_EVENT(rxrpc_recvmsg, diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h index bfae4a87626f..2ca99688f7f0 100644 --- a/net/rxrpc/ar-internal.h +++ b/net/rxrpc/ar-internal.h @@ -692,8 +692,9 @@ struct rxrpc_call { /* Receive-phase ACK management (ACKs we send). */ u8 ackr_reason; /* reason to ACK */ rxrpc_serial_t ackr_serial; /* serial of packet being ACK'd */ - atomic64_t ackr_window; /* Base (in LSW) and top (in MSW) of SACK window */ - atomic_t ackr_nr_unacked; /* Number of unacked packets */ + rxrpc_seq_t ackr_window; /* Base of SACK window */ + rxrpc_seq_t ackr_wtop; /* Base of SACK window */ + unsigned int ackr_nr_unacked; /* Number of unacked packets */ atomic_t ackr_nr_consumed; /* Number of packets needing hard ACK */ struct { #define RXRPC_SACK_SIZE 256 diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c index cf9799be4286..e363f21a2014 100644 --- a/net/rxrpc/call_event.c +++ b/net/rxrpc/call_event.c @@ -498,7 +498,7 @@ bool rxrpc_input_call_event(struct rxrpc_call *call, struct sk_buff *skb) rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0, rxrpc_propose_ack_rx_idle); - if (atomic_read(&call->ackr_nr_unacked) > 2) { + if (call->ackr_nr_unacked > 2) { if (call->peer->rtt_count < 3) rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, rxrpc_propose_ack_ping_for_rtt); diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c index 0012589f2aad..6eaffb0d8fdc 100644 --- a/net/rxrpc/call_object.c +++ b/net/rxrpc/call_object.c @@ -167,7 +167,8 @@ struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp, call->tx_total_len = -1; call->next_rx_timo = 20 * HZ; call->next_req_timo = 1 * HZ; - atomic64_set(&call->ackr_window, 0x100000001ULL); + call->ackr_window = 1; + call->ackr_wtop = 1; memset(&call->sock_node, 0xed, sizeof(call->sock_node)); diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index 367927a99881..7e65c7d5bff0 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c @@ -338,7 +338,8 @@ static void rxrpc_end_rx_phase(struct rxrpc_call *call, rxrpc_serial_t serial) static void rxrpc_input_update_ack_window(struct rxrpc_call *call, rxrpc_seq_t window, rxrpc_seq_t wtop) { - atomic64_set_release(&call->ackr_window, ((u64)wtop) << 32 | window); + call->ackr_window = window; + call->ackr_wtop = wtop; } /* @@ -367,9 +368,8 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb, struct rxrpc_skb_priv *sp = rxrpc_skb(skb); struct sk_buff *oos; rxrpc_serial_t serial = sp->hdr.serial; - u64 win = atomic64_read(&call->ackr_window); - rxrpc_seq_t window = lower_32_bits(win); - rxrpc_seq_t wtop = upper_32_bits(win); + rxrpc_seq_t window = call->ackr_window; + rxrpc_seq_t wtop = call->ackr_wtop; rxrpc_seq_t wlimit = window + call->rx_winsize - 1; rxrpc_seq_t seq = sp->hdr.seq; bool last = sp->hdr.flags & RXRPC_LAST_PACKET; @@ -419,7 +419,7 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb, else if (!skb_queue_empty(&call->rx_oos_queue)) ack_reason = RXRPC_ACK_DELAY; else - atomic_inc_return(&call->ackr_nr_unacked); + call->ackr_nr_unacked++; window++; if (after(window, wtop)) @@ -567,8 +567,8 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) rxrpc_serial_t serial = sp->hdr.serial; rxrpc_seq_t seq0 = sp->hdr.seq; - _enter("{%llx,%x},{%u,%x}", - atomic64_read(&call->ackr_window), call->rx_highest_seq, + _enter("{%x,%x,%x},{%u,%x}", + call->ackr_window, call->ackr_wtop, call->rx_highest_seq, skb->len, seq0); if (__rxrpc_call_is_complete(call)) diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 98b5d0db7761..b6bd5e6ccb4c 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c @@ -86,20 +86,18 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, unsigned int qsize; rxrpc_seq_t window, wtop, wrap_point, ix, first; int rsize; - u64 wtmp; u32 mtu, jmax; u8 *ackp = txb->acks; u8 sack_buffer[sizeof(call->ackr_sack_table)] __aligned(8); - atomic_set(&call->ackr_nr_unacked, 0); + call->ackr_nr_unacked = 0; atomic_set(&call->ackr_nr_consumed, 0); rxrpc_inc_stat(call->rxnet, stat_tx_ack_fill); /* Barrier against rxrpc_input_data(). */ retry: - wtmp = atomic64_read_acquire(&call->ackr_window); - window = lower_32_bits(wtmp); - wtop = upper_32_bits(wtmp); + window = call->ackr_window; + wtop = call->ackr_wtop; txb->ack.firstPacket = htonl(window); txb->ack.nAcks = 0; @@ -111,9 +109,8 @@ retry: */ memcpy(sack_buffer, call->ackr_sack_table, sizeof(sack_buffer)); wrap_point = window + RXRPC_SACK_SIZE - 1; - wtmp = atomic64_read_acquire(&call->ackr_window); - window = lower_32_bits(wtmp); - wtop = upper_32_bits(wtmp); + window = call->ackr_window; + wtop = call->ackr_wtop; if (after(wtop, wrap_point)) { cond_resched(); goto retry; diff --git a/net/rxrpc/proc.c b/net/rxrpc/proc.c index 750158a085cd..682636d3b060 100644 --- a/net/rxrpc/proc.c +++ b/net/rxrpc/proc.c @@ -55,7 +55,6 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) unsigned long timeout = 0; rxrpc_seq_t acks_hard_ack; char lbuff[50], rbuff[50]; - u64 wtmp; if (v == &rxnet->calls) { seq_puts(seq, @@ -83,7 +82,6 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) } acks_hard_ack = READ_ONCE(call->acks_hard_ack); - wtmp = atomic64_read_acquire(&call->ackr_window); seq_printf(seq, "UDP %-47.47s %-47.47s %4x %08x %08x %s %3u" " %-8.8s %08x %08x %08x %02x %08x %02x %08x %02x %06lx\n", @@ -98,7 +96,7 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v) call->abort_code, call->debug_id, acks_hard_ack, READ_ONCE(call->tx_top) - acks_hard_ack, - lower_32_bits(wtmp), upper_32_bits(wtmp) - lower_32_bits(wtmp), + call->ackr_window, call->ackr_wtop - call->ackr_window, call->rx_serial, call->cong_cwnd, timeout); diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c index b7545fdc0401..50d263a6359d 100644 --- a/net/rxrpc/recvmsg.c +++ b/net/rxrpc/recvmsg.c @@ -95,7 +95,7 @@ static int rxrpc_recvmsg_term(struct rxrpc_call *call, struct msghdr *msg) } trace_rxrpc_recvdata(call, rxrpc_recvmsg_terminal, - lower_32_bits(atomic64_read(&call->ackr_window)) - 1, + call->ackr_window - 1, call->rx_pkt_offset, call->rx_pkt_len, ret); return ret; } @@ -175,13 +175,13 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call, rx_pkt_len = call->rx_pkt_len; if (rxrpc_call_has_failed(call)) { - seq = lower_32_bits(atomic64_read(&call->ackr_window)) - 1; + seq = call->ackr_window - 1; ret = -EIO; goto done; } if (test_bit(RXRPC_CALL_RECVMSG_READ_ALL, &call->flags)) { - seq = lower_32_bits(atomic64_read(&call->ackr_window)) - 1; + seq = call->ackr_window - 1; ret = 1; goto done; } -- cgit From f21e93485bcbfa2753d1447b6198604a2c3d57be Mon Sep 17 00:00:00 2001 From: David Howells Date: Sun, 16 Oct 2022 08:01:32 +0100 Subject: rxrpc: Simplify ACK handling Now that general ACK transmission is done from the same thread as incoming DATA packet wrangling, there's no possibility that the SACK table will be being updated by the latter whilst the former is trying to copy it to an ACK. This means that we can safely rotate the SACK table whilst updating it without having to take a lock, rather than keeping all the bits inside it in fixed place and copying and then rotating it in the transmitter. Therefore, simplify SACK handing by keeping track of starting point in the ring and rotate slots down as we consume them. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- include/trace/events/rxrpc.h | 36 ++++++++++++++++++++++++++++++++++ net/rxrpc/ar-internal.h | 1 + net/rxrpc/input.c | 46 ++++++++++++++++++++++---------------------- net/rxrpc/output.c | 46 +++++++++++++------------------------------- 4 files changed, 73 insertions(+), 56 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index e51a84f349d8..b6adec9111e1 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -422,6 +422,13 @@ EM(RXRPC_ACK_IDLE, "IDL") \ E_(RXRPC_ACK__INVALID, "-?-") +#define rxrpc_sack_traces \ + EM(rxrpc_sack_advance, "ADV") \ + EM(rxrpc_sack_fill, "FIL") \ + EM(rxrpc_sack_nack, "NAK") \ + EM(rxrpc_sack_none, "---") \ + E_(rxrpc_sack_oos, "OOS") + #define rxrpc_completions \ EM(RXRPC_CALL_SUCCEEDED, "Succeeded") \ EM(RXRPC_CALL_REMOTELY_ABORTED, "RemoteAbort") \ @@ -497,6 +504,7 @@ enum rxrpc_recvmsg_trace { rxrpc_recvmsg_traces } __mode(byte); enum rxrpc_req_ack_trace { rxrpc_req_ack_traces } __mode(byte); enum rxrpc_rtt_rx_trace { rxrpc_rtt_rx_traces } __mode(byte); enum rxrpc_rtt_tx_trace { rxrpc_rtt_tx_traces } __mode(byte); +enum rxrpc_sack_trace { rxrpc_sack_traces } __mode(byte); enum rxrpc_skb_trace { rxrpc_skb_traces } __mode(byte); enum rxrpc_timer_trace { rxrpc_timer_traces } __mode(byte); enum rxrpc_tx_point { rxrpc_tx_points } __mode(byte); @@ -531,6 +539,7 @@ rxrpc_recvmsg_traces; rxrpc_req_ack_traces; rxrpc_rtt_rx_traces; rxrpc_rtt_tx_traces; +rxrpc_sack_traces; rxrpc_skb_traces; rxrpc_timer_traces; rxrpc_tx_points; @@ -1929,6 +1938,33 @@ TRACE_EVENT(rxrpc_call_poked, __entry->call_debug_id) ); +TRACE_EVENT(rxrpc_sack, + TP_PROTO(struct rxrpc_call *call, rxrpc_seq_t seq, + unsigned int sack, enum rxrpc_sack_trace what), + + TP_ARGS(call, seq, sack, what), + + TP_STRUCT__entry( + __field(unsigned int, call_debug_id) + __field(rxrpc_seq_t, seq) + __field(unsigned int, sack) + __field(enum rxrpc_sack_trace, what) + ), + + TP_fast_assign( + __entry->call_debug_id = call->debug_id; + __entry->seq = seq; + __entry->sack = sack; + __entry->what = what; + ), + + TP_printk("c=%08x q=%08x %s k=%x", + __entry->call_debug_id, + __entry->seq, + __print_symbolic(__entry->what, rxrpc_sack_traces), + __entry->sack) + ); + #undef EM #undef E_ diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h index 2ca99688f7f0..2b1d0d3ca064 100644 --- a/net/rxrpc/ar-internal.h +++ b/net/rxrpc/ar-internal.h @@ -691,6 +691,7 @@ struct rxrpc_call { /* Receive-phase ACK management (ACKs we send). */ u8 ackr_reason; /* reason to ACK */ + u16 ackr_sack_base; /* Starting slot in SACK table ring */ rxrpc_serial_t ackr_serial; /* serial of packet being ACK'd */ rxrpc_seq_t ackr_window; /* Base of SACK window */ rxrpc_seq_t ackr_wtop; /* Base of SACK window */ diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index 7e65c7d5bff0..d68848fce51f 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c @@ -368,6 +368,7 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb, struct rxrpc_skb_priv *sp = rxrpc_skb(skb); struct sk_buff *oos; rxrpc_serial_t serial = sp->hdr.serial; + unsigned int sack = call->ackr_sack_base; rxrpc_seq_t window = call->ackr_window; rxrpc_seq_t wtop = call->ackr_wtop; rxrpc_seq_t wlimit = window + call->rx_winsize - 1; @@ -410,9 +411,6 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb, /* Queue the packet. */ if (seq == window) { - rxrpc_seq_t reset_from; - bool reset_sack = false; - if (sp->hdr.flags & RXRPC_REQUEST_ACK) ack_reason = RXRPC_ACK_REQUESTED; /* Send an immediate ACK if we fill in a hole */ @@ -422,8 +420,14 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb, call->ackr_nr_unacked++; window++; - if (after(window, wtop)) + if (after(window, wtop)) { + trace_rxrpc_sack(call, seq, sack, rxrpc_sack_none); wtop = window; + } else { + trace_rxrpc_sack(call, seq, sack, rxrpc_sack_advance); + sack = (sack + 1) % RXRPC_SACK_SIZE; + } + rxrpc_get_skb(skb, rxrpc_skb_get_to_recvmsg); @@ -440,43 +444,39 @@ static void rxrpc_input_data_one(struct rxrpc_call *call, struct sk_buff *skb, __skb_unlink(oos, &call->rx_oos_queue); last = osp->hdr.flags & RXRPC_LAST_PACKET; seq = osp->hdr.seq; - if (!reset_sack) { - reset_from = seq; - reset_sack = true; - } + call->ackr_sack_table[sack] = 0; + trace_rxrpc_sack(call, seq, sack, rxrpc_sack_fill); + sack = (sack + 1) % RXRPC_SACK_SIZE; window++; rxrpc_input_queue_data(call, oos, window, wtop, - rxrpc_receive_queue_oos); + rxrpc_receive_queue_oos); } spin_unlock(&call->recvmsg_queue.lock); - if (reset_sack) { - do { - call->ackr_sack_table[reset_from % RXRPC_SACK_SIZE] = 0; - } while (reset_from++, before(reset_from, window)); - } + call->ackr_sack_base = sack; } else { - bool keep = false; + unsigned int slot; ack_reason = RXRPC_ACK_OUT_OF_SEQUENCE; - if (!call->ackr_sack_table[seq % RXRPC_SACK_SIZE]) { - call->ackr_sack_table[seq % RXRPC_SACK_SIZE] = 1; - keep = 1; + slot = seq - window; + sack = (sack + slot) % RXRPC_SACK_SIZE; + + if (call->ackr_sack_table[sack % RXRPC_SACK_SIZE]) { + ack_reason = RXRPC_ACK_DUPLICATE; + goto send_ack; } + call->ackr_sack_table[sack % RXRPC_SACK_SIZE] |= 1; + trace_rxrpc_sack(call, seq, sack, rxrpc_sack_oos); + if (after(seq + 1, wtop)) { wtop = seq + 1; rxrpc_input_update_ack_window(call, window, wtop); } - if (!keep) { - ack_reason = RXRPC_ACK_DUPLICATE; - goto send_ack; - } - skb_queue_walk(&call->rx_oos_queue, oos) { struct rxrpc_skb_priv *osp = rxrpc_skb(oos); diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index b6bd5e6ccb4c..c69c31470fa8 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c @@ -83,56 +83,36 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, struct rxrpc_txbuf *txb) { struct rxrpc_ackinfo ackinfo; - unsigned int qsize; - rxrpc_seq_t window, wtop, wrap_point, ix, first; + unsigned int qsize, sack, wrap, to; + rxrpc_seq_t window, wtop; int rsize; u32 mtu, jmax; u8 *ackp = txb->acks; - u8 sack_buffer[sizeof(call->ackr_sack_table)] __aligned(8); call->ackr_nr_unacked = 0; atomic_set(&call->ackr_nr_consumed, 0); rxrpc_inc_stat(call->rxnet, stat_tx_ack_fill); + clear_bit(RXRPC_CALL_RX_IS_IDLE, &call->flags); - /* Barrier against rxrpc_input_data(). */ -retry: window = call->ackr_window; wtop = call->ackr_wtop; + sack = call->ackr_sack_base % RXRPC_SACK_SIZE; txb->ack.firstPacket = htonl(window); - txb->ack.nAcks = 0; + txb->ack.nAcks = wtop - window; if (after(wtop, window)) { - /* Try to copy the SACK ring locklessly. We can use the copy, - * only if the now-current top of the window didn't go past the - * previously read base - otherwise we can't know whether we - * have old data or new data. - */ - memcpy(sack_buffer, call->ackr_sack_table, sizeof(sack_buffer)); - wrap_point = window + RXRPC_SACK_SIZE - 1; - window = call->ackr_window; - wtop = call->ackr_wtop; - if (after(wtop, wrap_point)) { - cond_resched(); - goto retry; - } - - /* The buffer is maintained as a ring with an invariant mapping - * between bit position and sequence number, so we'll probably - * need to rotate it. - */ - txb->ack.nAcks = wtop - window; - ix = window % RXRPC_SACK_SIZE; - first = sizeof(sack_buffer) - ix; + wrap = RXRPC_SACK_SIZE - sack; + to = min_t(unsigned int, txb->ack.nAcks, RXRPC_SACK_SIZE); - if (ix + txb->ack.nAcks <= RXRPC_SACK_SIZE) { - memcpy(txb->acks, sack_buffer + ix, txb->ack.nAcks); + if (sack + txb->ack.nAcks <= RXRPC_SACK_SIZE) { + memcpy(txb->acks, call->ackr_sack_table + sack, txb->ack.nAcks); } else { - memcpy(txb->acks, sack_buffer + ix, first); - memcpy(txb->acks + first, sack_buffer, - txb->ack.nAcks - first); + memcpy(txb->acks, call->ackr_sack_table + sack, wrap); + memcpy(txb->acks + wrap, call->ackr_sack_table, + to - wrap); } - ackp += txb->ack.nAcks; + ackp += to; } else if (before(wtop, window)) { pr_warn("ack window backward %x %x", window, wtop); } else if (txb->ack.reason == RXRPC_ACK_DELAY) { -- cgit From 83836eb4df75d9d0bfb1a5c508130658b8d13244 Mon Sep 17 00:00:00 2001 From: David Howells Date: Mon, 5 Dec 2022 17:38:31 +0000 Subject: rxrpc: Change rx_packet tracepoint to display securityIndex not type twice Change the rx_packet tracepoint to display the securityIndex from the packet header instead of displaying the type in numeric form. There's no need for the latter, as the display of the type in symbolic form will fall back automatically to displaying the hex value if no symbol is available. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- include/trace/events/rxrpc.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index b6adec9111e1..d7bb4acf4580 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -752,9 +752,8 @@ TRACE_EVENT(rxrpc_rx_packet, __entry->hdr.epoch, __entry->hdr.cid, __entry->hdr.callNumber, __entry->hdr.serviceId, __entry->hdr.serial, __entry->hdr.seq, - __entry->hdr.type, __entry->hdr.flags, - __entry->hdr.type <= 15 ? - __print_symbolic(__entry->hdr.type, rxrpc_pkts) : "?UNK") + __entry->hdr.securityIndex, __entry->hdr.flags, + __print_symbolic(__entry->hdr.type, rxrpc_pkts)) ); TRACE_EVENT(rxrpc_rx_done, -- cgit From d47230a3480a5f6df98c5870ba26843850a600d5 Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Thu, 2 Feb 2023 18:59:24 +0100 Subject: net: bridge: Add a tracepoint for MDB overflows The following patch will add two more maximum MDB allowances to the global one, mcast_hash_max, that exists today. In all these cases, attempts to add MDB entries above the configured maximums through netlink, fail noisily and obviously. Such visibility is missing when adding entries through the control plane traffic, by IGMP or MLD packets. To improve visibility in those cases, add a trace point that reports the violation, including the relevant netdevice (be it a slave or the bridge itself), and the MDB entry parameters: # perf record -e bridge:br_mdb_full & # [...] # perf script | cut -d: -f4- dev v2 af 2 src ::ffff:0.0.0.0 grp ::ffff:239.1.1.112/00:00:00:00:00:00 vid 0 dev v2 af 10 src :: grp ff0e::112/00:00:00:00:00:00 vid 0 dev v2 af 2 src ::ffff:0.0.0.0 grp ::ffff:239.1.1.112/00:00:00:00:00:00 vid 10 dev v2 af 10 src 2001:db8:1::1 grp ff0e::1/00:00:00:00:00:00 vid 10 dev v2 af 2 src ::ffff:192.0.2.1 grp ::ffff:239.1.1.1/00:00:00:00:00:00 vid 10 CC: Steven Rostedt CC: linux-trace-kernel@vger.kernel.org Signed-off-by: Petr Machata Reviewed-by: Steven Rostedt (Google) Acked-by: Nikolay Aleksandrov Signed-off-by: David S. Miller --- include/trace/events/bridge.h | 58 +++++++++++++++++++++++++++++++++++++++++++ net/core/net-traces.c | 1 + 2 files changed, 59 insertions(+) (limited to 'include/trace') diff --git a/include/trace/events/bridge.h b/include/trace/events/bridge.h index 6b200059c2c5..a6b3a4e409f0 100644 --- a/include/trace/events/bridge.h +++ b/include/trace/events/bridge.h @@ -122,6 +122,64 @@ TRACE_EVENT(br_fdb_update, __entry->flags) ); +TRACE_EVENT(br_mdb_full, + + TP_PROTO(const struct net_device *dev, + const struct br_ip *group), + + TP_ARGS(dev, group), + + TP_STRUCT__entry( + __string(dev, dev->name) + __field(int, af) + __field(u16, vid) + __array(__u8, src, 16) + __array(__u8, grp, 16) + __array(__u8, grpmac, ETH_ALEN) /* For af == 0. */ + ), + + TP_fast_assign( + struct in6_addr *in6; + + __assign_str(dev, dev->name); + __entry->vid = group->vid; + + if (!group->proto) { + __entry->af = 0; + + memset(__entry->src, 0, sizeof(__entry->src)); + memset(__entry->grp, 0, sizeof(__entry->grp)); + memcpy(__entry->grpmac, group->dst.mac_addr, ETH_ALEN); + } else if (group->proto == htons(ETH_P_IP)) { + __entry->af = AF_INET; + + in6 = (struct in6_addr *)__entry->src; + ipv6_addr_set_v4mapped(group->src.ip4, in6); + + in6 = (struct in6_addr *)__entry->grp; + ipv6_addr_set_v4mapped(group->dst.ip4, in6); + + memset(__entry->grpmac, 0, ETH_ALEN); + +#if IS_ENABLED(CONFIG_IPV6) + } else { + __entry->af = AF_INET6; + + in6 = (struct in6_addr *)__entry->src; + *in6 = group->src.ip6; + + in6 = (struct in6_addr *)__entry->grp; + *in6 = group->dst.ip6; + + memset(__entry->grpmac, 0, ETH_ALEN); +#endif + } + ), + + TP_printk("dev %s af %u src %pI6c grp %pI6c/%pM vid %u", + __get_str(dev), __entry->af, __entry->src, __entry->grp, + __entry->grpmac, __entry->vid) +); #endif /* _TRACE_BRIDGE_H */ diff --git a/net/core/net-traces.c b/net/core/net-traces.c index ee7006bbe49b..805b7385dd8d 100644 --- a/net/core/net-traces.c +++ b/net/core/net-traces.c @@ -41,6 +41,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(br_fdb_add); EXPORT_TRACEPOINT_SYMBOL_GPL(br_fdb_external_learn_add); EXPORT_TRACEPOINT_SYMBOL_GPL(fdb_delete); EXPORT_TRACEPOINT_SYMBOL_GPL(br_fdb_update); +EXPORT_TRACEPOINT_SYMBOL_GPL(br_mdb_full); #endif #if IS_ENABLED(CONFIG_PAGE_POOL) -- cgit From f789bff2deb3ddae08950f8e4a1e6f41b916c520 Mon Sep 17 00:00:00 2001 From: David Howells Date: Tue, 31 Jan 2023 15:31:49 +0000 Subject: rxrpc: Trace ack.rwind Log ack.rwind in the rxrpc_tx_ack tracepoint. This value is useful to see as it represents flow-control information to the peer. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- include/trace/events/rxrpc.h | 11 +++++++---- net/rxrpc/conn_event.c | 2 +- net/rxrpc/output.c | 10 +++++++--- 3 files changed, 15 insertions(+), 8 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index d7bb4acf4580..c3c0b0aa8381 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -1118,9 +1118,9 @@ TRACE_EVENT(rxrpc_tx_data, TRACE_EVENT(rxrpc_tx_ack, TP_PROTO(unsigned int call, rxrpc_serial_t serial, rxrpc_seq_t ack_first, rxrpc_serial_t ack_serial, - u8 reason, u8 n_acks), + u8 reason, u8 n_acks, u16 rwind), - TP_ARGS(call, serial, ack_first, ack_serial, reason, n_acks), + TP_ARGS(call, serial, ack_first, ack_serial, reason, n_acks, rwind), TP_STRUCT__entry( __field(unsigned int, call) @@ -1129,6 +1129,7 @@ TRACE_EVENT(rxrpc_tx_ack, __field(rxrpc_serial_t, ack_serial) __field(u8, reason) __field(u8, n_acks) + __field(u16, rwind) ), TP_fast_assign( @@ -1138,15 +1139,17 @@ TRACE_EVENT(rxrpc_tx_ack, __entry->ack_serial = ack_serial; __entry->reason = reason; __entry->n_acks = n_acks; + __entry->rwind = rwind; ), - TP_printk(" c=%08x ACK %08x %s f=%08x r=%08x n=%u", + TP_printk(" c=%08x ACK %08x %s f=%08x r=%08x n=%u rw=%u", __entry->call, __entry->serial, __print_symbolic(__entry->reason, rxrpc_ack_names), __entry->ack_first, __entry->ack_serial, - __entry->n_acks) + __entry->n_acks, + __entry->rwind) ); TRACE_EVENT(rxrpc_receive, diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c index 44414e724415..95f4bc206b3d 100644 --- a/net/rxrpc/conn_event.c +++ b/net/rxrpc/conn_event.c @@ -163,7 +163,7 @@ void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn, trace_rxrpc_tx_ack(chan->call_debug_id, serial, ntohl(pkt.ack.firstPacket), ntohl(pkt.ack.serial), - pkt.ack.reason, 0); + pkt.ack.reason, 0, rxrpc_rx_window_size); break; default: diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 6b2022240076..5e53429c6922 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c @@ -80,7 +80,8 @@ static void rxrpc_set_keepalive(struct rxrpc_call *call) */ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, struct rxrpc_call *call, - struct rxrpc_txbuf *txb) + struct rxrpc_txbuf *txb, + u16 *_rwind) { struct rxrpc_ackinfo ackinfo; unsigned int qsize, sack, wrap, to; @@ -124,6 +125,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, jmax = rxrpc_rx_jumbo_max; qsize = (window - 1) - call->rx_consumed; rsize = max_t(int, call->rx_winsize - qsize, 0); + *_rwind = rsize; ackinfo.rxMTU = htonl(rxrpc_rx_mtu); ackinfo.maxMTU = htonl(mtu); ackinfo.rwind = htonl(rsize); @@ -190,6 +192,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) rxrpc_serial_t serial; size_t len, n; int ret, rtt_slot = -1; + u16 rwind; if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) return -ECONNRESET; @@ -205,7 +208,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) if (txb->ack.reason == RXRPC_ACK_PING) txb->wire.flags |= RXRPC_REQUEST_ACK; - n = rxrpc_fill_out_ack(conn, call, txb); + n = rxrpc_fill_out_ack(conn, call, txb, &rwind); if (n == 0) return 0; @@ -217,7 +220,8 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) txb->wire.serial = htonl(serial); trace_rxrpc_tx_ack(call->debug_id, serial, ntohl(txb->ack.firstPacket), - ntohl(txb->ack.serial), txb->ack.reason, txb->ack.nAcks); + ntohl(txb->ack.serial), txb->ack.reason, txb->ack.nAcks, + rwind); if (txb->ack.reason == RXRPC_ACK_PING) rtt_slot = rxrpc_begin_rtt_probe(call, serial, rxrpc_rtt_tx_ping); -- cgit From d0ab772c1f1558af84f3293a52e9e886e08e0754 Mon Sep 17 00:00:00 2001 From: Moshe Shemesh Date: Tue, 14 Feb 2023 18:38:06 +0200 Subject: devlink: Fix TP_STRUCT_entry in trace of devlink health report Fix a bug in trace point definition for devlink health report, as TP_STRUCT_entry of reporter_name should get reporter_name and not msg. Note no fixes tag as this is a harmless bug as both reporter_name and msg are strings and TP_fast_assign for this entry is correct. Signed-off-by: Moshe Shemesh Reviewed-by: Jiri Pirko Signed-off-by: Jakub Kicinski --- include/trace/events/devlink.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include/trace') diff --git a/include/trace/events/devlink.h b/include/trace/events/devlink.h index 24969184c534..77ff7cfc6049 100644 --- a/include/trace/events/devlink.h +++ b/include/trace/events/devlink.h @@ -88,7 +88,7 @@ TRACE_EVENT(devlink_health_report, __string(bus_name, devlink_to_dev(devlink)->bus->name) __string(dev_name, dev_name(devlink_to_dev(devlink))) __string(driver_name, devlink_to_dev(devlink)->driver->name) - __string(reporter_name, msg) + __string(reporter_name, reporter_name) __string(msg, msg) ), -- cgit From c078381856230f1e8e13738661d83c2b4b433819 Mon Sep 17 00:00:00 2001 From: David Howells Date: Wed, 15 Feb 2023 21:48:05 +0000 Subject: rxrpc: Fix overproduction of wakeups to recvmsg() Fix three cases of overproduction of wakeups: (1) rxrpc_input_split_jumbo() conditionally notifies the app that there's data for recvmsg() to collect if it queues some data - and then its only caller, rxrpc_input_data(), goes and wakes up recvmsg() anyway. Fix the rxrpc_input_data() to only do the wakeup in failure cases. (2) If a DATA packet is received for a call by the I/O thread whilst recvmsg() is busy draining the call's rx queue in the app thread, the call will left on the recvmsg() queue for recvmsg() to pick up, even though there isn't any data on it. This can cause an unexpected recvmsg() with a 0 return and no MSG_EOR set after the reply has been posted to a service call. Fix this by discarding pending calls from the recvmsg() queue that don't need servicing yet. (3) Not-yet-completed calls get requeued after having data read from them, even if they have no data to read. Fix this by only requeuing them if they have data waiting on them; if they don't, the I/O thread will requeue them when data arrives or they fail. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org Link: https://lore.kernel.org/r/3386149.1676497685@warthog.procyon.org.uk Signed-off-by: Paolo Abeni --- include/trace/events/rxrpc.h | 1 + net/rxrpc/input.c | 2 +- net/rxrpc/recvmsg.c | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h index c3c0b0aa8381..4c53a5ef6257 100644 --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -318,6 +318,7 @@ EM(rxrpc_recvmsg_return, "RETN") \ EM(rxrpc_recvmsg_terminal, "TERM") \ EM(rxrpc_recvmsg_to_be_accepted, "TBAC") \ + EM(rxrpc_recvmsg_unqueue, "UNQU") \ E_(rxrpc_recvmsg_wait, "WAIT") #define rxrpc_rtt_tx_traces \ diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index d68848fce51f..030d64f282f3 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c @@ -606,7 +606,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) rxrpc_proto_abort(call, sp->hdr.seq, rxrpc_badmsg_bad_jumbo); goto out_notify; } - skb = NULL; + return; out_notify: trace_rxrpc_notify_socket(call->debug_id, serial); diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c index 76eb2b9cd936..a482f88c5fc5 100644 --- a/net/rxrpc/recvmsg.c +++ b/net/rxrpc/recvmsg.c @@ -334,10 +334,23 @@ try_again: /* Find the next call and dequeue it if we're not just peeking. If we * do dequeue it, that comes with a ref that we will need to release. + * We also want to weed out calls that got requeued whilst we were + * shovelling data out. */ spin_lock(&rx->recvmsg_lock); l = rx->recvmsg_q.next; call = list_entry(l, struct rxrpc_call, recvmsg_link); + + if (!rxrpc_call_is_complete(call) && + skb_queue_empty(&call->recvmsg_queue)) { + list_del_init(&call->recvmsg_link); + spin_unlock(&rx->recvmsg_lock); + release_sock(&rx->sk); + trace_rxrpc_recvmsg(call->debug_id, rxrpc_recvmsg_unqueue, 0); + rxrpc_put_call(call, rxrpc_call_put_recvmsg); + goto try_again; + } + if (!(flags & MSG_PEEK)) list_del_init(&call->recvmsg_link); else @@ -402,7 +415,8 @@ try_again: if (rxrpc_call_has_failed(call)) goto call_failed; - rxrpc_notify_socket(call); + if (!skb_queue_empty(&call->recvmsg_queue)) + rxrpc_notify_socket(call); goto not_yet_complete; call_failed: -- cgit From dd1b527831a3ed659afa01b672d8e1f7e6ca95a5 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Thu, 16 Feb 2023 15:47:18 +0000 Subject: net: add location to trace_consume_skb() kfree_skb() includes the location, it makes sense to add it to consume_skb() as well. After patch: taskd_EventMana 8602 [004] 420.406239: skb:consume_skb: skbaddr=0xffff893a4a6d0500 location=unix_stream_read_generic swapper 0 [011] 422.732607: skb:consume_skb: skbaddr=0xffff89597f68cee0 location=mlx4_en_free_tx_desc discipline 9141 [043] 423.065653: skb:consume_skb: skbaddr=0xffff893a487e9c00 location=skb_consume_udp swapper 0 [010] 423.073166: skb:consume_skb: skbaddr=0xffff8949ce9cdb00 location=icmpv6_rcv borglet 8672 [014] 425.628256: skb:consume_skb: skbaddr=0xffff8949c42e9400 location=netlink_dump swapper 0 [028] 426.263317: skb:consume_skb: skbaddr=0xffff893b1589dce0 location=net_rx_action wget 14339 [009] 426.686380: skb:consume_skb: skbaddr=0xffff893a51b552e0 location=tcp_rcv_state_process Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller --- include/trace/events/skb.h | 10 ++++++---- net/core/dev.c | 2 +- net/core/skbuff.c | 8 ++++---- 3 files changed, 11 insertions(+), 9 deletions(-) (limited to 'include/trace') diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h index 25ab1ff9423d..07e0715628ec 100644 --- a/include/trace/events/skb.h +++ b/include/trace/events/skb.h @@ -53,19 +53,21 @@ TRACE_EVENT(kfree_skb, TRACE_EVENT(consume_skb, - TP_PROTO(struct sk_buff *skb), + TP_PROTO(struct sk_buff *skb, void *location), - TP_ARGS(skb), + TP_ARGS(skb, location), TP_STRUCT__entry( - __field( void *, skbaddr ) + __field( void *, skbaddr) + __field( void *, location) ), TP_fast_assign( __entry->skbaddr = skb; + __entry->location = location; ), - TP_printk("skbaddr=%p", __entry->skbaddr) + TP_printk("skbaddr=%p location=%pS", __entry->skbaddr, __entry->location) ); TRACE_EVENT(skb_copy_datagram_iovec, diff --git a/net/core/dev.c b/net/core/dev.c index 5687b528d4c1..18dc8d75ead9 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -5019,7 +5019,7 @@ static __latent_entropy void net_tx_action(struct softirq_action *h) WARN_ON(refcount_read(&skb->users)); if (likely(get_kfree_skb_cb(skb)->reason == SKB_REASON_CONSUMED)) - trace_consume_skb(skb); + trace_consume_skb(skb, net_tx_action); else trace_kfree_skb(skb, net_tx_action, SKB_DROP_REASON_NOT_SPECIFIED); diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 98ebce9f6a51..eb7d33b41e71 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -991,7 +991,7 @@ bool __kfree_skb_reason(struct sk_buff *skb, enum skb_drop_reason reason) DEBUG_NET_WARN_ON_ONCE(reason <= 0 || reason >= SKB_DROP_REASON_MAX); if (reason == SKB_CONSUMED) - trace_consume_skb(skb); + trace_consume_skb(skb, __builtin_return_address(0)); else trace_kfree_skb(skb, __builtin_return_address(0), reason); return true; @@ -1189,7 +1189,7 @@ void consume_skb(struct sk_buff *skb) if (!skb_unref(skb)) return; - trace_consume_skb(skb); + trace_consume_skb(skb, __builtin_return_address(0)); __kfree_skb(skb); } EXPORT_SYMBOL(consume_skb); @@ -1204,7 +1204,7 @@ EXPORT_SYMBOL(consume_skb); */ void __consume_stateless_skb(struct sk_buff *skb) { - trace_consume_skb(skb); + trace_consume_skb(skb, __builtin_return_address(0)); skb_release_data(skb, SKB_CONSUMED); kfree_skbmem(skb); } @@ -1260,7 +1260,7 @@ void napi_consume_skb(struct sk_buff *skb, int budget) return; /* if reaching here SKB is ready to free */ - trace_consume_skb(skb); + trace_consume_skb(skb, __builtin_return_address(0)); /* if SKB is a clone, don't handle this case */ if (skb->fclone != SKB_FCLONE_UNAVAILABLE) { -- cgit