[dpdk-dev,v3,05/20] eal: introduce device class abstraction
Checks
Commit Message
Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
lib/librte_eal/bsdapp/eal/Makefile | 1 +
lib/librte_eal/common/Makefile | 2 +-
lib/librte_eal/common/eal_common_class.c | 62 +++++++++++++++
lib/librte_eal/common/include/rte_class.h | 121 +++++++++++++++++++++++++++++
lib/librte_eal/common/include/rte_common.h | 1 +
lib/librte_eal/linuxapp/eal/Makefile | 1 +
lib/librte_eal/rte_eal_version.map | 2 +
7 files changed, 189 insertions(+), 1 deletion(-)
create mode 100644 lib/librte_eal/common/eal_common_class.c
create mode 100644 lib/librte_eal/common/include/rte_class.h
Comments
On 3/27/2018 4:48 AM, Gaetan Rivet wrote:
> Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
> ---
> lib/librte_eal/bsdapp/eal/Makefile | 1 +
> lib/librte_eal/common/Makefile | 2 +-
> lib/librte_eal/common/eal_common_class.c | 62 +++++++++++++++
> lib/librte_eal/common/include/rte_class.h | 121 +++++++++++++++++++++++++++++
> lib/librte_eal/common/include/rte_common.h | 1 +
> lib/librte_eal/linuxapp/eal/Makefile | 1 +
> lib/librte_eal/rte_eal_version.map | 2 +
> 7 files changed, 189 insertions(+), 1 deletion(-)
> create mode 100644 lib/librte_eal/common/eal_common_class.c
> create mode 100644 lib/librte_eal/common/include/rte_class.h
>
[...]
> +
> +/**
> + * Class iterator to find a particular class.
> + *
> + * This function compares each registered class to find one that matches
> + * the data passed as parameter.
> + *
> + * If the comparison function returns zero this function will stop iterating
> + * over any more classes. To continue a search the class of a previous search
> + * can be passed via the start parameter.
> + *
> + * @param start
> + * Starting point for the iteration.
> + *
> + * @param cmp
> + * Comparison function.
> + *
> + * @param data
> + * Data to pass to comparison function.
> + *
> + * @return
> + * A pointer to a rte_bus structure or NULL in case no class matches
Trivial: ^^^^^^^^
Should be rte_class
[...]
-
Shreyansh
On Tue, Mar 27, 2018 at 02:08:31PM +0530, Shreyansh Jain wrote:
> On 3/27/2018 4:48 AM, Gaetan Rivet wrote:
> > Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
> > ---
> > lib/librte_eal/bsdapp/eal/Makefile | 1 +
> > lib/librte_eal/common/Makefile | 2 +-
> > lib/librte_eal/common/eal_common_class.c | 62 +++++++++++++++
> > lib/librte_eal/common/include/rte_class.h | 121 +++++++++++++++++++++++++++++
> > lib/librte_eal/common/include/rte_common.h | 1 +
> > lib/librte_eal/linuxapp/eal/Makefile | 1 +
> > lib/librte_eal/rte_eal_version.map | 2 +
> > 7 files changed, 189 insertions(+), 1 deletion(-)
> > create mode 100644 lib/librte_eal/common/eal_common_class.c
> > create mode 100644 lib/librte_eal/common/include/rte_class.h
> >
>
> [...]
>
> > +
> > +/**
> > + * Class iterator to find a particular class.
> > + *
> > + * This function compares each registered class to find one that matches
> > + * the data passed as parameter.
> > + *
> > + * If the comparison function returns zero this function will stop iterating
> > + * over any more classes. To continue a search the class of a previous search
> > + * can be passed via the start parameter.
> > + *
> > + * @param start
> > + * Starting point for the iteration.
> > + *
> > + * @param cmp
> > + * Comparison function.
> > + *
> > + * @param data
> > + * Data to pass to comparison function.
> > + *
> > + * @return
> > + * A pointer to a rte_bus structure or NULL in case no class matches
>
> Trivial: ^^^^^^^^
> Should be rte_class
Thanks, will fix.
>
> [...]
>
> -
> Shreyansh
@@ -48,6 +48,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_hypervisor.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_string_fns.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_hexdump.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_devargs.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_class.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_bus.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_dev.c
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_options.c
@@ -11,7 +11,7 @@ INC += rte_per_lcore.h rte_random.h
INC += rte_tailq.h rte_interrupts.h rte_alarm.h
INC += rte_version.h
INC += rte_eal_memconfig.h rte_malloc_heap.h
-INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h
+INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h rte_class.h
INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
INC += rte_malloc.h rte_keepalive.h rte_time.h
INC += rte_service.h rte_service_component.h
new file mode 100644
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2018 Gaëtan Rivet
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/queue.h>
+
+#include <rte_class.h>
+#include <rte_debug.h>
+
+struct rte_class_list rte_class_list =
+ TAILQ_HEAD_INITIALIZER(rte_class_list);
+
+__rte_experimental void
+rte_class_register(struct rte_class *class)
+{
+ RTE_VERIFY(class);
+ RTE_VERIFY(class->name && strlen(class->name));
+
+ TAILQ_INSERT_TAIL(&rte_class_list, class, next);
+ RTE_LOG(DEBUG, EAL, "Registered [%s] device class.\n", class->name);
+}
+
+__rte_experimental void
+rte_class_unregister(struct rte_class *class)
+{
+ TAILQ_REMOVE(&rte_class_list, class, next);
+ RTE_LOG(DEBUG, EAL, "Unregistered [%s] device class.\n", class->name);
+}
+
+struct rte_class *
+rte_class_find(const struct rte_class *start, rte_class_cmp_t cmp,
+ const void *data)
+{
+ struct rte_class *cls;
+
+ if (start != NULL)
+ cls = TAILQ_NEXT(start, next);
+ else
+ cls = TAILQ_FIRST(&rte_class_list);
+ while (cls != NULL) {
+ if (cmp(cls, data) == 0)
+ break;
+ cls = TAILQ_NEXT(cls, next);
+ }
+ return cls;
+}
+
+static int
+cmp_class_name(const struct rte_class *class, const void *_name)
+{
+ const char *name = _name;
+
+ return strcmp(class->name, name);
+}
+
+struct rte_class *
+rte_class_find_by_name(const char *name)
+{
+ return rte_class_find(NULL, cmp_class_name, (const void *)name);
+}
new file mode 100644
@@ -0,0 +1,121 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2018 Gaëtan Rivet
+ */
+
+#ifndef _RTE_CLASS_H_
+#define _RTE_CLASS_H_
+
+/**
+ * @file
+ *
+ * DPDK device class interface.
+ *
+ * This file exposes API and interfaces of device classes.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/queue.h>
+
+#include <rte_dev.h>
+
+/** Double linked list of classes */
+TAILQ_HEAD(rte_class_list, rte_class);
+
+/**
+ * A structure describing a generic device class.
+ */
+struct rte_class {
+ TAILQ_ENTRY(rte_class) next; /**< Next device class in linked list */
+ const char *name; /**< Name of the class */
+};
+
+/**
+ * Class comparison function.
+ *
+ * @param cls
+ * Class under test.
+ *
+ * @param data
+ * Data to compare against.
+ *
+ * @return
+ * 0 if the class matches the data.
+ * !0 if the class does not match.
+ * <0 if ordering is possible and the class is lower than the data.
+ * >0 if ordering is possible and the class is greater than the data.
+ */
+typedef int (*rte_class_cmp_t)(const struct rte_class *cls, const void *data);
+
+/**
+ * Class iterator to find a particular class.
+ *
+ * This function compares each registered class to find one that matches
+ * the data passed as parameter.
+ *
+ * If the comparison function returns zero this function will stop iterating
+ * over any more classes. To continue a search the class of a previous search
+ * can be passed via the start parameter.
+ *
+ * @param start
+ * Starting point for the iteration.
+ *
+ * @param cmp
+ * Comparison function.
+ *
+ * @param data
+ * Data to pass to comparison function.
+ *
+ * @return
+ * A pointer to a rte_bus structure or NULL in case no class matches
+ */
+struct rte_class *
+rte_class_find(const struct rte_class *start, rte_class_cmp_t cmp,
+ const void *data);
+
+/**
+ * Find the registered class for a given name.
+ */
+struct rte_class *
+rte_class_find_by_name(const char *name);
+
+/**
+ * Register a Class handle.
+ *
+ * @param
+ * A pointer to a rte_class structure describing the class
+ * to be registered.
+ */
+__rte_experimental
+void rte_class_register(struct rte_class *cls);
+
+/**
+ * Unregister a Class handle.
+ *
+ * @param class
+ * A pointer to a rte_class structure describing the class
+ * to be unregistered.
+ */
+__rte_experimental
+void rte_class_unregister(struct rte_class *cls);
+
+/**
+ * Helper for Class registration.
+ * The constructor has lower priority than Bus constructors.
+ * The constructor has higher priority than PMD constructors.
+ */
+#define RTE_REGISTER_CLASS(nm, cls) \
+RTE_INIT_PRIO(classinitfn_ ##nm, CLASS); \
+static void classinitfn_ ##nm(void) \
+{\
+ (cls).name = RTE_STR(nm);\
+ rte_class_register(&cls); \
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_CLASS_H_ */
@@ -83,6 +83,7 @@ typedef uint16_t unaligned_uint16_t;
#define RTE_PRIORITY_LOG 101
#define RTE_PRIORITY_BUS 110
+#define RTE_PRIORITY_CLASS 120
#define RTE_PRIO(prio) \
RTE_PRIORITY_ ## prio
@@ -56,6 +56,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_hypervisor.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_string_fns.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_hexdump.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_devargs.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_class.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_bus.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_dev.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_options.c
@@ -215,6 +215,8 @@ EXPERIMENTAL {
global:
rte_eal_cleanup;
+ rte_class_register;
+ rte_class_unregister;
rte_eal_devargs_insert;
rte_eal_devargs_parse;
rte_eal_devargs_remove;