On Thu, Jul 14, 2005 at 05:27:15PM -0300, aris at conectiva.com.br wrote: > > when i try to run strace or gdbserver on a program, the following comes: > > > > NIP [c000543c] __flush_dcache_icache_phys+0x38/0x54 > > LR [c000b060] flush_dcache_icache_page+0x20/0x30 > > Call trace: > > [c000b154] update_mmu_cache+0x7c/0xa4 > > [c005ae98] do_wp_page+0x460/0x5ec > > [c005c8a0] handle_mm_fault+0x7cc/0x91c > > [c005ccec] get_user_pages+0x2fc/0x65c > > [c0027104] access_process_vm+0x9c/0x1d4 > > [c00076e0] sys_ptrace+0x240/0x4a4 > > [c0002bd0] ret_from_syscall+0x0/0x44 > > mm/memory.c:2054: spin_lock(kernel/fork.c:c0ea1618) already locked by > > mm/memory.c/1306 > please try to reproduce with 2.6.13-rc2. seems much like the problem Marcelo > fixed recently (dcbst misbehaviour with unpopulated TLB entries)
Yep, just that now its the ptraceing process which is faulting in the page, instead of the (ptraced) process itself. So Anton, can you move the _tlbie() call up to && !test_bit(PG_arch_1, &page->flags)) { <---------- HERE if (vma->vm_mm == current->active_mm) __flush_dcache_icache((void *) address); else flush_dcache_icache_page(page); set_bit(PG_arch_1, &page->flags); So that it covers both cases instead of just (vma->vm_mm == current->active_mm) ? Its safe to do it because the address space ID is ignored by tlbie accordingly to the manual page: The ASID value in the entry is ignored for the purpose of matching an invalidate address, thus multiple entries can be invalidated if they have the same effective address and different ASID values.