smp.h revision 134416
1/* 2 * ---------------------------------------------------------------------------- 3 * "THE BEER-WARE LICENSE" (Revision 42): 4 * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 5 * can do whatever you want with this stuff. If we meet some day, and you think 6 * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 7 * ---------------------------------------------------------------------------- 8 * 9 * $FreeBSD: head/sys/sys/smp.h 134416 2004-08-28 00:49:55Z obrien $ 10 */ 11 12#ifndef _SYS_SMP_H_ 13#define _SYS_SMP_H_ 14 15#ifdef _KERNEL 16 17#ifndef LOCORE 18 19#ifdef SMP 20 21/* 22 * Topology of a NUMA or HTT system. 23 * 24 * The top level topology is an array of pointers to groups. Each group 25 * contains a bitmask of cpus in its group or subgroups. It may also 26 * contain a pointer to an array of child groups. 27 * 28 * The bitmasks at non leaf groups may be used by consumers who support 29 * a smaller depth than the hardware provides. 30 * 31 * The topology may be omitted by systems where all CPUs are equal. 32 */ 33 34struct cpu_group { 35 cpumask_t cg_mask; /* Mask of cpus in this group. */ 36 int cg_count; /* Count of cpus in this group. */ 37 int cg_children; /* Number of children groups. */ 38 struct cpu_group *cg_child; /* Optional child group. */ 39}; 40 41struct cpu_top { 42 int ct_count; /* Count of groups. */ 43 struct cpu_group *ct_group; /* Array of pointers to cpu groups. */ 44}; 45 46extern struct cpu_top *smp_topology; 47extern void (*cpustop_restartfunc)(void); 48extern int smp_active; 49extern int smp_cpus; 50extern volatile cpumask_t started_cpus; 51extern volatile cpumask_t stopped_cpus; 52#endif /* SMP */ 53 54extern cpumask_t all_cpus; 55extern u_int mp_maxid; 56extern int mp_ncpus; 57extern volatile int smp_started; 58 59/* 60 * Macro allowing us to determine whether a CPU is absent at any given 61 * time, thus permitting us to configure sparse maps of cpuid-dependent 62 * (per-CPU) structures. 63 */ 64#define CPU_ABSENT(x_cpu) ((all_cpus & (1 << (x_cpu))) == 0) 65 66#ifdef SMP 67/* 68 * Machine dependent functions used to initialize MP support. 69 * 70 * The cpu_mp_probe() should check to see if MP support is present and return 71 * zero if it is not or non-zero if it is. If MP support is present, then 72 * cpu_mp_start() will be called so that MP can be enabled. This function 73 * should do things such as startup secondary processors. It should also 74 * setup mp_ncpus, all_cpus, and smp_cpus. It should also ensure that 75 * smp_active and smp_started are initialized at the appropriate time. 76 * Once cpu_mp_start() returns, machine independent MP startup code will be 77 * executed and a simple message will be output to the console. Finally, 78 * cpu_mp_announce() will be called so that machine dependent messages about 79 * the MP support may be output to the console if desired. 80 * 81 * The cpu_setmaxid() function is called very early during the boot process 82 * so that the MD code may set mp_maxid to provide an upper bound on CPU IDs 83 * that other subsystems may use. If a platform is not able to determine 84 * the exact maximum ID that early, then it may set mp_maxid to MAXCPU - 1. 85 */ 86struct thread; 87 88void cpu_mp_announce(void); 89int cpu_mp_probe(void); 90void cpu_mp_setmaxid(void); 91void cpu_mp_start(void); 92 93void forward_signal(struct thread *); 94void forward_roundrobin(void); 95int restart_cpus(cpumask_t); 96int stop_cpus(cpumask_t); 97void smp_rendezvous_action(void); 98extern struct mtx smp_ipi_mtx; 99#endif /* SMP */ 100void smp_rendezvous(void (*)(void *), 101 void (*)(void *), 102 void (*)(void *), 103 void *arg); 104#endif /* !LOCORE */ 105#endif /* _KERNEL */ 106#endif /* _SYS_SMP_H_ */ 107