OProfile: Export task->tgid in the buffer
PATCH 1/4 OProfile: Export task->tgid in the buffer
Export the task->tgid to userspace as well. This is needed for forthcoming thread profiling stuff and should have been done in the original patch ... oh well.
This requires an upgrade to oprofile 0.5.3. You can get it from the website, or, for the impatient, here :
http://movementarian.org/oprofile-0.5.3.tar.gz
drivers/oprofile/buffer_sync.c +8 -3
@@ -274,12 +272,17 @@add_event_entry (KERNEL_EXIT_SWITCH_CODE ); } -static void add_user_ctx_switch (pid_t pid,unsigned long cookie) +static void +add_user_ctx_switch (struct task_struct const * task,unsigned long cookie) {add_event_entry (ESCAPE_CODE );add_event_entry (CTX_SWITCH_CODE ); -add_event_entry (pid); +add_event_entry (task->pid);add_event_entry (cookie); +/* Another code for daemon back-compat */ +add_event_entry (ESCAPE_CODE ); +add_event_entry (CTX_TGID_CODE ); +add_event_entry (task->tgid); }
@@ -446,7 +449,7 @@ mm =take_tasks_mm (new); cookie =get_exec_dcookie (mm); -add_user_ctx_switch (new->pid, cookie); +add_user_ctx_switch (new, cookie); } }else {add_sample (mm, s, in_kernel);
drivers/oprofile/event_buffer.h +1 -0
@@ -31,6 +31,7 @@#define KERNEL_ENTER_SWITCH_CODE 4#define KERNEL_EXIT_SWITCH_CODE 5#define MODULE_LOADED_CODE 6 +#define CTX_TGID_CODE 7/* add data to the event buffer */ void add_event_entry (unsigned long data);
PATCH 2/4 OProfile: update Changes
Update the version information.
Documentation/Changes +2 -2
@@ -61,7 +61,7 @@ o PPP 2.4.0 # pppd --version o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version o procps 2.0.9 # ps --version -o oprofile 0.5 # oprofiled --version +o oprofile 0.5.3 # oprofiled --version o nfs-utils 1.0.3 # showmount --version Kernel compilation
@@ -367,7 +367,7 @@ OProfile -------- -o <http://oprofile.sf.net/download.php3> +o <http://oprofile.sf.net/download/> Suggestions and corrections ===========================
PATCH 3/4 OProfile: remove useless code
Remove some useless code, from Philippe Elie.
drivers/oprofile/buffer_sync.c +1 -3
@@ -236,8 +236,6 @@struct vm_area_struct * vma;for (vma =find_vma (mm, addr); vma; vma = vma->vm_next) { -if (!vma) - goto out;if (!vma->vm_file)continue ;
@@ -250,7 +248,7 @@ *offset = (vma->vm_pgoff <<PAGE_SHIFT ) + addr - vma->vm_start;break ; } -out: +return cookie; }
PATCH 4/4 OProfile: fix init / exit routine
Ensure that the arch exit routines are always called when needed, previously we could end up with a nasty crash if using oprofile.timer=1, or the FS register failed.
drivers/oprofile/oprof.c +15 -18
@@ -131,36 +131,33 @@static int __init oprofile_init (void ) { -int err = -ENODEV ; +/* Architecture must fill in the interrupt ops and the +* logical CPU type, or we can fall back to the timer +* interrupt profiler. +*/ +int err =oprofile_arch_init (&oprofile_ops); -if (!timer) { -/* Architecture must fill in the interrupt ops and the -* logical CPU type, or we can fall back to the timer -* interrupt profiler. -*/ - err =oprofile_arch_init (&oprofile_ops); - } - -if (err == -ENODEV ) { +if (err == -ENODEV || timer) {timer_init (&oprofile_ops); err =0 ; - } - -if (err) + }else if (err) { goto out; + }if (!oprofile_ops->cpu_type) {printk (KERN_ERR "oprofile: cpu_type not set !\n" ); err = -EFAULT ; - goto out; + }else { + err =oprofilefs_register (); } - - err =oprofilefs_register (); -if (err) - goto out; +if (err) + goto out_exit; out:return err; +out_exit: +oprofile_arch_exit (); + goto out; }
include/linux/oprofile.h +3 -1
@@ -40,7 +40,9 @@/** * One-time initialisation. *ops must be set to a filled-in -* operations structure. +* operations structure. This is called even in timer interrupt +* mode. +* * Return 0 on success. */ int oprofile_arch_init (struct oprofile_operations ** ops);