From: "Min Hu (Connor)" <[email protected]>

This patch add support for RSS reta dump.

The command is like:
dpdk-proc-info -a xxxx:xx:xx.x --file-prefix=xxx -- --show-rss-reta

Signed-off-by: Min Hu (Connor) <[email protected]>
Signed-off-by: Dongdong Liu <[email protected]>
---
 app/proc-info/main.c | 58 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/app/proc-info/main.c b/app/proc-info/main.c
index da67155007..a718c201ce 100644
--- a/app/proc-info/main.c
+++ b/app/proc-info/main.c
@@ -46,6 +46,8 @@
 #define MAX_STRING_LEN 256
 
 #define ETHDEV_FWVERS_LEN 32
+#define RTE_RETA_CONF_GROUP_NUM 32
+#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
 
 #define STATS_BDR_FMT "========================================"
 #define STATS_BDR_STR(w, s) printf("%.*s%s%.*s\n", w, \
@@ -107,6 +109,8 @@ static uint32_t enable_dump_regs;
 static char *dump_regs_file_prefix;
 /* Enable show version. */
 static uint32_t enable_shw_version;
+/* Enable show RSS reta. */
+static uint32_t enable_shw_rss_reta;
 
 /**< display usage */
 static void
@@ -136,6 +140,7 @@ proc_info_usage(const char *prgname)
                "  --show-ring[=name]: to display ring information\n"
                "  --show-mempool[=name]: to display mempool information\n"
                "  --show-version: to display DPDK version and ethdev firmware 
version\n"
+               "  --show-rss-reta: to display ports redirection table\n"
                "  --iter-mempool=name: iterate mempool elements to display 
content\n"
                "  --dump-regs=file-prefix: dump registers to file with the 
file-prefix\n",
                prgname);
@@ -249,6 +254,7 @@ proc_info_parse_args(int argc, char **argv)
                {"iter-mempool", required_argument, NULL, 0},
                {"dump-regs", required_argument, NULL, 0},
                {"show-version", 0, NULL, 0},
+               {"show-rss-reta", 0, NULL, 0},
                {NULL, 0, 0, 0}
        };
 
@@ -323,6 +329,9 @@ proc_info_parse_args(int argc, char **argv)
                        } else if (!strncmp(long_option[option_index].name,
                                        "show-version", MAX_LONG_OPT_SZ))
                                enable_shw_version = 1;
+                       else if (!strncmp(long_option[option_index].name,
+                                       "show-rss-reta", MAX_LONG_OPT_SZ))
+                               enable_shw_rss_reta = 1;
                        break;
                case 1:
                        /* Print xstat single value given by name*/
@@ -1511,6 +1520,53 @@ show_version(void)
        }
 }
 
+static void
+show_port_rss_reta_info(void)
+{
+       struct rte_eth_rss_reta_entry64 reta_conf[RTE_RETA_CONF_GROUP_NUM + 1];
+       struct rte_eth_dev_info dev_info;
+       uint16_t i, idx, shift;
+       uint16_t num;
+       uint16_t id;
+       int ret;
+
+       RTE_ETH_FOREACH_DEV(id) {
+               /* Skip if port is not in mask */
+               if ((enabled_port_mask & (1ul << id)) == 0)
+                       continue;
+
+               if (!rte_eth_dev_is_valid_port(id))
+                       continue;
+
+               snprintf(bdr_str, MAX_STRING_LEN, " Port %u ", id);
+               STATS_BDR_STR(5, bdr_str);
+
+               ret = rte_eth_dev_info_get(id, &dev_info);
+               if (ret < 0) {
+                       printf("Error getting device info, ret = %d\n", ret);
+                       return;
+               }
+
+               num = DIV_ROUND_UP(dev_info.reta_size, RTE_ETH_RETA_GROUP_SIZE);
+               memset(reta_conf, 0, sizeof(reta_conf));
+               for (i = 0; i < num; i++)
+                       reta_conf[i].mask = ~0ULL;
+
+               ret = rte_eth_dev_rss_reta_query(id, reta_conf, 
dev_info.reta_size);
+               if (ret < 0) {
+                       printf("Failed to get RSS RETA info, ret = %d\n", ret);
+                       return;
+               }
+
+               for (i = 0; i < dev_info.reta_size; i++) {
+                       idx = i / RTE_ETH_RETA_GROUP_SIZE;
+                       shift = i % RTE_ETH_RETA_GROUP_SIZE;
+                       printf("RSS RETA configuration: hash index=%u, 
queue=%u\n",
+                               i, reta_conf[idx].reta[shift]);
+               }
+       }
+}
+
 int
 main(int argc, char **argv)
 {
@@ -1626,6 +1682,8 @@ main(int argc, char **argv)
                dump_regs(dump_regs_file_prefix);
        if (enable_shw_version)
                show_version();
+       if (enable_shw_rss_reta)
+               show_port_rss_reta_info();
        RTE_ETH_FOREACH_DEV(i)
                rte_eth_dev_close(i);
 
-- 
2.22.0

Reply via email to