/usr/share/dpdk/x86_64-default-linuxapp-gcc/include/rte_lcore.h is in dpdk-dev 17.11.1-6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 | /*-
* BSD LICENSE
*
* Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _RTE_LCORE_H_
#define _RTE_LCORE_H_
/**
* @file
*
* API for lcore and socket manipulation
*
*/
#include <rte_config.h>
#include <rte_per_lcore.h>
#include <rte_eal.h>
#include <rte_launch.h>
#ifdef __cplusplus
extern "C" {
#endif
#define LCORE_ID_ANY UINT32_MAX /**< Any lcore. */
#if defined(__linux__)
typedef cpu_set_t rte_cpuset_t;
#elif defined(__FreeBSD__)
#include <pthread_np.h>
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 */
};
/**
* Internal configuration (per-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". */
/**
* Return the ID of the execution unit we are running on.
* @return
* Logical core ID (in EAL thread) or LCORE_ID_ANY (in non-EAL thread)
*/
static inline unsigned
rte_lcore_id(void)
{
return RTE_PER_LCORE(_lcore_id);
}
/**
* Get the id of the master lcore
*
* @return
* the id of the master lcore
*/
static inline unsigned
rte_get_master_lcore(void)
{
return rte_eal_get_configuration()->master_lcore;
}
/**
* Return the number of execution units (lcores) on the system.
*
* @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;
}
/**
* Return the index of the lcore starting from zero.
* The order is physical or given by command line (-l option).
*
* @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;
}
/**
* Return the ID of the physical socket of the logical core we are
* running on.
* @return
* the ID of current lcoreid's physical socket
*/
unsigned rte_socket_id(void);
/**
* Get the ID of the physical socket of the specified lcore
*
* @param lcore_id
* the targeted lcore, which MUST be between 0 and RTE_MAX_LCORE-1.
* @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;
}
/**
* Test if an lcore is enabled.
*
* @param lcore_id
* The identifier of the lcore, which MUST be between 0 and
* RTE_MAX_LCORE-1.
* @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;
}
/**
* Get the next enabled lcore ID.
*
* @param i
* The current lcore (reference).
* @param skip_master
* If true, do not return the ID of the master 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.
*/
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;
}
/**
* 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_get_next_lcore(i, 0, 0))
/**
* Macro to browse all running lcores except the master lcore.
*/
#define RTE_LCORE_FOREACH_SLAVE(i) \
for (i = rte_get_next_lcore(-1, 1, 0); \
i<RTE_MAX_LCORE; \
i = rte_get_next_lcore(i, 1, 0))
/**
* Set core affinity of the current thread.
* Support both EAL and non-EAL thread and update TLS.
*
* @param cpusetp
* Point to cpu_set_t for setting current thread affinity.
* @return
* On success, return 0; otherwise return -1;
*/
int rte_thread_set_affinity(rte_cpuset_t *cpusetp);
/**
* Get core affinity of the current thread.
*
* @param cpusetp
* Point to cpu_set_t for getting current thread cpu affinity.
* It presumes input is not NULL, otherwise it causes panic.
*
*/
void rte_thread_get_affinity(rte_cpuset_t *cpusetp);
/**
* Set thread names.
*
* @note It fails with glibc < 2.12.
*
* @param id
* Thread id.
* @param name
* Thread name to set.
* @return
* On success, return 0; otherwise return a negative value.
*/
int rte_thread_setname(pthread_t id, const char *name);
/**
* Test if the core supplied has a specific role
*
* @param lcore_id
* The identifier of the lcore, which MUST be between 0 and
* RTE_MAX_LCORE-1.
* @param role
* The role to be checked against.
* @return
* On success, return 0; otherwise return a negative value.
*/
int
rte_lcore_has_role(unsigned int lcore_id, enum rte_lcore_role_t role);
#ifdef __cplusplus
}
#endif
#endif /* _RTE_LCORE_H_ */
|