From: Philippe E. <ph...@us...> - 2001-11-03 06:43:18
|
Update of /cvsroot/oprofile/oprofile/module In directory usw-pr-cvs1:/tmp/cvs-serv10397/oprofile/module Modified Files: oprofile.c oprofile.h Log Message: module: ty to avoid cache line ping pong Index: oprofile.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/module/oprofile.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- oprofile.c 2001/10/31 02:39:44 1.2 +++ oprofile.c 2001/11/03 06:43:14 1.3 @@ -66,9 +66,8 @@ static volatile uint oprof_note_opened __cacheline_aligned; static DECLARE_WAIT_QUEUE_HEAD(oprof_wait); -u32 oprof_ready[NR_CPUS] __cacheline_aligned; +static u32 oprof_ready[NR_CPUS] __cacheline_aligned; static struct _oprof_data oprof_data[NR_CPUS]; -static uint op_irq_stats[NR_CPUS] __cacheline_aligned; struct op_note * note_buffer __cacheline_aligned; u32 note_pos __cacheline_aligned; @@ -131,6 +130,8 @@ uint h = op_hash(regs->eip, current->pid, ctr); uint i; + data->nr_irq++; + for (i=0; i < OP_NR_ENTRY; i++) { if (likely(!op_miss(data->entries[h].samples[i]))) { data->entries[h].samples[i].count++; @@ -161,7 +162,6 @@ get_perfctr(l, h, ctr); if (likely(ctr_overflowed(l))) { op_do_profile(cpu, regs, ctr); - op_irq_stats[cpu]++; } } @@ -801,8 +801,8 @@ nr_interrupts = 0; for (cpu=0; cpu < smp_num_cpus; cpu++) { - nr_interrupts += op_irq_stats[cpu]; - op_irq_stats[cpu] = 0; + nr_interrupts += oprof_data[cpu].nr_irq; + oprof_data[cpu].nr_irq = 0; } return proc_dointvec(table, write, filp, buffer, lenp); Index: oprofile.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/module/oprofile.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- oprofile.h 2001/10/30 17:32:14 1.1 +++ oprofile.h 2001/11/03 06:43:14 1.2 @@ -39,7 +39,7 @@ struct op_entry { struct op_sample samples[OP_NR_ENTRY]; -} __attribute__((__aligned__(SMP_CACHE_BYTES))); +} __cacheline_aligned; /* per-cpu dynamic data */ struct _oprof_data { @@ -49,8 +49,9 @@ uint buf_size; /* nr. in buffer */ uint nextbuf; /* next in buffer (atomic) */ uint next; /* next sample in entry */ + uint nr_irq; uint ctr_count[OP_MAX_COUNTERS]; /* reset counter values */ -} __attribute__((__aligned__(SMP_CACHE_BYTES))); +} __cacheline_aligned; /* MSRs */ #ifndef MSR_IA32_PERFCTR0 |