From c32faac1fd0249ddd6265cf80c07a24e06d9aa0f Mon Sep 17 00:00:00 2001 From: Maynard Johnson Date: Wed, 18 Mar 2009 12:59:33 -0500 Subject: Fix for spinlock bad magic error with itrace probe point --- runtime/itrace.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'runtime/itrace.c') diff --git a/runtime/itrace.c b/runtime/itrace.c index ed32b0bc..da874f63 100644 --- a/runtime/itrace.c +++ b/runtime/itrace.c @@ -275,6 +275,7 @@ static int usr_itrace_init(int single_step, pid_t tid, struct stap_itrace_probe struct itrace_info *ui; struct task_struct *tsk; + spin_lock_init(&itrace_lock); rcu_read_lock(); tsk = find_task_by_vpid(tid); if (!tsk) { @@ -293,11 +294,6 @@ static int usr_itrace_init(int single_step, pid_t tid, struct stap_itrace_probe put_task_struct(tsk); rcu_read_unlock(); - spin_lock_init(&itrace_lock); - - /* set initial state */ - spin_lock(&itrace_lock); - spin_unlock(&itrace_lock); printk(KERN_INFO "usr_itrace_init: completed for tid = %d\n", tid); return 0; @@ -314,7 +310,6 @@ void static remove_usr_itrace_info(struct itrace_info *ui) if (debug) printk(KERN_INFO "remove_usr_itrace_info: tid=%d\n", ui->tid); - spin_lock(&itrace_lock); if (ui->tsk && ui->engine) { status = utrace_control(ui->tsk, ui->engine, UTRACE_DETACH); if (status < 0 && status != -ESRCH && status != -EALREADY) @@ -322,6 +317,7 @@ void static remove_usr_itrace_info(struct itrace_info *ui) "utrace_control(UTRACE_DETACH) returns %d\n", status); } + spin_lock(&itrace_lock); list_del(&ui->link); spin_unlock(&itrace_lock); kfree(ui); -- cgit From da049631393c37bad502ffac08a3805778c8d60d Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Thu, 19 Mar 2009 11:28:04 -0400 Subject: start of rhel5 compatibility for itrace --- runtime/itrace.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'runtime/itrace.c') diff --git a/runtime/itrace.c b/runtime/itrace.c index da874f63..3d9ded2f 100644 --- a/runtime/itrace.c +++ b/runtime/itrace.c @@ -1,6 +1,7 @@ /* * user space instruction tracing * Copyright (C) 2005, 2006, 2007, 2008, 2009 IBM Corp. + * Copyright (C) 2009 Red Hat Inc. * * This file is part of systemtap, and is free software. You can * redistribute it and/or modify it under the terms of the GNU General @@ -19,6 +20,7 @@ #include #include #include "uprobes/uprobes.h" +#include "utrace_compatibility.h" #ifndef put_task_struct #define put_task_struct(t) \ @@ -55,7 +57,7 @@ struct itrace_info { struct list_head link; }; -static u32 debug = 1; +static u32 debug = 0 /* 1 */; static LIST_HEAD(usr_itrace_info); static spinlock_t itrace_lock; @@ -118,10 +120,15 @@ static int __access_process_vm(struct task_struct *tsk, unsigned long addr, void return buf - old_buf; } +#ifdef UTRACE_ORIG_VERSION +static u32 usr_itrace_report_quiesce(struct utrace_attached_engine *engine, + struct task_struct *tsk) +#else static u32 usr_itrace_report_quiesce(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *tsk, unsigned long event) +#endif { int status; struct itrace_info *ui; @@ -129,10 +136,23 @@ static u32 usr_itrace_report_quiesce(enum utrace_resume_action action, ui = rcu_dereference(engine->data); WARN_ON(!ui); +#ifdef UTRACE_ORIG_VERSION + return (ui->step_flag); // XXX XXX XXX +#else return (event == 0 ? ui->step_flag : UTRACE_RESUME); +#endif } +#ifdef UTRACE_ORIG_VERSION +static u32 usr_itrace_report_signal( + struct utrace_attached_engine *engine, + struct task_struct *tsk, + struct pt_regs *regs, + u32 action, siginfo_t *info, + const struct k_sigaction *orig_ka, + struct k_sigaction *return_ka) +#else static u32 usr_itrace_report_signal(u32 action, struct utrace_attached_engine *engine, struct task_struct *tsk, @@ -140,6 +160,7 @@ static u32 usr_itrace_report_signal(u32 action, siginfo_t *info, const struct k_sigaction *orig_ka, struct k_sigaction *return_ka) +#endif { struct itrace_info *ui; u32 return_flags; @@ -174,16 +195,31 @@ static u32 usr_itrace_report_signal(u32 action, return return_flags; } + + +#ifdef UTRACE_ORIG_VERSION +static u32 usr_itrace_report_clone( + struct utrace_attached_engine *engine, + struct task_struct *parent, + unsigned long clone_flags, + struct task_struct *child) +#else static u32 usr_itrace_report_clone(enum utrace_resume_action action, struct utrace_attached_engine *engine, struct task_struct *parent, unsigned long clone_flags, struct task_struct *child) +#endif { return UTRACE_RESUME; } +#ifdef UTRACE_ORIG_VERSION +static u32 usr_itrace_report_death(struct utrace_attached_engine *e, + struct task_struct *tsk) +#else static u32 usr_itrace_report_death(struct utrace_attached_engine *e, struct task_struct *tsk, bool group_dead, int signal) +#endif { struct itrace_info *ui = rcu_dereference(e->data); WARN_ON(!ui); @@ -277,7 +313,11 @@ static int usr_itrace_init(int single_step, pid_t tid, struct stap_itrace_probe spin_lock_init(&itrace_lock); rcu_read_lock(); +#ifdef STAPCONF_FIND_TASK_PID + tsk = find_task_by_pid(tid); +#else tsk = find_task_by_vpid(tid); +#endif if (!tsk) { printk(KERN_ERR "usr_itrace_init: Cannot find process %d\n", tid); rcu_read_unlock(); -- cgit From 1fa23e70a939c20664d7ae6ee5ef66b51835e0ee Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Sun, 22 Mar 2009 11:20:23 -0400 Subject: PR9974: adapt to utrace_connected_engine -> utrace_engine Adjusted all headers that #include to follow with: /* PR9974: Adapt to struct renaming. */ --- runtime/itrace.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'runtime/itrace.c') diff --git a/runtime/itrace.c b/runtime/itrace.c index 3d9ded2f..618cbff0 100644 --- a/runtime/itrace.c +++ b/runtime/itrace.c @@ -18,6 +18,12 @@ #include #include #include + +/* PR9974: Adapt to struct renaming. */ +#ifdef UTRACE_API_VERSION +#define utrace_attached_engine utrace_engine +#endif + #include #include "uprobes/uprobes.h" #include "utrace_compatibility.h" -- cgit From 168bcc7c71f203fed7a8f25bfd0a84369b968c0f Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Tue, 24 Mar 2009 15:48:56 -0400 Subject: itrace: zap "usr_itrace_init: completed for tid = NNNN" debug message --- runtime/itrace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'runtime/itrace.c') diff --git a/runtime/itrace.c b/runtime/itrace.c index 618cbff0..97ba427e 100644 --- a/runtime/itrace.c +++ b/runtime/itrace.c @@ -340,7 +340,8 @@ static int usr_itrace_init(int single_step, pid_t tid, struct stap_itrace_probe put_task_struct(tsk); rcu_read_unlock(); - printk(KERN_INFO "usr_itrace_init: completed for tid = %d\n", tid); + if (debug) + printk(KERN_INFO "usr_itrace_init: completed for tid = %d\n", tid); return 0; } -- cgit From 975a582b1274eb66088466a66a2eb2c3a70cf766 Mon Sep 17 00:00:00 2001 From: David Smith Date: Mon, 27 Apr 2009 15:53:21 -0500 Subject: Fixed itrace on RHEL5 (PR10091). PR10091 fix. * runtime/itrace.c: Includes ptrace_compatibility.h. (usr_itrace_report_quiesce): Corrected return value for original version of utrace. * runtime/ptrace_compatibility.h: Defines arch_has_single_step() and arch_has_block_step() in terms of ARCH_HAS_SINGLE_STEP and ARCH_HAS_BLOCK_STEP. --- runtime/itrace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'runtime/itrace.c') diff --git a/runtime/itrace.c b/runtime/itrace.c index 97ba427e..68f85301 100644 --- a/runtime/itrace.c +++ b/runtime/itrace.c @@ -18,6 +18,7 @@ #include #include #include +#include "ptrace_compatibility.h" /* PR9974: Adapt to struct renaming. */ #ifdef UTRACE_API_VERSION @@ -143,7 +144,7 @@ static u32 usr_itrace_report_quiesce(enum utrace_resume_action action, WARN_ON(!ui); #ifdef UTRACE_ORIG_VERSION - return (ui->step_flag); // XXX XXX XXX + return (ui->step_flag | UTRACE_ACTION_NEWSTATE); #else return (event == 0 ? ui->step_flag : UTRACE_RESUME); #endif -- cgit