Commit 994cd2e0 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 4f4fdb81
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -471,10 +471,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 num)
{
	bool is_special = hclge_comm_is_special_opcode(desc->opcode);
	struct hclge_comm_cmq_ring *csq = &hw->cmq.csq;
	int ret;
	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);

	if (test_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hw->comm_state)) {
@@ -508,6 +512,9 @@ int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,

	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;
}

@@ -585,6 +592,17 @@ int hclge_comm_cmd_queue_init(struct pci_dev *pdev, struct hclge_comm_hw *hw)
	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,
			u32 *fw_version, bool is_pf,
			unsigned long reset_pending)
+13 −1
Original line number Diff line number Diff line
@@ -440,11 +440,22 @@ enum hclge_comm_cmd_status {
	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_ring csq;
	struct hclge_comm_cmq_ring crq;
	u16 tx_timeout;
	enum hclge_comm_cmd_status last_status;
	struct hclge_comm_cmq_ops ops;
};

struct hclge_comm_hw {
@@ -491,5 +502,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,
			u32 *fw_version, bool is_pf,
			unsigned long reset_pending);

void hclge_comm_cmd_init_ops(struct hclge_comm_hw *hw,
			     const struct hclge_comm_cmq_ops *ops);
#endif
+45 −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
@@ -408,6 +410,48 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int 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, (u32 *)&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, (u32 *)&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)
{
#define HCLGE_MAC_CMD_NUM 21
@@ -12386,6 +12430,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
		goto err_devlink_uninit;

	/* 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,
				  true, hdev->reset_pending);
	if (ret)
+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 */
+40 −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,42 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclge_desc *desc, int 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)
{
	struct hclge_comm_cmq *cmdq = &hdev->hw.hw.cmq;
@@ -3000,6 +3037,7 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)
	}

	hclgevf_arq_init(hdev);

	ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw,
				  &hdev->fw_version, false,
				  hdev->reset_pending);
@@ -3058,6 +3096,8 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
		goto err_cmd_queue_init;

	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,
				  &hdev->fw_version, false,
				  hdev->reset_pending);
Loading