mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
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:
parent
a799de0e59
commit
2a1a1a7b5f
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user