From 2b0ca11c6caa645b6d8a3fe59f2156306e437b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Sat, 16 Apr 2005 21:08:44 +0000 Subject: [PATCH] +Sat Apr 16 14:15:55 2005 Soeren Sandmann + + * TODO: Update + + * sysprof-module.c (x_access_process_vm): On kernel 2.6.9 and + later use get_task_mm()/mmput() instead of directly accessing + task->mm. + --- ChangeLog | 8 ++++ README | 2 +- TODO | 99 +++++++++++++++++++++++++----------------------- sysprof-module.c | 17 +++++++-- sysprof.c | 1 - 5 files changed, 73 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index 397d74ab..87e3c987 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sat Apr 16 14:15:55 2005 Soeren Sandmann + + * TODO: Update + + * sysprof-module.c (x_access_process_vm): On kernel 2.6.9 and + later use get_task_mm()/mmput() instead of directly accessing + task->mm. + Sat Apr 16 01:54:18 2005 Søren Sandmann * TODO: Add backtrace for kernel oops. diff --git a/README b/README index 653dcf5f..19d0ecf0 100644 --- a/README +++ b/README @@ -11,7 +11,7 @@ program "sysprof". - The module must be compiled with the same compiler that compiled the kernel it is going to be used with. For most systems that is just the system compiler, but if you have upgraded your kernel it is - possible the one was compiled with a difference compiler. + possible the one was compiled with a different compiler. In that case, "insmod sysprof-module.ko" will produce this error message: diff --git a/TODO b/TODO index 6cac7bdb..152ddc4d 100644 --- a/TODO +++ b/TODO @@ -6,54 +6,11 @@ Before 1.0: - or block unloading until all processes have exited - Find out what happened here: -[ Try and reproduce by having a ptraced process malloc/mmap a page of memory, then have the - ptracing process read a byte from it. -] - -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Unable to handle kernel NULL pointer dereference at virtual address 000001b8 -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: printing eip: -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: c017342c -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: *pde = 00000000 -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Oops: 0000 [#1] -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Modules linked in: sysprof_module(U) i2c_algo_bit md5 ipv6 parport_pc lp parport autofs4 sunrpc video button battery ac ohci1394 ieee1394 uhci_hcd ehci_hcd hw_random tpm_atmel tpm i2c_i801 i2c_core snd_intel8x0 snd_ac97_codec snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd soundcore snd_page_alloc e1000 floppy dm_snapshot dm_zero dm_mirror ext3 jbd dm_mod ata_piix libata sd_mod scsi_mod -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: CPU: 0 -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: EIP: 0060:[] Not tainted VLI -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: EFLAGS: 00010287 (2.6.11-1.1225_FC4) -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: EIP is at grab_swap_token+0x35/0x21f -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: eax: 0bd48023 ebx: d831d028 ecx: 00000282 edx: 00000000 -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: esi: c1b72934 edi: c1045820 ebp: c1b703f0 esp: c18dbdd8 -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: ds: 007b es: 007b ss: 0068 -Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Process events/0 (pid: 3, threadinfo=c18db000 task=f7e62000) -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: Stack: 000011a8 00000000 000011a8 c1b703f0 c0151731 c016f58f 000011a8 c1b72934 -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: 000011a8 c0166415 c1b72934 c1b72934 c0163768 ee7ccc38 f459fbf8 bf92e7b8 -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: f6c6a934 c0103b92 bfdaba18 c1b703f0 00000001 c1b81bfc c1b72934 bfdaba18 -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: Call Trace: -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] find_get_page+0x9/0x24 -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] read_swap_cache_async+0x32/0x83Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] do_swap_page+0x262/0x600 -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] pte_alloc_map+0xc6/0x1e6 -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] common_interrupt+0x1a/0x20 -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] handle_mm_fault+0x1da/0x31d -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] __follow_page+0xa2/0x10d -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] get_user_pages+0x145/0x6ee -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] kmap_high+0x52/0x44e -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] common_interrupt+0x1a/0x20 -Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] x_access_process_vm+0x111/0x1a5 [sysprof_module] -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] read_user_space+0x19/0x1d [sysprof_module] -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] read_frame+0x35/0x51 [sysprof_module] -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] generate_stack_trace+0x8b/0xb4 -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] do_generate+0x3f/0xa0 [sysprof_module] -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] worker_thread+0x1b0/0x450 -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] schedule+0x30d/0x780 -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] __wake_up_common+0x39/0x59 -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] do_generate+0x0/0xa0 [sysprof_module] -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] default_wake_function+0x0/0xc -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] worker_thread+0x0/0x450 -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] kthread+0x87/0x8b -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] kthread+0x0/0x8b -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] kernel_thread_helper+0x5/0xb -Apr 11 15:42:10 great-sage-equal-to-heaven kernel: Code: e0 8b 00 8b 50 74 8b 1d c4 55 3d c0 39 -da 0f 84 9b 01 00 00 a1 60 fc 3c c0 39 05 30 ec 48 c0 78 05 83 c4 20 5b c3 a1 60 fc 3c c0 <3b> 82 b8 01 00 00 78 ee 81 3d ac 55 3d c0 3c 4b 24 1d 0f 85 78 - + - Hopefully the oops at the end of this file is gone now that + we use mmput/get_task_mm. For older kernels those symbols + are not exported though, so we will probably have to either + use the old way (directly accessing the mm's) or just not + support those kernels. * Interface - If the current profile has a name, display it in the title bar @@ -338,3 +295,49 @@ It is possible that we simply need a better concept of Process: - autoexpand descendant tree - make double clicks work - fix leaks + + +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Unable to handle kernel NULL pointer dereference at virtual address 000001b8 +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: printing eip: +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: c017342c +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: *pde = 00000000 +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Oops: 0000 [#1] +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Modules linked in: sysprof_module(U) i2c_algo_bit md5 ipv6 parport_pc lp parport autofs4 sunrpc video button battery ac ohci1394 ieee1394 uhci_hcd ehci_hcd hw_random tpm_atmel tpm i2c_i801 i2c_core snd_intel8x0 snd_ac97_codec snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd soundcore snd_page_alloc e1000 floppy dm_snapshot dm_zero dm_mirror ext3 jbd dm_mod ata_piix libata sd_mod scsi_mod +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: CPU: 0 +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: EIP: 0060:[] Not tainted VLI +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: EFLAGS: 00010287 (2.6.11-1.1225_FC4) +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: EIP is at grab_swap_token+0x35/0x21f +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: eax: 0bd48023 ebx: d831d028 ecx: 00000282 edx: 00000000 +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: esi: c1b72934 edi: c1045820 ebp: c1b703f0 esp: c18dbdd8 +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: ds: 007b es: 007b ss: 0068 +Apr 11 15:42:08 great-sage-equal-to-heaven kernel: Process events/0 (pid: 3, threadinfo=c18db000 task=f7e62000) +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: Stack: 000011a8 00000000 000011a8 c1b703f0 c0151731 c016f58f 000011a8 c1b72934 +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: 000011a8 c0166415 c1b72934 c1b72934 c0163768 ee7ccc38 f459fbf8 bf92e7b8 +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: f6c6a934 c0103b92 bfdaba18 c1b703f0 00000001 c1b81bfc c1b72934 bfdaba18 +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: Call Trace: +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] find_get_page+0x9/0x24 +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] read_swap_cache_async+0x32/0x83Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] do_swap_page+0x262/0x600 +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] pte_alloc_map+0xc6/0x1e6 +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] common_interrupt+0x1a/0x20 +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] handle_mm_fault+0x1da/0x31d +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] __follow_page+0xa2/0x10d +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] get_user_pages+0x145/0x6ee +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] kmap_high+0x52/0x44e +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] common_interrupt+0x1a/0x20 +Apr 11 15:42:09 great-sage-equal-to-heaven kernel: [] x_access_process_vm+0x111/0x1a5 [sysprof_module] +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] read_user_space+0x19/0x1d [sysprof_module] +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] read_frame+0x35/0x51 [sysprof_module] +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] generate_stack_trace+0x8b/0xb4 +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] do_generate+0x3f/0xa0 [sysprof_module] +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] worker_thread+0x1b0/0x450 +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] schedule+0x30d/0x780 +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] __wake_up_common+0x39/0x59 +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] do_generate+0x0/0xa0 [sysprof_module] +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] default_wake_function+0x0/0xc +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] worker_thread+0x0/0x450 +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] kthread+0x87/0x8b +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] kthread+0x0/0x8b +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: [] kernel_thread_helper+0x5/0xb +Apr 11 15:42:10 great-sage-equal-to-heaven kernel: Code: e0 8b 00 8b 50 74 8b 1d c4 55 3d c0 39 +da 0f 84 9b 01 00 00 a1 60 fc 3c c0 39 05 30 ec 48 c0 78 05 83 c4 20 5b c3 a1 60 fc 3c c0 <3b> 82 b8 01 00 00 78 ee 81 3d ac 55 3d c0 3c 4b 24 1d 0f 85 78 + diff --git a/sysprof-module.c b/sysprof-module.c index 15720d75..f7c4dc39 100644 --- a/sysprof-module.c +++ b/sysprof-module.c @@ -76,9 +76,7 @@ init_userspace_reader (userspace_reader *reader, reader->page = NULL; } -/* This is mostly cutted and pasted from ptrace.c - * I removed some locking and stuff though. I hope it - * wasn't important. +/* This function was mostly cutted and pasted from ptrace.c */ /* Access another process' address space. @@ -94,7 +92,14 @@ x_access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int struct page *page; void *old_buf = buf; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9) + task_lock (tsk); mm = tsk->mm; + task_unlock (tsk); +#else + mm = get_task_mm (tsk); +#endif + if (!mm) return 0; @@ -115,7 +120,7 @@ x_access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int bytes = PAGE_SIZE-offset; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11) - + flush_cache_page(vma, addr); #endif @@ -136,6 +141,10 @@ x_access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int addr += bytes; } up_read(&mm->mmap_sem); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9) + mmput(mm); +#endif return buf - old_buf; } diff --git a/sysprof.c b/sysprof.c index 28e91dd0..4dc46642 100644 --- a/sysprof.c +++ b/sysprof.c @@ -745,7 +745,6 @@ on_about_activated (GtkWidget *widget, gpointer data) { #define OSLASH "\303\270" Application *app = data; - const char *artist[] = { "Diana Fong", NULL } ; gtk_show_about_dialog (GTK_WINDOW (app->main_window), "logo", app->icon,