0ac9b6d4cf
- any cpu can use smp_schedule() to tell another cpu to reschedule - if an AP is idle, it turns off timer as there is nothing to preempt, no need to wakeup just to go back to sleep again - if a cpu makes a process runnable on an idle cpu, it must wake it up to reschedule
85 lines
2.4 KiB
C
85 lines
2.4 KiB
C
/* Implementation of CPU local variables generics */
|
|
#ifndef __CPULOCALS_H__
|
|
#define __CPULOCALS_H__
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include "kernel.h"
|
|
#include "proc.h"
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
/* SMP */
|
|
|
|
#define CPULOCAL_ARRAY [CONFIG_MAX_CPUS]
|
|
|
|
#define get_cpu_var(cpu, name) CPULOCAL_STRUCT[cpu].name
|
|
#define get_cpu_var_ptr(cpu, name) (&(get_cpu_var(cpu, name)))
|
|
#define get_cpulocal_var(name) get_cpu_var(cpuid, name)
|
|
#define get_cpulocal_var_ptr(name) get_cpu_var_ptr(cpuid, name)
|
|
|
|
/* FIXME - padd the structure so that items in the array do not share cacheline
|
|
* with other cpus */
|
|
|
|
#else
|
|
|
|
/* single CPU */
|
|
|
|
#define CPULOCAL_ARRAY
|
|
|
|
#define get_cpulocal_var(name) CPULOCAL_STRUCT.name
|
|
#define get_cpulocal_var_ptr(name) &(get_cpulocal_var(name))
|
|
#define get_cpu_var(cpu, name) get_cpulocal_var(name)
|
|
#define get_cpu_var_ptr(cpu, name) get_cpulocal_var_ptr(name)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define DECLARE_CPULOCAL(type, name) type name
|
|
|
|
#define CPULOCAL_STRUCT __cpu_local_vars
|
|
#define ___CPULOCAL_START struct CPULOCAL_STRUCT {
|
|
#define ___CPULOCAL_END } CPULOCAL_STRUCT CPULOCAL_ARRAY;
|
|
|
|
#define DECLARE_CPULOCAL_START extern ___CPULOCAL_START
|
|
#define DECLARE_CPULOCAL_END ___CPULOCAL_END
|
|
|
|
#define DEFINE_CPULOCAL_VARS struct CPULOCAL_STRUCT CPULOCAL_STRUCT CPULOCAL_ARRAY
|
|
|
|
|
|
/*
|
|
* The global cpu local variables in use
|
|
*/
|
|
DECLARE_CPULOCAL_START
|
|
|
|
/* Process scheduling information and the kernel reentry count. */
|
|
DECLARE_CPULOCAL(struct proc *,proc_ptr);/* pointer to currently running process */
|
|
DECLARE_CPULOCAL(struct proc *,bill_ptr);/* process to bill for clock ticks */
|
|
DECLARE_CPULOCAL(struct proc ,idle_proc);/* stub for an idle process */
|
|
|
|
/*
|
|
* signal whether pagefault is already being handled to detect recursive
|
|
* pagefaults
|
|
*/
|
|
DECLARE_CPULOCAL(int, pagefault_handled);
|
|
|
|
/*
|
|
* which processpage tables are loaded right now. We need to know this because
|
|
* some processes are loaded in each process pagetables and don't have their own
|
|
* pagetables. Therefore we cannot use the proc_ptr pointer
|
|
*/
|
|
DECLARE_CPULOCAL(struct proc *, ptproc);
|
|
|
|
/* CPU private run queues */
|
|
DECLARE_CPULOCAL(struct proc *, run_q_head[NR_SCHED_QUEUES]); /* ptrs to ready list headers */
|
|
DECLARE_CPULOCAL(struct proc *, run_q_tail[NR_SCHED_QUEUES]); /* ptrs to ready list tails */
|
|
DECLARE_CPULOCAL(int, cpu_is_idle); /* let the others know that you are idle */
|
|
|
|
DECLARE_CPULOCAL(u64_t ,tsc_ctr_switch); /* when did we switched time accounting */
|
|
|
|
DECLARE_CPULOCAL_END
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* __CPULOCALS_H__ */
|