Commit 49142d12 authored by Subbaraya Sundeep's avatar Subbaraya Sundeep Committed by David S. Miller

octeontx2-af: Introduce tracepoints for mailbox

Added tracepoints in mailbox code so that
the mailbox operations like message allocation,
sending message and message interrupts are traced.
Also the mailbox errors occurred like timeout
or wrong responses are traced.
These will help in debugging mailbox issues.

Here's an example output showing one of the mailbox
messages sent by PF to AF and AF responding to it:

~# mount -t tracefs none /sys/kernel/tracing/
~# echo 1 > /sys/kernel/tracing/events/rvu/enable
~# ifconfig eth0 up
~# cat /sys/kernel/tracing/trace

~# cat /sys/kernel/tracing/trace
 tracer: nop

		      _-----=> irqs-off
		     / _----=> need-resched
		    | / _---=> hardirq/softirq
		    || / _--=> preempt-depth
		    ||| /     delay
   TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
      | |       |   ||||       |         |
ifconfig-2382  [002] ....   756.161892: otx2_msg_alloc: [0002:02:00.0] msg:(0x400) size:40

ifconfig-2382  [002] ...1   756.161895: otx2_msg_send: [0002:02:00.0] sent 1 msg(s) of size:48

 <idle>-0     [000] d.h1   756.161902: otx2_msg_interrupt: [0002:01:00.0] mbox interrupt PF(s) to AF (0x2)

kworker/u49:0-1165  [000] ....   756.162049: otx2_msg_process: [0002:01:00.0] msg:(0x400) error:0

kworker/u49:0-1165  [000] ...1   756.162051: otx2_msg_send: [0002:01:00.0] sent 1 msg(s) of size:32

kworker/u49:0-1165  [000] d.h.   756.162056: otx2_msg_interrupt: [0002:02:00.0] mbox interrupt AF to PF (0x1)
Signed-off-by: default avatarSubbaraya Sundeep <sbhatta@marvell.com>
Signed-off-by: default avatarSunil Goutham <sgoutham@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 36493269
......@@ -3,9 +3,10 @@
# Makefile for Marvell's OcteonTX2 RVU Admin Function driver
#
ccflags-y += -I$(src)
obj-$(CONFIG_OCTEONTX2_MBOX) += octeontx2_mbox.o
obj-$(CONFIG_OCTEONTX2_AF) += octeontx2_af.o
octeontx2_mbox-y := mbox.o
octeontx2_mbox-y := mbox.o rvu_trace.o
octeontx2_af-y := cgx.o rvu.o rvu_cgx.o rvu_npa.o rvu_nix.o \
rvu_reg.o rvu_npc.o rvu_debugfs.o ptp.o
......@@ -14,6 +14,7 @@
#include "rvu_reg.h"
#include "mbox.h"
#include "rvu_trace.h"
static const u16 msgs_offset = ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
......@@ -199,6 +200,9 @@ void otx2_mbox_msg_send(struct otx2_mbox *mbox, int devid)
*/
tx_hdr->num_msgs = mdev->num_msgs;
rx_hdr->num_msgs = 0;
trace_otx2_msg_send(mbox->pdev, tx_hdr->num_msgs, tx_hdr->msg_size);
spin_unlock(&mdev->mbox_lock);
/* The interrupt should be fired after num_msgs is written
......@@ -295,10 +299,15 @@ int otx2_mbox_check_rsp_msgs(struct otx2_mbox *mbox, int devid)
struct mbox_msghdr *preq = mdev->mbase + ireq;
struct mbox_msghdr *prsp = mdev->mbase + irsp;
if (preq->id != prsp->id)
if (preq->id != prsp->id) {
trace_otx2_msg_check(mbox->pdev, preq->id,
prsp->id, prsp->rc);
goto exit;
}
if (prsp->rc) {
rc = prsp->rc;
trace_otx2_msg_check(mbox->pdev, preq->id,
prsp->id, prsp->rc);
goto exit;
}
......
......@@ -20,6 +20,8 @@
#include "rvu_reg.h"
#include "ptp.h"
#include "rvu_trace.h"
#define DRV_NAME "octeontx2-af"
#define DRV_STRING "Marvell OcteonTX2 RVU Admin Function Driver"
......@@ -1549,6 +1551,7 @@ static int rvu_process_mbox_msg(struct otx2_mbox *mbox, int devid,
if (rsp && err) \
rsp->hdr.rc = err; \
\
trace_otx2_msg_process(mbox->pdev, _id, err); \
return rsp ? err : -ENOMEM; \
}
MBOX_MESSAGES
......@@ -1881,6 +1884,8 @@ static irqreturn_t rvu_mbox_intr_handler(int irq, void *rvu_irq)
intr = rvu_read64(rvu, BLKADDR_RVUM, RVU_AF_PFAF_MBOX_INT);
/* Clear interrupts */
rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_PFAF_MBOX_INT, intr);
if (intr)
trace_otx2_msg_interrupt(rvu->pdev, "PF(s) to AF", intr);
/* Sync with mbox memory region */
rmb();
......@@ -1898,6 +1903,8 @@ static irqreturn_t rvu_mbox_intr_handler(int irq, void *rvu_irq)
intr = rvupf_read64(rvu, RVU_PF_VFPF_MBOX_INTX(0));
rvupf_write64(rvu, RVU_PF_VFPF_MBOX_INTX(0), intr);
if (intr)
trace_otx2_msg_interrupt(rvu->pdev, "VF(s) to AF", intr);
rvu_queue_work(&rvu->afvf_wq_info, 0, vfs, intr);
......
......@@ -15,6 +15,7 @@
#include "rvu.h"
#include "cgx.h"
#include "rvu_reg.h"
#include "rvu_trace.h"
struct cgx_evq_entry {
struct list_head evq_node;
......@@ -34,6 +35,7 @@ static struct _req_type __maybe_unused \
return NULL; \
req->hdr.sig = OTX2_MBOX_REQ_SIG; \
req->hdr.id = _id; \
trace_otx2_msg_alloc(rvu->pdev, _id, sizeof(*req)); \
return req; \
}
......
// SPDX-License-Identifier: GPL-2.0
/* Marvell OcteonTx2 RVU Admin Function driver tracepoints
*
* Copyright (C) 2020 Marvell International Ltd.
*/
#define CREATE_TRACE_POINTS
#include "rvu_trace.h"
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_alloc);
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_interrupt);
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_process);
/* SPDX-License-Identifier: GPL-2.0 */
/* Marvell OcteonTx2 RVU Admin Function driver tracepoints
*
* Copyright (C) 2020 Marvell International Ltd.
*/
#undef TRACE_SYSTEM
#define TRACE_SYSTEM rvu
#if !defined(__RVU_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
#define __RVU_TRACE_H
#include <linux/types.h>
#include <linux/tracepoint.h>
#include <linux/pci.h>
TRACE_EVENT(otx2_msg_alloc,
TP_PROTO(const struct pci_dev *pdev, u16 id, u64 size),
TP_ARGS(pdev, id, size),
TP_STRUCT__entry(__string(dev, pci_name(pdev))
__field(u16, id)
__field(u64, size)
),
TP_fast_assign(__assign_str(dev, pci_name(pdev))
__entry->id = id;
__entry->size = size;
),
TP_printk("[%s] msg:(0x%x) size:%lld\n", __get_str(dev),
__entry->id, __entry->size)
);
TRACE_EVENT(otx2_msg_send,
TP_PROTO(const struct pci_dev *pdev, u16 num_msgs, u64 msg_size),
TP_ARGS(pdev, num_msgs, msg_size),
TP_STRUCT__entry(__string(dev, pci_name(pdev))
__field(u16, num_msgs)
__field(u64, msg_size)
),
TP_fast_assign(__assign_str(dev, pci_name(pdev))
__entry->num_msgs = num_msgs;
__entry->msg_size = msg_size;
),
TP_printk("[%s] sent %d msg(s) of size:%lld\n", __get_str(dev),
__entry->num_msgs, __entry->msg_size)
);
TRACE_EVENT(otx2_msg_check,
TP_PROTO(const struct pci_dev *pdev, u16 reqid, u16 rspid, int rc),
TP_ARGS(pdev, reqid, rspid, rc),
TP_STRUCT__entry(__string(dev, pci_name(pdev))
__field(u16, reqid)
__field(u16, rspid)
__field(int, rc)
),
TP_fast_assign(__assign_str(dev, pci_name(pdev))
__entry->reqid = reqid;
__entry->rspid = rspid;
__entry->rc = rc;
),
TP_printk("[%s] req->id:0x%x rsp->id:0x%x resp_code:%d\n",
__get_str(dev), __entry->reqid,
__entry->rspid, __entry->rc)
);
TRACE_EVENT(otx2_msg_interrupt,
TP_PROTO(const struct pci_dev *pdev, const char *msg, u64 intr),
TP_ARGS(pdev, msg, intr),
TP_STRUCT__entry(__string(dev, pci_name(pdev))
__string(str, msg)
__field(u64, intr)
),
TP_fast_assign(__assign_str(dev, pci_name(pdev))
__assign_str(str, msg)
__entry->intr = intr;
),
TP_printk("[%s] mbox interrupt %s (0x%llx)\n", __get_str(dev),
__get_str(str), __entry->intr)
);
TRACE_EVENT(otx2_msg_process,
TP_PROTO(const struct pci_dev *pdev, u16 id, int err),
TP_ARGS(pdev, id, err),
TP_STRUCT__entry(__string(dev, pci_name(pdev))
__field(u16, id)
__field(int, err)
),
TP_fast_assign(__assign_str(dev, pci_name(pdev))
__entry->id = id;
__entry->err = err;
),
TP_printk("[%s] msg:(0x%x) error:%d\n", __get_str(dev),
__entry->id, __entry->err)
);
#endif /* __RVU_TRACE_H */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE rvu_trace
#include <trace/define_trace.h>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment