Commit 67fa7564 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'octeontx2-improve-mailbox-tracing'

Subbaraya Sundeep says:

====================
octeontx2: Improve mailbox tracing

Octeontx2 VF,PF and AF devices communicate using hardware
shared mailbox region where VFs can only to talk to its PFs
and PFs can only talk to AF. AF does the entire resource management
for all PFs and VFs. The shared mbox region is used for synchronous
requests (requests from PF to AF or VF to PF) and async notifications
(notifications from AF to PFs or PF to VFs). Sending a request to AF
from VF involves various stages like
1. VF allocates message in shared region
2. Triggers interrupt to PF
3. PF upon receiving interrupt from VF will copy the message
   from VF<->PF region to PF<->AF region
4. Triggers interrupt to AF
5. AF processes it and writes response in PF<->AF region
6. Triggers interrupt to PF
7. PF copies responses from PF<->AF region to VF<->PF region
8. Triggers interrupt to Vf
9. VF reads response in VF<->PF region

Due to various stages involved, Tracepoints are used in mailbox code for
debugging. Existing tracepoints need some improvements so that maximum
information can be inferred from trace logs during an issue.
This patchset tries to enhance existing tracepoints and also adds
a couple of tracepoints.
====================

Link: https://patch.msgid.link/1747136408-30685-1-git-send-email-sbhatta@marvell.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents c1660800 fa00077d
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -188,14 +188,13 @@ int otx2_mbox_wait_for_rsp(struct otx2_mbox *mbox, int devid)
{
	unsigned long timeout = jiffies + msecs_to_jiffies(MBOX_RSP_TIMEOUT);
	struct otx2_mbox_dev *mdev = &mbox->dev[devid];
	struct device *sender = &mbox->pdev->dev;

	while (!time_after(jiffies, timeout)) {
		if (mdev->num_msgs == mdev->msgs_acked)
			return 0;
		usleep_range(800, 1000);
	}
	dev_dbg(sender, "timed out while waiting for rsp\n");
	trace_otx2_msg_wait_rsp(mbox->pdev);
	return -EIO;
}
EXPORT_SYMBOL(otx2_mbox_wait_for_rsp);
@@ -219,6 +218,7 @@ static void otx2_mbox_msg_send_data(struct otx2_mbox *mbox, int devid, u64 data)
	struct otx2_mbox_dev *mdev = &mbox->dev[devid];
	struct mbox_hdr *tx_hdr, *rx_hdr;
	void *hw_mbase = mdev->hwbase;
	struct mbox_msghdr *msg;
	u64 intr_val;

	tx_hdr = hw_mbase + mbox->tx_start;
@@ -251,7 +251,10 @@ static void otx2_mbox_msg_send_data(struct otx2_mbox *mbox, int devid, u64 data)
	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);
	msg = (struct mbox_msghdr *)(hw_mbase + mbox->tx_start + msgs_offset);

	trace_otx2_msg_send(mbox->pdev, tx_hdr->num_msgs, tx_hdr->msg_size,
			    msg->id, msg->pcifunc);

	spin_unlock(&mdev->mbox_lock);

@@ -445,6 +448,14 @@ const char *otx2_mbox_id2name(u16 id)
#define M(_name, _id, _1, _2, _3) case _id: return # _name;
	MBOX_MESSAGES
#undef M

#define M(_name, _id, _1, _2, _3) case _id: return # _name;
	MBOX_UP_CGX_MESSAGES
#undef M

#define M(_name, _id, _1, _2, _3) case _id: return # _name;
	MBOX_UP_CPT_MESSAGES
#undef M
	default:
		return "INVALID ID";
	}
+1 −1
Original line number Diff line number Diff line
@@ -2173,7 +2173,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);		\
		trace_otx2_msg_process(mbox->pdev, _id, err, req->pcifunc); \
		return rsp ? err : -ENOMEM;				\
	}
MBOX_MESSAGES
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,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));		\
	trace_otx2_msg_alloc(rvu->pdev, _id, sizeof(*req), 0);		\
	return req;							\
}

+1 −0
Original line number Diff line number Diff line
@@ -11,3 +11,4 @@
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_alloc);
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_interrupt);
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_process);
EXPORT_TRACEPOINT_SYMBOL(otx2_msg_status);
+50 −12
Original line number Diff line number Diff line
@@ -18,33 +18,42 @@
#include "mbox.h"

TRACE_EVENT(otx2_msg_alloc,
	    TP_PROTO(const struct pci_dev *pdev, u16 id, u64 size),
	    TP_ARGS(pdev, id, size),
	    TP_PROTO(const struct pci_dev *pdev, u16 id, u64 size, u16 pcifunc),
	    TP_ARGS(pdev, id, size, pcifunc),
	    TP_STRUCT__entry(__string(dev, pci_name(pdev))
			     __field(u16, id)
			     __field(u64, size)
			     __field(u16, pcifunc)
	    ),
	    TP_fast_assign(__assign_str(dev);
			   __entry->id = id;
			   __entry->size = size;
			   __entry->pcifunc = pcifunc;
	    ),
	    TP_printk("[%s] msg:(%s) size:%lld\n", __get_str(dev),
		      otx2_mbox_id2name(__entry->id), __entry->size)
	    TP_printk("[%s] msg:(%s) size:%lld pcifunc:0x%x\n", __get_str(dev),
		      otx2_mbox_id2name(__entry->id), __entry->size,
		      __entry->pcifunc)
);

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_PROTO(const struct pci_dev *pdev, u16 num_msgs, u64 msg_size,
		     u16 id, u16 pcifunc),
	    TP_ARGS(pdev, num_msgs, msg_size, id, pcifunc),
	    TP_STRUCT__entry(__string(dev, pci_name(pdev))
			     __field(u16, num_msgs)
			     __field(u64, msg_size)
			     __field(u16, id)
			     __field(u16, pcifunc)
	    ),
	    TP_fast_assign(__assign_str(dev);
			   __entry->num_msgs = num_msgs;
			   __entry->msg_size = msg_size;
			   __entry->id = id;
			   __entry->pcifunc = pcifunc;
	    ),
	    TP_printk("[%s] sent %d msg(s) of size:%lld\n", __get_str(dev),
		      __entry->num_msgs, __entry->msg_size)
	    TP_printk("[%s] sent %d msg(s) of size:%lld msg:(%s) pcifunc:0x%x\n",
		      __get_str(dev), __entry->num_msgs, __entry->msg_size,
		      otx2_mbox_id2name(__entry->id), __entry->pcifunc)
);

TRACE_EVENT(otx2_msg_check,
@@ -81,18 +90,47 @@ TRACE_EVENT(otx2_msg_interrupt,
);

TRACE_EVENT(otx2_msg_process,
	    TP_PROTO(const struct pci_dev *pdev, u16 id, int err),
	    TP_ARGS(pdev, id, err),
	    TP_PROTO(const struct pci_dev *pdev, u16 id, int err, u16 pcifunc),
	    TP_ARGS(pdev, id, err, pcifunc),
	    TP_STRUCT__entry(__string(dev, pci_name(pdev))
			     __field(u16, id)
			     __field(int, err)
			     __field(u16, pcifunc)
	    ),
	    TP_fast_assign(__assign_str(dev);
			   __entry->id = id;
			   __entry->err = err;
			   __entry->pcifunc = pcifunc;
	    ),
	    TP_printk("[%s] msg:(%s) error:%d pcifunc:0x%x\n", __get_str(dev),
		      otx2_mbox_id2name(__entry->id),
		      __entry->err, __entry->pcifunc)
);

TRACE_EVENT(otx2_msg_wait_rsp,
	    TP_PROTO(const struct pci_dev *pdev),
	    TP_ARGS(pdev),
	    TP_STRUCT__entry(__string(dev, pci_name(pdev))
	    ),
	    TP_fast_assign(__assign_str(dev)
	    ),
	    TP_printk("[%s] timed out while waiting for response\n",
		      __get_str(dev))
);

TRACE_EVENT(otx2_msg_status,
	    TP_PROTO(const struct pci_dev *pdev, const char *msg, u16 num_msgs),
	    TP_ARGS(pdev, msg, num_msgs),
	    TP_STRUCT__entry(__string(dev, pci_name(pdev))
			     __string(str, msg)
			     __field(u16, num_msgs)
	    ),
	    TP_fast_assign(__assign_str(dev);
			   __assign_str(str);
			   __entry->num_msgs = num_msgs;
	    ),
	    TP_printk("[%s] msg:(%s) error:%d\n", __get_str(dev),
		      otx2_mbox_id2name(__entry->id), __entry->err)
	    TP_printk("[%s] %s num_msgs:%d\n", __get_str(dev),
		      __get_str(str), __entry->num_msgs)
);

#endif /* __RVU_TRACE_H */
Loading