Commit 35e3dbfa authored by David S. Miller's avatar David S. Miller

Merge branch 'Introduce-mbox-tracepoints-for-Octeontx2'

Subbaraya Sundeep says:

====================
Introduce mbox tracepoints for Octeontx2

This patchset adds tracepoints support for mailbox.
In Octeontx2, PFs and VFs need to communicate with AF
for allocating and freeing resources. Once all the
configuration is done by AF for a PF/VF then packet I/O
can happen on PF/VF queues. When an interface
is brought up many mailbox messages are sent
to AF for initializing queues. Say a VF is brought up
then each message is sent to PF and PF forwards to
AF and response also traverses from AF to PF and then VF.
To aid debugging, tracepoints are added at places where
messages are allocated, sent and message interrupts.
Below is the trace of one of the messages from VF to AF
and AF response back to VF:

~ # echo 1 > /sys/kernel/tracing/events/rvu/enable
~ # ifconfig eth20 up
[  279.379559] eth20 NIC Link is UP 10000 Mbps Full duplex
~ # cat /sys/kernel/tracing/trace
        ifconfig-171   [000] ....   275.753345: otx2_msg_alloc: [0002:02:00.1] msg:(0x400) size:40

        ifconfig-171   [000] ...1   275.753347: otx2_msg_send: [0002:02:00.1] sent 1 msg(s) of size:48

          <idle>-0     [001] dNh1   275.753356: otx2_msg_interrupt: [0002:02:00.0] mbox interrupt VF(s) to PF (0x1)

    kworker/u9:1-90    [001] ...1   275.753364: otx2_msg_send: [0002:02:00.0] sent 1 msg(s) of size:48

    kworker/u9:1-90    [001] d.h.   275.753367: otx2_msg_interrupt: [0002:01:00.0] mbox interrupt PF(s) to AF (0x2)

    kworker/u9:2-167   [002] ....   275.753535: otx2_msg_process: [0002:01:00.0] msg:(0x400) error:0

    kworker/u9:2-167   [002] ...1   275.753537: otx2_msg_send: [0002:01:00.0] sent 1 msg(s) of size:32

          <idle>-0     [003] d.h1   275.753543: otx2_msg_interrupt: [0002:02:00.0] mbox interrupt AF to PF (0x1)

          <idle>-0     [001] d.h2   275.754376: otx2_msg_interrupt: [0002:02:00.1] mbox interrupt PF to VF (0x1)

v3 changes:
 Removed EXPORT_TRACEPOINT_SYMBOLS of otx2_msg_send and otx2_msg_check
 since they are called locally only

v2 changes:
 Removed otx2_msg_err tracepoint since it is similar to devlink_hwerr
 and it will be used instead when devlink supported is added.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 36493269 31a97460
...@@ -3,9 +3,10 @@ ...@@ -3,9 +3,10 @@
# Makefile for Marvell's OcteonTX2 RVU Admin Function driver # Makefile for Marvell's OcteonTX2 RVU Admin Function driver
# #
ccflags-y += -I$(src)
obj-$(CONFIG_OCTEONTX2_MBOX) += octeontx2_mbox.o obj-$(CONFIG_OCTEONTX2_MBOX) += octeontx2_mbox.o
obj-$(CONFIG_OCTEONTX2_AF) += octeontx2_af.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 \ 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 rvu_reg.o rvu_npc.o rvu_debugfs.o ptp.o
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "rvu_reg.h" #include "rvu_reg.h"
#include "mbox.h" #include "mbox.h"
#include "rvu_trace.h"
static const u16 msgs_offset = ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN); 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) ...@@ -199,6 +200,9 @@ void otx2_mbox_msg_send(struct otx2_mbox *mbox, int devid)
*/ */
tx_hdr->num_msgs = mdev->num_msgs; tx_hdr->num_msgs = mdev->num_msgs;
rx_hdr->num_msgs = 0; rx_hdr->num_msgs = 0;
trace_otx2_msg_send(mbox->pdev, tx_hdr->num_msgs, tx_hdr->msg_size);
spin_unlock(&mdev->mbox_lock); spin_unlock(&mdev->mbox_lock);
/* The interrupt should be fired after num_msgs is written /* 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) ...@@ -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 *preq = mdev->mbase + ireq;
struct mbox_msghdr *prsp = mdev->mbase + irsp; 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; goto exit;
}
if (prsp->rc) { if (prsp->rc) {
rc = prsp->rc; rc = prsp->rc;
trace_otx2_msg_check(mbox->pdev, preq->id,
prsp->id, prsp->rc);
goto exit; goto exit;
} }
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include "rvu_reg.h" #include "rvu_reg.h"
#include "ptp.h" #include "ptp.h"
#include "rvu_trace.h"
#define DRV_NAME "octeontx2-af" #define DRV_NAME "octeontx2-af"
#define DRV_STRING "Marvell OcteonTX2 RVU Admin Function Driver" #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, ...@@ -1549,6 +1551,7 @@ static int rvu_process_mbox_msg(struct otx2_mbox *mbox, int devid,
if (rsp && err) \ if (rsp && err) \
rsp->hdr.rc = err; \ rsp->hdr.rc = err; \
\ \
trace_otx2_msg_process(mbox->pdev, _id, err); \
return rsp ? err : -ENOMEM; \ return rsp ? err : -ENOMEM; \
} }
MBOX_MESSAGES MBOX_MESSAGES
...@@ -1881,6 +1884,8 @@ static irqreturn_t rvu_mbox_intr_handler(int irq, void *rvu_irq) ...@@ -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); intr = rvu_read64(rvu, BLKADDR_RVUM, RVU_AF_PFAF_MBOX_INT);
/* Clear interrupts */ /* Clear interrupts */
rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_PFAF_MBOX_INT, intr); 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 */ /* Sync with mbox memory region */
rmb(); rmb();
...@@ -1898,6 +1903,8 @@ static irqreturn_t rvu_mbox_intr_handler(int irq, void *rvu_irq) ...@@ -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)); intr = rvupf_read64(rvu, RVU_PF_VFPF_MBOX_INTX(0));
rvupf_write64(rvu, RVU_PF_VFPF_MBOX_INTX(0), intr); 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); rvu_queue_work(&rvu->afvf_wq_info, 0, vfs, intr);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "rvu.h" #include "rvu.h"
#include "cgx.h" #include "cgx.h"
#include "rvu_reg.h" #include "rvu_reg.h"
#include "rvu_trace.h"
struct cgx_evq_entry { struct cgx_evq_entry {
struct list_head evq_node; struct list_head evq_node;
...@@ -34,6 +35,7 @@ static struct _req_type __maybe_unused \ ...@@ -34,6 +35,7 @@ static struct _req_type __maybe_unused \
return NULL; \ return NULL; \
req->hdr.sig = OTX2_MBOX_REQ_SIG; \ req->hdr.sig = OTX2_MBOX_REQ_SIG; \
req->hdr.id = _id; \ req->hdr.id = _id; \
trace_otx2_msg_alloc(rvu->pdev, _id, sizeof(*req)); \
return 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>
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <mbox.h> #include <mbox.h>
#include "otx2_reg.h" #include "otx2_reg.h"
#include "otx2_txrx.h" #include "otx2_txrx.h"
#include <rvu_trace.h>
/* PCI device IDs */ /* PCI device IDs */
#define PCI_DEVID_OCTEONTX2_RVU_PF 0xA063 #define PCI_DEVID_OCTEONTX2_RVU_PF 0xA063
...@@ -523,6 +524,7 @@ static struct _req_type __maybe_unused \ ...@@ -523,6 +524,7 @@ static struct _req_type __maybe_unused \
return NULL; \ return NULL; \
req->hdr.sig = OTX2_MBOX_REQ_SIG; \ req->hdr.sig = OTX2_MBOX_REQ_SIG; \
req->hdr.id = _id; \ req->hdr.id = _id; \
trace_otx2_msg_alloc(mbox->mbox.pdev, _id, sizeof(*req)); \
return req; \ return req; \
} }
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "otx2_txrx.h" #include "otx2_txrx.h"
#include "otx2_struct.h" #include "otx2_struct.h"
#include "otx2_ptp.h" #include "otx2_ptp.h"
#include <rvu_trace.h>
#define DRV_NAME "octeontx2-nicpf" #define DRV_NAME "octeontx2-nicpf"
#define DRV_STRING "Marvell OcteonTX2 NIC Physical Function Driver" #define DRV_STRING "Marvell OcteonTX2 NIC Physical Function Driver"
...@@ -558,6 +559,8 @@ static irqreturn_t otx2_pfvf_mbox_intr_handler(int irq, void *pf_irq) ...@@ -558,6 +559,8 @@ static irqreturn_t otx2_pfvf_mbox_intr_handler(int irq, void *pf_irq)
otx2_queue_work(mbox, pf->mbox_pfvf_wq, 0, vfs, intr, TYPE_PFVF); otx2_queue_work(mbox, pf->mbox_pfvf_wq, 0, vfs, intr, TYPE_PFVF);
trace_otx2_msg_interrupt(mbox->mbox.pdev, "VF(s) to PF", intr);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -940,6 +943,9 @@ static irqreturn_t otx2_pfaf_mbox_intr_handler(int irq, void *pf_irq) ...@@ -940,6 +943,9 @@ static irqreturn_t otx2_pfaf_mbox_intr_handler(int irq, void *pf_irq)
otx2_write64(pf, RVU_PF_INT, BIT_ULL(0)); otx2_write64(pf, RVU_PF_INT, BIT_ULL(0));
mbox = &pf->mbox; mbox = &pf->mbox;
trace_otx2_msg_interrupt(mbox->mbox.pdev, "AF to PF", BIT_ULL(0));
otx2_queue_work(mbox, pf->mbox_wq, 0, 1, 1, TYPE_PFAF); otx2_queue_work(mbox, pf->mbox_wq, 0, 1, 1, TYPE_PFAF);
return IRQ_HANDLED; return IRQ_HANDLED;
......
...@@ -187,6 +187,8 @@ static irqreturn_t otx2vf_vfaf_mbox_intr_handler(int irq, void *vf_irq) ...@@ -187,6 +187,8 @@ static irqreturn_t otx2vf_vfaf_mbox_intr_handler(int irq, void *vf_irq)
mdev = &mbox->dev[0]; mdev = &mbox->dev[0];
otx2_sync_mbox_bbuf(mbox, 0); otx2_sync_mbox_bbuf(mbox, 0);
trace_otx2_msg_interrupt(mbox->pdev, "PF to VF", BIT_ULL(0));
hdr = (struct mbox_hdr *)(mdev->mbase + mbox->rx_start); hdr = (struct mbox_hdr *)(mdev->mbase + mbox->rx_start);
if (hdr->num_msgs) { if (hdr->num_msgs) {
vf->mbox.num_msgs = hdr->num_msgs; vf->mbox.num_msgs = hdr->num_msgs;
......
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