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 |
|