215e258fd1
o Setting td_intr_frame to the XIVs trap frame because it's referenced by the ET event handler. o Signal EOI to the CPU before calling the registered XIV handlers. This prevents lost ITC interrupts, which cause starvation in one-shot mode. o Adding support for IPI_HARDCLOCK with corresponding per-CPU counters. o Have the APs call cpu_initclocks() so as to limited the scattering of clock related initialization. cpu_initclocks() calls the <self>_bsp() or <self>_ap() version accordingly. o Uncomment the ET clock handling in cpu_idle(). o Update the DDB 'show pcpu' output for the new MD fields. o Entirely rewritten ia64_ih_clock(). Note that we don't create as many clock XIVs as we have CPUs, as is done on PowerPC. It doesn't scale. We can only have 240 XIVs and we can have more CPUs than that. There's a single intrcnt index for the cumulative clock ticks and we keep per CPU counts in the PCPU stats structure. o Register the ITC by hooking SI_SUB_CONFIGURE (2nd order). Open issues: o Clock interrupts can still be lost. Some tweaking is still necessary. Thanks to: mav@ for his support, feedback and explanations. ET stats while committing: eris% sysctl machdep.cpu | grep nclks machdep.cpu.0.nclks: 24007 machdep.cpu.1.nclks: 22895 machdep.cpu.2.nclks: 13523 machdep.cpu.3.nclks: 9342 machdep.cpu.4.nclks: 9103 machdep.cpu.5.nclks: 9298 machdep.cpu.6.nclks: 10039 machdep.cpu.7.nclks: 9479 eris% vmstat -i | grep clock clock 108599 50
57 lines
1.1 KiB
C
57 lines
1.1 KiB
C
/*
|
|
* $FreeBSD$
|
|
*/
|
|
#ifndef _MACHINE_SMP_H_
|
|
#define _MACHINE_SMP_H_
|
|
|
|
#ifdef _KERNEL
|
|
|
|
#define IPI_AST ia64_ipi_ast
|
|
#define IPI_HARDCLOCK ia64_ipi_hardclock
|
|
#define IPI_PREEMPT ia64_ipi_preempt
|
|
#define IPI_RENDEZVOUS ia64_ipi_rndzvs
|
|
#define IPI_STOP ia64_ipi_stop
|
|
#define IPI_STOP_HARD ia64_ipi_nmi
|
|
|
|
#ifndef LOCORE
|
|
|
|
#include <sys/_cpuset.h>
|
|
|
|
struct pcpu;
|
|
|
|
struct ia64_ap_state {
|
|
uint64_t as_trace;
|
|
uint64_t as_pgtbl_pte;
|
|
uint64_t as_pgtbl_itir;
|
|
uint64_t as_text_va;
|
|
uint64_t as_text_pte;
|
|
uint64_t as_text_itir;
|
|
uint64_t as_data_va;
|
|
uint64_t as_data_pte;
|
|
uint64_t as_data_itir;
|
|
void *as_kstack;
|
|
void *as_kstack_top;
|
|
struct pcpu *as_pcpu;
|
|
volatile int as_delay;
|
|
volatile u_int as_awake;
|
|
volatile u_int as_spin;
|
|
};
|
|
|
|
extern int ia64_ipi_ast;
|
|
extern int ia64_ipi_hardclock;
|
|
extern int ia64_ipi_highfp;
|
|
extern int ia64_ipi_nmi;
|
|
extern int ia64_ipi_preempt;
|
|
extern int ia64_ipi_rndzvs;
|
|
extern int ia64_ipi_stop;
|
|
extern int ia64_ipi_wakeup;
|
|
|
|
void ipi_all_but_self(int ipi);
|
|
void ipi_cpu(int cpu, u_int ipi);
|
|
void ipi_selected(cpuset_t cpus, int ipi);
|
|
void ipi_send(struct pcpu *, int ipi);
|
|
|
|
#endif /* !LOCORE */
|
|
#endif /* _KERNEL */
|
|
#endif /* !_MACHINE_SMP_H */
|