[dpdk-dev] [PATCH v2 07/15] sched: update memory compute to support flexiblity
Jasvinder Singh
jasvinder.singh at intel.com
Mon Sep 9 12:05:22 CEST 2019
Update memory footprint compute function for allowing subports of
the same port to have different configuration in terms of number of
pipes, pipe queue sizes, etc.
Signed-off-by: Jasvinder Singh <jasvinder.singh at intel.com>
Signed-off-by: Lukasz Krakowiak <lukaszx.krakowiak at intel.com>
---
lib/librte_sched/rte_sched.c | 102 +++++++++++------------------------
lib/librte_sched/rte_sched.h | 8 +--
2 files changed, 36 insertions(+), 74 deletions(-)
diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c
index a5e4c45b4..f8d13c66d 100644
--- a/lib/librte_sched/rte_sched.c
+++ b/lib/librte_sched/rte_sched.c
@@ -495,70 +495,6 @@ rte_sched_port_check_params(struct rte_sched_port_params *params)
return 0;
}
-static uint32_t
-rte_sched_port_get_array_base(struct rte_sched_port_params *params, enum rte_sched_port_array array)
-{
- uint32_t n_subports_per_port = params->n_subports_per_port;
- uint32_t n_pipes_per_subport = params->n_pipes_per_subport;
- uint32_t n_pipes_per_port = n_pipes_per_subport * n_subports_per_port;
- uint32_t n_queues_per_port = RTE_SCHED_QUEUES_PER_PIPE * n_pipes_per_subport * n_subports_per_port;
-
- uint32_t size_subport = n_subports_per_port * sizeof(struct rte_sched_subport);
- uint32_t size_pipe = n_pipes_per_port * sizeof(struct rte_sched_pipe);
- uint32_t size_queue = n_queues_per_port * sizeof(struct rte_sched_queue);
- uint32_t size_queue_extra
- = n_queues_per_port * sizeof(struct rte_sched_queue_extra);
- uint32_t size_pipe_profiles
- = params->n_max_pipe_profiles * sizeof(struct rte_sched_pipe_profile);
- uint32_t size_bmp_array = rte_bitmap_get_memory_footprint(n_queues_per_port);
- uint32_t size_per_pipe_queue_array, size_queue_array;
-
- uint32_t base, i;
-
- size_per_pipe_queue_array = 0;
- for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {
- if (i < RTE_SCHED_TRAFFIC_CLASS_BE)
- size_per_pipe_queue_array +=
- params->qsize[i] * sizeof(struct rte_mbuf *);
- else
- size_per_pipe_queue_array += RTE_SCHED_MAX_QUEUES_PER_TC *
- params->qsize[i] * sizeof(struct rte_mbuf *);
- }
- size_queue_array = n_pipes_per_port * size_per_pipe_queue_array;
-
- base = 0;
-
- if (array == e_RTE_SCHED_PORT_ARRAY_SUBPORT)
- return base;
- base += RTE_CACHE_LINE_ROUNDUP(size_subport);
-
- if (array == e_RTE_SCHED_PORT_ARRAY_PIPE)
- return base;
- base += RTE_CACHE_LINE_ROUNDUP(size_pipe);
-
- if (array == e_RTE_SCHED_PORT_ARRAY_QUEUE)
- return base;
- base += RTE_CACHE_LINE_ROUNDUP(size_queue);
-
- if (array == e_RTE_SCHED_PORT_ARRAY_QUEUE_EXTRA)
- return base;
- base += RTE_CACHE_LINE_ROUNDUP(size_queue_extra);
-
- if (array == e_RTE_SCHED_PORT_ARRAY_PIPE_PROFILES)
- return base;
- base += RTE_CACHE_LINE_ROUNDUP(size_pipe_profiles);
-
- if (array == e_RTE_SCHED_PORT_ARRAY_BMP_ARRAY)
- return base;
- base += RTE_CACHE_LINE_ROUNDUP(size_bmp_array);
-
- if (array == e_RTE_SCHED_PORT_ARRAY_QUEUE_ARRAY)
- return base;
- base += RTE_CACHE_LINE_ROUNDUP(size_queue_array);
-
- return base;
-}
-
static uint32_t
rte_sched_subport_get_array_base(struct rte_sched_subport_params *params,
uint32_t n_max_pipe_profiles,
@@ -880,22 +816,46 @@ rte_sched_subport_check_params(struct rte_sched_subport_params *params,
}
uint32_t
-rte_sched_port_get_memory_footprint(struct rte_sched_port_params *params)
+rte_sched_port_get_memory_footprint(struct rte_sched_port_params *port_params,
+ struct rte_sched_subport_params **subport_params)
{
- uint32_t size0, size1;
+ uint32_t size0 = 0, size1 = 0, i;
int status;
- status = rte_sched_port_check_params(params);
+ status = rte_sched_port_check_params(port_params);
if (status != 0) {
- RTE_LOG(NOTICE, SCHED,
- "Port scheduler params check failed (%d)\n", status);
+ RTE_LOG(ERR, SCHED,
+ "%s: Port scheduler port params check failed (%d)\n",
+ __func__, status);
return 0;
}
+ for (i = 0; i < port_params->n_subports_per_port; i++) {
+ struct rte_sched_subport_params *sp = subport_params[i];
+
+ status = rte_sched_subport_check_params(sp,
+ port_params->n_max_pipes_per_subport,
+ port_params->n_max_pipe_profiles,
+ port_params->rate);
+ if (status != 0) {
+ RTE_LOG(ERR, SCHED,
+ "%s: Port scheduler subport params check failed (%d)\n",
+ __func__, status);
+
+ return 0;
+ }
+ }
+
size0 = sizeof(struct rte_sched_port);
- size1 = rte_sched_port_get_array_base(params,
- e_RTE_SCHED_PORT_ARRAY_TOTAL);
+
+ for (i = 0; i < port_params->n_subports_per_port; i++) {
+ struct rte_sched_subport_params *sp = subport_params[i];
+
+ size1 += rte_sched_subport_get_array_base(sp,
+ port_params->n_max_pipe_profiles,
+ e_RTE_SCHED_SUBPORT_ARRAY_TOTAL);
+ }
return size0 + size1;
}
diff --git a/lib/librte_sched/rte_sched.h b/lib/librte_sched/rte_sched.h
index 56e9fbfa7..ea2b07448 100644
--- a/lib/librte_sched/rte_sched.h
+++ b/lib/librte_sched/rte_sched.h
@@ -364,14 +364,16 @@ rte_sched_pipe_config(struct rte_sched_port *port,
/**
* Hierarchical scheduler memory footprint size per port
*
- * @param params
+ * @param port_params
* Port scheduler configuration parameter structure
+ * @param subport_params
+ * Array of subport parameter structures
* @return
* Memory footprint size in bytes upon success, 0 otherwise
*/
uint32_t
-rte_sched_port_get_memory_footprint(struct rte_sched_port_params *params);
-
+rte_sched_port_get_memory_footprint(struct rte_sched_port_params *port_params,
+ struct rte_sched_subport_params **subport_params);
/*
* Statistics
*
--
2.21.0
More information about the dev
mailing list