From: Philippe E. <ph...@us...> - 2001-12-31 22:56:43
|
Update of /cvsroot/oprofile/oprofile/module In directory usw-pr-cvs1:/tmp/cvs-serv27102/oprofile/module Modified Files: op_init.c op_x86.c oprofile.c oprofile.h Log Message: pp: minor improvement; module: prepare preempt patch + minor fix Index: op_init.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/module/op_init.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- op_init.c 2001/12/31 14:45:33 1.2 +++ op_init.c 2001/12/31 22:56:39 1.3 @@ -25,7 +25,6 @@ MODULE_PARM_DESC(expected_cpu_type, "Allow checking of detected hardware from the user space"); static op_cpu expected_cpu_type = CPU_NO_GOOD; -extern op_cpu cpu_type; extern uint op_nr_counters; extern int separate_running_bit; @@ -44,29 +43,29 @@ /* 0 if PPro, 1 if PII, 2 if PIII, 3 if Athlon */ if (current_cpu_data.x86_vendor == X86_VENDOR_AMD) { - cpu_type = CPU_ATHLON; + sysctl.cpu_type = CPU_ATHLON; } else { - cpu_type = (current_cpu_data.x86_model > 5) ? CPU_PIII : + sysctl.cpu_type = (current_cpu_data.x86_model > 5) ? CPU_PIII : (current_cpu_data.x86_model > 2); } - if (cpu_type == CPU_ATHLON) { + if (sysctl.cpu_type == CPU_ATHLON) { op_nr_counters = 4; separate_running_bit = 1; } - if (expected_cpu_type != -1 && expected_cpu_type != cpu_type) { + if (expected_cpu_type != -1 && expected_cpu_type != sysctl.cpu_type) { printk("oprofile: user space/module cpu detection mismatch\n"); printk("please send the next line and your /proc/cpuinfo to opr...@li...\n"); printk("vendor %d step %d model %d, expected_cpu_type %d, cpu_type %d\n", current_cpu_data.x86_vendor, current_cpu_data.x86, current_cpu_data.x86_model, expected_cpu_type, - cpu_type); + sysctl.cpu_type); return CPU_NO_GOOD; } - return cpu_type; + return sysctl.cpu_type; } int __init stub_init(void) Index: op_x86.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/module/op_x86.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- op_x86.c 2001/12/31 14:45:33 1.3 +++ op_x86.c 2001/12/31 22:56:40 1.4 @@ -16,8 +16,6 @@ #include "oprofile.h" -extern op_cpu cpu_type; - /* ---------------- NMI handler setup ------------ */ static ulong idt_addr; @@ -92,7 +90,8 @@ apic_write(APIC_LVTPC, val); } -void __exit lvtpc_apic_restore(void *dummy) +/* not safe to mark as __exit since used from __init code */ +void lvtpc_apic_restore(void *dummy) { uint val = apic_read(APIC_LVTPC); // FIXME: this gives APIC errors on SMP hardware. @@ -159,9 +158,9 @@ /* does the CPU have a local APIC ? */ static int __init check_p6_ok(void) { - if (cpu_type != CPU_PPRO && - cpu_type != CPU_PII && - cpu_type != CPU_PIII) + if (sysctl.cpu_type != CPU_PPRO && + sysctl.cpu_type != CPU_PII && + sysctl.cpu_type != CPU_PIII) return 1; return enable_apic(); Index: oprofile.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/module/oprofile.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- oprofile.c 2001/12/31 14:45:33 1.16 +++ oprofile.c 2001/12/31 22:56:40 1.17 @@ -52,7 +52,6 @@ static u32 prof_on __cacheline_aligned; static int op_major; -op_cpu cpu_type; static volatile uint oprof_opened __cacheline_aligned; static volatile uint oprof_note_opened __cacheline_aligned; @@ -610,7 +609,7 @@ for (i = 0; i < op_nr_counters ; i++) { if (sysctl.ctr[i].enabled) { - int min_count = op_min_count(sysctl.ctr[i].event, cpu_type); + int min_count = op_min_count(sysctl.ctr[i].event, sysctl.cpu_type); if (!sysctl.ctr[i].user && !sysctl.ctr[i].kernel) { printk(KERN_ERR "oprofile: neither kernel nor user " @@ -630,16 +629,16 @@ return 0; } - /* hw_ok() has set cpu_type */ + /* hw_ok() has set sysctl.cpu_type */ ok = 1; for (i = 0 ; i < op_nr_counters ; ++i) { - ret = op_check_events(i, sysctl.ctr[i].event, sysctl.ctr[i].unit_mask, cpu_type); + ret = op_check_events(i, sysctl.ctr[i].event, sysctl.ctr[i].unit_mask, sysctl.cpu_type); if (ret & OP_EVT_NOT_FOUND) - printk(KERN_ERR "oprofile: ctr%d: %d: no such event for cpu %d\n", i, sysctl.ctr[i].event, cpu_type); + printk(KERN_ERR "oprofile: ctr%d: %d: no such event for cpu %d\n", i, sysctl.ctr[i].event, sysctl.cpu_type); if (ret & OP_EVT_NO_UM) - printk(KERN_ERR "oprofile: ctr%d: 0x%.2x: invalid unit mask for cpu %d\n", i, sysctl.ctr[i].unit_mask, cpu_type); + printk(KERN_ERR "oprofile: ctr%d: 0x%.2x: invalid unit mask for cpu %d\n", i, sysctl.ctr[i].unit_mask, sysctl.cpu_type); if (ret & OP_EVT_CTR_NOT_ALLOWED) printk(KERN_ERR "oprofile: ctr%d: %d: can't count event for this counter\n", i, sysctl.ctr[i].event); @@ -877,7 +876,7 @@ return err; } -static int nr_oprof_static = 8; +static int nr_oprof_static = 9; static ctl_table oprof_table[] = { { 1, "bufsize", &sysctl_parms.buf_size, sizeof(int), 0600, NULL, &lproc_dointvec, NULL, }, @@ -888,6 +887,7 @@ { 1, "pgrp_filter", &sysctl_parms.pgrp_filter, sizeof(pid_t), 0600, NULL, &lproc_dointvec, NULL, }, { 1, "nr_interrupts", &sysctl.nr_interrupts, sizeof(int), 0400, NULL, &get_nr_interrupts, NULL, }, { 1, "notesize", &sysctl_parms.note_size, sizeof(int), 0600, NULL, &lproc_dointvec, NULL, }, + { 1, "cpu_type", &sysctl.cpu_type, sizeof(int), 0400, NULL, &lproc_dointvec, NULL, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, }; @@ -952,7 +952,8 @@ return -EFAULT; } -static void __exit cleanup_sysctl(void) +/* not safe to mark as __exit since used from __init code */ +static void cleanup_sysctl(void) { int i; ctl_table *next = &oprof_table[nr_oprof_static]; @@ -992,7 +993,7 @@ find_intel_smp(); /* first, let's use the right MSRs */ - switch (cpu_type) { + switch (sysctl.cpu_type) { case CPU_ATHLON: eventsel_msr[0] = MSR_K7_PERFCTL0; eventsel_msr[1] = MSR_K7_PERFCTL1; Index: oprofile.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/module/oprofile.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- oprofile.h 2001/12/12 02:27:27 1.10 +++ oprofile.h 2001/12/31 22:56:40 1.11 @@ -71,6 +71,7 @@ int kernel_only; /* is profiling kernel only */ int note_size; /* nr. in note buffer */ int nr_interrupts; /* nr. interrupts occured */ + int cpu_type; /* the cpu core type: CPU_PPRO, CPU_PII ... */ pid_t pid_filter; pid_t pgrp_filter; struct oprof_counter ctr[OP_MAX_COUNTERS]; @@ -257,6 +258,14 @@ // 2.4.10 introduced MODULE_LICENSE #ifndef MODULE_LICENSE #define MODULE_LICENSE(x) +#endif + +// 2.4/2.5 kernel can be patched with the preempt patch. We support only +// recent version of this patch +#ifndef preempt_disable +#define preempt_disable() do { } while (0) +#define preempt_enable_no_resched() do { } while (0) +#define preempt_enable() do { } while (0) #endif /* These arrays are filled by hw_ok() */ |