[ovs-dev] [PATCH] dpif-netdev: Fix non-atomic read of smc_enable_db.
Ilya Maximets
i.maximets at ovn.org
Fri Jul 23 21:11:23 UTC 2021
Atomic variables must be read atomically. And since we already have
'smc_enable_db' in the PMD context, we need to use it from there to
avoid reading atomically twice.
Also, 'smc_enable_db' is a global configuration, there is no need
to read it per-port or per-rxq.
CC: Harry van Haaren <harry.van.haaren at intel.com>
Fixes: 9ac84a1a3698 ("dpif-avx512: Add ISA implementation of dpif.")
Signed-off-by: Ilya Maximets <i.maximets at ovn.org>
---
lib/dpif-netdev.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 59e326f11..d97c5756f 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -3078,11 +3078,9 @@ smc_insert(struct dp_netdev_pmd_thread *pmd,
struct smc_bucket *bucket = &smc_cache->buckets[key->hash & SMC_MASK];
uint16_t index;
uint32_t cmap_index;
- bool smc_enable_db;
int i;
- atomic_read_relaxed(&pmd->dp->smc_enable_db, &smc_enable_db);
- if (!smc_enable_db) {
+ if (!pmd->ctx.smc_enable_db) {
return;
}
@@ -5915,6 +5913,9 @@ dpif_netdev_run(struct dpif *dpif)
non_pmd = dp_netdev_get_pmd(dp, NON_PMD_CORE_ID);
if (non_pmd) {
ovs_mutex_lock(&dp->non_pmd_mutex);
+
+ atomic_read_relaxed(&dp->smc_enable_db, &non_pmd->ctx.smc_enable_db);
+
HMAP_FOR_EACH (port, node, &dp->ports) {
if (!netdev_is_pmd(port->netdev)) {
int i;
@@ -5926,8 +5927,6 @@ dpif_netdev_run(struct dpif *dpif)
non_pmd->ctx.emc_insert_min = 0;
}
- non_pmd->ctx.smc_enable_db = dp->smc_enable_db;
-
for (i = 0; i < port->n_rxq; i++) {
if (!netdev_rxq_enabled(port->rxqs[i].rx)) {
@@ -6190,6 +6189,8 @@ reload:
pmd_perf_start_iteration(s);
+ atomic_read_relaxed(&pmd->dp->smc_enable_db, &pmd->ctx.smc_enable_db);
+
for (i = 0; i < poll_cnt; i++) {
if (!poll_list[i].rxq_enabled) {
@@ -6203,8 +6204,6 @@ reload:
pmd->ctx.emc_insert_min = 0;
}
- pmd->ctx.smc_enable_db = pmd->dp->smc_enable_db;
-
process_packets =
dp_netdev_process_rxq_port(pmd, poll_list[i].rxq,
poll_list[i].port_no);
@@ -7328,11 +7327,9 @@ dfc_processing(struct dp_netdev_pmd_thread *pmd,
const bool netdev_flow_api = netdev_is_flow_api_enabled();
int i;
uint16_t tcp_flags;
- bool smc_enable_db;
size_t map_cnt = 0;
bool batch_enable = true;
- atomic_read_relaxed(&pmd->dp->smc_enable_db, &smc_enable_db);
pmd_perf_update_counter(&pmd->perf_stats,
md_is_valid ? PMD_STAT_RECIRC : PMD_STAT_RECV,
cnt);
@@ -7434,7 +7431,7 @@ dfc_processing(struct dp_netdev_pmd_thread *pmd,
n_mfex_opt_hit);
pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_EXACT_HIT, n_emc_hit);
- if (!smc_enable_db) {
+ if (!pmd->ctx.smc_enable_db) {
return dp_packet_batch_size(packets_);
}
--
2.31.1
More information about the dev
mailing list