DPDK patches and discussions
 help / color / mirror / Atom feed
From: Andre Muezerie <andremue@linux.microsoft.com>
To: Bruce Richardson <bruce.richardson@intel.com>,
	Vladimir Medvedkin <vladimir.medvedkin@intel.com>
Cc: dev@dpdk.org, Andre Muezerie <andremue@linux.microsoft.com>
Subject: [PATCH] lib/lpm: use standard atomic_store_explicit
Date: Tue,  3 Dec 2024 18:20:01 -0800	[thread overview]
Message-ID: <1733278801-19296-1-git-send-email-andremue@linux.microsoft.com> (raw)

MSVC issues the warning below:

../lib/lpm/rte_lpm.c(297): warning C4013
    '__atomic_store' undefined; assuming extern returning int
../lib/lpm/rte_lpm.c(298): error C2065:
    '__ATOMIC_RELAXED': undeclared identifier

The fix is to use standard atomic_store_explicit() instead of
gcc specific __atomic_store().
atomic_store_explicit() was already being used in other parts
of DPDK and is compatible
with many compilers, including MSVC.

Signed-off-by: Andre Muezerie <andremue@linux.microsoft.com>
---
 lib/lpm/rte_lpm.c | 108 ++++++++++++++++++++++++++++++----------------
 lib/lpm/rte_lpm.h |  56 ++++++++++++++----------
 2 files changed, 104 insertions(+), 60 deletions(-)

diff --git a/lib/lpm/rte_lpm.c b/lib/lpm/rte_lpm.c
index a5c9e7c9fc..7ec85f1718 100644
--- a/lib/lpm/rte_lpm.c
+++ b/lib/lpm/rte_lpm.c
@@ -294,8 +294,8 @@ __lpm_rcu_qsbr_free_resource(void *p, void *data, unsigned int n)
 
 	RTE_SET_USED(n);
 	/* Set tbl8 group invalid */
-	__atomic_store(&tbl8[tbl8_group_index], &zero_tbl8_entry,
-		__ATOMIC_RELAXED);
+	rte_atomic_store_explicit(&tbl8[tbl8_group_index].val,
+			zero_tbl8_entry.val, rte_memory_order_relaxed);
 }
 
 /* Associate QSBR variable with an LPM object.
@@ -515,8 +515,8 @@ _tbl8_alloc(struct __rte_lpm *i_lpm)
 					RTE_LPM_TBL8_GROUP_NUM_ENTRIES *
 					sizeof(tbl8_entry[0]));
 
-			__atomic_store(tbl8_entry, &new_tbl8_entry,
-					__ATOMIC_RELAXED);
+			rte_atomic_store_explicit(&tbl8_entry->val, new_tbl8_entry.val,
+					rte_memory_order_relaxed);
 
 			/* Return group index for allocated tbl8 group. */
 			return group_idx;
@@ -551,15 +551,19 @@ tbl8_free(struct __rte_lpm *i_lpm, uint32_t tbl8_group_start)
 
 	if (i_lpm->v == NULL) {
 		/* Set tbl8 group invalid*/
-		__atomic_store(&i_lpm->lpm.tbl8[tbl8_group_start], &zero_tbl8_entry,
-				__ATOMIC_RELAXED);
+		struct rte_lpm_tbl_entry *tbl8_entry =
+				&i_lpm->lpm.tbl8[tbl8_group_start];
+		rte_atomic_store_explicit(&tbl8_entry->val, zero_tbl8_entry.val,
+				rte_memory_order_relaxed);
 	} else if (i_lpm->rcu_mode == RTE_LPM_QSBR_MODE_SYNC) {
 		/* Wait for quiescent state change. */
 		rte_rcu_qsbr_synchronize(i_lpm->v,
 			RTE_QSBR_THRID_INVALID);
 		/* Set tbl8 group invalid*/
-		__atomic_store(&i_lpm->lpm.tbl8[tbl8_group_start], &zero_tbl8_entry,
-				__ATOMIC_RELAXED);
+		struct rte_lpm_tbl_entry *tbl8_entry =
+				&i_lpm->lpm.tbl8[tbl8_group_start];
+		rte_atomic_store_explicit(&tbl8_entry->val, zero_tbl8_entry.val,
+				rte_memory_order_relaxed);
 	} else if (i_lpm->rcu_mode == RTE_LPM_QSBR_MODE_DQ) {
 		/* Push into QSBR defer queue. */
 		status = rte_rcu_qsbr_dq_enqueue(i_lpm->dq,
@@ -602,8 +606,10 @@ add_depth_small(struct __rte_lpm *i_lpm, uint32_t ip, uint8_t depth,
 			/* Setting tbl24 entry in one go to avoid race
 			 * conditions
 			 */
-			__atomic_store(&i_lpm->lpm.tbl24[i], &new_tbl24_entry,
-					__ATOMIC_RELEASE);
+			struct rte_lpm_tbl_entry *tbl24_entry =
+					&i_lpm->lpm.tbl24[i];
+			rte_atomic_store_explicit(&tbl24_entry->val, new_tbl24_entry.val,
+					rte_memory_order_release);
 
 			continue;
 		}
@@ -632,9 +638,11 @@ add_depth_small(struct __rte_lpm *i_lpm, uint32_t ip, uint8_t depth,
 					 * Setting tbl8 entry in one go to avoid
 					 * race conditions
 					 */
-					__atomic_store(&i_lpm->lpm.tbl8[j],
-						&new_tbl8_entry,
-						__ATOMIC_RELAXED);
+					struct rte_lpm_tbl_entry *tbl8_entry =
+							&i_lpm->lpm.tbl8[j];
+					rte_atomic_store_explicit(&tbl8_entry->val,
+							new_tbl8_entry.val,
+							rte_memory_order_relaxed);
 
 					continue;
 				}
@@ -679,8 +687,10 @@ add_depth_big(struct __rte_lpm *i_lpm, uint32_t ip_masked, uint8_t depth,
 				.valid_group = i_lpm->lpm.tbl8[i].valid_group,
 				.next_hop = next_hop,
 			};
-			__atomic_store(&i_lpm->lpm.tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
+			struct rte_lpm_tbl_entry *tbl8_entry =
+					&i_lpm->lpm.tbl8[i];
+			rte_atomic_store_explicit(&tbl8_entry->val, new_tbl8_entry.val,
+					rte_memory_order_relaxed);
 		}
 
 		/*
@@ -699,8 +709,10 @@ add_depth_big(struct __rte_lpm *i_lpm, uint32_t ip_masked, uint8_t depth,
 		/* The tbl24 entry must be written only after the
 		 * tbl8 entries are written.
 		 */
-		__atomic_store(&i_lpm->lpm.tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELEASE);
+		struct rte_lpm_tbl_entry *tbl24_entry =
+				&i_lpm->lpm.tbl24[tbl24_index];
+		rte_atomic_store_explicit(&tbl24_entry->val, new_tbl24_entry.val,
+				rte_memory_order_release);
 
 	} /* If valid entry but not extended calculate the index into Table8. */
 	else if (i_lpm->lpm.tbl24[tbl24_index].valid_group == 0) {
@@ -724,8 +736,10 @@ add_depth_big(struct __rte_lpm *i_lpm, uint32_t ip_masked, uint8_t depth,
 				.valid_group = i_lpm->lpm.tbl8[i].valid_group,
 				.next_hop = i_lpm->lpm.tbl24[tbl24_index].next_hop,
 			};
-			__atomic_store(&i_lpm->lpm.tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
+			struct rte_lpm_tbl_entry *tbl8_entry =
+					&i_lpm->lpm.tbl8[i];
+			rte_atomic_store_explicit(&tbl8_entry->val, new_tbl8_entry.val,
+					rte_memory_order_relaxed);
 		}
 
 		tbl8_index = tbl8_group_start + (ip_masked & 0xFF);
@@ -738,8 +752,10 @@ add_depth_big(struct __rte_lpm *i_lpm, uint32_t ip_masked, uint8_t depth,
 				.valid_group = i_lpm->lpm.tbl8[i].valid_group,
 				.next_hop = next_hop,
 			};
-			__atomic_store(&i_lpm->lpm.tbl8[i], &new_tbl8_entry,
-					__ATOMIC_RELAXED);
+			struct rte_lpm_tbl_entry *tbl8_entry =
+					&i_lpm->lpm.tbl8[i];
+			rte_atomic_store_explicit(&tbl8_entry->val, new_tbl8_entry.val,
+					rte_memory_order_relaxed);
 		}
 
 		/*
@@ -758,8 +774,10 @@ add_depth_big(struct __rte_lpm *i_lpm, uint32_t ip_masked, uint8_t depth,
 		/* The tbl24 entry must be written only after the
 		 * tbl8 entries are written.
 		 */
-		__atomic_store(&i_lpm->lpm.tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELEASE);
+		struct rte_lpm_tbl_entry *tbl24_entry =
+				&i_lpm->lpm.tbl24[tbl24_index];
+		rte_atomic_store_explicit(&tbl24_entry->val, new_tbl24_entry.val,
+				rte_memory_order_release);
 
 	} else { /*
 		* If it is valid, extended entry calculate the index into tbl8.
@@ -784,8 +802,10 @@ add_depth_big(struct __rte_lpm *i_lpm, uint32_t ip_masked, uint8_t depth,
 				 * Setting tbl8 entry in one go to avoid race
 				 * condition
 				 */
-				__atomic_store(&i_lpm->lpm.tbl8[i], &new_tbl8_entry,
-						__ATOMIC_RELAXED);
+				struct rte_lpm_tbl_entry *tbl8_entry =
+						&i_lpm->lpm.tbl8[i];
+				rte_atomic_store_explicit(&tbl8_entry->val,
+						new_tbl8_entry.val, rte_memory_order_relaxed);
 
 				continue;
 			}
@@ -924,8 +944,10 @@ delete_depth_small(struct __rte_lpm *i_lpm, uint32_t ip_masked,
 
 			if (i_lpm->lpm.tbl24[i].valid_group == 0 &&
 					i_lpm->lpm.tbl24[i].depth <= depth) {
-				__atomic_store(&i_lpm->lpm.tbl24[i],
-					&zero_tbl24_entry, __ATOMIC_RELEASE);
+				struct rte_lpm_tbl_entry *tbl24_entry =
+						&i_lpm->lpm.tbl24[i];
+				rte_atomic_store_explicit(&tbl24_entry->val,
+						zero_tbl24_entry.val, rte_memory_order_release);
 			} else if (i_lpm->lpm.tbl24[i].valid_group == 1) {
 				/*
 				 * If TBL24 entry is extended, then there has
@@ -970,8 +992,10 @@ delete_depth_small(struct __rte_lpm *i_lpm, uint32_t ip_masked,
 
 			if (i_lpm->lpm.tbl24[i].valid_group == 0 &&
 					i_lpm->lpm.tbl24[i].depth <= depth) {
-				__atomic_store(&i_lpm->lpm.tbl24[i], &new_tbl24_entry,
-						__ATOMIC_RELEASE);
+				struct rte_lpm_tbl_entry *tbl24_entry =
+						&i_lpm->lpm.tbl24[i];
+				rte_atomic_store_explicit(&tbl24_entry->val,
+						new_tbl24_entry.val, rte_memory_order_release);
 			} else  if (i_lpm->lpm.tbl24[i].valid_group == 1) {
 				/*
 				 * If TBL24 entry is extended, then there has
@@ -986,10 +1010,13 @@ delete_depth_small(struct __rte_lpm *i_lpm, uint32_t ip_masked,
 				for (j = tbl8_index; j < (tbl8_index +
 					RTE_LPM_TBL8_GROUP_NUM_ENTRIES); j++) {
 
-					if (i_lpm->lpm.tbl8[j].depth <= depth)
-						__atomic_store(&i_lpm->lpm.tbl8[j],
-							&new_tbl8_entry,
-							__ATOMIC_RELAXED);
+					if (i_lpm->lpm.tbl8[j].depth <= depth) {
+						struct rte_lpm_tbl_entry *tbl8_entry =
+								&i_lpm->lpm.tbl8[j];
+						rte_atomic_store_explicit(&tbl8_entry->val,
+								new_tbl8_entry.val,
+								rte_memory_order_relaxed);
+					}
 				}
 			}
 		}
@@ -1097,9 +1124,12 @@ delete_depth_big(struct __rte_lpm *i_lpm, uint32_t ip_masked,
 		 * rule_to_delete must be modified.
 		 */
 		for (i = tbl8_index; i < (tbl8_index + tbl8_range); i++) {
-			if (i_lpm->lpm.tbl8[i].depth <= depth)
-				__atomic_store(&i_lpm->lpm.tbl8[i], &new_tbl8_entry,
-						__ATOMIC_RELAXED);
+			if (i_lpm->lpm.tbl8[i].depth <= depth) {
+				struct rte_lpm_tbl_entry *tbl8_entry =
+						&i_lpm->lpm.tbl8[i];
+				rte_atomic_store_explicit(&tbl8_entry->val,
+						new_tbl8_entry.val, rte_memory_order_relaxed);
+			}
 		}
 	}
 
@@ -1130,8 +1160,10 @@ delete_depth_big(struct __rte_lpm *i_lpm, uint32_t ip_masked,
 		/* Set tbl24 before freeing tbl8 to avoid race condition.
 		 * Prevent the free of the tbl8 group from hoisting.
 		 */
-		__atomic_store(&i_lpm->lpm.tbl24[tbl24_index], &new_tbl24_entry,
-				__ATOMIC_RELAXED);
+		struct rte_lpm_tbl_entry *tbl24_entry =
+				&i_lpm->lpm.tbl24[tbl24_index];
+		rte_atomic_store_explicit(&tbl24_entry->val, new_tbl24_entry.val,
+				rte_memory_order_relaxed);
 		rte_atomic_thread_fence(rte_memory_order_release);
 		status = tbl8_free(i_lpm, tbl8_group_start);
 	}
diff --git a/lib/lpm/rte_lpm.h b/lib/lpm/rte_lpm.h
index 329dc1aad4..c1f30f96e3 100644
--- a/lib/lpm/rte_lpm.h
+++ b/lib/lpm/rte_lpm.h
@@ -77,38 +77,50 @@ enum rte_lpm_qsbr_mode {
 /** @internal Tbl24 entry structure. */
 __extension__
 struct rte_lpm_tbl_entry {
-	/**
-	 * Stores Next hop (tbl8 or tbl24 when valid_group is not set) or
-	 * a group index pointing to a tbl8 structure (tbl24 only, when
-	 * valid_group is set)
-	 */
-	uint32_t next_hop    :24;
-	/* Using single uint8_t to store 3 values. */
-	uint32_t valid       :1;   /**< Validation flag. */
-	/**
-	 * For tbl24:
-	 *  - valid_group == 0: entry stores a next hop
-	 *  - valid_group == 1: entry stores a group_index pointing to a tbl8
-	 * For tbl8:
-	 *  - valid_group indicates whether the current tbl8 is in use or not
-	 */
-	uint32_t valid_group :1;
-	uint32_t depth       :6; /**< Rule depth. */
+	union {
+		RTE_ATOMIC(uint32_t) val;
+		struct {
+			/**
+			 * Stores Next hop (tbl8 or tbl24 when valid_group is not set) or
+			 * a group index pointing to a tbl8 structure (tbl24 only, when
+			 * valid_group is set)
+			 */
+			uint32_t next_hop    :24;
+			/* Using single uint8_t to store 3 values. */
+			uint32_t valid       :1;   /**< Validation flag. */
+			/**
+			 * For tbl24:
+			 *  - valid_group == 0: entry stores a next hop
+			 *  - valid_group == 1: entry stores a group_index pointing to a tbl8
+			 * For tbl8:
+			 *  - valid_group indicates whether the current tbl8 is in use or not
+			 */
+			uint32_t valid_group :1;
+			uint32_t depth       :6; /**< Rule depth. */
+		};
+	};
 };
 
 #else
 
 __extension__
 struct rte_lpm_tbl_entry {
-	uint32_t depth       :6;
-	uint32_t valid_group :1;
-	uint32_t valid       :1;
-	uint32_t next_hop    :24;
-
+	union {
+		RTE_ATOMIC(uint32_t) val;
+		struct {
+			uint32_t depth       :6;
+			uint32_t valid_group :1;
+			uint32_t valid       :1;
+			uint32_t next_hop    :24;
+		};
+	};
 };
 
 #endif
 
+static_assert(sizeof(struct rte_lpm_tbl_entry) == sizeof(uint32_t),
+		"sizeof(struct rte_lpm_tbl_entry) == sizeof(uint32_t)");
+
 /** LPM configuration structure. */
 struct rte_lpm_config {
 	uint32_t max_rules;      /**< Max number of rules. */
-- 
2.47.0.vfs.0.3


             reply	other threads:[~2024-12-04  2:20 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-04  2:20 Andre Muezerie [this message]
2024-12-04  7:56 ` David Marchand
2024-12-04 16:20   ` Andre Muezerie
2024-12-04 16:52     ` Bruce Richardson
2024-12-04 19:09       ` Andre Muezerie

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=1733278801-19296-1-git-send-email-andremue@linux.microsoft.com \
    --to=andremue@linux.microsoft.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=vladimir.medvedkin@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).