Date: Wed, 15 Apr 1998 11:21:32 -0700 (PDT) From: Matt Dillon <dillon@best.net> To: Poul-Henning Kamp <phk@FreeBSD.ORG> Cc: freebsd-bugs@FreeBSD.ORG Subject: Re: kern/6258 Message-ID: <199804151821.LAA28517@flea.best.net>
next in thread | raw e-mail | index | archive | help
:
:Old Synopsis: A fix required to prevent kernel lockups in brelse causes the dump program to lockup in 'newbuf'
:New Synopsis: A fix required to prevent kernel lockups in brelse causes the dump program to lockup in 'newbuf' [2.2 ISSUE]
:
:State-Changed-From-To: open-analyzed
:State-Changed-By: phk
:State-Changed-When: Wed Apr 15 10:08:26 PDT 1998
:State-Changed-Why:
:merge to 2.2 issue
Oh, I should add something to the bug report... in email I think the
FreeBSD folks decided to fold in the -current changes to fix this problem.
The patch I included in the bug report would therefore not be used.
However, since I did submit the patch I should probably submit an update
to it as the patch I submitted has a bug in. The bp scan I added in the
patch overwrites the 'bp' variable which is used later on.
-Matt
Matthew Dillon Engineering, BEST Internet Communications, Inc.
<dillon@best.net>
[always include a portion of the original email in any response!]
--- LINK/vfs_bio.c Fri Mar 13 13:13:57 1998
+++ vfs_bio.c Mon Apr 13 17:21:49 1998
@@ -597,10 +597,12 @@
LIST_REMOVE(bp, b_hash);
LIST_INSERT_HEAD(&invalhash, bp, b_hash);
bp->b_dev = NODEV;
+#ifdef notdef
/*
* Get rid of the kva allocation *now*
*/
bfreekva(bp);
+#endif
if (needsbuffer) {
wakeup(&needsbuffer);
needsbuffer=0;
@@ -986,9 +988,34 @@
*/
if (vm_map_findspace(buffer_map,
vm_map_min(buffer_map), maxsize, &addr)) {
- bp->b_flags |= B_INVAL;
- brelse(bp);
- goto trytofreespace;
+ struct buf *bp2;
+
+ /*
+ * Matt hack. Since we can't call bfreekva() in
+ * brelse(), the bp's on the EMPTY list may all
+ * still have allocated KVM. If we can't find
+ * unused space in the buffer_map, we should try
+ * to defragment the map by freeing as much from
+ * the empty list as possible.
+ */
+ printf("vm_map_findspace() failed, defragmenting freelist\n");
+ for (bp2 = TAILQ_FIRST(&bufqueues[QUEUE_EMPTY]);
+ bp2;
+ bp2 = TAILQ_NEXT(bp2, b_freelist)
+ ) {
+ if (bp2->b_kvasize)
+ bfreekva(bp2);
+ if (bp2->b_qindex != QUEUE_EMPTY)
+ break;
+ }
+ addr = 0;
+ if (vm_map_findspace(buffer_map,
+ vm_map_min(buffer_map), maxsize, &addr)) {
+
+ bp->b_flags |= B_INVAL;
+ brelse(bp);
+ goto trytofreespace;
+ }
}
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199804151821.LAA28517>
