#include <rte_per_lcore.h>
#include <rte_eal.h>
#include <rte_launch.h>
+#include <rte_thread.h>
#ifdef __cplusplus
extern "C" {
}
/**
- * Get the id of the master lcore
+ * Get the id of the main lcore
*
* @return
- * the id of the master lcore
+ * the id of the main lcore
*/
-unsigned int rte_get_master_lcore(void);
+unsigned int rte_get_main_lcore(void);
+
+/**
+ * Deprecated function the id of the main lcore
+ *
+ * @return
+ * the id of the main lcore
+ */
+__rte_deprecated
+static inline unsigned int rte_get_master_lcore(void)
+{
+ return rte_get_main_lcore();
+}
/**
* Return the number of execution units (lcores) on the system.
*
* @param i
* The current lcore (reference).
- * @param skip_master
- * If true, do not return the ID of the master lcore.
+ * @param skip_main
+ * If true, do not return the ID of the main lcore.
* @param wrap
* If true, go back to 0 when RTE_MAX_LCORE is reached; otherwise,
* return RTE_MAX_LCORE.
* @return
* The next lcore_id or RTE_MAX_LCORE if not found.
*/
-unsigned int rte_get_next_lcore(unsigned int i, int skip_master, int wrap);
+unsigned int rte_get_next_lcore(unsigned int i, int skip_main, int wrap);
/**
* Macro to browse all running lcores.
*/
#define RTE_LCORE_FOREACH(i) \
for (i = rte_get_next_lcore(-1, 0, 0); \
- i<RTE_MAX_LCORE; \
+ i < RTE_MAX_LCORE; \
i = rte_get_next_lcore(i, 0, 0))
/**
- * Macro to browse all running lcores except the master lcore.
+ * Macro to browse all running lcores except the main lcore.
*/
-#define RTE_LCORE_FOREACH_SLAVE(i) \
+#define RTE_LCORE_FOREACH_WORKER(i) \
for (i = rte_get_next_lcore(-1, 1, 0); \
- i<RTE_MAX_LCORE; \
+ i < RTE_MAX_LCORE; \
i = rte_get_next_lcore(i, 1, 0))
+#define RTE_LCORE_FOREACH_SLAVE(l) \
+ RTE_DEPRECATED(RTE_LCORE_FOREACH_SLAVE) RTE_LCORE_FOREACH_WORKER(l)
+
+/**
+ * Callback prototype for initializing lcores.
+ *
+ * @param lcore_id
+ * The lcore to consider.
+ * @param arg
+ * An opaque pointer passed at callback registration.
+ * @return
+ * - -1 when refusing this operation,
+ * - 0 otherwise.
+ */
+typedef int (*rte_lcore_init_cb)(unsigned int lcore_id, void *arg);
+
+/**
+ * Callback prototype for uninitializing lcores.
+ *
+ * @param lcore_id
+ * The lcore to consider.
+ * @param arg
+ * An opaque pointer passed at callback registration.
+ */
+typedef void (*rte_lcore_uninit_cb)(unsigned int lcore_id, void *arg);
+
+/**
+ * Register callbacks invoked when initializing and uninitializing a lcore.
+ *
+ * This function calls the init callback with all initialized lcores.
+ * Any error reported by the init callback triggers a rollback calling the
+ * uninit callback for each lcore.
+ * If this step succeeds, the callbacks are put in the lcore callbacks list
+ * that will get called for each lcore allocation/release.
+ *
+ * Note: callbacks execution is serialised under a write lock protecting the
+ * lcores and callbacks list.
+ *
+ * @param name
+ * A name serving as a small description for this callback.
+ * @param init
+ * The callback invoked when a lcore_id is initialized.
+ * init can be NULL.
+ * @param uninit
+ * The callback invoked when a lcore_id is uninitialized.
+ * uninit can be NULL.
+ * @param arg
+ * An optional argument that gets passed to the callback when it gets
+ * invoked.
+ * @return
+ * On success, returns an opaque pointer for the registered object.
+ * On failure (either memory allocation issue in the function itself or an
+ * error is returned by the init callback itself), returns NULL.
+ */
+__rte_experimental
+void *
+rte_lcore_callback_register(const char *name, rte_lcore_init_cb init,
+ rte_lcore_uninit_cb uninit, void *arg);
+
+/**
+ * Unregister callbacks previously registered with rte_lcore_callback_register.
+ *
+ * This function calls the uninit callback with all initialized lcores.
+ * The callbacks are then removed from the lcore callbacks list.
+ *
+ * @param handle
+ * The handle pointer returned by a former successful call to
+ * rte_lcore_callback_register.
+ */
+__rte_experimental
+void
+rte_lcore_callback_unregister(void *handle);
+
/**
- * Set core affinity of the current thread.
- * Support both EAL and non-EAL thread and update TLS.
+ * Callback prototype for iterating over lcores.
*
- * @param cpusetp
- * Point to cpu_set_t for setting current thread affinity.
+ * @param lcore_id
+ * The lcore to consider.
+ * @param arg
+ * An opaque pointer coming from the caller.
* @return
- * On success, return 0; otherwise return -1;
+ * - 0 lets the iteration continue.
+ * - !0 makes the iteration stop.
*/
-int rte_thread_set_affinity(rte_cpuset_t *cpusetp);
+typedef int (*rte_lcore_iterate_cb)(unsigned int lcore_id, void *arg);
/**
- * Get core affinity of the current thread.
+ * Iterate on all active lcores (ROLE_RTE, ROLE_SERVICE and ROLE_NON_EAL).
+ * No modification on the lcore states is allowed in the callback.
+ *
+ * Note: as opposed to init/uninit callbacks, iteration callbacks can be
+ * invoked in parallel as they are run under a read lock protecting the lcores
+ * and callbacks list.
*
- * @param cpusetp
- * Point to cpu_set_t for getting current thread cpu affinity.
- * It presumes input is not NULL, otherwise it causes panic.
+ * @param cb
+ * The callback that gets passed each lcore.
+ * @param arg
+ * An opaque pointer passed to cb.
+ * @return
+ * Same return code as the callback last invocation (see rte_lcore_iterate_cb
+ * description).
+ */
+__rte_experimental
+int
+rte_lcore_iterate(rte_lcore_iterate_cb cb, void *arg);
+
+/**
+ * List all lcores.
*
+ * @param f
+ * The output stream where the dump should be sent.
*/
-void rte_thread_get_affinity(rte_cpuset_t *cpusetp);
+__rte_experimental
+void
+rte_lcore_dump(FILE *f);
/**
* Set thread names.