From: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
To: dev@dpdk.org
Cc: Harshad Narayane <harshad.suresh.narayane@intel.com>,
Kamalakannan R <kamalakannan.r@intel.com>,
Venkata Suresh Kumar P <venkata.suresh.kumar.p@intel.com>,
stable@dpdk.org
Subject: [PATCH] pipeline: fix table state memory allocation
Date: Thu, 10 Feb 2022 19:45:08 +0000 [thread overview]
Message-ID: <20220210194508.58650-1-cristian.dumitrescu@intel.com> (raw)
The regular tables, selector tables and learner tables are all sharing
the table state array. The locations in this array were computed
incorrectly, leading to memory corruption issues.
Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Harshad Narayane <harshad.suresh.narayane@intel.com>
Signed-off-by: Kamalakannan R <kamalakannan.r@intel.com>
Signed-off-by: Venkata Suresh Kumar P <venkata.suresh.kumar.p@intel.com>
Fixes: 4f59d3726147 ("pipeline: support learner tables")
Cc: stable@dpdk.org
---
lib/pipeline/rte_swx_ctl.c | 28 +++++++++++++++++-----------
lib/pipeline/rte_swx_pipeline.c | 2 +-
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/lib/pipeline/rte_swx_ctl.c b/lib/pipeline/rte_swx_ctl.c
index 8e29d58cec..f52ccffd75 100644
--- a/lib/pipeline/rte_swx_ctl.c
+++ b/lib/pipeline/rte_swx_ctl.c
@@ -1021,15 +1021,16 @@ learner_action_data_size_get(struct rte_swx_ctl_pipeline *ctl, struct learner *l
static void
table_state_free(struct rte_swx_ctl_pipeline *ctl)
{
- uint32_t i;
+ uint32_t table_base_index, selector_base_index, learner_base_index, i;
if (!ctl->ts_next)
return;
/* For each table, free its table state. */
+ table_base_index = 0;
for (i = 0; i < ctl->info.n_tables; i++) {
struct table *table = &ctl->tables[i];
- struct rte_swx_table_state *ts = &ctl->ts_next[i];
+ struct rte_swx_table_state *ts = &ctl->ts_next[table_base_index + i];
/* Default action data. */
free(ts->default_action_data);
@@ -1040,8 +1041,9 @@ table_state_free(struct rte_swx_ctl_pipeline *ctl)
}
/* For each selector table, free its table state. */
+ selector_base_index = ctl->info.n_tables;
for (i = 0; i < ctl->info.n_selectors; i++) {
- struct rte_swx_table_state *ts = &ctl->ts_next[i];
+ struct rte_swx_table_state *ts = &ctl->ts_next[selector_base_index + i];
/* Table object. */
if (ts->obj)
@@ -1049,8 +1051,9 @@ table_state_free(struct rte_swx_ctl_pipeline *ctl)
}
/* For each learner table, free its table state. */
+ learner_base_index = ctl->info.n_tables + ctl->info.n_selectors;
for (i = 0; i < ctl->info.n_learners; i++) {
- struct rte_swx_table_state *ts = &ctl->ts_next[i];
+ struct rte_swx_table_state *ts = &ctl->ts_next[learner_base_index + i];
/* Default action data. */
free(ts->default_action_data);
@@ -1063,10 +1066,10 @@ table_state_free(struct rte_swx_ctl_pipeline *ctl)
static int
table_state_create(struct rte_swx_ctl_pipeline *ctl)
{
+ uint32_t table_base_index, selector_base_index, learner_base_index, i;
int status = 0;
- uint32_t i;
- ctl->ts_next = calloc(ctl->info.n_tables + ctl->info.n_selectors,
+ ctl->ts_next = calloc(ctl->info.n_tables + ctl->info.n_selectors + ctl->info.n_learners,
sizeof(struct rte_swx_table_state));
if (!ctl->ts_next) {
status = -ENOMEM;
@@ -1074,10 +1077,11 @@ table_state_create(struct rte_swx_ctl_pipeline *ctl)
}
/* Tables. */
+ table_base_index = 0;
for (i = 0; i < ctl->info.n_tables; i++) {
struct table *table = &ctl->tables[i];
- struct rte_swx_table_state *ts = &ctl->ts[i];
- struct rte_swx_table_state *ts_next = &ctl->ts_next[i];
+ struct rte_swx_table_state *ts = &ctl->ts[table_base_index + i];
+ struct rte_swx_table_state *ts_next = &ctl->ts_next[table_base_index + i];
/* Table object. */
if (!table->is_stub && table->ops.add) {
@@ -1110,9 +1114,10 @@ table_state_create(struct rte_swx_ctl_pipeline *ctl)
}
/* Selector tables. */
+ selector_base_index = ctl->info.n_tables;
for (i = 0; i < ctl->info.n_selectors; i++) {
struct selector *s = &ctl->selectors[i];
- struct rte_swx_table_state *ts_next = &ctl->ts_next[ctl->info.n_tables + i];
+ struct rte_swx_table_state *ts_next = &ctl->ts_next[selector_base_index + i];
/* Table object. */
ts_next->obj = rte_swx_table_selector_create(&s->params, NULL, ctl->numa_node);
@@ -1123,10 +1128,11 @@ table_state_create(struct rte_swx_ctl_pipeline *ctl)
}
/* Learner tables. */
+ learner_base_index = ctl->info.n_tables + ctl->info.n_selectors;
for (i = 0; i < ctl->info.n_learners; i++) {
struct learner *l = &ctl->learners[i];
- struct rte_swx_table_state *ts = &ctl->ts[i];
- struct rte_swx_table_state *ts_next = &ctl->ts_next[i];
+ struct rte_swx_table_state *ts = &ctl->ts[learner_base_index + i];
+ struct rte_swx_table_state *ts_next = &ctl->ts_next[learner_base_index + i];
/* Table object: duplicate from the current table state. */
ts_next->obj = ts->obj;
diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c
index eb54ccaeda..868010303c 100644
--- a/lib/pipeline/rte_swx_pipeline.c
+++ b/lib/pipeline/rte_swx_pipeline.c
@@ -8566,7 +8566,7 @@ table_state_build(struct rte_swx_pipeline *p)
struct selector *s;
struct learner *l;
- p->table_state = calloc(p->n_tables + p->n_selectors,
+ p->table_state = calloc(p->n_tables + p->n_selectors + p->n_learners,
sizeof(struct rte_swx_table_state));
CHECK(p->table_state, ENOMEM);
--
2.17.1
next reply other threads:[~2022-02-10 19:45 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-10 19:45 Cristian Dumitrescu [this message]
2022-02-13 20:23 ` Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220210194508.58650-1-cristian.dumitrescu@intel.com \
--to=cristian.dumitrescu@intel.com \
--cc=dev@dpdk.org \
--cc=harshad.suresh.narayane@intel.com \
--cc=kamalakannan.r@intel.com \
--cc=stable@dpdk.org \
--cc=venkata.suresh.kumar.p@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).