From owner-freebsd-current Sat Jan 23 11:44:56 1999 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id LAA08215 for freebsd-current-outgoing; Sat, 23 Jan 1999 11:44:56 -0800 (PST) (envelope-from owner-freebsd-current@FreeBSD.ORG) Received: from nlsystems.com (nlsys.demon.co.uk [158.152.125.33]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id LAA08206 for ; Sat, 23 Jan 1999 11:44:52 -0800 (PST) (envelope-from dfr@nlsystems.com) Received: from localhost (dfr@localhost) by nlsystems.com (8.9.1/8.8.5) with SMTP id TAA72666; Sat, 23 Jan 1999 19:45:48 GMT Date: Sat, 23 Jan 1999 19:45:48 +0000 (GMT) From: Doug Rabson To: Peter Wemm cc: Matthew Dillon , current@FreeBSD.ORG Subject: Re: panic: found dirty cache page 0xf046f1c0 In-Reply-To: <199901231928.DAA00732@spinner.netplex.com.au> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG On Sun, 24 Jan 1999, Peter Wemm wrote: > Doug Rabson wrote: > > On Sat, 23 Jan 1999, Matthew Dillon wrote: > > > > > > > > :I made it happen again by doing the same installworld but this time I > > > :caught it in the debugger. I'll leave the machine up for a while in case > > > :someone has some idea of how to debug it. The stacktrace looks like this: > > > : > > > :#0 Debugger () at ../../alpha/alpha/db_interface.c:260 > > > :#1 0xfffffc000036c2c0 in panic () at ../../kern/kern_shutdown.c:444 > > > :#2 0xfffffc00004942fc in vm_page_alloc () at ../../vm/vm_page.c:1041 > > > :#3 0xfffffc00003a1b54 in allocbuf () at ../../kern/vfs_bio.c:1791 > > > > > > The panic message should be printing the address of the vm_page_t that > > > it caught. > > > > > > From the debugger, dump that vm_page_t with 'print'. > > > > > > print *0xADDRESS > > > > > > Do about 8 print's bumping the address by 4 ( in hex ) for each. > > > > > > It would be even better if we could figure out the contents and type > > > of the underlying object. > > > > I have full symbols: > > > > (gdb) fr 2 > > #2 0xfffffc00004942fc in vm_page_alloc () at ../../vm/vm_page.c:1041 > > 1041 panic("found dirty cache page %p", m); > > (gdb) l > > 1036 */ > > 1037 > > 1038 if (qtype == PQ_CACHE) { > > 1039 #if !defined(MAX_PERF) > > 1040 if (m->dirty) > > 1041 panic("found dirty cache page %p", m); > > 1042 > > 1043 #endif > > 1044 vm_page_busy(m); > > 1045 vm_page_protect(m, VM_PROT_NONE); > > (gdb) p m > > $4 = (struct vm_page *) 0xfffffe0000108f40 > > (gdb) p *m > > $5 = {pageq = {tqe_next = 0x0, tqe_prev = 0xfffffc000052ecc8}, hnext = 0x0, > > listq = {tqe_next = 0xfffffe0000090fe0, tqe_prev = 0xfffffe00000bb6b8}, > > object = 0xfffffe00050e2a10, pindex = 12, phys_addr = 88940544, queue = 172 > , > > flags = 128, pc = 41, wire_count = 0, hold_count = 0, act_count = 5 '\005', > > > busy = 0 '\000', valid = 65535, dirty = 65535} > > > -- > > Doug, Matt wanted some things from m->object too.. If it's still there > can you grab it? > > printf( > "found dirty cache page %p (%p,%d,%x) obtype %d obflags %x", > m, > m->object, > (int)m->pindex, > (int)m->flags, > (int)m->object->type, > (int)m->object->flags > ); He sent me private mail asking for m->object which I replied to. Here is *m->object: $6 = {object_list = {tqe_next = 0xfffffe0005369870, tqe_prev = 0xfffffe000527e0b8}, shadow_head = {tqh_first = 0x0, tqh_last = 0xfffffe00050e2a20}, shadow_list = {tqe_next = 0x0, tqe_prev = 0xfffffe00052d2020}, memq = {tqh_first = 0xfffffe00000c8f80, tqh_last = 0xfffffe0000115a78}, generation = 897, type = OBJT_DEFAULT, size = 23, ref_count = 1, shadow_count = 0, pg_color = 4, hash_rand = -15145890, flags = 8192, paging_in_progress = 0, behavior = 0, resident_page_count = 15, cache_count = 15, wire_count = 0, backing_object = 0x0, backing_object_offset = 0, last_read = 0, pager_object_list = {tqe_next = 0x0, tqe_prev = 0x0}, handle = 0x0, un_pager = {vnp = {vnp_size = 754}, devp = {devp_pglist = { tqh_first = 0x2f2, tqh_last = 0x0}}, swp = {swp_bcount = 754}}} > > BTW; in vm_map.c: > /* > * vm_map_clean > * > * Push any dirty cached pages in the address range to their pager. > * If syncio is TRUE, dirty pages are written synchronously. > * If invalidate is TRUE, any cached pages are freed as well. > * > * Returns an error if any part of the specified range is not mapped. > */ > This kinda suggests that dirty cached pages might not be all that > unusual.. but the code in question seems to be working at a different > level. I'm not too familiar with this code. It is only called from msync(2) as far as I can see. -- Doug Rabson Mail: dfr@nlsystems.com Nonlinear Systems Ltd. Phone: +44 181 442 9037 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message