Re: oprofile BUG() in current kernel.

From: Eric Dumazet
Date: Tue May 13 2008 - 06:26:18 EST


Gianni Tedesco a écrit :


Nope, exact same bad paging request in kernel mode... probably the bug
is something deep in oprofile then?
Hum... Are you using oprofile as a module or statically included in kernel ?

Current module loader only allocates percpu room by examining ".data.percpu" section and should be augmented to also look at ".data.percpu.shared_aligned"
Or, change DEFINE_PER_CPU_SHARED_ALIGNED() for modules (to use ".data.percpu" only)

Anyway, with the per_cpu conversion of cpu_buffer, we dont need to request cache_line alignment anymore

[PATCH] oprofile: Dont request cache line alignment for cpu_buffer

Alignment was previously requested because cpu_buffer was an [NR_CPUS] array, to avoid cache line sharing between CPUS.

After commit 608dfddd845da5ab6accef70154c8910529699f7 ( oprofile: change cpu_buffer from array to per_cpu variable ),
we dont need to force an alignement anymore since cpu_buffer sits in per_cpu zone.

Signed-off-by: Eric Dumazet <dada1@xxxxxxxxxxxxx>


diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c
index efcbf4b..2450b3a 100644
--- a/drivers/oprofile/cpu_buffer.c
+++ b/drivers/oprofile/cpu_buffer.c
@@ -27,7 +27,7 @@
#include "buffer_sync.h"
#include "oprof.h"

-DEFINE_PER_CPU_SHARED_ALIGNED(struct oprofile_cpu_buffer, cpu_buffer);
+DEFINE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer);

static void wq_sync_buffer(struct work_struct *work);

diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h
index 1358817..c3e366b 100644
--- a/drivers/oprofile/cpu_buffer.h
+++ b/drivers/oprofile/cpu_buffer.h
@@ -46,7 +46,7 @@ struct oprofile_cpu_buffer {
unsigned long sample_invalid_eip;
int cpu;
struct delayed_work work;
-} ____cacheline_aligned;
+};

DECLARE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer);