diff options
author | Dave Brolley <brolley@redhat.com> | 2009-07-23 12:43:03 -0400 |
---|---|---|
committer | Dave Brolley <brolley@redhat.com> | 2009-07-23 12:43:03 -0400 |
commit | c04c525de43003fb00612df635a7c819b5a1d645 (patch) | |
tree | 22cd1e41f84a66d7eaece8e17138bf83427f4bab /runtime | |
parent | 6c456acd35009630facd95cca91483a92aa50e9f (diff) | |
parent | 4a8636a307a9a532dcc60b5ad8bf809a20dc24c3 (diff) | |
download | systemtap-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.c | 6 | ||||
-rw-r--r-- | runtime/autoconf-save-stack-trace.c | 2 | ||||
-rw-r--r-- | runtime/itrace.c | 15 | ||||
-rw-r--r-- | runtime/sym.c | 14 | ||||
-rw-r--r-- | runtime/transport/ring_buffer.c | 57 |
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 |