X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Finclude%2Frte_lcore.h;h=476b8ef3a7396d24abb9f87cf5f650ce23f65bde;hb=df3ff6be2b33faea3edf3c112b9bdc5b74d6f684;hp=223658baeaf0bfad1e0c3e465a0d2eba8ce2ee4a;hpb=369991d997e4abdee355e19ffbb41a4d246cafa2;p=dpdk.git diff --git a/lib/librte_eal/common/include/rte_lcore.h b/lib/librte_eal/common/include/rte_lcore.h index 223658baea..476b8ef3a7 100644 --- a/lib/librte_eal/common/include/rte_lcore.h +++ b/lib/librte_eal/common/include/rte_lcore.h @@ -11,6 +11,7 @@ * API for lcore and socket manipulation * */ +#include #include #include #include @@ -21,42 +22,28 @@ extern "C" { #define LCORE_ID_ANY UINT32_MAX /**< Any lcore. */ -#if defined(__linux__) - typedef cpu_set_t rte_cpuset_t; -#elif defined(__FreeBSD__) -#include - typedef cpuset_t rte_cpuset_t; -#endif - -/** - * Structure storing internal configuration (per-lcore) - */ -struct lcore_config { - unsigned detected; /**< true if lcore was detected */ - pthread_t thread_id; /**< pthread identifier */ - int pipe_master2slave[2]; /**< communication pipe with master */ - int pipe_slave2master[2]; /**< communication pipe with master */ - lcore_function_t * volatile f; /**< function to call */ - void * volatile arg; /**< argument of function */ - volatile int ret; /**< return value of function */ - volatile enum rte_lcore_state_t state; /**< lcore state */ - unsigned socket_id; /**< physical socket id for this lcore */ - unsigned core_id; /**< core number on socket for this lcore */ - int core_index; /**< relative index, starting from 0 */ - rte_cpuset_t cpuset; /**< cpu set which the lcore affinity to */ - uint8_t core_role; /**< role of core eg: OFF, RTE, SERVICE */ -}; +RTE_DECLARE_PER_LCORE(unsigned, _lcore_id); /**< Per thread "lcore id". */ +RTE_DECLARE_PER_LCORE(rte_cpuset_t, _cpuset); /**< Per thread "cpuset". */ /** - * Internal configuration (per-lcore) + * Get a lcore's role. + * + * @param lcore_id + * The identifier of the lcore, which MUST be between 0 and RTE_MAX_LCORE-1. + * @return + * The role of the lcore. */ -extern struct lcore_config lcore_config[RTE_MAX_LCORE]; - -RTE_DECLARE_PER_LCORE(unsigned, _lcore_id); /**< Per thread "lcore id". */ -RTE_DECLARE_PER_LCORE(rte_cpuset_t, _cpuset); /**< Per thread "cpuset". */ +enum rte_lcore_role_t rte_eal_lcore_role(unsigned int lcore_id); /** - * Return the ID of the execution unit we are running on. + * Return the Application thread ID of the execution unit. + * + * Note: in most cases the lcore id returned here will also correspond + * to the processor id of the CPU on which the thread is pinned, this + * will not be the case if the user has explicitly changed the thread to + * core affinities using --lcores EAL argument e.g. --lcores '(0-3)@10' + * to run threads with lcore IDs 0, 1, 2 and 3 on physical core 10.. + * * @return * Logical core ID (in EAL thread) or LCORE_ID_ANY (in non-EAL thread) */ @@ -72,11 +59,7 @@ rte_lcore_id(void) * @return * the id of the master lcore */ -static inline unsigned -rte_get_master_lcore(void) -{ - return rte_eal_get_configuration()->master_lcore; -} +unsigned int rte_get_master_lcore(void); /** * Return the number of execution units (lcores) on the system. @@ -84,31 +67,23 @@ rte_get_master_lcore(void) * @return * the number of execution units (lcores) on the system. */ -static inline unsigned -rte_lcore_count(void) -{ - const struct rte_config *cfg = rte_eal_get_configuration(); - return cfg->lcore_count; -} +unsigned int rte_lcore_count(void); /** * Return the index of the lcore starting from zero. - * The order is physical or given by command line (-l option). + * + * When option -c or -l is given, the index corresponds + * to the order in the list. + * For example: + * -c 0x30, lcore 4 has index 0, and 5 has index 1. + * -l 22,18 lcore 22 has index 0, and 18 has index 1. * * @param lcore_id * The targeted lcore, or -1 for the current one. * @return * The relative index, or -1 if not enabled. */ -static inline int -rte_lcore_index(int lcore_id) -{ - if (lcore_id >= RTE_MAX_LCORE) - return -1; - if (lcore_id < 0) - lcore_id = rte_lcore_id(); - return lcore_config[lcore_id].core_index; -} +int rte_lcore_index(int lcore_id); /** * Return the ID of the physical socket of the logical core we are @@ -116,7 +91,37 @@ rte_lcore_index(int lcore_id) * @return * the ID of current lcoreid's physical socket */ -unsigned rte_socket_id(void); +unsigned int rte_socket_id(void); + +/** + * Return number of physical sockets detected on the system. + * + * Note that number of nodes may not be correspondent to their physical id's: + * for example, a system may report two socket id's, but the actual socket id's + * may be 0 and 8. + * + * @return + * the number of physical sockets as recognized by EAL + */ +unsigned int +rte_socket_count(void); + +/** + * Return socket id with a particular index. + * + * This will return socket id at a particular position in list of all detected + * physical socket id's. For example, on a machine with sockets [0, 8], passing + * 1 as a parameter will return 8. + * + * @param idx + * index of physical socket id to return + * + * @return + * - physical socket id as recognized by EAL + * - -1 on error, with errno set to EINVAL + */ +int +rte_socket_id_by_idx(unsigned int idx); /** * Get the ID of the physical socket of the specified lcore @@ -126,11 +131,37 @@ unsigned rte_socket_id(void); * @return * the ID of lcoreid's physical socket */ -static inline unsigned -rte_lcore_to_socket_id(unsigned lcore_id) -{ - return lcore_config[lcore_id].socket_id; -} +unsigned int +rte_lcore_to_socket_id(unsigned int lcore_id); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Return the id of the lcore on a socket starting from zero. + * + * @param lcore_id + * The targeted lcore, or -1 for the current one. + * @return + * The relative index, or -1 if not enabled. + */ +__rte_experimental +int +rte_lcore_to_cpu_id(int lcore_id); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Return the cpuset for a given lcore. + * @param lcore_id + * the targeted lcore, which MUST be between 0 and RTE_MAX_LCORE-1. + * @return + * The cpuset of that lcore + */ +__rte_experimental +rte_cpuset_t +rte_lcore_cpuset(unsigned int lcore_id); /** * Test if an lcore is enabled. @@ -141,14 +172,7 @@ rte_lcore_to_socket_id(unsigned lcore_id) * @return * True if the given lcore is enabled; false otherwise. */ -static inline int -rte_lcore_is_enabled(unsigned lcore_id) -{ - struct rte_config *cfg = rte_eal_get_configuration(); - if (lcore_id >= RTE_MAX_LCORE) - return 0; - return cfg->lcore_role[lcore_id] == ROLE_RTE; -} +int rte_lcore_is_enabled(unsigned int lcore_id); /** * Get the next enabled lcore ID. @@ -163,25 +187,8 @@ rte_lcore_is_enabled(unsigned lcore_id) * @return * The next lcore_id or RTE_MAX_LCORE if not found. */ -static inline unsigned -rte_get_next_lcore(unsigned i, int skip_master, int wrap) -{ - i++; - if (wrap) - i %= RTE_MAX_LCORE; - - while (i < RTE_MAX_LCORE) { - if (!rte_lcore_is_enabled(i) || - (skip_master && (i == rte_get_master_lcore()))) { - i++; - if (wrap) - i %= RTE_MAX_LCORE; - continue; - } - break; - } - return i; -} +unsigned int rte_get_next_lcore(unsigned int i, int skip_master, int wrap); + /** * Macro to browse all running lcores. */ @@ -233,6 +240,33 @@ void rte_thread_get_affinity(rte_cpuset_t *cpusetp); */ int rte_thread_setname(pthread_t id, const char *name); +/** + * Create a control thread. + * + * Wrapper to pthread_create(), pthread_setname_np() and + * pthread_setaffinity_np(). The affinity of the new thread is based + * on the CPU affinity retrieved at the time rte_eal_init() was called, + * the dataplane and service lcores are then excluded. + * + * @param thread + * Filled with the thread id of the new created thread. + * @param name + * The name of the control thread (max 16 characters including '\0'). + * @param attr + * Attributes for the new thread. + * @param start_routine + * Function to be executed by the new thread. + * @param arg + * Argument passed to start_routine. + * @return + * On success, returns 0; on error, it returns a negative value + * corresponding to the error number. + */ +int +rte_ctrl_thread_create(pthread_t *thread, const char *name, + const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg); + /** * Test if the core supplied has a specific role * @@ -242,7 +276,7 @@ int rte_thread_setname(pthread_t id, const char *name); * @param role * The role to be checked against. * @return - * On success, return 0; otherwise return a negative value. + * Boolean value: positive if test is true; otherwise returns 0. */ int rte_lcore_has_role(unsigned int lcore_id, enum rte_lcore_role_t role);