4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 021110-1307, USA
24 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
25 * Copyright (c) 2012, Intel Corporation.
28 * This file is part of Lustre, http://www.lustre.org/
29 * Lustre is a trademark of Sun Microsystems, Inc.
31 * libcfs/include/libcfs/linux/linux-mem.h
33 * Basic library routines.
35 * Author: liang@whamcloud.com
38 #ifndef __LIBCFS_LINUX_CPU_H__
39 #define __LIBCFS_LINUX_CPU_H__
41 #ifndef __LIBCFS_LIBCFS_H__
42 #error Do not #include this file directly. #include <libcfs/libcfs.h> instead
46 #error This include is only for kernel use.
49 #include <linux/cpu.h>
50 #include <linux/cpuset.h>
51 #include <linux/topology.h>
52 #include <linux/version.h>
56 #define HAVE_LIBCFS_CPT
58 /** virtual processing unit */
59 struct cfs_cpu_partition {
60 /* CPUs mask for this partition */
61 cpumask_t *cpt_cpumask;
62 /* nodes mask for this partition */
63 nodemask_t *cpt_nodemask;
64 /* spread rotor for NUMA allocator */
65 unsigned cpt_spread_rotor;
68 /** descriptor for CPU partitions */
69 struct cfs_cpt_table {
70 /* version, reserved for hotplug */
72 /* spread rotor for NUMA allocator */
73 unsigned ctb_spread_rotor;
74 /* # of CPU partitions */
76 /* partitions tables */
77 struct cfs_cpu_partition *ctb_parts;
78 /* shadow HW CPU to CPU partition ID */
80 /* all cpus in this partition table */
81 cpumask_t *ctb_cpumask;
82 /* all nodes in this partition table */
83 nodemask_t *ctb_nodemask;
86 void cfs_cpu_core_siblings(int cpu, cpumask_t *mask);
87 void cfs_cpu_ht_siblings(int cpu, cpumask_t *mask);
88 void cfs_node_to_cpumask(int node, cpumask_t *mask);
89 int cfs_cpu_core_nsiblings(int cpu);
90 int cfs_cpu_ht_nsiblings(int cpu);
93 * comment out definitions for compatible layer
94 * #define CFS_CPU_NR NR_CPUS
96 * typedef cpumask_t cfs_cpumask_t;
98 * #define cfs_cpu_current() smp_processor_id()
99 * #define cfs_cpu_online(i) cpu_online(i)
100 * #define cfs_cpu_online_num() num_online_cpus()
101 * #define cfs_cpu_online_for_each(i) for_each_online_cpu(i)
102 * #define cfs_cpu_possible_num() num_possible_cpus()
103 * #define cfs_cpu_possible_for_each(i) for_each_possible_cpu(i)
105 * #ifdef CONFIG_CPUMASK_SIZE
106 * #define cfs_cpu_mask_size() cpumask_size()
108 * #define cfs_cpu_mask_size() sizeof(cfs_cpumask_t)
111 * #define cfs_cpu_mask_set(i, mask) cpu_set(i, mask)
112 * #define cfs_cpu_mask_unset(i, mask) cpu_clear(i, mask)
113 * #define cfs_cpu_mask_isset(i, mask) cpu_isset(i, mask)
114 * #define cfs_cpu_mask_clear(mask) cpus_clear(mask)
115 * #define cfs_cpu_mask_empty(mask) cpus_empty(mask)
116 * #define cfs_cpu_mask_weight(mask) cpus_weight(mask)
117 * #define cfs_cpu_mask_first(mask) first_cpu(mask)
118 * #define cfs_cpu_mask_any_online(mask) (any_online_cpu(mask) != NR_CPUS)
119 * #define cfs_cpu_mask_for_each(i, mask) for_each_cpu_mask(i, mask)
121 * #define cfs_cpu_mask_copy(dst, src) cpumask_copy(dst, src)
124 * cfs_cpu_mask_of_online(cfs_cpumask_t *mask)
126 * cfs_cpu_mask_copy(mask, &cpu_online_map);
131 * #define CFS_NODE_NR MAX_NUMNODES
133 * typedef nodemask_t cfs_node_mask_t;
135 * #define cfs_node_of_cpu(cpu) cpu_to_node(cpu)
136 * #define cfs_node_online(i) node_online(i)
137 * #define cfs_node_online_num() num_online_nodes()
138 * #define cfs_node_online_for_each(i) for_each_online_node(i)
139 * #define cfs_node_possible_num() num_possible_nodes()
140 * #define cfs_node_possible_for_each(i) for_each_node(i)
142 * static inline void cfs_node_to_cpumask(int node, cfs_cpumask_t *mask)
144 * cfs_cpu_mask_copy(mask, cpumask_of_node(node));
147 * #define cfs_node_mask_set(i, mask) node_set(i, mask)
148 * #define cfs_node_mask_unset(i, mask) node_clear(i, mask)
149 * #define cfs_node_mask_isset(i, mask) node_isset(i, mask)
150 * #define cfs_node_mask_clear(mask) nodes_reset(mask)
151 * #define cfs_node_mask_empty(mask) nodes_empty(mask)
152 * #define cfs_node_mask_weight(mask) nodes_weight(mask)
153 * #define cfs_node_mask_for_each(i, mask) for_each_node_mask(i, mask)
154 * #define cfs_node_mask_copy(dst, src) memcpy(dst, src, sizeof(*src))
157 * cfs_node_mask_of_online(cfs_node_mask_t *mask)
159 * cfs_node_mask_copy(mask, &node_online_map);
165 #endif /* CONFIG_SMP */
166 #endif /* __LIBCFS_LINUX_CPU_H__ */