mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 06:49:29 -04:00
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: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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; \
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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\n", __get_str(dev),
|
||||
otx2_mbox_id2name(__entry->id), __entry->err)
|
||||
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] %s num_msgs:%d\n", __get_str(dev),
|
||||
__get_str(str), __entry->num_msgs)
|
||||
);
|
||||
|
||||
#endif /* __RVU_TRACE_H */
|
||||
|
||||
@@ -871,6 +871,7 @@ static struct _req_type __maybe_unused \
|
||||
*otx2_mbox_alloc_msg_ ## _fn_name(struct mbox *mbox) \
|
||||
{ \
|
||||
struct _req_type *req; \
|
||||
u16 pcifunc = mbox->pfvf->pcifunc; \
|
||||
\
|
||||
req = (struct _req_type *)otx2_mbox_alloc_msg_rsp( \
|
||||
&mbox->mbox, 0, sizeof(struct _req_type), \
|
||||
@@ -879,7 +880,8 @@ static struct _req_type __maybe_unused \
|
||||
return NULL; \
|
||||
req->hdr.sig = OTX2_MBOX_REQ_SIG; \
|
||||
req->hdr.id = _id; \
|
||||
trace_otx2_msg_alloc(mbox->mbox.pdev, _id, sizeof(*req)); \
|
||||
req->hdr.pcifunc = pcifunc; \
|
||||
trace_otx2_msg_alloc(mbox->mbox.pdev, _id, sizeof(*req), pcifunc); \
|
||||
return req; \
|
||||
}
|
||||
|
||||
|
||||
@@ -465,6 +465,9 @@ static void otx2_pfvf_mbox_handler(struct work_struct *work)
|
||||
|
||||
offset = ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
|
||||
|
||||
trace_otx2_msg_status(pf->pdev, "PF-VF down queue handler(forwarding)",
|
||||
vf_mbox->num_msgs);
|
||||
|
||||
for (id = 0; id < vf_mbox->num_msgs; id++) {
|
||||
msg = (struct mbox_msghdr *)(mdev->mbase + mbox->rx_start +
|
||||
offset);
|
||||
@@ -473,7 +476,7 @@ static void otx2_pfvf_mbox_handler(struct work_struct *work)
|
||||
goto inval_msg;
|
||||
|
||||
/* Set VF's number in each of the msg */
|
||||
msg->pcifunc &= RVU_PFVF_FUNC_MASK;
|
||||
msg->pcifunc &= ~RVU_PFVF_FUNC_MASK;
|
||||
msg->pcifunc |= (vf_idx + 1) & RVU_PFVF_FUNC_MASK;
|
||||
offset = msg->next_msgoff;
|
||||
}
|
||||
@@ -503,6 +506,9 @@ static void otx2_pfvf_mbox_up_handler(struct work_struct *work)
|
||||
|
||||
offset = mbox->rx_start + ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
|
||||
|
||||
trace_otx2_msg_status(pf->pdev, "PF-VF up queue handler(response)",
|
||||
vf_mbox->up_num_msgs);
|
||||
|
||||
for (id = 0; id < vf_mbox->up_num_msgs; id++) {
|
||||
msg = mdev->mbase + offset;
|
||||
|
||||
@@ -819,6 +825,9 @@ static void otx2_pfaf_mbox_handler(struct work_struct *work)
|
||||
offset = mbox->rx_start + ALIGN(sizeof(*rsp_hdr), MBOX_MSG_ALIGN);
|
||||
pf = af_mbox->pfvf;
|
||||
|
||||
trace_otx2_msg_status(pf->pdev, "PF-AF down queue handler(response)",
|
||||
num_msgs);
|
||||
|
||||
for (id = 0; id < num_msgs; id++) {
|
||||
msg = (struct mbox_msghdr *)(mdev->mbase + offset);
|
||||
otx2_process_pfaf_mbox_msg(pf, msg);
|
||||
@@ -974,6 +983,9 @@ static void otx2_pfaf_mbox_up_handler(struct work_struct *work)
|
||||
|
||||
offset = mbox->rx_start + ALIGN(sizeof(*rsp_hdr), MBOX_MSG_ALIGN);
|
||||
|
||||
trace_otx2_msg_status(pf->pdev, "PF-AF up queue handler(notification)",
|
||||
num_msgs);
|
||||
|
||||
for (id = 0; id < num_msgs; id++) {
|
||||
msg = (struct mbox_msghdr *)(mdev->mbase + offset);
|
||||
|
||||
@@ -1023,6 +1035,9 @@ static irqreturn_t otx2_pfaf_mbox_intr_handler(int irq, void *pf_irq)
|
||||
|
||||
trace_otx2_msg_interrupt(pf->pdev, "UP message from AF to PF",
|
||||
BIT_ULL(0));
|
||||
|
||||
trace_otx2_msg_status(pf->pdev, "PF-AF up work queued(interrupt)",
|
||||
hdr->num_msgs);
|
||||
}
|
||||
|
||||
if (mbox_data & MBOX_DOWN_MSG) {
|
||||
@@ -1039,6 +1054,9 @@ static irqreturn_t otx2_pfaf_mbox_intr_handler(int irq, void *pf_irq)
|
||||
|
||||
trace_otx2_msg_interrupt(pf->pdev, "DOWN reply from AF to PF",
|
||||
BIT_ULL(0));
|
||||
|
||||
trace_otx2_msg_status(pf->pdev, "PF-AF down work queued(interrupt)",
|
||||
hdr->num_msgs);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@@ -3285,6 +3303,7 @@ static void otx2_vf_link_event_task(struct work_struct *work)
|
||||
req = (struct cgx_link_info_msg *)msghdr;
|
||||
req->hdr.id = MBOX_MSG_CGX_LINK_EVENT;
|
||||
req->hdr.sig = OTX2_MBOX_REQ_SIG;
|
||||
req->hdr.pcifunc = pf->pcifunc;
|
||||
memcpy(&req->link_info, &pf->linfo, sizeof(req->link_info));
|
||||
|
||||
otx2_mbox_wait_for_zero(&pf->mbox_pfvf[0].mbox_up, vf_idx);
|
||||
|
||||
@@ -136,7 +136,7 @@ static int otx2vf_process_mbox_msg_up(struct otx2_nic *vf,
|
||||
|
||||
rsp->hdr.id = MBOX_MSG_CGX_LINK_EVENT;
|
||||
rsp->hdr.sig = OTX2_MBOX_RSP_SIG;
|
||||
rsp->hdr.pcifunc = 0;
|
||||
rsp->hdr.pcifunc = req->pcifunc;
|
||||
rsp->hdr.rc = 0;
|
||||
err = otx2_mbox_up_handler_cgx_link_event(
|
||||
vf, (struct cgx_link_info_msg *)req, rsp);
|
||||
|
||||
Reference in New Issue
Block a user