Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0c64c15 authored by Paul Durrant's avatar Paul Durrant Committed by David S. Miller
Browse files

xen-netback: create a debugfs node for hash information



It is useful to be able to see the hash configuration when running tests.
This patch adds a debugfs node for that purpose.

Signed-off-by: default avatarPaul Durrant <paul.durrant@citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>
Acked-by: default avatarWei Liu <wei.liu2@citrix.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c7b256f9
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -412,4 +412,8 @@ u32 xenvif_set_hash_mapping(struct xenvif *vif, u32 gref, u32 len,


void xenvif_set_skb_hash(struct xenvif *vif, struct sk_buff *skb);
void xenvif_set_skb_hash(struct xenvif *vif, struct sk_buff *skb);


#ifdef CONFIG_DEBUG_FS
void xenvif_dump_hash_info(struct xenvif *vif, struct seq_file *m);
#endif

#endif /* __XEN_NETBACK__COMMON_H__ */
#endif /* __XEN_NETBACK__COMMON_H__ */
+68 −0
Original line number Original line Diff line number Diff line
@@ -369,6 +369,74 @@ u32 xenvif_set_hash_mapping(struct xenvif *vif, u32 gref, u32 len,
	return XEN_NETIF_CTRL_STATUS_SUCCESS;
	return XEN_NETIF_CTRL_STATUS_SUCCESS;
}
}


#ifdef CONFIG_DEBUG_FS
void xenvif_dump_hash_info(struct xenvif *vif, struct seq_file *m)
{
	unsigned int i;

	switch (vif->hash.alg) {
	case XEN_NETIF_CTRL_HASH_ALGORITHM_TOEPLITZ:
		seq_puts(m, "Hash Algorithm: TOEPLITZ\n");
		break;

	case XEN_NETIF_CTRL_HASH_ALGORITHM_NONE:
		seq_puts(m, "Hash Algorithm: NONE\n");
		/* FALLTHRU */
	default:
		return;
	}

	if (vif->hash.flags) {
		seq_puts(m, "\nHash Flags:\n");

		if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV4)
			seq_puts(m, "- IPv4\n");
		if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV4_TCP)
			seq_puts(m, "- IPv4 + TCP\n");
		if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV6)
			seq_puts(m, "- IPv6\n");
		if (vif->hash.flags & XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP)
			seq_puts(m, "- IPv6 + TCP\n");
	}

	seq_puts(m, "\nHash Key:\n");

	for (i = 0; i < XEN_NETBK_MAX_HASH_KEY_SIZE; ) {
		unsigned int j, n;

		n = 8;
		if (i + n >= XEN_NETBK_MAX_HASH_KEY_SIZE)
			n = XEN_NETBK_MAX_HASH_KEY_SIZE - i;

		seq_printf(m, "[%2u - %2u]: ", i, i + n - 1);

		for (j = 0; j < n; j++, i++)
			seq_printf(m, "%02x ", vif->hash.key[i]);

		seq_puts(m, "\n");
	}

	if (vif->hash.size != 0) {
		seq_puts(m, "\nHash Mapping:\n");

		for (i = 0; i < vif->hash.size; ) {
			unsigned int j, n;

			n = 8;
			if (i + n >= vif->hash.size)
				n = vif->hash.size - i;

			seq_printf(m, "[%4u - %4u]: ", i, i + n - 1);

			for (j = 0; j < n; j++, i++)
				seq_printf(m, "%4u ", vif->hash.mapping[i]);

			seq_puts(m, "\n");
		}
	}
}
#endif /* CONFIG_DEBUG_FS */

void xenvif_init_hash(struct xenvif *vif)
void xenvif_init_hash(struct xenvif *vif)
{
{
	if (xenvif_hash_cache_size == 0)
	if (xenvif_hash_cache_size == 0)
+35 −2
Original line number Original line Diff line number Diff line
@@ -165,7 +165,7 @@ xenvif_write_io_ring(struct file *filp, const char __user *buf, size_t count,
	return count;
	return count;
}
}


static int xenvif_dump_open(struct inode *inode, struct file *filp)
static int xenvif_io_ring_open(struct inode *inode, struct file *filp)
{
{
	int ret;
	int ret;
	void *queue = NULL;
	void *queue = NULL;
@@ -179,13 +179,35 @@ static int xenvif_dump_open(struct inode *inode, struct file *filp)


static const struct file_operations xenvif_dbg_io_ring_ops_fops = {
static const struct file_operations xenvif_dbg_io_ring_ops_fops = {
	.owner = THIS_MODULE,
	.owner = THIS_MODULE,
	.open = xenvif_dump_open,
	.open = xenvif_io_ring_open,
	.read = seq_read,
	.read = seq_read,
	.llseek = seq_lseek,
	.llseek = seq_lseek,
	.release = single_release,
	.release = single_release,
	.write = xenvif_write_io_ring,
	.write = xenvif_write_io_ring,
};
};


static int xenvif_read_ctrl(struct seq_file *m, void *v)
{
	struct xenvif *vif = m->private;

	xenvif_dump_hash_info(vif, m);

	return 0;
}

static int xenvif_ctrl_open(struct inode *inode, struct file *filp)
{
	return single_open(filp, xenvif_read_ctrl, inode->i_private);
}

static const struct file_operations xenvif_dbg_ctrl_ops_fops = {
	.owner = THIS_MODULE,
	.open = xenvif_ctrl_open,
	.read = seq_read,
	.llseek = seq_lseek,
	.release = single_release,
};

static void xenvif_debugfs_addif(struct xenvif *vif)
static void xenvif_debugfs_addif(struct xenvif *vif)
{
{
	struct dentry *pfile;
	struct dentry *pfile;
@@ -210,6 +232,17 @@ static void xenvif_debugfs_addif(struct xenvif *vif)
				pr_warn("Creation of io_ring file returned %ld!\n",
				pr_warn("Creation of io_ring file returned %ld!\n",
					PTR_ERR(pfile));
					PTR_ERR(pfile));
		}
		}

		if (vif->ctrl_task) {
			pfile = debugfs_create_file("ctrl",
						    S_IRUSR,
						    vif->xenvif_dbg_root,
						    vif,
						    &xenvif_dbg_ctrl_ops_fops);
			if (IS_ERR_OR_NULL(pfile))
				pr_warn("Creation of ctrl file returned %ld!\n",
					PTR_ERR(pfile));
		}
	} else
	} else
		netdev_warn(vif->dev,
		netdev_warn(vif->dev,
			    "Creation of vif debugfs dir returned %ld!\n",
			    "Creation of vif debugfs dir returned %ld!\n",