net: hns3: add command queue trace for hns3

Add support to dump command queue trace for hns3.

Signed-off-by: Hao Lan <lanhao@huawei.com>
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Link: https://lore.kernel.org/r/20240410125354.2177067-2-shaojijie@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Hao Lan 2024-04-10 20:53:51 +08:00 committed by Jakub Kicinski
parent a799de0e59
commit 2a1a1a7b5f
6 changed files with 260 additions and 1 deletions

View File

@ -470,10 +470,14 @@ static int hclge_comm_cmd_check_result(struct hclge_comm_hw *hw,
int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc, int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
int num) int num)
{ {
bool is_special = hclge_comm_is_special_opcode(le16_to_cpu(desc->opcode));
struct hclge_comm_cmq_ring *csq = &hw->cmq.csq; struct hclge_comm_cmq_ring *csq = &hw->cmq.csq;
int ret; int ret;
int ntc; int ntc;
if (hw->cmq.ops.trace_cmd_send)
hw->cmq.ops.trace_cmd_send(hw, desc, num, is_special);
spin_lock_bh(&hw->cmq.csq.lock); spin_lock_bh(&hw->cmq.csq.lock);
if (test_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hw->comm_state)) { if (test_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hw->comm_state)) {
@ -507,6 +511,9 @@ int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
spin_unlock_bh(&hw->cmq.csq.lock); spin_unlock_bh(&hw->cmq.csq.lock);
if (hw->cmq.ops.trace_cmd_get)
hw->cmq.ops.trace_cmd_get(hw, desc, num, is_special);
return ret; return ret;
} }
@ -584,6 +591,17 @@ err_csq:
return ret; return ret;
} }
void hclge_comm_cmd_init_ops(struct hclge_comm_hw *hw,
const struct hclge_comm_cmq_ops *ops)
{
struct hclge_comm_cmq *cmdq = &hw->cmq;
if (ops) {
cmdq->ops.trace_cmd_send = ops->trace_cmd_send;
cmdq->ops.trace_cmd_get = ops->trace_cmd_get;
}
}
int hclge_comm_cmd_init(struct hnae3_ae_dev *ae_dev, struct hclge_comm_hw *hw, int hclge_comm_cmd_init(struct hnae3_ae_dev *ae_dev, struct hclge_comm_hw *hw,
u32 *fw_version, bool is_pf, u32 *fw_version, bool is_pf,
unsigned long reset_pending) unsigned long reset_pending)

View File

@ -423,11 +423,22 @@ enum hclge_comm_cmd_status {
HCLGE_COMM_ERR_CSQ_ERROR = -3, HCLGE_COMM_ERR_CSQ_ERROR = -3,
}; };
struct hclge_comm_hw;
struct hclge_comm_cmq_ops {
void (*trace_cmd_send)(struct hclge_comm_hw *hw,
struct hclge_desc *desc,
int num, bool is_special);
void (*trace_cmd_get)(struct hclge_comm_hw *hw,
struct hclge_desc *desc,
int num, bool is_special);
};
struct hclge_comm_cmq { struct hclge_comm_cmq {
struct hclge_comm_cmq_ring csq; struct hclge_comm_cmq_ring csq;
struct hclge_comm_cmq_ring crq; struct hclge_comm_cmq_ring crq;
u16 tx_timeout; u16 tx_timeout;
enum hclge_comm_cmd_status last_status; enum hclge_comm_cmd_status last_status;
struct hclge_comm_cmq_ops ops;
}; };
struct hclge_comm_hw { struct hclge_comm_hw {
@ -474,5 +485,6 @@ int hclge_comm_cmd_queue_init(struct pci_dev *pdev, struct hclge_comm_hw *hw);
int hclge_comm_cmd_init(struct hnae3_ae_dev *ae_dev, struct hclge_comm_hw *hw, int hclge_comm_cmd_init(struct hnae3_ae_dev *ae_dev, struct hclge_comm_hw *hw,
u32 *fw_version, bool is_pf, u32 *fw_version, bool is_pf,
unsigned long reset_pending); unsigned long reset_pending);
void hclge_comm_cmd_init_ops(struct hclge_comm_hw *hw,
const struct hclge_comm_cmq_ops *ops);
#endif #endif

View File

@ -27,6 +27,8 @@
#include "hclge_devlink.h" #include "hclge_devlink.h"
#include "hclge_comm_cmd.h" #include "hclge_comm_cmd.h"
#include "hclge_trace.h"
#define HCLGE_NAME "hclge" #define HCLGE_NAME "hclge"
#define HCLGE_BUF_SIZE_UNIT 256U #define HCLGE_BUF_SIZE_UNIT 256U
@ -391,6 +393,48 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
return hclge_comm_cmd_send(&hw->hw, desc, num); return hclge_comm_cmd_send(&hw->hw, desc, num);
} }
static void hclge_trace_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
int num, bool is_special)
{
int i;
trace_hclge_pf_cmd_send(hw, desc, 0, num);
if (!is_special) {
for (i = 1; i < num; i++)
trace_hclge_pf_cmd_send(hw, &desc[i], i, num);
} else {
for (i = 1; i < num; i++)
trace_hclge_pf_special_cmd_send(hw, (__le32 *)&desc[i],
i, num);
}
}
static void hclge_trace_cmd_get(struct hclge_comm_hw *hw, struct hclge_desc *desc,
int num, bool is_special)
{
int i;
if (!HCLGE_COMM_SEND_SYNC(le16_to_cpu(desc->flag)))
return;
trace_hclge_pf_cmd_get(hw, desc, 0, num);
if (!is_special) {
for (i = 1; i < num; i++)
trace_hclge_pf_cmd_get(hw, &desc[i], i, num);
} else {
for (i = 1; i < num; i++)
trace_hclge_pf_special_cmd_get(hw, (__le32 *)&desc[i],
i, num);
}
}
static const struct hclge_comm_cmq_ops hclge_cmq_ops = {
.trace_cmd_send = hclge_trace_cmd_send,
.trace_cmd_get = hclge_trace_cmd_get,
};
static int hclge_mac_update_stats_defective(struct hclge_dev *hdev) static int hclge_mac_update_stats_defective(struct hclge_dev *hdev)
{ {
#define HCLGE_MAC_CMD_NUM 21 #define HCLGE_MAC_CMD_NUM 21
@ -11634,6 +11678,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
goto err_devlink_uninit; goto err_devlink_uninit;
/* Firmware command initialize */ /* Firmware command initialize */
hclge_comm_cmd_init_ops(&hdev->hw.hw, &hclge_cmq_ops);
ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw, &hdev->fw_version, ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw, &hdev->fw_version,
true, hdev->reset_pending); true, hdev->reset_pending);
if (ret) if (ret)

View File

@ -10,6 +10,7 @@
#include <linux/tracepoint.h> #include <linux/tracepoint.h>
#define PF_DESC_LEN (sizeof(struct hclge_desc) / sizeof(u32))
#define PF_GET_MBX_LEN (sizeof(struct hclge_mbx_vf_to_pf_cmd) / sizeof(u32)) #define PF_GET_MBX_LEN (sizeof(struct hclge_mbx_vf_to_pf_cmd) / sizeof(u32))
#define PF_SEND_MBX_LEN (sizeof(struct hclge_mbx_pf_to_vf_cmd) / sizeof(u32)) #define PF_SEND_MBX_LEN (sizeof(struct hclge_mbx_pf_to_vf_cmd) / sizeof(u32))
@ -77,6 +78,99 @@ TRACE_EVENT(hclge_pf_mbx_send,
) )
); );
DECLARE_EVENT_CLASS(hclge_pf_cmd_template,
TP_PROTO(struct hclge_comm_hw *hw,
struct hclge_desc *desc,
int index,
int num),
TP_ARGS(hw, desc, index, num),
TP_STRUCT__entry(__field(u16, opcode)
__field(u16, flag)
__field(u16, retval)
__field(u16, rsv)
__field(int, index)
__field(int, num)
__string(pciname, pci_name(hw->cmq.csq.pdev))
__array(u32, data, HCLGE_DESC_DATA_LEN)),
TP_fast_assign(int i;
__entry->opcode = le16_to_cpu(desc->opcode);
__entry->flag = le16_to_cpu(desc->flag);
__entry->retval = le16_to_cpu(desc->retval);
__entry->rsv = le16_to_cpu(desc->rsv);
__entry->index = index;
__entry->num = num;
__assign_str(pciname, pci_name(hw->cmq.csq.pdev));
for (i = 0; i < HCLGE_DESC_DATA_LEN; i++)
__entry->data[i] = le32_to_cpu(desc->data[i]);),
TP_printk("%s opcode:0x%04x %d-%d flag:0x%04x retval:0x%04x rsv:0x%04x data:%s",
__get_str(pciname), __entry->opcode,
__entry->index, __entry->num,
__entry->flag, __entry->retval, __entry->rsv,
__print_array(__entry->data,
HCLGE_DESC_DATA_LEN, sizeof(u32)))
);
DEFINE_EVENT(hclge_pf_cmd_template, hclge_pf_cmd_send,
TP_PROTO(struct hclge_comm_hw *hw,
struct hclge_desc *desc,
int index,
int num),
TP_ARGS(hw, desc, index, num)
);
DEFINE_EVENT(hclge_pf_cmd_template, hclge_pf_cmd_get,
TP_PROTO(struct hclge_comm_hw *hw,
struct hclge_desc *desc,
int index,
int num),
TP_ARGS(hw, desc, index, num)
);
DECLARE_EVENT_CLASS(hclge_pf_special_cmd_template,
TP_PROTO(struct hclge_comm_hw *hw,
__le32 *data,
int index,
int num),
TP_ARGS(hw, data, index, num),
TP_STRUCT__entry(__field(int, index)
__field(int, num)
__string(pciname, pci_name(hw->cmq.csq.pdev))
__array(u32, data, PF_DESC_LEN)),
TP_fast_assign(int i;
__entry->index = index;
__entry->num = num;
__assign_str(pciname, pci_name(hw->cmq.csq.pdev));
for (i = 0; i < PF_DESC_LEN; i++)
__entry->data[i] = le32_to_cpu(data[i]);
),
TP_printk("%s %d-%d data:%s",
__get_str(pciname),
__entry->index, __entry->num,
__print_array(__entry->data,
PF_DESC_LEN, sizeof(u32)))
);
DEFINE_EVENT(hclge_pf_special_cmd_template, hclge_pf_special_cmd_send,
TP_PROTO(struct hclge_comm_hw *hw,
__le32 *desc,
int index,
int num),
TP_ARGS(hw, desc, index, num));
DEFINE_EVENT(hclge_pf_special_cmd_template, hclge_pf_special_cmd_get,
TP_PROTO(struct hclge_comm_hw *hw,
__le32 *desc,
int index,
int num),
TP_ARGS(hw, desc, index, num)
);
#endif /* _HCLGE_TRACE_H_ */ #endif /* _HCLGE_TRACE_H_ */
/* This must be outside ifdef _HCLGE_TRACE_H */ /* This must be outside ifdef _HCLGE_TRACE_H */

View File

@ -11,6 +11,7 @@
#include "hnae3.h" #include "hnae3.h"
#include "hclgevf_devlink.h" #include "hclgevf_devlink.h"
#include "hclge_comm_rss.h" #include "hclge_comm_rss.h"
#include "hclgevf_trace.h"
#define HCLGEVF_NAME "hclgevf" #define HCLGEVF_NAME "hclgevf"
@ -47,6 +48,42 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclge_desc *desc, int num)
return hclge_comm_cmd_send(&hw->hw, desc, num); return hclge_comm_cmd_send(&hw->hw, desc, num);
} }
static void hclgevf_trace_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
int num, bool is_special)
{
int i;
trace_hclge_vf_cmd_send(hw, desc, 0, num);
if (is_special)
return;
for (i = 1; i < num; i++)
trace_hclge_vf_cmd_send(hw, &desc[i], i, num);
}
static void hclgevf_trace_cmd_get(struct hclge_comm_hw *hw, struct hclge_desc *desc,
int num, bool is_special)
{
int i;
if (!HCLGE_COMM_SEND_SYNC(le16_to_cpu(desc->flag)))
return;
trace_hclge_vf_cmd_get(hw, desc, 0, num);
if (is_special)
return;
for (i = 1; i < num; i++)
trace_hclge_vf_cmd_get(hw, &desc[i], i, num);
}
static const struct hclge_comm_cmq_ops hclgevf_cmq_ops = {
.trace_cmd_send = hclgevf_trace_cmd_send,
.trace_cmd_get = hclgevf_trace_cmd_get,
};
void hclgevf_arq_init(struct hclgevf_dev *hdev) void hclgevf_arq_init(struct hclgevf_dev *hdev)
{ {
struct hclge_comm_cmq *cmdq = &hdev->hw.hw.cmq; struct hclge_comm_cmq *cmdq = &hdev->hw.hw.cmq;
@ -2796,6 +2833,7 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)
} }
hclgevf_arq_init(hdev); hclgevf_arq_init(hdev);
ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw, ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw,
&hdev->fw_version, false, &hdev->fw_version, false,
hdev->reset_pending); hdev->reset_pending);
@ -2854,6 +2892,8 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
goto err_cmd_queue_init; goto err_cmd_queue_init;
hclgevf_arq_init(hdev); hclgevf_arq_init(hdev);
hclge_comm_cmd_init_ops(&hdev->hw.hw, &hclgevf_cmq_ops);
ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw, ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw,
&hdev->fw_version, false, &hdev->fw_version, false,
hdev->reset_pending); hdev->reset_pending);

View File

@ -77,6 +77,56 @@ TRACE_EVENT(hclge_vf_mbx_send,
) )
); );
DECLARE_EVENT_CLASS(hclge_vf_cmd_template,
TP_PROTO(struct hclge_comm_hw *hw,
struct hclge_desc *desc,
int index,
int num),
TP_ARGS(hw, desc, index, num),
TP_STRUCT__entry(__field(u16, opcode)
__field(u16, flag)
__field(u16, retval)
__field(u16, rsv)
__field(int, index)
__field(int, num)
__string(pciname, pci_name(hw->cmq.csq.pdev))
__array(u32, data, HCLGE_DESC_DATA_LEN)),
TP_fast_assign(int i;
__entry->opcode = le16_to_cpu(desc->opcode);
__entry->flag = le16_to_cpu(desc->flag);
__entry->retval = le16_to_cpu(desc->retval);
__entry->rsv = le16_to_cpu(desc->rsv);
__entry->index = index;
__entry->num = num;
__assign_str(pciname, pci_name(hw->cmq.csq.pdev));
for (i = 0; i < HCLGE_DESC_DATA_LEN; i++)
__entry->data[i] = le32_to_cpu(desc->data[i]);),
TP_printk("%s opcode:0x%04x %d-%d flag:0x%04x retval:0x%04x rsv:0x%04x data:%s",
__get_str(pciname), __entry->opcode,
__entry->index, __entry->num,
__entry->flag, __entry->retval, __entry->rsv,
__print_array(__entry->data,
HCLGE_DESC_DATA_LEN, sizeof(u32)))
);
DEFINE_EVENT(hclge_vf_cmd_template, hclge_vf_cmd_send,
TP_PROTO(struct hclge_comm_hw *hw,
struct hclge_desc *desc,
int index,
int num),
TP_ARGS(hw, desc, index, num));
DEFINE_EVENT(hclge_vf_cmd_template, hclge_vf_cmd_get,
TP_PROTO(struct hclge_comm_hw *hw,
struct hclge_desc *desc,
int index,
int num),
TP_ARGS(hw, desc, index, num));
#endif /* _HCLGEVF_TRACE_H_ */ #endif /* _HCLGEVF_TRACE_H_ */
/* This must be outside ifdef _HCLGEVF_TRACE_H */ /* This must be outside ifdef _HCLGEVF_TRACE_H */