* [GIT PULL v2] perf fixes
@ 2010-03-31 3:58 Frederic Weisbecker
2010-03-31 3:58 ` [PATCH 1/2 v2] perf: Use hot regs with software sched switch/migrate events Frederic Weisbecker
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Frederic Weisbecker @ 2010-03-31 3:58 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar
Cc: LKML, Frederic Weisbecker, Arnaldo Carvalho de Melo, Paul Mackerras
Ingo,
Please pull the perf/urgent branch that can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git
perf/urgent
It fixes the conflict against latest linus's tree that raised
build errors (you can find a merge commit inside).
I am not yet totally sure about Peter's opinion concerning
the context switch event that is now captured from the kernel.
Our latest discussion on the strict exclude_kernel meaning
seems in favour of this change but I'd prefer to wait for his
final approval before you pull this.
(I'm not reposting the alignment fix as it is unchanged)
Thanks,
Frederic
---
Frederic Weisbecker (2):
perf: Correctly align perf event tracing buffer
perf: Use hot regs with software sched switch/migrate events
Jason Wessel (1):
x86,kgdb: Always initialize the hw breakpoint attribute
arch/x86/kernel/cpu/perf_event.c | 2 --
arch/x86/kernel/kgdb.c | 2 +-
include/linux/perf_event.h | 21 ++++++++++++++-------
kernel/perf_event.c | 4 +---
kernel/trace/trace_event_perf.c | 11 +++++++++--
5 files changed, 25 insertions(+), 15 deletions(-)
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2 v2] perf: Use hot regs with software sched switch/migrate events
2010-03-31 3:58 [GIT PULL v2] perf fixes Frederic Weisbecker
@ 2010-03-31 3:58 ` Frederic Weisbecker
2010-03-31 3:58 ` [PATCH 2/2] x86,kgdb: Always initialize the hw breakpoint attribute Frederic Weisbecker
2010-04-01 7:17 ` [GIT PULL v3] perf fixes Frederic Weisbecker
2 siblings, 0 replies; 6+ messages in thread
From: Frederic Weisbecker @ 2010-03-31 3:58 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar
Cc: LKML, Frederic Weisbecker, Peter Zijlstra,
Arnaldo Carvalho de Melo, Paul Mackerras, Ingo Molnar,
David Miller
Scheduler's task migration events don't work because they always
pass NULL regs perf_sw_event(). The event hence gets filtered
in perf_swevent_add().
Scheduler's context switches events use task_pt_regs() to get
the context when the event occured which is a wrong thing to
do as this won't give us the place in the kernel where we went
to sleep but the place where we left userspace. The result is
even more wrong if we switch from a kernel thread.
Use the hot regs snapshot for both events as they belong to the
non-interrupt/exception based events family. Unlike page faults
or so that provide the regs matching the exact origin of the event,
we need to save the current context.
This makes the task migration event working and fix the context
switch callchains and origin ip.
Example: perf record -a -e cs
Before:
10.91% ksoftirqd/0 0 [k] 0000000000000000
|
--- (nil)
perf_callchain
perf_prepare_sample
__perf_event_overflow
perf_swevent_overflow
perf_swevent_add
perf_swevent_ctx_event
do_perf_sw_event
__perf_sw_event
perf_event_task_sched_out
schedule
run_ksoftirqd
kthread
kernel_thread_helper
After:
23.77% hald-addon-stor [kernel.kallsyms] [k] schedule
|
--- schedule
|
|--60.00%-- schedule_timeout
| wait_for_common
| wait_for_completion
| blk_execute_rq
| scsi_execute
| scsi_execute_req
| sr_test_unit_ready
| |
| |--66.67%-- sr_media_change
| | media_changed
| | cdrom_media_changed
| | sr_block_media_changed
| | check_disk_change
| | cdrom_open
v2: Always build perf_arch_fetch_caller_regs() now that software
events need that too. They don't need it from modules, unlike trace
events, so we keep the EXPORT_SYMBOL in trace_event_perf.c
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: David Miller <davem@davemloft.net>
---
arch/x86/kernel/cpu/perf_event.c | 2 --
include/linux/perf_event.h | 21 ++++++++++++++-------
kernel/perf_event.c | 4 +---
3 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
index 60398a0..5fb490c 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -1702,7 +1702,6 @@ struct perf_callchain_entry *perf_callchain(struct pt_regs *regs)
return entry;
}
-#ifdef CONFIG_EVENT_TRACING
void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip)
{
regs->ip = ip;
@@ -1714,4 +1713,3 @@ void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int ski
regs->cs = __KERNEL_CS;
local_save_flags(regs->flags);
}
-#endif
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 9547703..c8e3754 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -842,13 +842,6 @@ extern atomic_t perf_swevent_enabled[PERF_COUNT_SW_MAX];
extern void __perf_sw_event(u32, u64, int, struct pt_regs *, u64);
-static inline void
-perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr)
-{
- if (atomic_read(&perf_swevent_enabled[event_id]))
- __perf_sw_event(event_id, nr, nmi, regs, addr);
-}
-
extern void
perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip);
@@ -887,6 +880,20 @@ static inline void perf_fetch_caller_regs(struct pt_regs *regs, int skip)
return perf_arch_fetch_caller_regs(regs, ip, skip);
}
+static inline void
+perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr)
+{
+ if (atomic_read(&perf_swevent_enabled[event_id])) {
+ struct pt_regs hot_regs;
+
+ if (!regs) {
+ perf_fetch_caller_regs(&hot_regs, 1);
+ regs = &hot_regs;
+ }
+ __perf_sw_event(event_id, nr, nmi, regs, addr);
+ }
+}
+
extern void __perf_event_mmap(struct vm_area_struct *vma);
static inline void perf_event_mmap(struct vm_area_struct *vma)
diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index 574ee58..b0feb47 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -1164,11 +1164,9 @@ void perf_event_task_sched_out(struct task_struct *task,
struct perf_event_context *ctx = task->perf_event_ctxp;
struct perf_event_context *next_ctx;
struct perf_event_context *parent;
- struct pt_regs *regs;
int do_switch = 1;
- regs = task_pt_regs(task);
- perf_sw_event(PERF_COUNT_SW_CONTEXT_SWITCHES, 1, 1, regs, 0);
+ perf_sw_event(PERF_COUNT_SW_CONTEXT_SWITCHES, 1, 1, NULL, 0);
if (likely(!ctx || !cpuctx->task_ctx))
return;
--
1.6.2.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] x86,kgdb: Always initialize the hw breakpoint attribute
2010-03-31 3:58 [GIT PULL v2] perf fixes Frederic Weisbecker
2010-03-31 3:58 ` [PATCH 1/2 v2] perf: Use hot regs with software sched switch/migrate events Frederic Weisbecker
@ 2010-03-31 3:58 ` Frederic Weisbecker
2010-04-01 7:17 ` [GIT PULL v3] perf fixes Frederic Weisbecker
2 siblings, 0 replies; 6+ messages in thread
From: Frederic Weisbecker @ 2010-03-31 3:58 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar
Cc: LKML, Jason Wessel, Ingo Molnar, 2.6.33, Frederic Weisbecker
From: Jason Wessel <jason.wessel@windriver.com>
It is required to call hw_breakpoint_init() on an attr before using it
in any other calls. This fixes the problem where kgdb will sometimes
fail to initialize on x86_64.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: 2.6.33 <stable@kernel.org>
LKML-Reference: <1269975907-27602-1-git-send-email-jason.wessel@windriver.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
arch/x86/kernel/kgdb.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
index bfba601..b2258ca 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
@@ -618,8 +618,8 @@ int kgdb_arch_init(void)
* portion of kgdb because this operation requires mutexs to
* complete.
*/
+ hw_breakpoint_init(&attr);
attr.bp_addr = (unsigned long)kgdb_arch_init;
- attr.type = PERF_TYPE_BREAKPOINT;
attr.bp_len = HW_BREAKPOINT_LEN_1;
attr.bp_type = HW_BREAKPOINT_W;
attr.disabled = 1;
--
1.6.2.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [GIT PULL v3] perf fixes
2010-03-31 3:58 [GIT PULL v2] perf fixes Frederic Weisbecker
2010-03-31 3:58 ` [PATCH 1/2 v2] perf: Use hot regs with software sched switch/migrate events Frederic Weisbecker
2010-03-31 3:58 ` [PATCH 2/2] x86,kgdb: Always initialize the hw breakpoint attribute Frederic Weisbecker
@ 2010-04-01 7:17 ` Frederic Weisbecker
2010-04-02 17:32 ` Ingo Molnar
2 siblings, 1 reply; 6+ messages in thread
From: Frederic Weisbecker @ 2010-04-01 7:17 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar
Cc: LKML, Arnaldo Carvalho de Melo, Paul Mackerras
On Wed, Mar 31, 2010 at 05:58:45AM +0200, Frederic Weisbecker wrote:
> Ingo,
>
> Please pull the perf/urgent branch that can be found at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git
> perf/urgent
I have updated the tree. There was a leftover patch for perf/core
inside (not listed here). Also, since you've merged linus tree in
perf/urgent lately, I've zapped my merge commit. Other than that,
the three fixes remain.
Thanks.
>
> It fixes the conflict against latest linus's tree that raised
> build errors (you can find a merge commit inside).
>
> I am not yet totally sure about Peter's opinion concerning
> the context switch event that is now captured from the kernel.
> Our latest discussion on the strict exclude_kernel meaning
> seems in favour of this change but I'd prefer to wait for his
> final approval before you pull this.
>
> (I'm not reposting the alignment fix as it is unchanged)
>
> Thanks,
> Frederic
> ---
>
> Frederic Weisbecker (2):
> perf: Correctly align perf event tracing buffer
> perf: Use hot regs with software sched switch/migrate events
>
> Jason Wessel (1):
> x86,kgdb: Always initialize the hw breakpoint attribute
>
>
> arch/x86/kernel/cpu/perf_event.c | 2 --
> arch/x86/kernel/kgdb.c | 2 +-
> include/linux/perf_event.h | 21 ++++++++++++++-------
> kernel/perf_event.c | 4 +---
> kernel/trace/trace_event_perf.c | 11 +++++++++--
> 5 files changed, 25 insertions(+), 15 deletions(-)
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [GIT PULL v3] perf fixes
2010-04-01 7:17 ` [GIT PULL v3] perf fixes Frederic Weisbecker
@ 2010-04-02 17:32 ` Ingo Molnar
2010-04-03 10:38 ` Frederic Weisbecker
0 siblings, 1 reply; 6+ messages in thread
From: Ingo Molnar @ 2010-04-02 17:32 UTC (permalink / raw)
To: Frederic Weisbecker
Cc: Peter Zijlstra, LKML, Arnaldo Carvalho de Melo, Paul Mackerras
* Frederic Weisbecker <fweisbec@gmail.com> wrote:
> On Wed, Mar 31, 2010 at 05:58:45AM +0200, Frederic Weisbecker wrote:
> > Ingo,
> >
> > Please pull the perf/urgent branch that can be found at:
> >
> > git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git
> > perf/urgent
>
>
> I have updated the tree. There was a leftover patch for perf/core
> inside (not listed here). Also, since you've merged linus tree in
> perf/urgent lately, I've zapped my merge commit. Other than that,
> the three fixes remain.
>
> Thanks.
Pulled, thanks Frederic!
Note, i also queued up this patch from Edwin:
257ef9d: perf, x86: Fix callgraphs of 32-bit processes on 64-bit kernels
with your Acked-by added.
Thanks,
Ingo
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [GIT PULL v3] perf fixes
2010-04-02 17:32 ` Ingo Molnar
@ 2010-04-03 10:38 ` Frederic Weisbecker
0 siblings, 0 replies; 6+ messages in thread
From: Frederic Weisbecker @ 2010-04-03 10:38 UTC (permalink / raw)
To: Ingo Molnar
Cc: Peter Zijlstra, LKML, Arnaldo Carvalho de Melo, Paul Mackerras
On Fri, Apr 02, 2010 at 07:32:03PM +0200, Ingo Molnar wrote:
>
> * Frederic Weisbecker <fweisbec@gmail.com> wrote:
>
> > On Wed, Mar 31, 2010 at 05:58:45AM +0200, Frederic Weisbecker wrote:
> > > Ingo,
> > >
> > > Please pull the perf/urgent branch that can be found at:
> > >
> > > git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git
> > > perf/urgent
> >
> >
> > I have updated the tree. There was a leftover patch for perf/core
> > inside (not listed here). Also, since you've merged linus tree in
> > perf/urgent lately, I've zapped my merge commit. Other than that,
> > the three fixes remain.
> >
> > Thanks.
>
> Pulled, thanks Frederic!
>
> Note, i also queued up this patch from Edwin:
>
> 257ef9d: perf, x86: Fix callgraphs of 32-bit processes on 64-bit kernels
>
> with your Acked-by added.
>
> Thanks,
>
> Ingo
Ah ok. I was too cautious and eventually queued it for perf/core, but
if you think it's fine, no problem.
Thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-04-03 10:38 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-31 3:58 [GIT PULL v2] perf fixes Frederic Weisbecker
2010-03-31 3:58 ` [PATCH 1/2 v2] perf: Use hot regs with software sched switch/migrate events Frederic Weisbecker
2010-03-31 3:58 ` [PATCH 2/2] x86,kgdb: Always initialize the hw breakpoint attribute Frederic Weisbecker
2010-04-01 7:17 ` [GIT PULL v3] perf fixes Frederic Weisbecker
2010-04-02 17:32 ` Ingo Molnar
2010-04-03 10:38 ` Frederic Weisbecker
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.