diff mbox series

[V2,net-next,11/11] net: hns3: add debugfs support for interrupt coalesce

Message ID 1604892159-19990-12-git-send-email-tanhuazhong@huawei.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series net: hns3: updates for -next | expand

Commit Message

Huazhong Tan Nov. 9, 2020, 3:22 a.m. UTC
Since user may need to check the current configuration of the
interrupt coalesce, so add debugfs support for query this info,
which includes DIM profile, coalesce configuration of both software
and hardware.

Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 126 +++++++++++++++++++++
 1 file changed, 126 insertions(+)

Comments

Jakub Kicinski Nov. 11, 2020, 1:28 a.m. UTC | #1
On Mon, 9 Nov 2020 11:22:39 +0800 Huazhong Tan wrote:
> Since user may need to check the current configuration of the
> interrupt coalesce, so add debugfs support for query this info,
> which includes DIM profile, coalesce configuration of both software
> and hardware.
> 
> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>

Please create a file per vector so that users can just read it instead
of dumping the info into the logs.

Even better we should put as much of this information as possible into
the ethtool API. dim state is hardly hardware-specific.
Huazhong Tan Nov. 11, 2020, 3:16 a.m. UTC | #2
On 2020/11/11 9:28, Jakub Kicinski wrote:
> On Mon, 9 Nov 2020 11:22:39 +0800 Huazhong Tan wrote:
>> Since user may need to check the current configuration of the
>> interrupt coalesce, so add debugfs support for query this info,
>> which includes DIM profile, coalesce configuration of both software
>> and hardware.
>>
>> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
> 
> Please create a file per vector so that users can just read it instead
> of dumping the info into the logs.
> 

This patch should be removed from this series right now. Since this new 
read method needs some adaptations and verifications, and there maybe 
another better ways to dump this info.

> Even better we should put as much of this information as possible into
> the ethtool API. dim state is hardly hardware-specific.
> 

Should the ethtool API used to dump the hardware info? Could you provide 
some hints to do it?

> .
>
Jakub Kicinski Nov. 11, 2020, 4:15 p.m. UTC | #3
On Wed, 11 Nov 2020 11:16:37 +0800 tanhuazhong wrote:
> On 2020/11/11 9:28, Jakub Kicinski wrote:
> > On Mon, 9 Nov 2020 11:22:39 +0800 Huazhong Tan wrote:  
> >> Since user may need to check the current configuration of the
> >> interrupt coalesce, so add debugfs support for query this info,
> >> which includes DIM profile, coalesce configuration of both software
> >> and hardware.
> >>
> >> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>  
> > 
> > Please create a file per vector so that users can just read it instead
> > of dumping the info into the logs.
> >   
> 
> This patch should be removed from this series right now. Since this new 
> read method needs some adaptations and verifications, and there maybe 
> another better ways to dump this info.
> 
> > Even better we should put as much of this information as possible into
> > the ethtool API. dim state is hardly hardware-specific.
> >   
> 
> Should the ethtool API used to dump the hardware info? Could you provide 
> some hints to do it?

Not necessarily hardware info but if there is a use case for inspecting
DIM state we can extend

coalesce_fill_reply() in net/ethtool/coalesce.c 

to report it.
Huazhong Tan Nov. 12, 2020, 12:48 a.m. UTC | #4
On 2020/11/12 0:15, Jakub Kicinski wrote:
> On Wed, 11 Nov 2020 11:16:37 +0800 tanhuazhong wrote:
>> On 2020/11/11 9:28, Jakub Kicinski wrote:
>>> On Mon, 9 Nov 2020 11:22:39 +0800 Huazhong Tan wrote:
>>>> Since user may need to check the current configuration of the
>>>> interrupt coalesce, so add debugfs support for query this info,
>>>> which includes DIM profile, coalesce configuration of both software
>>>> and hardware.
>>>>
>>>> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
>>>
>>> Please create a file per vector so that users can just read it instead
>>> of dumping the info into the logs.
>>>    
>>
>> This patch should be removed from this series right now. Since this new
>> read method needs some adaptations and verifications, and there maybe
>> another better ways to dump this info.
>>
>>> Even better we should put as much of this information as possible into
>>> the ethtool API. dim state is hardly hardware-specific.
>>>    
>>
>> Should the ethtool API used to dump the hardware info? Could you provide
>> some hints to do it?
> 
> Not necessarily hardware info but if there is a use case for inspecting
> DIM state we can extend
> 
> coalesce_fill_reply() in net/ethtool/coalesce.c
> 
> to report it.
> 

ok, thanks.

> .
>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
index a5ebca8..26fa69a 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
@@ -12,6 +12,93 @@ 
 
 static struct dentry *hns3_dbgfs_root;
 
+static ssize_t hns3_dbg_coal_write(struct file *filp, const char __user *buffer,
+				   size_t count, loff_t *ppos)
+{
+	struct hnae3_handle *h = filp->private_data;
+	struct hns3_nic_priv *priv  = h->priv;
+	struct hns3_enet_tqp_vector *tqp_vector;
+	struct hns3_enet_coalesce *coal;
+	u8 __iomem *base_addr;
+	int uncopied_bytes;
+	unsigned int idx;
+	struct dim *dim;
+	char *cmd_buf;
+
+	if (*ppos != 0)
+		return 0;
+
+	if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state)) {
+		dev_err(&h->pdev->dev, "device is not initialized\n");
+		return -EFAULT;
+	}
+
+	cmd_buf = kzalloc(count + 1, GFP_KERNEL);
+	if (!cmd_buf)
+		return -ENOMEM;
+
+	uncopied_bytes = copy_from_user(cmd_buf, buffer, count);
+	if (uncopied_bytes) {
+		kfree(cmd_buf);
+		return -EFAULT;
+	}
+
+	cmd_buf[count] = '\0';
+
+	if (kstrtouint(cmd_buf, 0, &idx))
+		idx = 0;
+
+	if (idx >= priv->vector_num) {
+		dev_err(&h->pdev->dev,
+			"vector index(%u) is out of range(0-%u)\n", idx,
+			priv->vector_num - 1);
+		kfree(cmd_buf);
+		return -EINVAL;
+	}
+
+	tqp_vector = &priv->tqp_vector[idx];
+	coal = &tqp_vector->tx_group.coal;
+	dim = &tqp_vector->tx_group.dim;
+	base_addr = tqp_vector->mask_addr;
+
+	dev_info(&h->pdev->dev, "vector[%u] interrupt coalesce info:\n", idx);
+	dev_info(&h->pdev->dev,
+		 "TX DIM info state = %d profile_ix = %d mode = %d tune_state = %d steps_right = %d steps_left = %d tired = %d\n",
+		 dim->state, dim->profile_ix, dim->mode, dim->tune_state,
+		 dim->steps_right, dim->steps_left, dim->tired);
+
+	dev_info(&h->pdev->dev, "TX GL info sw_gl = %u, hw_gl = %u\n",
+		 coal->int_gl,
+		 readl(base_addr + HNS3_VECTOR_GL1_OFFSET));
+
+	if (coal->ql_enable)
+		dev_info(&h->pdev->dev, "TX QL info sw_ql = %u, hw_ql = %u\n",
+			 coal->int_ql,
+			 readl(base_addr + HNS3_VECTOR_TX_QL_OFFSET));
+
+	coal = &tqp_vector->rx_group.coal;
+	dim = &tqp_vector->rx_group.dim;
+
+	dev_info(&h->pdev->dev,
+		 "RX dim_info state = %d profile_ix = %d mode = %d tune_state = %d steps_right = %d steps_left = %d tired = %d\n",
+		 dim->state, dim->profile_ix, dim->mode, dim->tune_state,
+		 dim->steps_right, dim->steps_left, dim->tired);
+
+	dev_info(&h->pdev->dev, "RX GL info sw_gl = %u, hw_gl = %u\n",
+		 coal->int_gl,
+		 readl(base_addr + HNS3_VECTOR_GL0_OFFSET));
+
+	if (coal->ql_enable)
+		dev_info(&h->pdev->dev, "RX QL info sw_ql = %u, hw_ql = %u\n",
+			 coal->int_ql,
+			 readl(base_addr + HNS3_VECTOR_RX_QL_OFFSET));
+
+	kfree(cmd_buf);
+	cmd_buf = NULL;
+
+	return count;
+}
+
 static int hns3_dbg_queue_info(struct hnae3_handle *h,
 			       const char *cmd_buf)
 {
@@ -352,6 +439,35 @@  static void hns3_dbg_dev_specs(struct hnae3_handle *h)
 	dev_info(priv->dev, "MAX INT GL: %u\n", dev_specs->max_int_gl);
 }
 
+static ssize_t hns3_dbg_coal_read(struct file *filp, char __user *buffer,
+				  size_t count, loff_t *ppos)
+{
+	int uncopy_bytes;
+	char *buf;
+	int len;
+
+	if (*ppos != 0)
+		return 0;
+
+	if (count < HNS3_DBG_READ_LEN)
+		return -ENOSPC;
+
+	buf = kzalloc(HNS3_DBG_READ_LEN, GFP_KERNEL);
+	if (!buf)
+		return -ENOMEM;
+
+	len = scnprintf(buf, HNS3_DBG_READ_LEN, "%s\n",
+			"Please echo index to coal");
+	uncopy_bytes = copy_to_user(buffer, buf, len);
+
+	kfree(buf);
+
+	if (uncopy_bytes)
+		return -EFAULT;
+
+	return (*ppos = len);
+}
+
 static ssize_t hns3_dbg_cmd_read(struct file *filp, char __user *buffer,
 				 size_t count, loff_t *ppos)
 {
@@ -452,6 +568,13 @@  static const struct file_operations hns3_dbg_cmd_fops = {
 	.write = hns3_dbg_cmd_write,
 };
 
+static const struct file_operations hns3_dbg_coal_fops = {
+	.owner = THIS_MODULE,
+	.open  = simple_open,
+	.read  = hns3_dbg_coal_read,
+	.write = hns3_dbg_coal_write,
+};
+
 void hns3_dbg_init(struct hnae3_handle *handle)
 {
 	const char *name = pci_name(handle->pdev);
@@ -460,6 +583,9 @@  void hns3_dbg_init(struct hnae3_handle *handle)
 
 	debugfs_create_file("cmd", 0600, handle->hnae3_dbgfs, handle,
 			    &hns3_dbg_cmd_fops);
+
+	debugfs_create_file("coal", 0600, handle->hnae3_dbgfs, handle,
+			    &hns3_dbg_coal_fops);
 }
 
 void hns3_dbg_uninit(struct hnae3_handle *handle)