kern_pmc.c (d07f36b0754fcfa77368dfcbcd1d405a92b232e0) kern_pmc.c (122ccdc1cae8922f3845fc4f44b4e0470d342b9b)
1/*-
1/*-
2 * Copyright (c) 2003-2007 Joseph Koshy
2 * Copyright (c) 2003-2008 Joseph Koshy
3 * Copyright (c) 2007 The FreeBSD Foundation
4 * All rights reserved.
5 *
6 * Portions of this software were developed by A. Joseph Koshy under
7 * sponsorship from the FreeBSD Foundation and Google, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions

--- 65 unchanged lines hidden (view full) ---

76pmc_init_sx(void)
77{
78 sx_init_flags(&pmc_sx, "pmc-sx", SX_NOWITNESS);
79}
80
81SYSINIT(pmcsx, SI_SUB_LOCK, SI_ORDER_MIDDLE, pmc_init_sx, NULL);
82
83/*
3 * Copyright (c) 2007 The FreeBSD Foundation
4 * All rights reserved.
5 *
6 * Portions of this software were developed by A. Joseph Koshy under
7 * sponsorship from the FreeBSD Foundation and Google, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions

--- 65 unchanged lines hidden (view full) ---

76pmc_init_sx(void)
77{
78 sx_init_flags(&pmc_sx, "pmc-sx", SX_NOWITNESS);
79}
80
81SYSINIT(pmcsx, SI_SUB_LOCK, SI_ORDER_MIDDLE, pmc_init_sx, NULL);
82
83/*
84 * Helper functions
84 * Helper functions.
85 */
86
85 */
86
87/*
88 * A note on the CPU numbering scheme used by the hwpmc(4) driver.
89 *
90 * CPUs are denoted using numbers in the range 0..[pmc_cpu_max()-1].
91 * CPUs could be numbered "sparsely" in this range; the predicate
92 * `pmc_cpu_is_present()' is used to test whether a given CPU is
93 * physically present.
94 *
95 * Further, a CPU that is physically present may be administratively
96 * disabled or otherwise unavailable for use by hwpmc(4). The
97 * `pmc_cpu_is_active()' predicate tests for CPU usability. An
98 * "active" CPU participates in thread scheduling and can field
99 * interrupts raised by PMC hardware.
100 *
101 * On systems with hyperthreaded CPUs, multiple logical CPUs may share
102 * PMC hardware resources. For such processors one logical CPU is
103 * denoted as the primary owner of the in-CPU PMC resources. The
104 * pmc_cpu_is_primary() predicate is used to distinguish this primary
105 * CPU from the others.
106 */
107
87int
108int
109pmc_cpu_is_active(int cpu)
110{
111#ifdef SMP
112 return (pmc_cpu_is_present(cpu) &&
113 (hlt_cpus_mask & (1 << cpu)) == 0);
114#else
115 return (1);
116#endif
117}
118
119/* Deprecated. */
120int
88pmc_cpu_is_disabled(int cpu)
89{
121pmc_cpu_is_disabled(int cpu)
122{
123 return (!pmc_cpu_is_active(cpu));
124}
125
126int
127pmc_cpu_is_present(int cpu)
128{
90#ifdef SMP
129#ifdef SMP
91 return ((hlt_cpus_mask & (1 << cpu)) != 0);
130 return (!CPU_ABSENT(cpu));
92#else
131#else
93 return 0;
132 return (1);
94#endif
95}
96
97int
133#endif
134}
135
136int
98pmc_cpu_is_logical(int cpu)
137pmc_cpu_is_primary(int cpu)
99{
100#ifdef SMP
138{
139#ifdef SMP
101 return ((logical_cpus_mask & (1 << cpu)) != 0);
140 return ((logical_cpus_mask & (1 << cpu)) == 0);
102#else
141#else
103 return 0;
142 return (1);
104#endif
105}
143#endif
144}
145
146
147/*
148 * Return the maximum CPU number supported by the system. The return
149 * value is used for scaling internal data structures and for runtime
150 * checks.
151 */
152unsigned int
153pmc_cpu_max(void)
154{
155#ifdef SMP
156 return (mp_maxid+1);
157#else
158 return (1);
159#endif
160}
161
162#ifdef INVARIANTS
163
164/*
165 * Return the count of CPUs in the `active' state in the system.
166 */
167int
168pmc_cpu_max_active(void)
169{
170#ifdef SMP
171 /*
172 * When support for CPU hot-plugging is added to the kernel,
173 * this function would change to return the current number
174 * of "active" CPUs.
175 */
176 return (mp_ncpus);
177#else
178 return (1);
179#endif
180}
181
182#endif