Date: Mon, 19 Oct 1998 20:33:52 +1000 From: Bruce Evans <bde@zeta.org.au> To: cvs-all@FreeBSD.ORG, cvs-committers@FreeBSD.ORG, dillon@apollo.backplane.com Subject: Re: Anyone got any ideas? getblk/pgtblk/inode lockup Message-ID: <199810191033.UAA11898@godzilla.zeta.org.au>
next in thread | raw e-mail | index | archive | help
> The code in question is this:
>
> } else if (m->flags & PG_BUSY) {
> s = splvm();
> if (m->flags & PG_BUSY) {
> vm_page_flag_set(m, PG_WANTED);
> tsleep(m, PVM, "pgtblk", 0);
> }
> splx(s);
> goto doretry;
> } ...
>
> Looking at the kernel dump, the page structure 'm' in the process locked
> up in pgtblk has PG_WANTED and PG_TABLED set, but PG_BUSY cleared.
>
> This combined with the code fragment above leads me to believe that
> PG_BUSY is somehow being cleared on the page without waking up the
> process.
PG_BUSY is cleared without a wakeup in vfs_bio.c and vm_kern.c. The wakeup
is apparently important in vfs_bio.c. Untested fix + cosmetic fix for not
always using the specialized inline function for doing the wakeup:
diff -c2 kern/vfs_bio.c~ kern/vfs_bio.c
*** kern/vfs_bio.c~ Wed Oct 14 03:22:21 1998
--- kern/vfs_bio.c Mon Oct 19 20:16:59 1998
***************
*** 1790,1794 ****
vm_page_wire(m);
! vm_page_flag_clear(m, PG_BUSY);
bp->b_flags &= ~B_CACHE;
--- 1831,1835 ----
vm_page_wire(m);
! vm_page_wakeup(m);
bp->b_flags &= ~B_CACHE;
diff -c2 vm/vm_page.c~ vm/vm_page.c
*** vm/vm_page.c~ Sat Sep 5 17:27:51 1998
--- vm/vm_page.c Mon Oct 19 20:18:00 1998
***************
*** 447,455 ****
#endif
! vm_page_flag_clear(m, PG_BUSY);
! if (m->flags & PG_WANTED) {
! vm_page_flag_clear(m, PG_WANTED);
! wakeup(m);
! }
object = m->object;
--- 458,462 ----
#endif
! vm_page_wakeup(m);
object = m->object;
Bruce
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810191033.UAA11898>
