first public release
[dpdk.git] / lib / librte_eal / common / include / rte_lcore.h
1 /*-
2  *   BSD LICENSE
3  * 
4  *   Copyright(c) 2010-2012 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  *  version: DPDK.L.1.2.3-3
34  */
35
36 #ifndef _RTE_LCORE_H_
37 #define _RTE_LCORE_H_
38
39 /**
40  * @file
41  *
42  * API for lcore and Socket Manipulation. Parts of this are execution
43  * environment specific.
44  *
45  */
46 #include <rte_per_lcore.h>
47 #include <rte_eal.h>
48 #include <rte_launch.h>
49
50 #ifdef __cplusplus
51 extern "C" {
52 #endif
53
54 #define LCORE_ID_ANY -1    /**< Any lcore. */
55
56 RTE_DECLARE_PER_LCORE(unsigned, _lcore_id); /**< Per core "core id". */
57
58 /**
59  * Return the ID of the execution unit we are running on.
60  * @return
61  *  Logical core ID
62  */
63 static inline unsigned
64 rte_lcore_id(void)
65 {
66         return RTE_PER_LCORE(_lcore_id);
67 }
68
69 /**
70  * Get the id of the master lcore
71  *
72  * @return
73  *   the id of the master lcore
74  */
75 static inline unsigned
76 rte_get_master_lcore(void)
77 {
78         return rte_eal_get_configuration()->master_lcore;
79 }
80
81 /**
82  * Return the number of execution units (lcores) on the system.
83  *
84  * @return
85  *   the number of execution units (lcores) on the system.
86  */
87 static inline unsigned
88 rte_lcore_count(void)
89 {
90         const struct rte_config *cfg = rte_eal_get_configuration();
91         return cfg->lcore_count;
92 }
93
94 #include <exec-env/rte_lcore.h>
95
96 #ifdef __DOXYGEN__
97 /**
98  * Return the ID of the physical socket of the logical core we are
99  * running on.
100  * @return
101  *   Socket ID
102  */
103 static inline unsigned
104 rte_socket_id(void);
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 #endif
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_ */