DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH 00/15] Add attributes to allocation functions
@ 2025-01-20 18:03 Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 01/15] fib: add allocation function attributes Stephen Hemminger
                   ` (15 more replies)
  0 siblings, 16 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

This patch series builds on the allocation function attributes
added in 24.11 release. These annotations will allow for compiler
to flag cases where a pointer is allocated with one function
but incorrectly passed to a different free function.

Checkpatch perl script falsely complains in a couple patches
because it doesn't really understand C syntax for attributes.

Stephen Hemminger (15):
  fib: add allocation function attributes
  rib: annotate rib allocation functions
  hash: add allocation function attributes
  lpm: add allocation function attributes
  pipeline: add allocation function attributes
  acl: add allocation function attributes
  bitratestats: add allocation function attributes
  member: add allocation function attributes
  mempool: add allocation function attributes
  eventdev: add allocation function attributes
  ring: add allocation function attributes
  reorder: add allocation function attributes
  compressdev: add allocation function attributes
  telemetry: add allocation function attributes
  sched: add allocation function attributes

 lib/acl/rte_acl.h                 | 26 ++++++++-------
 lib/bitratestats/rte_bitrate.h    | 20 +++++------
 lib/compressdev/rte_comp.h        | 28 ++++++++--------
 lib/eventdev/rte_event_ring.h     | 27 +++++++--------
 lib/fib/rte_fib.h                 | 26 ++++++++-------
 lib/fib/rte_fib6.h                | 24 +++++++-------
 lib/fib/trie.h                    |  7 ++--
 lib/hash/rte_fbk_hash.h           | 24 +++++++-------
 lib/hash/rte_hash.h               | 21 ++++++------
 lib/lpm/rte_lpm.h                 | 23 ++++++-------
 lib/lpm/rte_lpm6.h                | 23 ++++++-------
 lib/member/rte_member.h           | 24 +++++++-------
 lib/mempool/rte_mempool.h         | 37 +++++++++++----------
 lib/pipeline/rte_port_in_action.h | 55 ++++++++++++++++---------------
 lib/pipeline/rte_table_action.h   | 53 +++++++++++++++--------------
 lib/reorder/rte_reorder.h         | 23 ++++++-------
 lib/rib/rte_rib.h                 | 24 +++++++-------
 lib/rib/rte_rib6.h                | 24 +++++++-------
 lib/ring/rte_ring.h               | 22 +++++++------
 lib/sched/rte_sched.h             | 23 +++++++------
 lib/telemetry/rte_telemetry.h     | 21 ++++++------
 21 files changed, 296 insertions(+), 259 deletions(-)

-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 01/15] fib: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 02/15] rib: annotate rib allocation functions Stephen Hemminger
                   ` (14 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Vladimir Medvedkin

Use function attributes to catch cases where fib table is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/fib/rte_fib.h  | 26 +++++++++++++++-----------
 lib/fib/rte_fib6.h | 24 +++++++++++++-----------
 lib/fib/trie.h     |  7 ++++---
 3 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/lib/fib/rte_fib.h b/lib/fib/rte_fib.h
index 496d137d48..65c24d5459 100644
--- a/lib/fib/rte_fib.h
+++ b/lib/fib/rte_fib.h
@@ -17,8 +17,10 @@
 
 #include <stdint.h>
 
+#include <rte_common.h>
 #include <rte_rcu_qsbr.h>
 
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -128,6 +130,17 @@ struct rte_fib_rcu_config {
 	uint32_t reclaim_max;
 };
 
+
+/**
+ * Free an FIB object.
+ *
+ * @param fib
+ *   FIB object handle created by rte_fib_create().
+ *   If fib is NULL, no operation is performed.
+ */
+void
+rte_fib_free(struct rte_fib *fib);
+
 /**
  * Create FIB
  *
@@ -142,7 +155,8 @@ struct rte_fib_rcu_config {
  *  NULL otherwise with rte_errno set to an appropriate values.
  */
 struct rte_fib *
-rte_fib_create(const char *name, int socket_id, struct rte_fib_conf *conf);
+rte_fib_create(const char *name, int socket_id, struct rte_fib_conf *conf)
+	__rte_malloc __rte_dealloc(rte_fib_free, 1);
 
 /**
  * Find an existing FIB object and return a pointer to it.
@@ -157,16 +171,6 @@ rte_fib_create(const char *name, int socket_id, struct rte_fib_conf *conf);
 struct rte_fib *
 rte_fib_find_existing(const char *name);
 
-/**
- * Free an FIB object.
- *
- * @param fib
- *   FIB object handle created by rte_fib_create().
- *   If fib is NULL, no operation is performed.
- */
-void
-rte_fib_free(struct rte_fib *fib);
-
 /**
  * Add a route to the FIB.
  *
diff --git a/lib/fib/rte_fib6.h b/lib/fib/rte_fib6.h
index 21f0492374..b03b24421c 100644
--- a/lib/fib/rte_fib6.h
+++ b/lib/fib/rte_fib6.h
@@ -82,6 +82,17 @@ struct rte_fib6_conf {
 	};
 };
 
+
+/**
+ * Free an FIB object.
+ *
+ * @param fib
+ *   FIB object handle created by rte_fib6_create().
+ *   If fib is NULL, no operation is performed.
+ */
+void
+rte_fib6_free(struct rte_fib6 *fib);
+
 /**
  * Create FIB
  *
@@ -96,7 +107,8 @@ struct rte_fib6_conf {
  *  NULL otherwise with rte_errno set to an appropriate values.
  */
 struct rte_fib6 *
-rte_fib6_create(const char *name, int socket_id, struct rte_fib6_conf *conf);
+rte_fib6_create(const char *name, int socket_id, struct rte_fib6_conf *conf)
+	__rte_malloc __rte_dealloc(rte_fib6_free, 1);
 
 /**
  * Find an existing FIB object and return a pointer to it.
@@ -111,16 +123,6 @@ rte_fib6_create(const char *name, int socket_id, struct rte_fib6_conf *conf);
 struct rte_fib6 *
 rte_fib6_find_existing(const char *name);
 
-/**
- * Free an FIB object.
- *
- * @param fib
- *   FIB object handle created by rte_fib6_create().
- *   If fib is NULL, no operation is performed.
- */
-void
-rte_fib6_free(struct rte_fib6 *fib);
-
 /**
  * Add a route to the FIB.
  *
diff --git a/lib/fib/trie.h b/lib/fib/trie.h
index f87fc0f6d2..bcb161702b 100644
--- a/lib/fib/trie.h
+++ b/lib/fib/trie.h
@@ -129,12 +129,13 @@ LOOKUP_FUNC(2b, uint16_t, 1)
 LOOKUP_FUNC(4b, uint32_t, 2)
 LOOKUP_FUNC(8b, uint64_t, 3)
 
-void *
-trie_create(const char *name, int socket_id, struct rte_fib6_conf *conf);
-
 void
 trie_free(void *p);
 
+void *
+trie_create(const char *name, int socket_id, struct rte_fib6_conf *conf)
+	__rte_malloc __rte_dealloc(trie_free, 1);
+
 rte_fib6_lookup_fn_t
 trie_get_lookup_fn(void *p, enum rte_fib6_lookup_type type);
 
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 02/15] rib: annotate rib allocation functions
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 01/15] fib: add allocation function attributes Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 03/15] hash: add allocation function attributes Stephen Hemminger
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Vladimir Medvedkin

Add function attributes to catch cases where rib is allocated
and not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/rib/rte_rib.h  | 24 +++++++++++++-----------
 lib/rib/rte_rib6.h | 24 +++++++++++++-----------
 2 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/lib/rib/rte_rib.h b/lib/rib/rte_rib.h
index 2054d3cebd..f30b85d79a 100644
--- a/lib/rib/rte_rib.h
+++ b/lib/rib/rte_rib.h
@@ -230,6 +230,17 @@ rte_rib_get_nh(const struct rte_rib_node *node, uint64_t *nh);
 int
 rte_rib_set_nh(struct rte_rib_node *node, uint64_t nh);
 
+
+/**
+ * Free an RIB object.
+ *
+ * @param rib
+ *   RIB object handle created with rte_rib_create().
+ *   If rib is NULL, no operation is performed.
+ */
+void
+rte_rib_free(struct rte_rib *rib);
+
 /**
  * Create RIB
  *
@@ -245,7 +256,8 @@ rte_rib_set_nh(struct rte_rib_node *node, uint64_t nh);
  */
 struct rte_rib *
 rte_rib_create(const char *name, int socket_id,
-	       const struct rte_rib_conf *conf);
+	       const struct rte_rib_conf *conf)
+	__rte_malloc __rte_dealloc(rte_rib_free, 1);
 
 /**
  * Find an existing RIB object and return a pointer to it.
@@ -259,16 +271,6 @@ rte_rib_create(const char *name, int socket_id,
 struct rte_rib *
 rte_rib_find_existing(const char *name);
 
-/**
- * Free an RIB object.
- *
- * @param rib
- *   RIB object handle created with rte_rib_create().
- *   If rib is NULL, no operation is performed.
- */
-void
-rte_rib_free(struct rte_rib *rib);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/rib/rte_rib6.h b/lib/rib/rte_rib6.h
index a60756f798..d9514acf82 100644
--- a/lib/rib/rte_rib6.h
+++ b/lib/rib/rte_rib6.h
@@ -294,6 +294,17 @@ rte_rib6_get_nh(const struct rte_rib6_node *node, uint64_t *nh);
 int
 rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
 
+
+/**
+ * Free an RIB object.
+ *
+ * @param rib
+ *   RIB object handle created with rte_rib6_create().
+ *   If rib is NULL, no operation is performed.
+ */
+void
+rte_rib6_free(struct rte_rib6 *rib);
+
 /**
  * Create RIB
  *
@@ -309,7 +320,8 @@ rte_rib6_set_nh(struct rte_rib6_node *node, uint64_t nh);
  */
 struct rte_rib6 *
 rte_rib6_create(const char *name, int socket_id,
-		const struct rte_rib6_conf *conf);
+		const struct rte_rib6_conf *conf)
+	__rte_malloc __rte_dealloc(rte_rib6_free, 1);
 
 /**
  * Find an existing RIB object and return a pointer to it.
@@ -323,16 +335,6 @@ rte_rib6_create(const char *name, int socket_id,
 struct rte_rib6 *
 rte_rib6_find_existing(const char *name);
 
-/**
- * Free an RIB object.
- *
- * @param rib
- *   RIB object handle created with rte_rib6_create().
- *   If rib is NULL, no operation is performed.
- */
-void
-rte_rib6_free(struct rte_rib6 *rib);
-
 #ifdef __cplusplus
 }
 #endif
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 03/15] hash: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 01/15] fib: add allocation function attributes Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 02/15] rib: annotate rib allocation functions Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 04/15] lpm: " Stephen Hemminger
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev
  Cc: Stephen Hemminger, Yipeng Wang, Sameh Gobriel, Bruce Richardson,
	Vladimir Medvedkin

Use function attributes to catch cases where hash table is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/hash/rte_fbk_hash.h | 24 +++++++++++++-----------
 lib/hash/rte_hash.h     | 21 +++++++++++----------
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/lib/hash/rte_fbk_hash.h b/lib/hash/rte_fbk_hash.h
index 1f0c1d1b6c..b1a43f37b4 100644
--- a/lib/hash/rte_fbk_hash.h
+++ b/lib/hash/rte_fbk_hash.h
@@ -322,6 +322,16 @@ rte_fbk_hash_get_load_factor(struct rte_fbk_hash_table *ht)
  */
 struct rte_fbk_hash_table *rte_fbk_hash_find_existing(const char *name);
 
+
+/**
+ * Free all memory used by a hash table.
+ * Has no effect on hash tables allocated in memory zones
+ *
+ * @param ht
+ *   Hash table to deallocate.
+ */
+void rte_fbk_hash_free(struct rte_fbk_hash_table *ht);
+
 /**
  * Create a new hash table for use with four byte keys.
  *
@@ -339,17 +349,9 @@ struct rte_fbk_hash_table *rte_fbk_hash_find_existing(const char *name);
  *    - EEXIST - a memzone with the same name already exists
  *    - ENOMEM - no appropriate memory area found in which to create memzone
  */
-struct rte_fbk_hash_table * \
-rte_fbk_hash_create(const struct rte_fbk_hash_params *params);
-
-/**
- * Free all memory used by a hash table.
- * Has no effect on hash tables allocated in memory zones
- *
- * @param ht
- *   Hash table to deallocate.
- */
-void rte_fbk_hash_free(struct rte_fbk_hash_table *ht);
+struct rte_fbk_hash_table *
+rte_fbk_hash_create(const struct rte_fbk_hash_params *params)
+	__rte_malloc __rte_dealloc(rte_fbk_hash_free, 1);
 
 #ifdef __cplusplus
 }
diff --git a/lib/hash/rte_hash.h b/lib/hash/rte_hash.h
index 05ab447e4a..736fb15885 100644
--- a/lib/hash/rte_hash.h
+++ b/lib/hash/rte_hash.h
@@ -125,6 +125,15 @@ struct rte_hash_rcu_config {
 /** @internal A hash table structure. */
 struct rte_hash;
 
+/**
+ * De-allocate all memory used by hash table.
+ *
+ * @param h
+ *   Hash table to free, if NULL, the function does nothing.
+ */
+void
+rte_hash_free(struct rte_hash *h);
+
 /**
  * Create a new hash table.
  *
@@ -143,7 +152,8 @@ struct rte_hash;
  *    - ENOMEM - no appropriate memory area found in which to create memzone
  */
 struct rte_hash *
-rte_hash_create(const struct rte_hash_parameters *params);
+rte_hash_create(const struct rte_hash_parameters *params)
+	__rte_malloc __rte_dealloc(rte_hash_free, 1);
 
 /**
  * Set a new hash compare function other than the default one.
@@ -171,15 +181,6 @@ void rte_hash_set_cmp_func(struct rte_hash *h, rte_hash_cmp_eq_t func);
 struct rte_hash *
 rte_hash_find_existing(const char *name);
 
-/**
- * De-allocate all memory used by hash table.
- *
- * @param h
- *   Hash table to free, if NULL, the function does nothing.
- */
-void
-rte_hash_free(struct rte_hash *h);
-
 /**
  * Reset all hash structure, by zeroing all entries.
  * When RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF is enabled,
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 04/15] lpm: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (2 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 03/15] hash: add allocation function attributes Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 05/15] pipeline: " Stephen Hemminger
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Bruce Richardson, Vladimir Medvedkin

Use function attributes to catch cases where lpm table is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/lpm/rte_lpm.h  | 23 ++++++++++++-----------
 lib/lpm/rte_lpm6.h | 23 ++++++++++++-----------
 2 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/lib/lpm/rte_lpm.h b/lib/lpm/rte_lpm.h
index 329dc1aad4..7df64f06b1 100644
--- a/lib/lpm/rte_lpm.h
+++ b/lib/lpm/rte_lpm.h
@@ -140,6 +140,16 @@ struct rte_lpm_rcu_config {
 				 */
 };
 
+/**
+ * Free an LPM object.
+ *
+ * @param lpm
+ *   LPM object handle
+ *   If lpm is NULL, no operation is performed.
+ */
+void
+rte_lpm_free(struct rte_lpm *lpm);
+
 /**
  * Create an LPM object.
  *
@@ -161,7 +171,8 @@ struct rte_lpm_rcu_config {
  */
 struct rte_lpm *
 rte_lpm_create(const char *name, int socket_id,
-		const struct rte_lpm_config *config);
+	       const struct rte_lpm_config *config)
+	__rte_malloc __rte_dealloc(rte_lpm_free, 1);
 
 /**
  * Find an existing LPM object and return a pointer to it.
@@ -176,16 +187,6 @@ rte_lpm_create(const char *name, int socket_id,
 struct rte_lpm *
 rte_lpm_find_existing(const char *name);
 
-/**
- * Free an LPM object.
- *
- * @param lpm
- *   LPM object handle
- *   If lpm is NULL, no operation is performed.
- */
-void
-rte_lpm_free(struct rte_lpm *lpm);
-
 /**
  * Associate RCU QSBR variable with an LPM object.
  *
diff --git a/lib/lpm/rte_lpm6.h b/lib/lpm/rte_lpm6.h
index 079187ca56..08b5618613 100644
--- a/lib/lpm/rte_lpm6.h
+++ b/lib/lpm/rte_lpm6.h
@@ -34,6 +34,16 @@ struct rte_lpm6_config {
 	int flags;               /**< This field is currently unused. */
 };
 
+/**
+ * Free an LPM object.
+ *
+ * @param lpm
+ *   LPM object handle
+ *   If lpm is NULL, no operation is performed.
+ */
+void
+rte_lpm6_free(struct rte_lpm6 *lpm);
+
 /**
  * Create an LPM object.
  *
@@ -55,7 +65,8 @@ struct rte_lpm6_config {
  */
 struct rte_lpm6 *
 rte_lpm6_create(const char *name, int socket_id,
-		const struct rte_lpm6_config *config);
+		const struct rte_lpm6_config *config)
+	__rte_malloc __rte_dealloc(rte_lpm6_free, 1);
 
 /**
  * Find an existing LPM object and return a pointer to it.
@@ -70,16 +81,6 @@ rte_lpm6_create(const char *name, int socket_id,
 struct rte_lpm6 *
 rte_lpm6_find_existing(const char *name);
 
-/**
- * Free an LPM object.
- *
- * @param lpm
- *   LPM object handle
- *   If lpm is NULL, no operation is performed.
- */
-void
-rte_lpm6_free(struct rte_lpm6 *lpm);
-
 /**
  * Add a rule to the LPM table.
  *
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 05/15] pipeline: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (3 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 04/15] lpm: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 06/15] acl: " Stephen Hemminger
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Cristian Dumitrescu

Use function attributes to catch cases where pipeline is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/pipeline/rte_port_in_action.h | 55 ++++++++++++++++---------------
 lib/pipeline/rte_table_action.h   | 53 +++++++++++++++--------------
 2 files changed, 56 insertions(+), 52 deletions(-)

diff --git a/lib/pipeline/rte_port_in_action.h b/lib/pipeline/rte_port_in_action.h
index 9d17bae988..ee6cc59fae 100644
--- a/lib/pipeline/rte_port_in_action.h
+++ b/lib/pipeline/rte_port_in_action.h
@@ -164,18 +164,6 @@ struct rte_port_in_action_lb_params {
  */
 struct rte_port_in_action_profile;
 
-/**
- * Input port action profile create.
- *
- * @param[in] socket_id
- *   CPU socket ID for the internal data structures memory allocation.
- * @return
- *   Input port action profile handle on success, NULL otherwise.
- */
-__rte_experimental
-struct rte_port_in_action_profile *
-rte_port_in_action_profile_create(uint32_t socket_id);
-
 /**
  * Input port action profile free.
  *
@@ -189,6 +177,19 @@ __rte_experimental
 int
 rte_port_in_action_profile_free(struct rte_port_in_action_profile *profile);
 
+/**
+ * Input port action profile create.
+ *
+ * @param[in] socket_id
+ *   CPU socket ID for the internal data structures memory allocation.
+ * @return
+ *   Input port action profile handle on success, NULL otherwise.
+ */
+__rte_experimental
+struct rte_port_in_action_profile *
+rte_port_in_action_profile_create(uint32_t socket_id)
+	__rte_malloc __rte_dealloc(rte_port_in_action_profile_free, 1);
+
 /**
  * Input port action profile action register.
  *
@@ -236,6 +237,19 @@ rte_port_in_action_profile_freeze(struct rte_port_in_action_profile *profile);
  */
 struct rte_port_in_action;
 
+/**
+ * Input port action free.
+ *
+ * @param[in] action
+ *   Handle to input port action object (needs to be valid).
+ *   If action is NULL, no operation is performed.
+ * @return
+ *   Always zero.
+ */
+__rte_experimental
+int
+rte_port_in_action_free(struct rte_port_in_action *action);
+
 /**
  * Input port action create.
  *
@@ -252,21 +266,8 @@ struct rte_port_in_action;
  */
 __rte_experimental
 struct rte_port_in_action *
-rte_port_in_action_create(struct rte_port_in_action_profile *profile,
-	uint32_t socket_id);
-
-/**
- * Input port action free.
- *
- * @param[in] action
- *   Handle to input port action object (needs to be valid).
- *   If action is NULL, no operation is performed.
- * @return
- *   Always zero.
- */
-__rte_experimental
-int
-rte_port_in_action_free(struct rte_port_in_action *action);
+rte_port_in_action_create(struct rte_port_in_action_profile *profile, uint32_t socket_id)
+	__rte_malloc __rte_dealloc(rte_port_in_action_free, 1);
 
 /**
  * Input port params get.
diff --git a/lib/pipeline/rte_table_action.h b/lib/pipeline/rte_table_action.h
index 47a7bdfc01..e8b4d8b33d 100644
--- a/lib/pipeline/rte_table_action.h
+++ b/lib/pipeline/rte_table_action.h
@@ -54,6 +54,7 @@
 
 #include <stdint.h>
 
+#include <rte_common.h>
 #include <rte_compat.h>
 #include <rte_ether.h>
 #include <rte_ip6.h>
@@ -812,17 +813,6 @@ struct rte_table_action_decap_params {
  */
 struct rte_table_action_profile;
 
-/**
- * Table action profile create.
- *
- * @param[in] common
- *   Common action configuration.
- * @return
- *   Table action profile handle on success, NULL otherwise.
- */
-__rte_experimental
-struct rte_table_action_profile *
-rte_table_action_profile_create(struct rte_table_action_common_config *common);
 
 /**
  * Table action profile free.
@@ -836,6 +826,19 @@ __rte_experimental
 int
 rte_table_action_profile_free(struct rte_table_action_profile *profile);
 
+/**
+ * Table action profile create.
+ *
+ * @param[in] common
+ *   Common action configuration.
+ * @return
+ *   Table action profile handle on success, NULL otherwise.
+ */
+__rte_experimental
+struct rte_table_action_profile *
+rte_table_action_profile_create(struct rte_table_action_common_config *common)
+	__rte_malloc __rte_dealloc(rte_table_action_profile_free, 1);
+
 /**
  * Table action profile action register.
  *
@@ -881,6 +884,18 @@ rte_table_action_profile_freeze(struct rte_table_action_profile *profile);
  */
 struct rte_table_action;
 
+/**
+ * Table action free.
+ *
+ * @param[in] action
+ *   Handle to table action object (needs to be valid).
+ * @return
+ *   Zero on success, non-zero error code otherwise.
+ */
+__rte_experimental
+int
+rte_table_action_free(struct rte_table_action *action);
+
 /**
  * Table action create.
  *
@@ -898,20 +913,8 @@ struct rte_table_action;
  */
 __rte_experimental
 struct rte_table_action *
-rte_table_action_create(struct rte_table_action_profile *profile,
-	uint32_t socket_id);
-
-/**
- * Table action free.
- *
- * @param[in] action
- *   Handle to table action object (needs to be valid).
- * @return
- *   Zero on success, non-zero error code otherwise.
- */
-__rte_experimental
-int
-rte_table_action_free(struct rte_table_action *action);
+rte_table_action_create(struct rte_table_action_profile *profile, uint32_t socket_id)
+	__rte_malloc __rte_dealloc(rte_table_action_free, 1);
 
 /**
  * Table action table params get.
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 06/15] acl: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (4 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 05/15] pipeline: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 07/15] bitratestats: " Stephen Hemminger
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Konstantin Ananyev

Use function attributes to catch cases where acl table is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/acl/rte_acl.h | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/lib/acl/rte_acl.h b/lib/acl/rte_acl.h
index ca75a6f220..b95f8778c3 100644
--- a/lib/acl/rte_acl.h
+++ b/lib/acl/rte_acl.h
@@ -133,6 +133,19 @@ struct rte_acl_param {
 };
 
 
+/** @internal opaque ACL handle */
+struct rte_acl_ctx;
+
+/**
+ * De-allocate all memory used by ACL context.
+ *
+ * @param ctx
+ *   ACL context to free
+ *   If ctx is NULL, no operation is performed.
+ */
+void
+rte_acl_free(struct rte_acl_ctx *ctx);
+
 /**
  * Create a new ACL context.
  *
@@ -145,7 +158,8 @@ struct rte_acl_param {
  *   - EINVAL - invalid parameter passed to function
  */
 struct rte_acl_ctx *
-rte_acl_create(const struct rte_acl_param *param);
+rte_acl_create(const struct rte_acl_param *param)
+	__rte_malloc __rte_dealloc(rte_acl_free, 1);
 
 /**
  * Find an existing ACL context object and return a pointer to it.
@@ -160,16 +174,6 @@ rte_acl_create(const struct rte_acl_param *param);
 struct rte_acl_ctx *
 rte_acl_find_existing(const char *name);
 
-/**
- * De-allocate all memory used by ACL context.
- *
- * @param ctx
- *   ACL context to free
- *   If ctx is NULL, no operation is performed.
- */
-void
-rte_acl_free(struct rte_acl_ctx *ctx);
-
 /**
  * Add rules to an existing ACL context.
  * This function is not multi-thread safe.
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 07/15] bitratestats: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (5 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 06/15] acl: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 08/15] member: " Stephen Hemminger
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

Use function attributes to catch cases where bitratestats is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/bitratestats/rte_bitrate.h | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/lib/bitratestats/rte_bitrate.h b/lib/bitratestats/rte_bitrate.h
index 979a712837..27951f3e28 100644
--- a/lib/bitratestats/rte_bitrate.h
+++ b/lib/bitratestats/rte_bitrate.h
@@ -17,16 +17,6 @@ extern "C" {
  */
 struct rte_stats_bitrates;
 
-
-/**
- * Allocate a bitrate statistics structure
- *
- * @return
- *   - Pointer to structure on success
- *   - NULL on error (zmalloc failure)
- */
-struct rte_stats_bitrates *rte_stats_bitrate_create(void);
-
 /**
  * Free bitrate statistics structure
  *
@@ -36,6 +26,16 @@ struct rte_stats_bitrates *rte_stats_bitrate_create(void);
  */
 void rte_stats_bitrate_free(struct rte_stats_bitrates *bitrate_data);
 
+/**
+ * Allocate a bitrate statistics structure
+ *
+ * @return
+ *   - Pointer to structure on success
+ *   - NULL on error (zmalloc failure)
+ */
+struct rte_stats_bitrates *rte_stats_bitrate_create(void)
+	__rte_malloc __rte_dealloc(rte_stats_bitrate_free, 1);
+
 /**
  * Register bitrate statistics with the metric library.
  *
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 08/15] member: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (6 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 07/15] bitratestats: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 09/15] mempool: " Stephen Hemminger
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Yipeng Wang, Sameh Gobriel

Use function attributes to catch cases where member table is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/member/rte_member.h | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/lib/member/rte_member.h b/lib/member/rte_member.h
index 109bdd000b..0235bb0a81 100644
--- a/lib/member/rte_member.h
+++ b/lib/member/rte_member.h
@@ -341,6 +341,16 @@ struct __rte_cache_aligned rte_member_parameters {
 struct rte_member_setsum *
 rte_member_find_existing(const char *name);
 
+/**
+ * De-allocate memory used by set-summary.
+ *
+ * @param setsum
+ *   Pointer to the set summary.
+ *   If setsum is NULL, no operation is performed.
+ */
+void
+rte_member_free(struct rte_member_setsum *setsum);
+
 /**
  * Create set-summary (SS).
  *
@@ -351,7 +361,8 @@ rte_member_find_existing(const char *name);
  *   Return value is NULL if the creation failed.
  */
 struct rte_member_setsum *
-rte_member_create(const struct rte_member_parameters *params);
+rte_member_create(const struct rte_member_parameters *params)
+	__rte_malloc __rte_dealloc(rte_member_free, 1);
 
 /**
  * Lookup key in set-summary (SS).
@@ -528,17 +539,6 @@ int
 rte_member_report_heavyhitter(const struct rte_member_setsum *setsum,
 			      void **keys, uint64_t *counts);
 
-
-/**
- * De-allocate memory used by set-summary.
- *
- * @param setsum
- *   Pointer to the set summary.
- *   If setsum is NULL, no operation is performed.
- */
-void
-rte_member_free(struct rte_member_setsum *setsum);
-
 /**
  * Reset the set-summary tables. E.g. reset bits to be 0 in BF,
  * reset set_id in each entry to be RTE_MEMBER_NO_MATCH in HT based SS.
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 09/15] mempool: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (7 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 08/15] member: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 10/15] eventdev: " Stephen Hemminger
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Andrew Rybchenko, Morten Brørup

Use function attributes to catch cases where mempool is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/mempool/rte_mempool.h | 37 ++++++++++++++++++++-----------------
 1 file changed, 20 insertions(+), 17 deletions(-)

diff --git a/lib/mempool/rte_mempool.h b/lib/mempool/rte_mempool.h
index 7bdc92b812..c495cc012f 100644
--- a/lib/mempool/rte_mempool.h
+++ b/lib/mempool/rte_mempool.h
@@ -1012,6 +1012,20 @@ typedef void (rte_mempool_mem_cb_t)(struct rte_mempool *mp,
  */
 typedef void (rte_mempool_ctor_t)(struct rte_mempool *, void *);
 
+/**
+ * Free a mempool
+ *
+ * Unlink the mempool from global list, free the memory chunks, and all
+ * memory referenced by the mempool. The objects must not be used by
+ * other cores as they will be freed.
+ *
+ * @param mp
+ *   A pointer to the mempool structure.
+ *   If NULL then, the function does nothing.
+ */
+void
+rte_mempool_free(struct rte_mempool *mp);
+
 /**
  * Create a new mempool named *name* in memory.
  *
@@ -1095,7 +1109,8 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size,
 		   unsigned cache_size, unsigned private_data_size,
 		   rte_mempool_ctor_t *mp_init, void *mp_init_arg,
 		   rte_mempool_obj_cb_t *obj_init, void *obj_init_arg,
-		   int socket_id, unsigned flags);
+		   int socket_id, unsigned int flags)
+	__rte_malloc __rte_dealloc(rte_mempool_free, 1);
 
 /**
  * Create an empty mempool
@@ -1132,22 +1147,10 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size,
  *   with rte_errno set appropriately. See rte_mempool_create() for details.
  */
 struct rte_mempool *
-rte_mempool_create_empty(const char *name, unsigned n, unsigned elt_size,
-	unsigned cache_size, unsigned private_data_size,
-	int socket_id, unsigned flags);
-/**
- * Free a mempool
- *
- * Unlink the mempool from global list, free the memory chunks, and all
- * memory referenced by the mempool. The objects must not be used by
- * other cores as they will be freed.
- *
- * @param mp
- *   A pointer to the mempool structure.
- *   If NULL then, the function does nothing.
- */
-void
-rte_mempool_free(struct rte_mempool *mp);
+rte_mempool_create_empty(const char *name, unsigned int n, unsigned int elt_size,
+			 unsigned int cache_size, unsigned int private_data_size,
+			 int socket_id, unsigned int flags)
+		__rte_malloc __rte_dealloc(rte_mempool_free, 1);
 
 /**
  * Add physically contiguous memory for objects in the pool at init
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 10/15] eventdev: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (8 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 09/15] mempool: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 11/15] ring: " Stephen Hemminger
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Jerin Jacob

Use function attributes to catch cases where eventdev is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/eventdev/rte_event_ring.h | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/lib/eventdev/rte_event_ring.h b/lib/eventdev/rte_event_ring.h
index 5769da269e..a8f308e4d6 100644
--- a/lib/eventdev/rte_event_ring.h
+++ b/lib/eventdev/rte_event_ring.h
@@ -247,7 +247,18 @@ int
 rte_event_ring_init(struct rte_event_ring *r, const char *name,
 	unsigned int count, unsigned int flags);
 
-/*
+
+/**
+ * De-allocate all memory used by the ring.
+ *
+ * @param r
+ *   Pointer to ring to created with rte_event_ring_create().
+ *   If r is NULL, no operation is performed.
+ */
+void
+rte_event_ring_free(struct rte_event_ring *r);
+
+/**
  * Create an event ring structure
  *
  * This function allocates memory and initializes an event ring inside that
@@ -288,8 +299,8 @@ rte_event_ring_init(struct rte_event_ring *r, const char *name,
  *    - ENOMEM - no appropriate memory area found in which to create memzone
  */
 struct rte_event_ring *
-rte_event_ring_create(const char *name, unsigned int count, int socket_id,
-		unsigned int flags);
+rte_event_ring_create(const char *name, unsigned int count, int socket_id, unsigned int flags)
+	__rte_malloc __rte_dealloc(rte_event_ring_free, 1);
 
 /**
  * Search for an event ring based on its name
@@ -304,16 +315,6 @@ rte_event_ring_create(const char *name, unsigned int count, int socket_id,
 struct rte_event_ring *
 rte_event_ring_lookup(const char *name);
 
-/**
- * De-allocate all memory used by the ring.
- *
- * @param r
- *   Pointer to ring to created with rte_event_ring_create().
- *   If r is NULL, no operation is performed.
- */
-void
-rte_event_ring_free(struct rte_event_ring *r);
-
 /**
  * Return the size of the event ring.
  *
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 11/15] ring: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (9 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 10/15] eventdev: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 12/15] reorder: " Stephen Hemminger
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Honnappa Nagarahalli, Konstantin Ananyev

Use function attributes to catch cases where ring is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/ring/rte_ring.h | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/lib/ring/rte_ring.h b/lib/ring/rte_ring.h
index 63a71d5871..15340a1981 100644
--- a/lib/ring/rte_ring.h
+++ b/lib/ring/rte_ring.h
@@ -119,6 +119,16 @@ ssize_t rte_ring_get_memsize(unsigned int count);
 int rte_ring_init(struct rte_ring *r, const char *name, unsigned int count,
 	unsigned int flags);
 
+
+/**
+ * De-allocate all memory used by the ring.
+ *
+ * @param r
+ *   Ring to free.
+ *   If NULL then, the function does nothing.
+ */
+void rte_ring_free(struct rte_ring *r);
+
 /**
  * Create a new ring named *name* in memory.
  *
@@ -183,16 +193,8 @@ int rte_ring_init(struct rte_ring *r, const char *name, unsigned int count,
  *    - ENOMEM - no appropriate memory area found in which to create memzone
  */
 struct rte_ring *rte_ring_create(const char *name, unsigned int count,
-				 int socket_id, unsigned int flags);
-
-/**
- * De-allocate all memory used by the ring.
- *
- * @param r
- *   Ring to free.
- *   If NULL then, the function does nothing.
- */
-void rte_ring_free(struct rte_ring *r);
+				 int socket_id, unsigned int flags)
+	__rte_malloc __rte_dealloc(rte_ring_free, 1);
 
 /**
  * Dump the status of the ring to a file.
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 12/15] reorder: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (10 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 11/15] ring: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 13/15] compressdev: " Stephen Hemminger
                   ` (3 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Volodymyr Fialko

Use function attributes to catch cases where reorder table is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/reorder/rte_reorder.h | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/lib/reorder/rte_reorder.h b/lib/reorder/rte_reorder.h
index 56a6507f9f..2f26ed7df3 100644
--- a/lib/reorder/rte_reorder.h
+++ b/lib/reorder/rte_reorder.h
@@ -44,6 +44,16 @@ rte_reorder_seqn(struct rte_mbuf *mbuf)
 		rte_reorder_seqn_t *);
 }
 
+/**
+ * Free reorder buffer instance.
+ *
+ * @param b
+ *   Pointer to reorder buffer instance.
+ *   If b is NULL, no operation is performed.
+ */
+void
+rte_reorder_free(struct rte_reorder_buffer *b);
+
 /**
  * Create a new reorder buffer instance
  *
@@ -64,7 +74,8 @@ rte_reorder_seqn(struct rte_mbuf *mbuf)
  *    - EINVAL - invalid parameters
  */
 struct rte_reorder_buffer *
-rte_reorder_create(const char *name, unsigned socket_id, unsigned int size);
+rte_reorder_create(const char *name, unsigned int socket_id, unsigned int size)
+	__rte_malloc __rte_dealloc(rte_reorder_free, 1);
 
 /**
  * Initializes given reorder buffer instance
@@ -111,16 +122,6 @@ rte_reorder_find_existing(const char *name);
 void
 rte_reorder_reset(struct rte_reorder_buffer *b);
 
-/**
- * Free reorder buffer instance.
- *
- * @param b
- *   Pointer to reorder buffer instance.
- *   If b is NULL, no operation is performed.
- */
-void
-rte_reorder_free(struct rte_reorder_buffer *b);
-
 /**
  * Insert given mbuf in reorder buffer in its correct position
  *
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 13/15] compressdev: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (11 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 12/15] reorder: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:03 ` [PATCH 14/15] telemetry: " Stephen Hemminger
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Fan Zhang, Ashish Gupta

Use function attributes to catch cases where compressdev is allocated
but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/compressdev/rte_comp.h | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/lib/compressdev/rte_comp.h b/lib/compressdev/rte_comp.h
index d66a4b1cb9..f86e773b28 100644
--- a/lib/compressdev/rte_comp.h
+++ b/lib/compressdev/rte_comp.h
@@ -480,6 +480,19 @@ struct __rte_cache_aligned rte_comp_op {
 	 */
 };
 
+
+/**
+ * Free operation structure
+ * If operation has been allocate from a rte_mempool, then the operation will
+ * be returned to the mempool.
+ *
+ * @param op
+ *   Compress operation pointer allocated from rte_comp_op_alloc()
+ *   If op is NULL, no operation is performed.
+ */
+void
+rte_comp_op_free(struct rte_comp_op *op);
+
 /**
  * Creates an operation pool
  *
@@ -501,7 +514,8 @@ struct __rte_cache_aligned rte_comp_op {
 struct rte_mempool *
 rte_comp_op_pool_create(const char *name,
 		unsigned int nb_elts, unsigned int cache_size,
-		uint16_t user_size, int socket_id);
+		uint16_t user_size, int socket_id)
+	__rte_malloc __rte_dealloc(rte_comp_op_free, 1);
 
 /**
  * Allocate an operation from a mempool with default parameters set
@@ -533,18 +547,6 @@ int
 rte_comp_op_bulk_alloc(struct rte_mempool *mempool,
 		struct rte_comp_op **ops, uint16_t nb_ops);
 
-/**
- * Free operation structure
- * If operation has been allocate from a rte_mempool, then the operation will
- * be returned to the mempool.
- *
- * @param op
- *   Compress operation pointer allocated from rte_comp_op_alloc()
- *   If op is NULL, no operation is performed.
- */
-void
-rte_comp_op_free(struct rte_comp_op *op);
-
 /**
  * Bulk free operation structures
  * If operations have been allocated from an rte_mempool, then the operations
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 14/15] telemetry: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (12 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 13/15] compressdev: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:43   ` Bruce Richardson
  2025-01-20 18:03 ` [PATCH 15/15] sched: " Stephen Hemminger
  2025-01-20 18:40 ` [PATCH 00/15] Add attributes to allocation functions Bruce Richardson
  15 siblings, 1 reply; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Bruce Richardson

Use function attributes to catch cases where telemetry data
is allocated but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/telemetry/rte_telemetry.h | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h
index 2ccfc73a5f..c4554e4028 100644
--- a/lib/telemetry/rte_telemetry.h
+++ b/lib/telemetry/rte_telemetry.h
@@ -414,16 +414,6 @@ __rte_experimental
 int
 rte_telemetry_register_cmd_arg(const char *cmd, telemetry_arg_cb fn, void *arg, const char *help);
 
-/**
- * Get a pointer to a container with memory allocated. The container is to be
- * used embedded within an existing telemetry dict/array.
- *
- * @return
- *  Pointer to a container.
- */
-struct rte_tel_data *
-rte_tel_data_alloc(void);
-
 /**
  * @internal
  * Free a container that has memory allocated.
@@ -435,6 +425,17 @@ rte_tel_data_alloc(void);
 void
 rte_tel_data_free(struct rte_tel_data *data);
 
+/**
+ * Get a pointer to a container with memory allocated. The container is to be
+ * used embedded within an existing telemetry dict/array.
+ *
+ * @return
+ *  Pointer to a container.
+ */
+struct rte_tel_data *
+rte_tel_data_alloc(void)
+	__rte_malloc __rte_dealloc(rte_tel_data_free, 1);
+
 #ifdef __cplusplus
 }
 #endif
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 15/15] sched: add allocation function attributes
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (13 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 14/15] telemetry: " Stephen Hemminger
@ 2025-01-20 18:03 ` Stephen Hemminger
  2025-01-20 18:40 ` [PATCH 00/15] Add attributes to allocation functions Bruce Richardson
  15 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:03 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Cristian Dumitrescu

Use function attributes to catch cases where sched port config
is allocated but not freed correctly.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/sched/rte_sched.h | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/lib/sched/rte_sched.h b/lib/sched/rte_sched.h
index 222e6b3583..7ae570aa1b 100644
--- a/lib/sched/rte_sched.h
+++ b/lib/sched/rte_sched.h
@@ -310,16 +310,7 @@ struct rte_sched_port_params {
  * Configuration
  */
 
-/**
- * Hierarchical scheduler port configuration
- *
- * @param params
- *   Port scheduler configuration parameter structure
- * @return
- *   Handle to port scheduler instance upon success or NULL otherwise.
- */
-struct rte_sched_port *
-rte_sched_port_config(struct rte_sched_port_params *params);
+struct rte_sched_port;
 
 /**
  * Hierarchical scheduler port free
@@ -331,6 +322,18 @@ rte_sched_port_config(struct rte_sched_port_params *params);
 void
 rte_sched_port_free(struct rte_sched_port *port);
 
+/**
+ * Hierarchical scheduler port configuration
+ *
+ * @param params
+ *   Port scheduler configuration parameter structure
+ * @return
+ *   Handle to port scheduler instance upon success or NULL otherwise.
+ */
+struct rte_sched_port *
+rte_sched_port_config(struct rte_sched_port_params *params)
+	__rte_malloc __rte_dealloc(rte_sched_port_free, 1);
+
 /**
  * Hierarchical scheduler pipe profile add
  *
-- 
2.45.2


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 00/15] Add attributes to allocation functions
  2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
                   ` (14 preceding siblings ...)
  2025-01-20 18:03 ` [PATCH 15/15] sched: " Stephen Hemminger
@ 2025-01-20 18:40 ` Bruce Richardson
  2025-01-20 18:42   ` Stephen Hemminger
  15 siblings, 1 reply; 19+ messages in thread
From: Bruce Richardson @ 2025-01-20 18:40 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Mon, Jan 20, 2025 at 10:03:18AM -0800, Stephen Hemminger wrote:
> This patch series builds on the allocation function attributes
> added in 24.11 release. These annotations will allow for compiler
> to flag cases where a pointer is allocated with one function
> but incorrectly passed to a different free function.
> 
> Checkpatch perl script falsely complains in a couple patches
> because it doesn't really understand C syntax for attributes.
> 

Looking at the patchset, I see a number of functions moved in files. Is
there a restriction on the placement of the alloc and free functions where
free has to be defined first?

/Bruce

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 00/15] Add attributes to allocation functions
  2025-01-20 18:40 ` [PATCH 00/15] Add attributes to allocation functions Bruce Richardson
@ 2025-01-20 18:42   ` Stephen Hemminger
  0 siblings, 0 replies; 19+ messages in thread
From: Stephen Hemminger @ 2025-01-20 18:42 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

On Mon, 20 Jan 2025 18:40:53 +0000
Bruce Richardson <bruce.richardson@intel.com> wrote:

> On Mon, Jan 20, 2025 at 10:03:18AM -0800, Stephen Hemminger wrote:
> > This patch series builds on the allocation function attributes
> > added in 24.11 release. These annotations will allow for compiler
> > to flag cases where a pointer is allocated with one function
> > but incorrectly passed to a different free function.
> > 
> > Checkpatch perl script falsely complains in a couple patches
> > because it doesn't really understand C syntax for attributes.
> >   
> 
> Looking at the patchset, I see a number of functions moved in files. Is
> there a restriction on the placement of the alloc and free functions where
> free has to be defined first?
> 
> /Bruce

Yes the function prototype must be defined before it can be used.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 14/15] telemetry: add allocation function attributes
  2025-01-20 18:03 ` [PATCH 14/15] telemetry: " Stephen Hemminger
@ 2025-01-20 18:43   ` Bruce Richardson
  0 siblings, 0 replies; 19+ messages in thread
From: Bruce Richardson @ 2025-01-20 18:43 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Mon, Jan 20, 2025 at 10:03:32AM -0800, Stephen Hemminger wrote:
> Use function attributes to catch cases where telemetry data
> is allocated but not freed correctly.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  lib/telemetry/rte_telemetry.h | 21 +++++++++++----------
>  1 file changed, 11 insertions(+), 10 deletions(-)
> 
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2025-01-20 18:44 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-20 18:03 [PATCH 00/15] Add attributes to allocation functions Stephen Hemminger
2025-01-20 18:03 ` [PATCH 01/15] fib: add allocation function attributes Stephen Hemminger
2025-01-20 18:03 ` [PATCH 02/15] rib: annotate rib allocation functions Stephen Hemminger
2025-01-20 18:03 ` [PATCH 03/15] hash: add allocation function attributes Stephen Hemminger
2025-01-20 18:03 ` [PATCH 04/15] lpm: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 05/15] pipeline: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 06/15] acl: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 07/15] bitratestats: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 08/15] member: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 09/15] mempool: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 10/15] eventdev: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 11/15] ring: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 12/15] reorder: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 13/15] compressdev: " Stephen Hemminger
2025-01-20 18:03 ` [PATCH 14/15] telemetry: " Stephen Hemminger
2025-01-20 18:43   ` Bruce Richardson
2025-01-20 18:03 ` [PATCH 15/15] sched: " Stephen Hemminger
2025-01-20 18:40 ` [PATCH 00/15] Add attributes to allocation functions Bruce Richardson
2025-01-20 18:42   ` Stephen Hemminger

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).