eal_common_lcore.c revision 809f0800
1/*-
2 *   BSD LICENSE
3 *
4 *   Copyright(c) 2010-2014 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#include <unistd.h>
35#include <limits.h>
36#include <string.h>
37#include <dirent.h>
38
39#include <rte_log.h>
40#include <rte_eal.h>
41#include <rte_lcore.h>
42#include <rte_common.h>
43#include <rte_debug.h>
44
45#include "eal_private.h"
46#include "eal_thread.h"
47
48/*
49 * Parse /sys/devices/system/cpu to get the number of physical and logical
50 * processors on the machine. The function will fill the cpu_info
51 * structure.
52 */
53int
54rte_eal_cpu_init(void)
55{
56	/* pointer to global configuration */
57	struct rte_config *config = rte_eal_get_configuration();
58	unsigned lcore_id;
59	unsigned count = 0;
60
61	/*
62	 * Parse the maximum set of logical cores, detect the subset of running
63	 * ones and enable them by default.
64	 */
65	for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
66		lcore_config[lcore_id].core_index = count;
67
68		/* init cpuset for per lcore config */
69		CPU_ZERO(&lcore_config[lcore_id].cpuset);
70
71		/* in 1:1 mapping, record related cpu detected state */
72		lcore_config[lcore_id].detected = eal_cpu_detected(lcore_id);
73		if (lcore_config[lcore_id].detected == 0) {
74			config->lcore_role[lcore_id] = ROLE_OFF;
75			lcore_config[lcore_id].core_index = -1;
76			continue;
77		}
78
79		/* By default, lcore 1:1 map to cpu id */
80		CPU_SET(lcore_id, &lcore_config[lcore_id].cpuset);
81
82		/* By default, each detected core is enabled */
83		config->lcore_role[lcore_id] = ROLE_RTE;
84		lcore_config[lcore_id].core_id = eal_cpu_core_id(lcore_id);
85		lcore_config[lcore_id].socket_id = eal_cpu_socket_id(lcore_id);
86		if (lcore_config[lcore_id].socket_id >= RTE_MAX_NUMA_NODES)
87#ifdef RTE_EAL_ALLOW_INV_SOCKET_ID
88			lcore_config[lcore_id].socket_id = 0;
89#else
90			rte_panic("Socket ID (%u) is greater than "
91				"RTE_MAX_NUMA_NODES (%d)\n",
92				lcore_config[lcore_id].socket_id,
93				RTE_MAX_NUMA_NODES);
94#endif
95
96		RTE_LOG(DEBUG, EAL, "Detected lcore %u as "
97				"core %u on socket %u\n",
98				lcore_id, lcore_config[lcore_id].core_id,
99				lcore_config[lcore_id].socket_id);
100		count++;
101	}
102	/* Set the count of enabled logical cores of the EAL configuration */
103	config->lcore_count = count;
104	RTE_LOG(DEBUG, EAL,
105		"Support maximum %u logical core(s) by configuration.\n",
106		RTE_MAX_LCORE);
107	RTE_LOG(INFO, EAL, "Detected %u lcore(s)\n", config->lcore_count);
108
109	return 0;
110}
111