mctp: Add tracepoints for tag/key handling
The tag allocation, release and bind events are somewhat opaque outside the kernel; this change adds a few tracepoints to assist in instrumentation and debugging. Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7b14e15ae6
commit
4f9e1ba6de
75
include/trace/events/mctp.h
Normal file
75
include/trace/events/mctp.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
|
||||||
|
#undef TRACE_SYSTEM
|
||||||
|
#define TRACE_SYSTEM mctp
|
||||||
|
|
||||||
|
#if !defined(_TRACE_MCTP_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||||
|
#define _TRACE_MCTP_H
|
||||||
|
|
||||||
|
#include <linux/tracepoint.h>
|
||||||
|
|
||||||
|
#ifndef __TRACE_MCTP_ENUMS
|
||||||
|
#define __TRACE_MCTP_ENUMS
|
||||||
|
enum {
|
||||||
|
MCTP_TRACE_KEY_TIMEOUT,
|
||||||
|
MCTP_TRACE_KEY_REPLIED,
|
||||||
|
MCTP_TRACE_KEY_INVALIDATED,
|
||||||
|
MCTP_TRACE_KEY_CLOSED,
|
||||||
|
};
|
||||||
|
#endif /* __TRACE_MCTP_ENUMS */
|
||||||
|
|
||||||
|
TRACE_DEFINE_ENUM(MCTP_TRACE_KEY_TIMEOUT);
|
||||||
|
TRACE_DEFINE_ENUM(MCTP_TRACE_KEY_REPLIED);
|
||||||
|
TRACE_DEFINE_ENUM(MCTP_TRACE_KEY_INVALIDATED);
|
||||||
|
TRACE_DEFINE_ENUM(MCTP_TRACE_KEY_CLOSED);
|
||||||
|
|
||||||
|
TRACE_EVENT(mctp_key_acquire,
|
||||||
|
TP_PROTO(const struct mctp_sk_key *key),
|
||||||
|
TP_ARGS(key),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(__u8, paddr)
|
||||||
|
__field(__u8, laddr)
|
||||||
|
__field(__u8, tag)
|
||||||
|
),
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->paddr = key->peer_addr;
|
||||||
|
__entry->laddr = key->local_addr;
|
||||||
|
__entry->tag = key->tag;
|
||||||
|
),
|
||||||
|
TP_printk("local %d, peer %d, tag %1x",
|
||||||
|
__entry->laddr,
|
||||||
|
__entry->paddr,
|
||||||
|
__entry->tag
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(mctp_key_release,
|
||||||
|
TP_PROTO(const struct mctp_sk_key *key, int reason),
|
||||||
|
TP_ARGS(key, reason),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(__u8, paddr)
|
||||||
|
__field(__u8, laddr)
|
||||||
|
__field(__u8, tag)
|
||||||
|
__field(int, reason)
|
||||||
|
),
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->paddr = key->peer_addr;
|
||||||
|
__entry->laddr = key->local_addr;
|
||||||
|
__entry->tag = key->tag;
|
||||||
|
__entry->reason = reason;
|
||||||
|
),
|
||||||
|
TP_printk("local %d, peer %d, tag %1x %s",
|
||||||
|
__entry->laddr,
|
||||||
|
__entry->paddr,
|
||||||
|
__entry->tag,
|
||||||
|
__print_symbolic(__entry->reason,
|
||||||
|
{ MCTP_TRACE_KEY_TIMEOUT, "timeout" },
|
||||||
|
{ MCTP_TRACE_KEY_REPLIED, "replied" },
|
||||||
|
{ MCTP_TRACE_KEY_INVALIDATED, "invalidated" },
|
||||||
|
{ MCTP_TRACE_KEY_CLOSED, "closed" })
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <trace/define_trace.h>
|
@ -16,6 +16,9 @@
|
|||||||
#include <net/mctpdevice.h>
|
#include <net/mctpdevice.h>
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
|
|
||||||
|
#define CREATE_TRACE_POINTS
|
||||||
|
#include <trace/events/mctp.h>
|
||||||
|
|
||||||
/* socket implementation */
|
/* socket implementation */
|
||||||
|
|
||||||
static int mctp_release(struct socket *sock)
|
static int mctp_release(struct socket *sock)
|
||||||
@ -239,6 +242,7 @@ static void mctp_sk_expire_keys(struct timer_list *timer)
|
|||||||
spin_lock(&key->lock);
|
spin_lock(&key->lock);
|
||||||
|
|
||||||
if (!time_after_eq(key->expiry, jiffies)) {
|
if (!time_after_eq(key->expiry, jiffies)) {
|
||||||
|
trace_mctp_key_release(key, MCTP_TRACE_KEY_TIMEOUT);
|
||||||
key->valid = false;
|
key->valid = false;
|
||||||
hlist_del_rcu(&key->hlist);
|
hlist_del_rcu(&key->hlist);
|
||||||
hlist_del_rcu(&key->sklist);
|
hlist_del_rcu(&key->sklist);
|
||||||
@ -310,6 +314,8 @@ static void mctp_sk_unhash(struct sock *sk)
|
|||||||
hlist_del(&key->sklist);
|
hlist_del(&key->sklist);
|
||||||
hlist_del(&key->hlist);
|
hlist_del(&key->hlist);
|
||||||
|
|
||||||
|
trace_mctp_key_release(key, MCTP_TRACE_KEY_CLOSED);
|
||||||
|
|
||||||
spin_lock(&key->lock);
|
spin_lock(&key->lock);
|
||||||
if (key->reasm_head)
|
if (key->reasm_head)
|
||||||
kfree_skb(key->reasm_head);
|
kfree_skb(key->reasm_head);
|
||||||
|
@ -23,10 +23,11 @@
|
|||||||
#include <net/netlink.h>
|
#include <net/netlink.h>
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
|
|
||||||
|
#include <trace/events/mctp.h>
|
||||||
|
|
||||||
static const unsigned int mctp_message_maxlen = 64 * 1024;
|
static const unsigned int mctp_message_maxlen = 64 * 1024;
|
||||||
static const unsigned long mctp_key_lifetime = 6 * CONFIG_HZ;
|
static const unsigned long mctp_key_lifetime = 6 * CONFIG_HZ;
|
||||||
|
|
||||||
|
|
||||||
/* route output callbacks */
|
/* route output callbacks */
|
||||||
static int mctp_route_discard(struct mctp_route *route, struct sk_buff *skb)
|
static int mctp_route_discard(struct mctp_route *route, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
@ -332,6 +333,8 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)
|
|||||||
/* we've hit a pending reassembly; not much we
|
/* we've hit a pending reassembly; not much we
|
||||||
* can do but drop it
|
* can do but drop it
|
||||||
*/
|
*/
|
||||||
|
trace_mctp_key_release(key,
|
||||||
|
MCTP_TRACE_KEY_REPLIED);
|
||||||
__mctp_key_unlock_drop(key, net, f);
|
__mctp_key_unlock_drop(key, net, f);
|
||||||
key = NULL;
|
key = NULL;
|
||||||
}
|
}
|
||||||
@ -365,12 +368,16 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)
|
|||||||
if (rc)
|
if (rc)
|
||||||
kfree(key);
|
kfree(key);
|
||||||
|
|
||||||
|
trace_mctp_key_acquire(key);
|
||||||
|
|
||||||
/* we don't need to release key->lock on exit */
|
/* we don't need to release key->lock on exit */
|
||||||
key = NULL;
|
key = NULL;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (key->reasm_head || key->reasm_dead) {
|
if (key->reasm_head || key->reasm_dead) {
|
||||||
/* duplicate start? drop everything */
|
/* duplicate start? drop everything */
|
||||||
|
trace_mctp_key_release(key,
|
||||||
|
MCTP_TRACE_KEY_INVALIDATED);
|
||||||
__mctp_key_unlock_drop(key, net, f);
|
__mctp_key_unlock_drop(key, net, f);
|
||||||
rc = -EEXIST;
|
rc = -EEXIST;
|
||||||
key = NULL;
|
key = NULL;
|
||||||
@ -396,6 +403,7 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)
|
|||||||
if (!rc && flags & MCTP_HDR_FLAG_EOM) {
|
if (!rc && flags & MCTP_HDR_FLAG_EOM) {
|
||||||
sock_queue_rcv_skb(key->sk, key->reasm_head);
|
sock_queue_rcv_skb(key->sk, key->reasm_head);
|
||||||
key->reasm_head = NULL;
|
key->reasm_head = NULL;
|
||||||
|
trace_mctp_key_release(key, MCTP_TRACE_KEY_REPLIED);
|
||||||
__mctp_key_unlock_drop(key, net, f);
|
__mctp_key_unlock_drop(key, net, f);
|
||||||
key = NULL;
|
key = NULL;
|
||||||
}
|
}
|
||||||
@ -572,6 +580,8 @@ static int mctp_alloc_local_tag(struct mctp_sock *msk,
|
|||||||
if (tagbits) {
|
if (tagbits) {
|
||||||
key->tag = __ffs(tagbits);
|
key->tag = __ffs(tagbits);
|
||||||
mctp_reserve_tag(net, key, msk);
|
mctp_reserve_tag(net, key, msk);
|
||||||
|
trace_mctp_key_acquire(key);
|
||||||
|
|
||||||
*tagp = key->tag;
|
*tagp = key->tag;
|
||||||
rc = 0;
|
rc = 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user