[v14,1/8] fib: make lookup function type configurable

Message ID b388b7d1424b79a686477a2cd684d535de90d620.1603649185.git.vladimir.medvedkin@intel.com (mailing list archive)
State Superseded, archived
Delegated to: David Marchand
Headers
Series fib: implement AVX512 vector lookup |

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Vladimir Medvedkin Oct. 25, 2020, 6:07 p.m. UTC
  Add type argument to dir24_8_get_lookup_fn()
Now it supports 3 different lookup implementations:
 RTE_FIB_DIR24_8_SCALAR_MACRO
 RTE_FIB_DIR24_8_SCALAR_INLINE
 RTE_FIB_DIR24_8_SCALAR_UNI

Add new rte_fib_set_lookup_fn() - user can change lookup
function type runtime.

Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
---
 lib/librte_fib/dir24_8.c   | 84 ++++++++++++++++++++++++++++------------------
 lib/librte_fib/dir24_8.h   |  2 +-
 lib/librte_fib/rte_fib.c   | 21 +++++++++++-
 lib/librte_fib/rte_fib.h   | 32 ++++++++++++++++++
 lib/librte_fib/version.map |  1 +
 5 files changed, 106 insertions(+), 34 deletions(-)
  

Comments

David Marchand Oct. 26, 2020, 1:58 p.m. UTC | #1
Hello Vladimir,

On Sun, Oct 25, 2020 at 7:08 PM Vladimir Medvedkin
<vladimir.medvedkin@intel.com> wrote:
> diff --git a/lib/librte_fib/rte_fib.h b/lib/librte_fib/rte_fib.h
> index 84ee774..2097ee5 100644
> --- a/lib/librte_fib/rte_fib.h
> +++ b/lib/librte_fib/rte_fib.h
> @@ -58,6 +58,21 @@ enum rte_fib_dir24_8_nh_sz {
>         RTE_FIB_DIR24_8_8B
>  };
>
> +/** Type of lookup function implementation */
> +enum rte_fib_dir24_8_lookup_type {
> +       RTE_FIB_DIR24_8_SCALAR_MACRO,
> +       /**< Macro based lookup function */
> +       RTE_FIB_DIR24_8_SCALAR_INLINE,
> +       /**<
> +        * Lookup implementation using inlined functions
> +        * for different next hop sizes
> +        */
> +       RTE_FIB_DIR24_8_SCALAR_UNI
> +       /**<
> +        * Unified lookup function for all next hop sizes
> +        */
> +};
> +

We can't have a generic function, with a specific type/
Let's have a generic name, in hope it will be extended later for other
fib implementations.
For the default behavior and selecting the "best" possible
implementation, we can introduce a RTE_FIB_LOOKUP_DEFAULT magic value
that would work with any fib type.

How about:

enum rte_fib_lookup_type {
  RTE_FIB_LOOKUP_DEFAULT,
  RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO,
  RTE_FIB_LOOKUP_DIR24_8_SCALAR_INLINE,
  RTE_FIB_LOOKUP_DIR24_8_SCALAR_UNI,
  RTE_FIB_LOOKUP_DIR24_8_VECTOR_AVX512,
};


>  /** FIB configuration structure */
>  struct rte_fib_conf {
>         enum rte_fib_type type; /**< Type of FIB struct */
> @@ -196,6 +211,23 @@ __rte_experimental
>  struct rte_rib *
>  rte_fib_get_rib(struct rte_fib *fib);
>
> +/**
> + * Set lookup function based on type
> + *
> + * @param fib
> + *   FIB object handle
> + * @param type
> + *   type of lookup function
> + *
> + * @return
> + *    -EINVAL on failure
> + *    0 on success
> + */
> +__rte_experimental
> +int
> +rte_fib_set_lookup_fn(struct rte_fib *fib,
> +       enum rte_fib_dir24_8_lookup_type type);
> +

_fn does not give much info, how about rte_fib_select_lookup ?


>  #ifdef __cplusplus
>  }
>  #endif
  
Vladimir Medvedkin Oct. 26, 2020, 5:51 p.m. UTC | #2
Hello David,

On 26/10/2020 13:58, David Marchand wrote:
> Hello Vladimir,
> 
> On Sun, Oct 25, 2020 at 7:08 PM Vladimir Medvedkin
> <vladimir.medvedkin@intel.com> wrote:
>> diff --git a/lib/librte_fib/rte_fib.h b/lib/librte_fib/rte_fib.h
>> index 84ee774..2097ee5 100644
>> --- a/lib/librte_fib/rte_fib.h
>> +++ b/lib/librte_fib/rte_fib.h
>> @@ -58,6 +58,21 @@ enum rte_fib_dir24_8_nh_sz {
>>          RTE_FIB_DIR24_8_8B
>>   };
>>
>> +/** Type of lookup function implementation */
>> +enum rte_fib_dir24_8_lookup_type {
>> +       RTE_FIB_DIR24_8_SCALAR_MACRO,
>> +       /**< Macro based lookup function */
>> +       RTE_FIB_DIR24_8_SCALAR_INLINE,
>> +       /**<
>> +        * Lookup implementation using inlined functions
>> +        * for different next hop sizes
>> +        */
>> +       RTE_FIB_DIR24_8_SCALAR_UNI
>> +       /**<
>> +        * Unified lookup function for all next hop sizes
>> +        */
>> +};
>> +
> 
> We can't have a generic function, with a specific type/
> Let's have a generic name, in hope it will be extended later for other
> fib implementations.
> For the default behavior and selecting the "best" possible
> implementation, we can introduce a RTE_FIB_LOOKUP_DEFAULT magic value
> that would work with any fib type.
> 
> How about:
> 
> enum rte_fib_lookup_type {
>    RTE_FIB_LOOKUP_DEFAULT,
>    RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO,
>    RTE_FIB_LOOKUP_DIR24_8_SCALAR_INLINE,
>    RTE_FIB_LOOKUP_DIR24_8_SCALAR_UNI,
>    RTE_FIB_LOOKUP_DIR24_8_VECTOR_AVX512,
> };
> 
> 

I introduced special magic value to select the "best" possible lookup 
implementation in "fib: introduce AVX512 lookup patch":
+       RTE_FIB_DIR24_8_ANY = UINT32_MAX
+       /**< Selects the best implementation based on the max simd 
bitwidth */
and I wanted to get rid of dir24_8 in names after I remove all 
unnecessary lookup implementations in the separate patches.

But I'm OK with your suggestion, I will reflect it in v15.


>>   /** FIB configuration structure */
>>   struct rte_fib_conf {
>>          enum rte_fib_type type; /**< Type of FIB struct */
>> @@ -196,6 +211,23 @@ __rte_experimental
>>   struct rte_rib *
>>   rte_fib_get_rib(struct rte_fib *fib);
>>
>> +/**
>> + * Set lookup function based on type
>> + *
>> + * @param fib
>> + *   FIB object handle
>> + * @param type
>> + *   type of lookup function
>> + *
>> + * @return
>> + *    -EINVAL on failure
>> + *    0 on success
>> + */
>> +__rte_experimental
>> +int
>> +rte_fib_set_lookup_fn(struct rte_fib *fib,
>> +       enum rte_fib_dir24_8_lookup_type type);
>> +
> 
> _fn does not give much info, how about rte_fib_select_lookup ?
> 

rte_fib_select_lookup is OK, I will rename it in v15 as well.

> 
>>   #ifdef __cplusplus
>>   }
>>   #endif
> 
>
  

Patch

diff --git a/lib/librte_fib/dir24_8.c b/lib/librte_fib/dir24_8.c
index c9dce3c..ff51f65 100644
--- a/lib/librte_fib/dir24_8.c
+++ b/lib/librte_fib/dir24_8.c
@@ -45,13 +45,6 @@  struct dir24_8_tbl {
 
 #define ROUNDUP(x, y)	 RTE_ALIGN_CEIL(x, (1 << (32 - y)))
 
-enum lookup_type {
-	MACRO,
-	INLINE,
-	UNI
-};
-enum lookup_type test_lookup = MACRO;
-
 static inline void *
 get_tbl24_p(struct dir24_8_tbl *dp, uint32_t ip, uint8_t nh_sz)
 {
@@ -252,35 +245,62 @@  dir24_8_lookup_bulk_uni(void *p, const uint32_t *ips,
 	}
 }
 
+static inline rte_fib_lookup_fn_t
+get_scalar_fn(enum rte_fib_dir24_8_nh_sz nh_sz)
+{
+	switch (nh_sz) {
+	case RTE_FIB_DIR24_8_1B:
+		return dir24_8_lookup_bulk_1b;
+	case RTE_FIB_DIR24_8_2B:
+		return dir24_8_lookup_bulk_2b;
+	case RTE_FIB_DIR24_8_4B:
+		return dir24_8_lookup_bulk_4b;
+	case RTE_FIB_DIR24_8_8B:
+		return dir24_8_lookup_bulk_8b;
+	default:
+		return NULL;
+	}
+}
+
+static inline rte_fib_lookup_fn_t
+get_scalar_fn_inlined(enum rte_fib_dir24_8_nh_sz nh_sz)
+{
+	switch (nh_sz) {
+	case RTE_FIB_DIR24_8_1B:
+		return dir24_8_lookup_bulk_0;
+	case RTE_FIB_DIR24_8_2B:
+		return dir24_8_lookup_bulk_1;
+	case RTE_FIB_DIR24_8_4B:
+		return dir24_8_lookup_bulk_2;
+	case RTE_FIB_DIR24_8_8B:
+		return dir24_8_lookup_bulk_3;
+	default:
+		return NULL;
+	}
+}
+
 rte_fib_lookup_fn_t
-dir24_8_get_lookup_fn(struct rte_fib_conf *fib_conf)
+dir24_8_get_lookup_fn(void *p, enum rte_fib_dir24_8_lookup_type type)
 {
-	enum rte_fib_dir24_8_nh_sz nh_sz = fib_conf->dir24_8.nh_sz;
+	enum rte_fib_dir24_8_nh_sz nh_sz;
+	struct dir24_8_tbl *dp = p;
 
-	if (test_lookup == MACRO) {
-		switch (nh_sz) {
-		case RTE_FIB_DIR24_8_1B:
-			return dir24_8_lookup_bulk_1b;
-		case RTE_FIB_DIR24_8_2B:
-			return dir24_8_lookup_bulk_2b;
-		case RTE_FIB_DIR24_8_4B:
-			return dir24_8_lookup_bulk_4b;
-		case RTE_FIB_DIR24_8_8B:
-			return dir24_8_lookup_bulk_8b;
-		}
-	} else if (test_lookup == INLINE) {
-		switch (nh_sz) {
-		case RTE_FIB_DIR24_8_1B:
-			return dir24_8_lookup_bulk_0;
-		case RTE_FIB_DIR24_8_2B:
-			return dir24_8_lookup_bulk_1;
-		case RTE_FIB_DIR24_8_4B:
-			return dir24_8_lookup_bulk_2;
-		case RTE_FIB_DIR24_8_8B:
-			return dir24_8_lookup_bulk_3;
-		}
-	} else
+	if (dp == NULL)
+		return NULL;
+
+	nh_sz = dp->nh_sz;
+
+	switch (type) {
+	case RTE_FIB_DIR24_8_SCALAR_MACRO:
+		return get_scalar_fn(nh_sz);
+	case RTE_FIB_DIR24_8_SCALAR_INLINE:
+		return get_scalar_fn_inlined(nh_sz);
+	case RTE_FIB_DIR24_8_SCALAR_UNI:
 		return dir24_8_lookup_bulk_uni;
+	default:
+		return NULL;
+	}
+
 	return NULL;
 }
 
diff --git a/lib/librte_fib/dir24_8.h b/lib/librte_fib/dir24_8.h
index 1ec437c..53c5dd2 100644
--- a/lib/librte_fib/dir24_8.h
+++ b/lib/librte_fib/dir24_8.h
@@ -22,7 +22,7 @@  void
 dir24_8_free(void *p);
 
 rte_fib_lookup_fn_t
-dir24_8_get_lookup_fn(struct rte_fib_conf *conf);
+dir24_8_get_lookup_fn(void *p, enum rte_fib_dir24_8_lookup_type type);
 
 int
 dir24_8_modify(struct rte_fib *fib, uint32_t ip, uint8_t depth,
diff --git a/lib/librte_fib/rte_fib.c b/lib/librte_fib/rte_fib.c
index e090808..b9f6efb 100644
--- a/lib/librte_fib/rte_fib.c
+++ b/lib/librte_fib/rte_fib.c
@@ -107,7 +107,8 @@  init_dataplane(struct rte_fib *fib, __rte_unused int socket_id,
 		fib->dp = dir24_8_create(dp_name, socket_id, conf);
 		if (fib->dp == NULL)
 			return -rte_errno;
-		fib->lookup = dir24_8_get_lookup_fn(conf);
+		fib->lookup = dir24_8_get_lookup_fn(fib->dp,
+			RTE_FIB_DIR24_8_SCALAR_MACRO);
 		fib->modify = dir24_8_modify;
 		return 0;
 	default:
@@ -317,3 +318,21 @@  rte_fib_get_rib(struct rte_fib *fib)
 {
 	return (fib == NULL) ? NULL : fib->rib;
 }
+
+int
+rte_fib_set_lookup_fn(struct rte_fib *fib,
+	enum rte_fib_dir24_8_lookup_type type)
+{
+	rte_fib_lookup_fn_t fn;
+
+	switch (fib->type) {
+	case RTE_FIB_DIR24_8:
+		fn = dir24_8_get_lookup_fn(fib->dp, type);
+		if (fn == NULL)
+			return -EINVAL;
+		fib->lookup = fn;
+		return 0;
+	default:
+		return -EINVAL;
+	}
+}
diff --git a/lib/librte_fib/rte_fib.h b/lib/librte_fib/rte_fib.h
index 84ee774..2097ee5 100644
--- a/lib/librte_fib/rte_fib.h
+++ b/lib/librte_fib/rte_fib.h
@@ -58,6 +58,21 @@  enum rte_fib_dir24_8_nh_sz {
 	RTE_FIB_DIR24_8_8B
 };
 
+/** Type of lookup function implementation */
+enum rte_fib_dir24_8_lookup_type {
+	RTE_FIB_DIR24_8_SCALAR_MACRO,
+	/**< Macro based lookup function */
+	RTE_FIB_DIR24_8_SCALAR_INLINE,
+	/**<
+	 * Lookup implementation using inlined functions
+	 * for different next hop sizes
+	 */
+	RTE_FIB_DIR24_8_SCALAR_UNI
+	/**<
+	 * Unified lookup function for all next hop sizes
+	 */
+};
+
 /** FIB configuration structure */
 struct rte_fib_conf {
 	enum rte_fib_type type; /**< Type of FIB struct */
@@ -196,6 +211,23 @@  __rte_experimental
 struct rte_rib *
 rte_fib_get_rib(struct rte_fib *fib);
 
+/**
+ * Set lookup function based on type
+ *
+ * @param fib
+ *   FIB object handle
+ * @param type
+ *   type of lookup function
+ *
+ * @return
+ *    -EINVAL on failure
+ *    0 on success
+ */
+__rte_experimental
+int
+rte_fib_set_lookup_fn(struct rte_fib *fib,
+	enum rte_fib_dir24_8_lookup_type type);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_fib/version.map b/lib/librte_fib/version.map
index 9527417..216af66 100644
--- a/lib/librte_fib/version.map
+++ b/lib/librte_fib/version.map
@@ -9,6 +9,7 @@  EXPERIMENTAL {
 	rte_fib_lookup_bulk;
 	rte_fib_get_dp;
 	rte_fib_get_rib;
+	rte_fib_set_lookup_fn;
 
 	rte_fib6_add;
 	rte_fib6_create;