From: John L. <mov...@us...> - 2001-09-12 02:54:34
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv32504 Modified Files: ChangeLog configure.in op_events.c op_init.c op_user.h oprofile.c Log Message: cpu type detection fixes, irq stats Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.105 retrieving revision 1.106 diff -u -d -r1.105 -r1.106 --- ChangeLog 2001/09/12 01:22:40 1.105 +++ ChangeLog 2001/09/12 02:54:30 1.106 @@ -1,5 +1,16 @@ 2001-09-12 John Levon <mo...@co...> + * configure.in: remove warning + + * op_user.h: + * op_events.c: fix and clean up cpu type detection + + * op_init.c: fix email + + * oprofile.c: add IRQ stats. Not sure whether to keep... + +2001-09-12 John Levon <mo...@co...> + * oprofile.h: * oprofile.c: use cpu_number_map (pedantry thing) Index: configure.in =================================================================== RCS file: /cvsroot/oprofile/oprofile/configure.in,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- configure.in 2001/08/16 02:21:19 1.29 +++ configure.in 2001/09/12 02:54:30 1.30 @@ -113,7 +113,6 @@ AC_MSG_CHECKING(for SMP) AX_COMPILE_OPTION(CONFIG_SMP,smp=1,smp=0) AX_MSG_RESULT_YN($smp) -test "$smp" = 1 && echo "Warning: SMP totally untested !" AC_MSG_CHECKING(for versioned modules) mv=0 Index: op_events.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/op_events.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- op_events.c 2001/09/08 21:46:03 1.23 +++ op_events.c 2001/09/12 02:54:30 1.24 @@ -280,7 +280,7 @@ /** * op_min_count - get the minimum count value. * @ctr_type: event value - * @cpu_type: + * @cpu_type: cpu type * * 0 Pentium Pro * @@ -438,71 +438,71 @@ int cpu_type; }; -/* string must be in the correct order to not hide a forward string eg. - * order "Pentium II" "Pentium III" is bad because the first hide the second */ +/* be careful here, later entries will be override earlier ones */ static struct op_cpu_type op_cpu_types[] = { - { "PentiumPro", CPU_PPRO }, - { "Pentium III",CPU_PIII }, - { "Pentium II", CPU_PII }, - { "Pentium III",CPU_PIII }, - { "Athlon", CPU_ATHLON }, - { "Duron", CPU_ATHLON }, - { "K7", CPU_ATHLON }, - { "Celeron", CPU_PII }, - { "Coppermine", CPU_PIII }, + { "PentiumPro", CPU_PPRO }, + { "Pentium II", CPU_PII }, + { "Pentium III", CPU_PIII }, + { "Celeron", CPU_PII }, + { "Coppermine", CPU_PIII }, + { "Athlon", CPU_ATHLON }, + { "Duron", CPU_ATHLON }, + { "K7", CPU_ATHLON }, }; #define OP_CPU_TYPES_NR (sizeof(op_cpu_types) / sizeof(op_cpu_types[0])) + +static int op_type_from_name(char const * name) +{ + uint i; + int cpu_type = CPU_NO_GOOD; + + for (i = 0; i < OP_CPU_TYPES_NR; i++) { + if (strstr(name, op_cpu_types[i].cpu_name)) + cpu_type = op_cpu_types[i].cpu_type; + } + return cpu_type; +} + +#define MODEL_PREFIX "model name\t: " + /** * op_get_cpu_type - get from /proc/cpuinfo the cpu type * - * return DEFAULT_CPU_TYPE if the cpu type is un-recognizable - * FIXME: return -1 + * returns CPU_NO_GOOD if the CPU could not be identified */ int op_get_cpu_type(void) { - int cpu_type; + int cpu_type = CPU_NO_GOOD; + int cputmp; char line[256]; - char *model_name; FILE* fp; - uint i; - int found = 0; - - cpu_type = DEFAULT_CPU_TYPE; fp = fopen("/proc/cpuinfo", "r"); if (!fp) { fprintf(stderr, "Unable to open /proc/cpuinfo for reading\n"); - return cpu_type; } while (fgets(line, sizeof(line) - 1, fp)) { - if (strncmp(line, "model name\t: ", strlen("model name\t: ")) == 0) { - model_name = line + strlen("model name\t: "); - - for (i = 0; i < OP_CPU_TYPES_NR; i++) { - if (strncmp(model_name, op_cpu_types[i].cpu_name, strlen(op_cpu_types[i].cpu_name)) == 0) { - cpu_type = op_cpu_types[i].cpu_type; - - found = 1; - } - } + if (strncmp(line, MODEL_PREFIX, strlen(MODEL_PREFIX)) == 0) { + cputmp = op_type_from_name(line + strlen(MODEL_PREFIX)); + if (cputmp != CPU_NO_GOOD) + cpu_type = cputmp; } } - if (!found) { - /* FIXME: use oprofile mail list adress here ? */ - fprintf(stderr, "Unknown CPU type. Please send /proc/cpuinfo to mo...@co...\n"); - } + if (cpu_type == CPU_NO_GOOD) + fprintf(stderr, "Unknown CPU type. Please send /proc/cpuinfo to opr...@li...\n"); + fclose(fp); return cpu_type; } #undef OP_CPU_TYPES_NR -#endif +#endif /* !defined(MODULE) */ #ifdef OP_EVENTS_DESC struct op_unit_desc { @@ -756,7 +756,7 @@ #include "version.h" -static int cpu_type = DEFAULT_CPU_TYPE; +static int cpu_type = CPU_NO_GOOD; /** * help_for_event - output event name and description @@ -879,17 +879,15 @@ return 0; } else if (!strcmp(argv[i], "--help")) { printf("op_help [--version|--cpu-type] event_name\n"); - return 0; } else if (!strncmp(argv[i], "--cpu-type=", 11)) { sscanf(argv[i] + 11, "%d", &cpu_type); if (cpu_type < 0 || cpu_type >= MAX_CPU_TYPE) { - fprintf(stderr, "invalid cpu type %d, default to to %s\n", cpu_type, cpu_type_str[DEFAULT_CPU_TYPE]); - cpu_type = DEFAULT_CPU_TYPE; + fprintf(stderr, "invalid cpu type %d !\n", cpu_type); + exit(EXIT_FAILURE); } } else if (!strncmp(argv[i], "--get-cpu-type", 11)) { printf("%d\n", cpu_type); - exit(EXIT_SUCCESS); } else if (!strcmp(argv[1], "--gui-description")) { for_gui = 1; Index: op_init.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/op_init.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- op_init.c 2001/09/08 21:46:03 1.8 +++ op_init.c 2001/09/12 02:54:30 1.9 @@ -55,10 +55,7 @@ if (expected_cpu_type != -1 && expected_cpu_type != cpu_type) { printk("oprofile: user space/module cpu detection mismatch\n"); - - /* FIXME: oprofile list */ - printk("please send the next line and your /proc/cpuinfo to mo...@co...\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, Index: op_user.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/op_user.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- op_user.h 2001/09/08 21:46:03 1.6 +++ op_user.h 2001/09/12 02:54:30 1.7 @@ -55,9 +55,6 @@ #define CPU_ATHLON 3 #define MAX_CPU_TYPE 4 -/* default value must be set by configure */ -#define DEFAULT_CPU_TYPE CPU_PII - #ifndef NR_CPUS #define NR_CPUS 32 #endif Index: oprofile.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/oprofile.c,v retrieving revision 1.84 retrieving revision 1.85 diff -u -d -r1.84 -r1.85 --- oprofile.c 2001/09/12 01:22:40 1.84 +++ oprofile.c 2001/09/12 02:54:30 1.85 @@ -66,6 +66,7 @@ u32 oprof_ready[NR_CPUS] __cacheline_aligned; static struct _oprof_data oprof_data[NR_CPUS]; +static uint op_irq_stats[NR_CPUS] __cacheline_aligned; extern spinlock_t map_lock; @@ -123,8 +124,10 @@ { ulong l,h; get_perfctr(l, h, ctr); - if (ctr_overflowed(l)) + if (ctr_overflowed(l)) { op_do_profile(data, regs, ctr); + op_irq_stats[op_cpu_id()]++; + } } asmlinkage void op_do_nmi(struct pt_regs *regs) @@ -594,7 +597,7 @@ inline static void pmc_select_stop(uint cpu) { - if (cpu==op_cpu_id()) + if (cpu == op_cpu_id()) pmc_stop(NULL); else smp_call_function(pmc_stop, &cpu, 0, 1); @@ -1127,26 +1130,30 @@ down(&sysctlsem); - if (write) { - /* clean out the hash table as far as possible */ - for (cpu=0; cpu < smp_num_cpus; cpu++) { - struct _oprof_data * data = &oprof_data[cpu]; - pmc_select_stop(cpu); - for (i=0; i < data->hash_size; i++) { - for (j=0; j < OP_NR_ENTRY; j++) - dump_one(data, &data->entries[i].samples[j], cpu); - if (oprof_ready[cpu]) - break; - } - oprof_ready[cpu] = 2; - pmc_select_start(cpu); - } - wake_up(&oprof_wait); - err = 0; + for (cpu=0; cpu < smp_num_cpus; cpu++) + printk("oprofile: CPU%u: %u interrupts\n", cpu, op_irq_stats[cpu]); + + if (!write) { + err = proc_dointvec(table, write, filp, buffer, lenp); goto out; } - - err = proc_dointvec(table, write, filp, buffer, lenp); + + err = 0; + + /* clean out the hash table as far as possible */ + for (cpu=0; cpu < smp_num_cpus; cpu++) { + struct _oprof_data * data = &oprof_data[cpu]; + pmc_select_stop(cpu); + for (i=0; i < data->hash_size; i++) { + for (j=0; j < OP_NR_ENTRY; j++) + dump_one(data, &data->entries[i].samples[j], cpu); + if (oprof_ready[cpu]) + break; + } + oprof_ready[cpu] = 2; + pmc_select_start(cpu); + } + wake_up(&oprof_wait); out: up(&sysctlsem); @@ -1165,7 +1172,6 @@ { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, }; - static ctl_table oprof_root[] = { {1, "oprofile", NULL, 0, 0700, oprof_table}, |