test/telemetry: fix typo at beginning of line
[dpdk.git] / lib / librte_lpm / rte_lpm.h
index b9d49ac..1afe55c 100644 (file)
@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright(c) 2010-2014 Intel Corporation
+ * Copyright(c) 2020 Arm Limited
  */
 
 #ifndef _RTE_LPM_H_
@@ -20,6 +21,7 @@
 #include <rte_memory.h>
 #include <rte_common.h>
 #include <rte_vect.h>
+#include <rte_rcu_qsbr.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -62,6 +64,17 @@ extern "C" {
 /** Bitmask used to indicate successful lookup */
 #define RTE_LPM_LOOKUP_SUCCESS          0x01000000
 
+/** @internal Default RCU defer queue entries to reclaim in one go. */
+#define RTE_LPM_RCU_DQ_RECLAIM_MAX     16
+
+/** RCU reclamation modes */
+enum rte_lpm_qsbr_mode {
+       /** Create defer queue for reclaim. */
+       RTE_LPM_QSBR_MODE_DQ = 0,
+       /** Use blocking mode reclaim. No defer queue created. */
+       RTE_LPM_QSBR_MODE_SYNC
+};
+
 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
 /** @internal Tbl24 entry structure. */
 __extension__
@@ -105,31 +118,28 @@ struct rte_lpm_config {
        int flags;               /**< This field is currently unused. */
 };
 
-/** @internal Rule structure. */
-struct rte_lpm_rule {
-       uint32_t ip; /**< Rule IP address. */
-       uint32_t next_hop; /**< Rule next hop. */
-};
-
-/** @internal Contains metadata about the rules table. */
-struct rte_lpm_rule_info {
-       uint32_t used_rules; /**< Used rules so far. */
-       uint32_t first_rule; /**< Indexes the first rule of a given depth. */
-};
-
 /** @internal LPM structure. */
 struct rte_lpm {
-       /* LPM metadata. */
-       char name[RTE_LPM_NAMESIZE];        /**< Name of the lpm. */
-       uint32_t max_rules; /**< Max. balanced rules per lpm. */
-       uint32_t number_tbl8s; /**< Number of tbl8s. */
-       struct rte_lpm_rule_info rule_info[RTE_LPM_MAX_DEPTH]; /**< Rule info table. */
-
        /* LPM Tables. */
        struct rte_lpm_tbl_entry tbl24[RTE_LPM_TBL24_NUM_ENTRIES]
                        __rte_cache_aligned; /**< LPM tbl24 table. */
        struct rte_lpm_tbl_entry *tbl8; /**< LPM tbl8 table. */
-       struct rte_lpm_rule *rules_tbl; /**< LPM rules. */
+};
+
+/** LPM RCU QSBR configuration structure. */
+struct rte_lpm_rcu_config {
+       struct rte_rcu_qsbr *v; /* RCU QSBR variable. */
+       /* Mode of RCU QSBR. RTE_LPM_QSBR_MODE_xxx
+        * '0' for default: create defer queue for reclaim.
+        */
+       enum rte_lpm_qsbr_mode mode;
+       uint32_t dq_size;       /* RCU defer queue size.
+                                * default: lpm->number_tbl8s.
+                                */
+       uint32_t reclaim_thd;   /* Threshold to trigger auto reclaim. */
+       uint32_t reclaim_max;   /* Max entries to reclaim in one go.
+                                * default: RTE_LPM_RCU_DQ_RECLAIM_MAX.
+                                */
 };
 
 /**
@@ -179,6 +189,27 @@ rte_lpm_find_existing(const char *name);
 void
 rte_lpm_free(struct rte_lpm *lpm);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Associate RCU QSBR variable with an LPM object.
+ *
+ * @param lpm
+ *   the lpm object to add RCU QSBR
+ * @param cfg
+ *   RCU QSBR configuration
+ * @return
+ *   On success - 0
+ *   On error - 1 with error code set in rte_errno.
+ *   Possible rte_errno codes are:
+ *   - EINVAL - invalid pointer
+ *   - EEXIST - already added QSBR
+ *   - ENOMEM - memory allocation failure
+ */
+__rte_experimental
+int rte_lpm_rcu_qsbr_add(struct rte_lpm *lpm, struct rte_lpm_rcu_config *cfg);
+
 /**
  * Add a rule to the LPM table.
  *
@@ -370,7 +401,7 @@ static inline void
 rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4],
        uint32_t defv);
 
-#if defined(RTE_ARCH_ARM) || defined(RTE_ARCH_ARM64)
+#if defined(RTE_ARCH_ARM)
 #include "rte_lpm_neon.h"
 #elif defined(RTE_ARCH_PPC_64)
 #include "rte_lpm_altivec.h"