i40e: introduce new dump desc XDP command
Interfaces already exist for dumping Rx and Tx descriptor information. Introduce another for doing the same for XDP descriptors. Signed-off-by: Ciara Loftus <ciara.loftus@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
Родитель
890c402c7b
Коммит
44ea803e2f
|
@ -10,6 +10,12 @@
|
|||
|
||||
static struct dentry *i40e_dbg_root;
|
||||
|
||||
enum ring_type {
|
||||
RING_TYPE_RX,
|
||||
RING_TYPE_TX,
|
||||
RING_TYPE_XDP
|
||||
};
|
||||
|
||||
/**
|
||||
* i40e_dbg_find_vsi - searches for the vsi with the given seid
|
||||
* @pf: the PF structure to search for the vsi
|
||||
|
@ -530,11 +536,12 @@ static void i40e_dbg_dump_aq_desc(struct i40e_pf *pf)
|
|||
* @ring_id: ring id entered by user
|
||||
* @desc_n: descriptor number entered by user
|
||||
* @pf: the i40e_pf created in command write
|
||||
* @is_rx_ring: true if rx, false if tx
|
||||
* @type: enum describing whether ring is RX, TX or XDP
|
||||
**/
|
||||
static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
|
||||
struct i40e_pf *pf, bool is_rx_ring)
|
||||
struct i40e_pf *pf, enum ring_type type)
|
||||
{
|
||||
bool is_rx_ring = type == RING_TYPE_RX;
|
||||
struct i40e_tx_desc *txd;
|
||||
union i40e_rx_desc *rxd;
|
||||
struct i40e_ring *ring;
|
||||
|
@ -546,6 +553,10 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
|
|||
dev_info(&pf->pdev->dev, "vsi %d not found\n", vsi_seid);
|
||||
return;
|
||||
}
|
||||
if (type == RING_TYPE_XDP && !i40e_enabled_xdp_vsi(vsi)) {
|
||||
dev_info(&pf->pdev->dev, "XDP not enabled on VSI %d\n", vsi_seid);
|
||||
return;
|
||||
}
|
||||
if (ring_id >= vsi->num_queue_pairs || ring_id < 0) {
|
||||
dev_info(&pf->pdev->dev, "ring %d not found\n", ring_id);
|
||||
return;
|
||||
|
@ -557,15 +568,32 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
|
|||
return;
|
||||
}
|
||||
|
||||
ring = kmemdup(is_rx_ring
|
||||
? vsi->rx_rings[ring_id] : vsi->tx_rings[ring_id],
|
||||
sizeof(*ring), GFP_KERNEL);
|
||||
switch (type) {
|
||||
case RING_TYPE_RX:
|
||||
ring = kmemdup(vsi->rx_rings[ring_id], sizeof(*ring), GFP_KERNEL);
|
||||
break;
|
||||
case RING_TYPE_TX:
|
||||
ring = kmemdup(vsi->tx_rings[ring_id], sizeof(*ring), GFP_KERNEL);
|
||||
break;
|
||||
case RING_TYPE_XDP:
|
||||
ring = kmemdup(vsi->xdp_rings[ring_id], sizeof(*ring), GFP_KERNEL);
|
||||
break;
|
||||
}
|
||||
if (!ring)
|
||||
return;
|
||||
|
||||
if (cnt == 2) {
|
||||
dev_info(&pf->pdev->dev, "vsi = %02i %s ring = %02i\n",
|
||||
vsi_seid, is_rx_ring ? "rx" : "tx", ring_id);
|
||||
switch (type) {
|
||||
case RING_TYPE_RX:
|
||||
dev_info(&pf->pdev->dev, "VSI = %02i Rx ring = %02i\n", vsi_seid, ring_id);
|
||||
break;
|
||||
case RING_TYPE_TX:
|
||||
dev_info(&pf->pdev->dev, "VSI = %02i Tx ring = %02i\n", vsi_seid, ring_id);
|
||||
break;
|
||||
case RING_TYPE_XDP:
|
||||
dev_info(&pf->pdev->dev, "VSI = %02i XDP ring = %02i\n", vsi_seid, ring_id);
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < ring->count; i++) {
|
||||
if (!is_rx_ring) {
|
||||
txd = I40E_TX_DESC(ring, i);
|
||||
|
@ -603,7 +631,7 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
|
|||
rxd->read.rsvd1, rxd->read.rsvd2);
|
||||
}
|
||||
} else {
|
||||
dev_info(&pf->pdev->dev, "dump desc rx/tx <vsi_seid> <ring_id> [<desc_n>]\n");
|
||||
dev_info(&pf->pdev->dev, "dump desc rx/tx/xdp <vsi_seid> <ring_id> [<desc_n>]\n");
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -960,13 +988,19 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|||
cnt = sscanf(&cmd_buf[12], "%i %i %i",
|
||||
&vsi_seid, &ring_id, &desc_n);
|
||||
i40e_dbg_dump_desc(cnt, vsi_seid, ring_id,
|
||||
desc_n, pf, true);
|
||||
desc_n, pf, RING_TYPE_RX);
|
||||
} else if (strncmp(&cmd_buf[10], "tx", 2)
|
||||
== 0) {
|
||||
cnt = sscanf(&cmd_buf[12], "%i %i %i",
|
||||
&vsi_seid, &ring_id, &desc_n);
|
||||
i40e_dbg_dump_desc(cnt, vsi_seid, ring_id,
|
||||
desc_n, pf, false);
|
||||
desc_n, pf, RING_TYPE_TX);
|
||||
} else if (strncmp(&cmd_buf[10], "xdp", 3)
|
||||
== 0) {
|
||||
cnt = sscanf(&cmd_buf[13], "%i %i %i",
|
||||
&vsi_seid, &ring_id, &desc_n);
|
||||
i40e_dbg_dump_desc(cnt, vsi_seid, ring_id,
|
||||
desc_n, pf, RING_TYPE_XDP);
|
||||
} else if (strncmp(&cmd_buf[10], "aq", 2) == 0) {
|
||||
i40e_dbg_dump_aq_desc(pf);
|
||||
} else {
|
||||
|
@ -974,6 +1008,8 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|||
"dump desc tx <vsi_seid> <ring_id> [<desc_n>]\n");
|
||||
dev_info(&pf->pdev->dev,
|
||||
"dump desc rx <vsi_seid> <ring_id> [<desc_n>]\n");
|
||||
dev_info(&pf->pdev->dev,
|
||||
"dump desc xdp <vsi_seid> <ring_id> [<desc_n>]\n");
|
||||
dev_info(&pf->pdev->dev, "dump desc aq\n");
|
||||
}
|
||||
} else if (strncmp(&cmd_buf[5], "reset stats", 11) == 0) {
|
||||
|
@ -1144,7 +1180,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|||
buff = NULL;
|
||||
} else {
|
||||
dev_info(&pf->pdev->dev,
|
||||
"dump desc tx <vsi_seid> <ring_id> [<desc_n>], dump desc rx <vsi_seid> <ring_id> [<desc_n>],\n");
|
||||
"dump desc tx <vsi_seid> <ring_id> [<desc_n>], dump desc rx <vsi_seid> <ring_id> [<desc_n>], dump desc xdp <vsi_seid> <ring_id> [<desc_n>],\n");
|
||||
dev_info(&pf->pdev->dev, "dump switch\n");
|
||||
dev_info(&pf->pdev->dev, "dump vsi [seid]\n");
|
||||
dev_info(&pf->pdev->dev, "dump reset stats\n");
|
||||
|
@ -1560,6 +1596,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|||
dev_info(&pf->pdev->dev, " dump vsi [seid]\n");
|
||||
dev_info(&pf->pdev->dev, " dump desc tx <vsi_seid> <ring_id> [<desc_n>]\n");
|
||||
dev_info(&pf->pdev->dev, " dump desc rx <vsi_seid> <ring_id> [<desc_n>]\n");
|
||||
dev_info(&pf->pdev->dev, " dump desc xdp <vsi_seid> <ring_id> [<desc_n>]\n");
|
||||
dev_info(&pf->pdev->dev, " dump desc aq\n");
|
||||
dev_info(&pf->pdev->dev, " dump reset stats\n");
|
||||
dev_info(&pf->pdev->dev, " dump debug fwdata <cluster_id> <table_id> <index>\n");
|
||||
|
|
Загрузка…
Ссылка в новой задаче