remove version in all files
[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  */
34
35 #ifndef _RTE_LCORE_H_
36 #define _RTE_LCORE_H_
37
38 /**
39  * @file
40  *
41  * API for lcore and Socket Manipulation. Parts of this are execution
42  * environment specific.
43  *
44  */
45 #include <rte_per_lcore.h>
46 #include <rte_eal.h>
47 #include <rte_launch.h>
48
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
52
53 #define LCORE_ID_ANY -1    /**< Any lcore. */
54
55 RTE_DECLARE_PER_LCORE(unsigned, _lcore_id); /**< Per core "core id". */
56
57 /**
58  * Return the ID of the execution unit we are running on.
59  * @return
60  *  Logical core ID
61  */
62 static inline unsigned
63 rte_lcore_id(void)
64 {
65         return RTE_PER_LCORE(_lcore_id);
66 }
67
68 /**
69  * Get the id of the master lcore
70  *
71  * @return
72  *   the id of the master lcore
73  */
74 static inline unsigned
75 rte_get_master_lcore(void)
76 {
77         return rte_eal_get_configuration()->master_lcore;
78 }
79
80 /**
81  * Return the number of execution units (lcores) on the system.
82  *
83  * @return
84  *   the number of execution units (lcores) on the system.
85  */
86 static inline unsigned
87 rte_lcore_count(void)
88 {
89         const struct rte_config *cfg = rte_eal_get_configuration();
90         return cfg->lcore_count;
91 }
92
93 #include <exec-env/rte_lcore.h>
94
95 #ifdef __DOXYGEN__
96 /**
97  * Return the ID of the physical socket of the logical core we are
98  * running on.
99  * @return
100  *   Socket ID
101  */
102 static inline unsigned
103 rte_socket_id(void);
104
105 /**
106  * Get the ID of the physical socket of the specified lcore
107  *
108  * @param lcore_id
109  *   the targeted lcore, which MUST be between 0 and RTE_MAX_LCORE-1.
110  * @return
111  *   the ID of lcoreid's physical socket
112  */
113 static inline unsigned
114 rte_lcore_to_socket_id(unsigned lcore_id);
115
116 #endif
117
118
119 /**
120  * Test if an lcore is enabled.
121  *
122  * @param lcore_id
123  *   The identifier of the lcore, which MUST be between 0 and
124  *   RTE_MAX_LCORE-1.
125  * @return
126  *   True if the given lcore is enabled; false otherwise.
127  */
128 static inline int
129 rte_lcore_is_enabled(unsigned lcore_id)
130 {
131         struct rte_config *cfg = rte_eal_get_configuration();
132         if (lcore_id >= RTE_MAX_LCORE)
133                 return 0;
134         return (cfg->lcore_role[lcore_id] != ROLE_OFF);
135 }
136
137 /**
138  * Get the next enabled lcore ID.
139  *
140  * @param i
141  *   The current lcore (reference).
142  * @param skip_master
143  *   If true, do not return the ID of the master lcore.
144  * @param wrap
145  *   If true, go back to 0 when RTE_MAX_LCORE is reached; otherwise,
146  *   return RTE_MAX_LCORE.
147  * @return
148  *   The next lcore_id or RTE_MAX_LCORE if not found.
149  */
150 static inline unsigned
151 rte_get_next_lcore(unsigned i, int skip_master, int wrap)
152 {
153         i++;
154         if (wrap)
155                 i %= RTE_MAX_LCORE;
156
157         while (i < RTE_MAX_LCORE) {
158                 if (!rte_lcore_is_enabled(i) ||
159                     (skip_master && (i == rte_get_master_lcore()))) {
160                         i++;
161                         if (wrap)
162                                 i %= RTE_MAX_LCORE;
163                         continue;
164                 }
165                 break;
166         }
167         return i;
168 }
169 /**
170  * Macro to browse all running lcores.
171  */
172 #define RTE_LCORE_FOREACH(i)                                            \
173         for (i = rte_get_next_lcore(-1, 0, 0);                          \
174              i<RTE_MAX_LCORE;                                           \
175              i = rte_get_next_lcore(i, 0, 0))
176
177 /**
178  * Macro to browse all running lcores except the master lcore.
179  */
180 #define RTE_LCORE_FOREACH_SLAVE(i)                                      \
181         for (i = rte_get_next_lcore(-1, 1, 0);                          \
182              i<RTE_MAX_LCORE;                                           \
183              i = rte_get_next_lcore(i, 1, 0))
184
185 #ifdef __cplusplus
186 }
187 #endif
188
189
190 #endif /* _RTE_LCORE_H_ */