doc: whitespace changes in licenses
[dpdk.git] / lib / librte_eal / common / include / rte_lcore.h
1 /*-
2  *   BSD LICENSE
3  * 
4  *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  * 
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  * 
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  * 
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #ifndef _RTE_LCORE_H_
35 #define _RTE_LCORE_H_
36
37 /**
38  * @file
39  *
40  * API for lcore and Socket Manipulation. Parts of this are execution
41  * environment specific.
42  *
43  */
44 #include <rte_per_lcore.h>
45 #include <rte_eal.h>
46 #include <rte_launch.h>
47
48 #ifdef __cplusplus
49 extern "C" {
50 #endif
51
52 #define LCORE_ID_ANY -1    /**< Any lcore. */
53
54 RTE_DECLARE_PER_LCORE(unsigned, _lcore_id); /**< Per core "core id". */
55
56 /**
57  * Return the ID of the execution unit we are running on.
58  * @return
59  *  Logical core ID
60  */
61 static inline unsigned
62 rte_lcore_id(void)
63 {
64         return RTE_PER_LCORE(_lcore_id);
65 }
66
67 /**
68  * Get the id of the master lcore
69  *
70  * @return
71  *   the id of the master lcore
72  */
73 static inline unsigned
74 rte_get_master_lcore(void)
75 {
76         return rte_eal_get_configuration()->master_lcore;
77 }
78
79 /**
80  * Return the number of execution units (lcores) on the system.
81  *
82  * @return
83  *   the number of execution units (lcores) on the system.
84  */
85 static inline unsigned
86 rte_lcore_count(void)
87 {
88         const struct rte_config *cfg = rte_eal_get_configuration();
89         return cfg->lcore_count;
90 }
91
92 #include <exec-env/rte_lcore.h>
93
94 /**
95  * Return the ID of the physical socket of the logical core we are
96  * running on.
97  * @return
98  *   the ID of current lcoreid's physical socket
99  */
100 static inline unsigned
101 rte_socket_id(void)
102 {
103         return lcore_config[rte_lcore_id()].socket_id;
104 }
105
106 /**
107  * Get the ID of the physical socket of the specified lcore
108  *
109  * @param lcore_id
110  *   the targeted lcore, which MUST be between 0 and RTE_MAX_LCORE-1.
111  * @return
112  *   the ID of lcoreid's physical socket
113  */
114 static inline unsigned
115 rte_lcore_to_socket_id(unsigned lcore_id)
116 {
117         return lcore_config[lcore_id].socket_id;
118 }
119
120 /**
121  * Test if an lcore is enabled.
122  *
123  * @param lcore_id
124  *   The identifier of the lcore, which MUST be between 0 and
125  *   RTE_MAX_LCORE-1.
126  * @return
127  *   True if the given lcore is enabled; false otherwise.
128  */
129 static inline int
130 rte_lcore_is_enabled(unsigned lcore_id)
131 {
132         struct rte_config *cfg = rte_eal_get_configuration();
133         if (lcore_id >= RTE_MAX_LCORE)
134                 return 0;
135         return (cfg->lcore_role[lcore_id] != ROLE_OFF);
136 }
137
138 /**
139  * Get the next enabled lcore ID.
140  *
141  * @param i
142  *   The current lcore (reference).
143  * @param skip_master
144  *   If true, do not return the ID of the master lcore.
145  * @param wrap
146  *   If true, go back to 0 when RTE_MAX_LCORE is reached; otherwise,
147  *   return RTE_MAX_LCORE.
148  * @return
149  *   The next lcore_id or RTE_MAX_LCORE if not found.
150  */
151 static inline unsigned
152 rte_get_next_lcore(unsigned i, int skip_master, int wrap)
153 {
154         i++;
155         if (wrap)
156                 i %= RTE_MAX_LCORE;
157
158         while (i < RTE_MAX_LCORE) {
159                 if (!rte_lcore_is_enabled(i) ||
160                     (skip_master && (i == rte_get_master_lcore()))) {
161                         i++;
162                         if (wrap)
163                                 i %= RTE_MAX_LCORE;
164                         continue;
165                 }
166                 break;
167         }
168         return i;
169 }
170 /**
171  * Macro to browse all running lcores.
172  */
173 #define RTE_LCORE_FOREACH(i)                                            \
174         for (i = rte_get_next_lcore(-1, 0, 0);                          \
175              i<RTE_MAX_LCORE;                                           \
176              i = rte_get_next_lcore(i, 0, 0))
177
178 /**
179  * Macro to browse all running lcores except the master lcore.
180  */
181 #define RTE_LCORE_FOREACH_SLAVE(i)                                      \
182         for (i = rte_get_next_lcore(-1, 1, 0);                          \
183              i<RTE_MAX_LCORE;                                           \
184              i = rte_get_next_lcore(i, 1, 0))
185
186 #ifdef __cplusplus
187 }
188 #endif
189
190
191 #endif /* _RTE_LCORE_H_ */