summaryrefslogtreecommitdiffstats
path: root/runtime/task_finder.c
diff options
context:
space:
mode:
authorDavid Smith <dsmith@redhat.com>2009-03-24 14:43:08 -0500
committerDavid Smith <dsmith@redhat.com>2009-03-24 14:43:08 -0500
commit59b6abb36a6b4db7025b65112164378621a70444 (patch)
tree249132ff033ab8439114423097ec6e4b404f0ec0 /runtime/task_finder.c
parent148f987f1bbc4a8fe23012a56bf89bb9fc69beb9 (diff)
downloadsystemtap-steved-59b6abb36a6b4db7025b65112164378621a70444.tar.gz
systemtap-steved-59b6abb36a6b4db7025b65112164378621a70444.tar.xz
systemtap-steved-59b6abb36a6b4db7025b65112164378621a70444.zip
PR 9989 fix.
2009-03-24 David Smith <dsmith@redhat.com> PR 9989. * runtime/task_finder.c (stap_utrace_detach): Ignores -EINPROGRESS. (stap_utrace_detach_ops): Ignores errors from stap_utrace_detach(), so that other tasks will get detached from this utrace engine. (__stp_utrace_attach): Better error handling from utrace_barrier(). (__stp_utrace_task_finder_target_quiesce): Ditto.
Diffstat (limited to 'runtime/task_finder.c')
-rw-r--r--runtime/task_finder.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/runtime/task_finder.c b/runtime/task_finder.c
index 3f4908cb..e494e7a8 100644
--- a/runtime/task_finder.c
+++ b/runtime/task_finder.c
@@ -39,15 +39,23 @@ static atomic_t __stp_attach_count = ATOMIC_INIT (0);
#define debug_task_finder_attach() (atomic_inc(&__stp_attach_count))
#define debug_task_finder_detach() (atomic_dec(&__stp_attach_count))
+#ifdef DEBUG_TASK_FINDER_PRINTK
+#define debug_task_finder_report() (printk(KERN_ERR \
+ "%s:%d attach count: %d, inuse count: %d\n", \
+ __FUNCTION__, __LINE__, \
+ atomic_read(&__stp_attach_count), \
+ atomic_read(&__stp_inuse_count)))
+#else
#define debug_task_finder_report() (_stp_dbug(__FUNCTION__, __LINE__, \
"attach count: %d, inuse count: %d\n", \
atomic_read(&__stp_attach_count), \
atomic_read(&__stp_inuse_count)))
+#endif /* !DEBUG_TASK_FINDER_PRINTK */
#else
#define debug_task_finder_attach() /* empty */
#define debug_task_finder_detach() /* empty */
#define debug_task_finder_report() /* empty */
-#endif
+#endif /* !DEBUG_TASK_FINDER */
typedef int (*stap_task_finder_callback)(struct stap_task_finder_target *tgt,
struct task_struct *tsk,
@@ -280,11 +288,15 @@ stap_utrace_detach(struct task_struct *tsk,
break;
case -ESRCH: /* REAP callback already begun */
case -EALREADY: /* DEATH callback already begun */
- rc = 0; /* ignore these errors*/
+ rc = 0; /* ignore these errors */
+ break;
+ case -EINPROGRESS:
+ debug_task_finder_detach();
+ rc = 0;
break;
default:
rc = -rc;
- _stp_error("utrace_detach returned error %d on pid %d",
+ _stp_error("utrace_control returned error %d on pid %d",
rc, tsk->pid);
break;
}
@@ -298,7 +310,6 @@ stap_utrace_detach_ops(struct utrace_engine_ops *ops)
{
struct task_struct *grp, *tsk;
struct utrace_attached_engine *engine;
- int rc = 0;
pid_t pid = 0;
// Notice we're not calling get_task_mm() in this loop. In
@@ -324,11 +335,12 @@ stap_utrace_detach_ops(struct utrace_engine_ops *ops)
continue;
#endif
- rc = stap_utrace_detach(tsk, ops);
- if (rc != 0)
- goto udo_err;
+ /* Notice we're purposefully ignoring errors from
+ * stap_utrace_detach(). Even if we got an error on
+ * this task, we need to keep detaching from other
+ * tasks. */
+ (void) stap_utrace_detach(tsk, ops);
} while_each_thread(grp, tsk);
-udo_err:
rcu_read_unlock();
debug_task_finder_report();
}
@@ -475,7 +487,7 @@ __stp_utrace_attach(struct task_struct *tsk,
* ref.
*/
rc = utrace_barrier(tsk, engine);
- if (rc != 0)
+ if (rc != -ESRCH && rc != -EALREADY)
_stp_error("utrace_barrier returned error %d on pid %d",
rc, (int)tsk->pid);
}
@@ -494,7 +506,7 @@ __stp_utrace_attach(struct task_struct *tsk,
}
}
- else
+ else if (rc != -ESRCH && rc != -EALREADY)
_stp_error("utrace_set_events2 returned error %d on pid %d",
rc, (int)tsk->pid);
utrace_engine_put(engine);
@@ -869,11 +881,12 @@ __stp_utrace_task_finder_target_quiesce(enum utrace_resume_action action,
* a stale task pointer, if we have an engine ref.
*/
rc = utrace_barrier(tsk, engine);
- if (rc != 0)
+ if (rc == 0)
+ rc = utrace_set_events(tsk, engine,
+ __STP_ATTACHED_TASK_BASE_EVENTS(tgt));
+ else if (rc != -ESRCH && rc != -EALREADY)
_stp_error("utrace_barrier returned error %d on pid %d",
rc, (int)tsk->pid);
- rc = utrace_set_events(tsk, engine,
- __STP_ATTACHED_TASK_BASE_EVENTS(tgt));
}
if (rc != 0)
_stp_error("utrace_set_events returned error %d on pid %d",