diff options
author | Luc Provoost <luc.provoost@intel.com> | 2020-08-17 14:53:11 +0200 |
---|---|---|
committer | Xavier Simonart <xavier.simonart@intel.com> | 2020-08-18 09:13:35 +0000 |
commit | 7610183ab984f1ffb362f0ffff95ba3b7efe4dd1 (patch) | |
tree | 7d7592302fbc6ad59dbd59debd553192edce191d | |
parent | 05af2d54e86e36dae6009e2fbeb258c0fe37cffd (diff) |
Add all_rx_queues port flag to use all rx queues
In the port section of the PROX configuration file, a new parameter can
be added: all_rx_queues. The default is all_rx_queues=no.
When the rx port variable of a task is listing a port name, all rx
queues will be used when the all_rx_queues is set for that port.
If not set, only one queue of that port will be "consumed", each time
the port is referenced in the rx port variable.
When the all_rx_queues is set for a port, you should NOT reference that
port more than once in the rx port variables.
Change-Id: If9662b1ac07adeec9db88d2a25ca68aed0b9e213
Signed-off-by: Luc Provoost <luc.provoost@intel.com>
-rw-r--r-- | VNFs/DPPD-PROX/main.c | 43 | ||||
-rw-r--r-- | VNFs/DPPD-PROX/prox_args.c | 7 | ||||
-rw-r--r-- | VNFs/DPPD-PROX/prox_port_cfg.h | 1 |
3 files changed, 51 insertions, 0 deletions
diff --git a/VNFs/DPPD-PROX/main.c b/VNFs/DPPD-PROX/main.c index f6fa3e80..a863ffb3 100644 --- a/VNFs/DPPD-PROX/main.c +++ b/VNFs/DPPD-PROX/main.c @@ -315,6 +315,49 @@ static void configure_if_tx_queues(struct task_args *targ, uint8_t socket) static void configure_if_rx_queues(struct task_args *targ, uint8_t socket) { struct prox_port_cfg *port; + uint8_t port_used_counter[PROX_MAX_PORTS] = {0}; + bool multiple_port_reference = false; + uint8_t total_number_of_queues = 0; + // Check how many times a port is referenced for this task + for (uint8_t i = 0; i < targ->nb_rxports; i++) { + uint8_t if_port = targ->rx_port_queue[i].port; + port_used_counter[if_port]++; + if (port_used_counter[if_port] > 1) { + multiple_port_reference = true; + port = &prox_port_cfg[if_port]; + PROX_PANIC((port->all_rx_queues), "Multiple queues defined in rx port, but all_rx_queues also set for port %s\n", port->name); + } + } + // If only referenced once, it is possible that we want to use all queues + // Therefore we will check all_rx_queues for that port + if (!multiple_port_reference) { + for (uint8_t i = 0; i < PROX_MAX_PORTS; i++) { + uint8_t if_port = targ->rx_port_queue[i].port; + if (port_used_counter[if_port]) { + port = &prox_port_cfg[if_port]; + if (port->all_rx_queues) { + port_used_counter[if_port] = port->max_rxq; + total_number_of_queues += port->max_rxq; + plog_info("\tall_rx_queues for Port %s: %u rx_queues will be applied\n", port->name, port_used_counter[if_port]); + } + } + } + } + if (total_number_of_queues) { + PROX_PANIC((total_number_of_queues > PROX_MAX_PORTS), "%u queues using the all_rx_queues. PROX_MAX_PORTS is set to %u\n", total_number_of_queues, PROX_MAX_PORTS); + uint8_t index = 0; + for (uint8_t i = 0; i < PROX_MAX_PORTS; i++) { + if (port_used_counter[i]) { + for (uint8_t j = 0; j < port_used_counter[i]; j++) { + targ->rx_port_queue[index].port = i; + index ++; + } + port = &prox_port_cfg[i]; + plog_info("\t\tConfiguring task to use port %s with %u rx_queues\n", port->name, port_used_counter[i]); + } + } + targ->nb_rxports = index; + } for (int i = 0; i < targ->nb_rxports; i++) { uint8_t if_port = targ->rx_port_queue[i].port; diff --git a/VNFs/DPPD-PROX/prox_args.c b/VNFs/DPPD-PROX/prox_args.c index d6bdf818..5af19318 100644 --- a/VNFs/DPPD-PROX/prox_args.c +++ b/VNFs/DPPD-PROX/prox_args.c @@ -541,6 +541,13 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) else if (STR_EQ(str, "tx desc")) { return parse_int(&cfg->n_txd, pkey); } + else if (STR_EQ(str, "all_rx_queues")) { + uint32_t val; + if (parse_bool(&val, pkey)) { + return -1; + } + cfg->all_rx_queues = val; + } else if (STR_EQ(str, "promiscuous")) { uint32_t val; if (parse_bool(&val, pkey)) { diff --git a/VNFs/DPPD-PROX/prox_port_cfg.h b/VNFs/DPPD-PROX/prox_port_cfg.h index 9d025999..f5929a72 100644 --- a/VNFs/DPPD-PROX/prox_port_cfg.h +++ b/VNFs/DPPD-PROX/prox_port_cfg.h @@ -87,6 +87,7 @@ struct prox_port_cfg { uint32_t vlan_tag; uint8_t prefix; uint8_t is_vdev; + uint8_t all_rx_queues; }; extern rte_atomic32_t lsc; |