summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorDave Brolley <brolley@redhat.com>2009-07-23 12:43:03 -0400
committerDave Brolley <brolley@redhat.com>2009-07-23 12:43:03 -0400
commitc04c525de43003fb00612df635a7c819b5a1d645 (patch)
tree22cd1e41f84a66d7eaece8e17138bf83427f4bab /runtime
parent6c456acd35009630facd95cca91483a92aa50e9f (diff)
parent4a8636a307a9a532dcc60b5ad8bf809a20dc24c3 (diff)
downloadsystemtap-steved-c04c525de43003fb00612df635a7c819b5a1d645.tar.gz
systemtap-steved-c04c525de43003fb00612df635a7c819b5a1d645.tar.xz
systemtap-steved-c04c525de43003fb00612df635a7c819b5a1d645.zip
Merge branch 'master' of git://sources.redhat.com/git/systemtap
Diffstat (limited to 'runtime')
-rw-r--r--runtime/autoconf-find-task-pid.c6
-rw-r--r--runtime/autoconf-save-stack-trace.c2
-rw-r--r--runtime/itrace.c15
-rw-r--r--runtime/sym.c14
-rw-r--r--runtime/transport/ring_buffer.c57
5 files changed, 58 insertions, 36 deletions
diff --git a/runtime/autoconf-find-task-pid.c b/runtime/autoconf-find-task-pid.c
deleted file mode 100644
index 549d5ac3..00000000
--- a/runtime/autoconf-find-task-pid.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <linux/sched.h>
-
-void foo (pid_t k) {
- struct task_struct *tsk = find_task_by_pid (k);
- (void) tsk;
-}
diff --git a/runtime/autoconf-save-stack-trace.c b/runtime/autoconf-save-stack-trace.c
index 39ded684..07d45c31 100644
--- a/runtime/autoconf-save-stack-trace.c
+++ b/runtime/autoconf-save-stack-trace.c
@@ -11,7 +11,7 @@ void foo(struct task_struct *foo)
trace.entries = &backtrace[0];
trace.max_entries = 20;
trace.skip = 0;
- save_stack_trace_tsk(tsk, &trace);
+ save_stack_trace_tsk(foo, &trace);
}
static const struct stacktrace_ops print_stack_ops;
diff --git a/runtime/itrace.c b/runtime/itrace.c
index 3014f9e5..6fe39db4 100644
--- a/runtime/itrace.c
+++ b/runtime/itrace.c
@@ -324,20 +324,14 @@ done:
}
-static int usr_itrace_init(int single_step, pid_t tid, struct stap_itrace_probe *p)
+static int usr_itrace_init(int single_step, struct task_struct *tsk, struct stap_itrace_probe *p)
{
struct itrace_info *ui;
- struct task_struct *tsk;
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);
+ if (tsk == NULL) {
+ printk(KERN_ERR "usr_itrace_init: Invalid task\n");
rcu_read_unlock();
return 1;
}
@@ -353,7 +347,8 @@ static int usr_itrace_init(int single_step, pid_t tid, struct stap_itrace_probe
rcu_read_unlock();
if (debug)
- printk(KERN_INFO "usr_itrace_init: completed for tid = %d\n", tid);
+ printk(KERN_INFO "usr_itrace_init: completed for tid = %d\n",
+ tsk->pid);
return 0;
}
diff --git a/runtime/sym.c b/runtime/sym.c
index 386005b2..35fb3cb0 100644
--- a/runtime/sym.c
+++ b/runtime/sym.c
@@ -309,9 +309,10 @@ static int _stp_module_check(void)
static void _stp_symbol_print(unsigned long address)
{
- const char *modname;
- const char *name;
- unsigned long offset, size;
+ const char *modname = 0;
+ const char *name = 0;
+ unsigned long offset = 0;
+ unsigned long size = 0;
name = _stp_kallsyms_lookup(address, &size, &offset, &modname, NULL, NULL);
@@ -334,9 +335,10 @@ static void _stp_symbol_print(unsigned long address)
static void _stp_usymbol_print(unsigned long address, struct task_struct *task)
{
- const char *modname;
- const char *name;
- unsigned long offset, size;
+ const char *modname = 0;
+ const char *name = 0;
+ unsigned long offset = 0;
+ unsigned long size = 0;
name = _stp_kallsyms_lookup(address, &size, &offset, &modname, NULL,
task);
diff --git a/runtime/transport/ring_buffer.c b/runtime/transport/ring_buffer.c
index 0c37621f..3af1bf7d 100644
--- a/runtime/transport/ring_buffer.c
+++ b/runtime/transport/ring_buffer.c
@@ -141,22 +141,37 @@ _stp_event_to_user(struct ring_buffer_event *event, char __user *ubuf,
struct _stp_data_entry *entry;
dbug_trans(1, "event(%p), ubuf(%p), cnt(%lu)\n", event, ubuf, cnt);
- if (event == NULL || ubuf == NULL)
+ if (event == NULL || ubuf == NULL) {
+ dbug_trans(1, "returning -EFAULT(1)\n");
return -EFAULT;
+ }
entry = (struct _stp_data_entry *)ring_buffer_event_data(event);
- if (entry == NULL)
+ if (entry == NULL) {
+ dbug_trans(1, "returning -EFAULT(2)\n");
return -EFAULT;
+ }
/* We don't do partial entries - just fail. */
- if (entry->len > cnt)
+ if (entry->len > cnt) {
+ dbug_trans(1, "returning -EBUSY\n");
return -EBUSY;
+ }
+
+#if defined(DEBUG_TRANS) && (DEBUG_TRANS >= 2)
+ {
+ char *last = entry->buf + (entry->len - 5);
+ dbug_trans2("copying %.5s...%.5s\n", entry->buf, last);
+ }
+#endif
if (cnt > entry->len)
cnt = entry->len;
ret = copy_to_user(ubuf, entry->buf, cnt);
- if (ret)
+ if (ret) {
+ dbug_trans(1, "returning -EFAULT(3)\n");
return -EFAULT;
+ }
return cnt;
}
@@ -195,6 +210,13 @@ static void _stp_ring_buffer_iterator_increment(void)
}
}
+static void _stp_ring_buffer_consume(void)
+{
+ _stp_ring_buffer_iterator_increment();
+ ring_buffer_consume(_stp_relay_data.rb, _stp_relay_data.rb_data.cpu,
+ &_stp_relay_data.rb_data.ts);
+}
+
static ssize_t _stp_tracing_wait_pipe(struct file *filp)
{
if (_stp_ring_buffer_empty()) {
@@ -238,8 +260,10 @@ static struct ring_buffer_event *_stp_find_next_event(int cpu_file)
event = _stp_peek_next_event(cpu_file, &_stp_relay_data.rb_data.ts);
_stp_relay_data.rb_data.cpu = cpu_file;
+#if 0
if (event)
_stp_ring_buffer_iterator_increment();
+#endif
return event;
#else
struct ring_buffer_event *next = NULL;
@@ -265,9 +289,10 @@ static struct ring_buffer_event *_stp_find_next_event(int cpu_file)
_stp_relay_data.rb_data.cpu = next_cpu;
_stp_relay_data.rb_data.ts = next_ts;
+#if 0
if (next)
_stp_ring_buffer_iterator_increment();
-
+#endif
return next;
#endif
}
@@ -303,6 +328,7 @@ _stp_data_read_trace(struct file *filp, char __user *ubuf,
= ring_buffer_read_start(_stp_relay_data.rb, cpu);
}
#endif
+ _stp_relay_data.rb_data.ts = 0;
dbug_trans(0, "iterator(s) started\n");
/* stop when tracing is finished */
@@ -323,15 +349,15 @@ _stp_data_read_trace(struct file *filp, char __user *ubuf,
if (len <= 0)
break;
- ring_buffer_consume(_stp_relay_data.rb,
- _stp_relay_data.rb_data.cpu,
- &_stp_relay_data.rb_data.ts);
+ _stp_ring_buffer_consume();
+ dbug_trans(1, "event consumed\n");
ubuf += len;
cnt -= len;
sret += len;
if (cnt <= 0)
break;
}
+
out:
#ifdef STP_BULKMODE
if (_stp_relay_data.rb_data.buffer_iter[cpu_file]) {
@@ -346,9 +372,8 @@ out:
_stp_relay_data.rb_data.buffer_iter[cpu] = NULL;
}
}
-#endif
dbug_trans(0, "iterator(s) finished\n");
-
+#endif
return sret;
}
@@ -440,9 +465,7 @@ _stp_data_write_reserve(size_t size_request, void **entry)
sde = (struct _stp_data_entry *)ring_buffer_event_data(event);
if (sde->len < size_request)
size_request = sde->len;
- ring_buffer_consume(_stp_relay_data.rb, cpu,
- &_stp_relay_data.rb_data.ts);
- _stp_relay_data.rb_data.cpu = cpu;
+ _stp_ring_buffer_consume();
/* Try to reserve again. */
#ifdef STAPCONF_RING_BUFFER_FLAGS
@@ -490,6 +513,14 @@ static int _stp_data_write_commit(void *entry)
return -EINVAL;
}
+#if defined(DEBUG_TRANS) && (DEBUG_TRANS >= 2)
+ {
+ struct _stp_data_entry *sde = (struct _stp_data_entry *)ring_buffer_event_data(event);
+ char *last = sde->buf + (sde->len - 5);
+ dbug_trans2("commiting %.5s...%.5s\n", sde->buf, last);
+ }
+#endif
+
#ifdef STAPCONF_RING_BUFFER_FLAGS
return ring_buffer_unlock_commit(_stp_relay_data.rb, event, 0);
#else