Commit 7906c655 authored by Hao Lan's avatar Hao Lan Committed by Jiantao Xiao
Browse files

net: hns3: add command queue trace for hns3

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8GK5Q


CVE: NA

----------------------------------------------------------------------

Currently, the hns3 driver does not have the trace
of the command queue. As a result, it is difficult to
locate the communication between the driver and firmware.
Therefore, the trace function of the command queue is
added in this test case to facilitate the locating of
communication problems between the driver and firmware.

Signed-off-by: default avatarHao Lan <lanhao@huawei.com>
parent 59de65f6
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -474,6 +474,8 @@ int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
	struct hclge_comm_cmq_ring *csq = &hw->cmq.csq;
	int ret;
	int ntc;
	trace_hclge_comm_cmd_send(hw, desc, num,
				  hclge_comm_is_special_opcode(desc->opcode));

	spin_lock_bh(&hw->cmq.csq.lock);

@@ -508,6 +510,8 @@ int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,

	spin_unlock_bh(&hw->cmq.csq.lock);

	trace_hclge_comm_cmd_get(hw, desc, num,
				 hclge_comm_is_special_opcode(desc->opcode));
	return ret;
}

+6 −0
Original line number Diff line number Diff line
@@ -491,5 +491,11 @@ 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,
			u32 *fw_version, bool is_pf,
			unsigned long reset_pending);
void trace_hclge_comm_cmd_send(struct hclge_comm_hw *hw,
			       struct hclge_desc *desc,
			       int num, int is_special);
void trace_hclge_comm_cmd_get(struct hclge_comm_hw *hw,
			      struct hclge_desc *desc,
			      int num, int is_special);

#endif
+39 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@
#include "hclge_unic_guid.h"
#include "hclge_unic_addr.h"

#include "hclge_trace.h"

#define HCLGE_NAME			"hclge"

#define HCLGE_BUF_SIZE_UNIT	256U
@@ -407,6 +409,43 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
	return hclge_comm_cmd_send(&hw->hw, desc, num);
}

void trace_hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
			       int num, int 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, (u32 *)&desc[i],
							i, num);
	}
}

void trace_hclge_comm_cmd_get(struct hclge_comm_hw *hw, struct hclge_desc *desc,
			      int num, int 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, (u32 *)&desc[i],
						       i, num);
	}
}

static int hclge_mac_update_stats_defective(struct hclge_dev *hdev)
{
#define HCLGE_MAC_CMD_NUM 21
+94 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@

#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_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,
			     u32 *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,
		      u32 *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,
		      u32 *desc,
		      int index,
		      int num),
	     TP_ARGS(hw, desc, index, num)
);

#endif /* _HCLGE_TRACE_H_ */

/* This must be outside ifdef _HCLGE_TRACE_H */
+32 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include "hclgevf_unic_ip.h"
#include "hclgevf_unic_guid.h"
#include "hclgevf_unic_addr.h"
#include "hclgevf_trace.h"

#define HCLGEVF_NAME	"hclgevf"

@@ -60,6 +61,37 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclge_desc *desc, int num)
	return hclge_comm_cmd_send(&hw->hw, desc, num);
}

void trace_hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
			       int num, int 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);
}

void trace_hclge_comm_cmd_get(struct hclge_comm_hw *hw, struct hclge_desc *desc,
			      int num, int 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);
}

void hclgevf_arq_init(struct hclgevf_dev *hdev)
{
	struct hclge_comm_cmq *cmdq = &hdev->hw.hw.cmq;
Loading