b8f4b7c093664ac6e72f56f9d68ffa6aa84cb5a2
[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 /**
96  * Return the ID of the physical socket of the logical core we are
97  * running on.
98  * @return
99  *   the ID of current lcoreid's physical socket
100  */
101 static inline unsigned
102 rte_socket_id(void)
103 {
104         return lcore_config[rte_lcore_id()].socket_id;
105 }
106
107 /**
108  * Get the ID of the physical socket of the specified lcore
109  *
110  * @param lcore_id
111  *   the targeted lcore, which MUST be between 0 and RTE_MAX_LCORE-1.
112  * @return
113  *   the ID of lcoreid's physical socket
114  */
115 static inline unsigned
116 rte_lcore_to_socket_id(unsigned lcore_id)
117 {
118         return lcore_config[lcore_id].socket_id;
119 }
120
121 /**
122  * Test if an lcore is enabled.
123  *
124  * @param lcore_id
125  *   The identifier of the lcore, which MUST be between 0 and
126  *   RTE_MAX_LCORE-1.
127  * @return
128  *   True if the given lcore is enabled; false otherwise.
129  */
130 static inline int
131 rte_lcore_is_enabled(unsigned lcore_id)
132 {
133         struct rte_config *cfg = rte_eal_get_configuration();
134         if (lcore_id >= RTE_MAX_LCORE)
135                 return 0;
136         return (cfg->lcore_role[lcore_id] != ROLE_OFF);
137 }
138
139 /**
140  * Get the next enabled lcore ID.
141  *
142  * @param i
143  *   The current lcore (reference).
144  * @param skip_master
145  *   If true, do not return the ID of the master lcore.
146  * @param wrap
147  *   If true, go back to 0 when RTE_MAX_LCORE is reached; otherwise,
148  *   return RTE_MAX_LCORE.
149  * @return
150  *   The next lcore_id or RTE_MAX_LCORE if not found.
151  */
152 static inline unsigned
153 rte_get_next_lcore(unsigned i, int skip_master, int wrap)
154 {
155         i++;
156         if (wrap)
157                 i %= RTE_MAX_LCORE;
158
159         while (i < RTE_MAX_LCORE) {
160                 if (!rte_lcore_is_enabled(i) ||
161                     (skip_master && (i == rte_get_master_lcore()))) {
162                         i++;
163                         if (wrap)
164                                 i %= RTE_MAX_LCORE;
165                         continue;
166                 }
167                 break;
168         }
169         return i;
170 }
171 /**
172  * Macro to browse all running lcores.
173  */
174 #define RTE_LCORE_FOREACH(i)                                            \
175         for (i = rte_get_next_lcore(-1, 0, 0);                          \
176              i<RTE_MAX_LCORE;                                           \
177              i = rte_get_next_lcore(i, 0, 0))
178
179 /**
180  * Macro to browse all running lcores except the master lcore.
181  */
182 #define RTE_LCORE_FOREACH_SLAVE(i)                                      \
183         for (i = rte_get_next_lcore(-1, 1, 0);                          \
184              i<RTE_MAX_LCORE;                                           \
185              i = rte_get_next_lcore(i, 1, 0))
186
187 #ifdef __cplusplus
188 }
189 #endif
190
191
192 #endif /* _RTE_LCORE_H_ */