Date: Fri, 16 Jan 2004 14:13:15 -0500 (EST) From: Andrew Gallatin <gallatin@cs.duke.edu> To: Doug White <dwhite@gumbysoft.com> Cc: current@freebsd.org Subject: Re: Fatal trap under heavy load on 5.1-p10... Message-ID: <16392.14283.178714.344108@grasshopper.cs.duke.edu> In-Reply-To: <20040116091901.V92448@carver.gumbysoft.com> References: <200401160250.54593.Peter_Losher@isc.org> <20040116091901.V92448@carver.gumbysoft.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Doug White writes:
>
> I know you've been doing some perf tuning, but you've probably hit a bug.
> You're the heaviest load thats ever been put on that code :)
>
> It was changed last November so there's newer code out there.
>
FWIW, It could be panicing because I forgot to deal with
sf_buf_alloc() returning null. I've send the following patch (against
-current) to Alan for review.
In my own defense, I wrote the code against 4.0, when
sf_buf_alloc() ignored signals and could never return null.
But I botched the integration into -current.
Drew
Index: kern/uipc_cow.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/uipc_cow.c,v
retrieving revision 1.16
diff -u -r1.16 uipc_cow.c
--- kern/uipc_cow.c 16 Nov 2003 06:11:25 -0000 1.16
+++ kern/uipc_cow.c 16 Jan 2004 17:22:15 -0000
@@ -60,18 +60,12 @@
struct netsend_cow_stats {
int attempted;
int fail_not_mapped;
- int fail_wired;
- int fail_not_anon;
- int fail_pmap_cow;
- int fail_pg_error;
- int fail_kva;
- int free_post_exit;
+ int fail_sf_buf;
int success;
int iodone;
- int freed;
};
-static struct netsend_cow_stats socow_stats = {0,0,0,0,0,0,0,0,0,0,0};
+static struct netsend_cow_stats socow_stats;
static void socow_iodone(void *addr, void *args);
@@ -141,7 +135,22 @@
* Allocate an sf buf
*/
sf = sf_buf_alloc(pp);
-
+ if (!sf) {
+ vm_page_lock_queues();
+ vm_page_cowclear(pp);
+ vm_page_unwire(pp, 0);
+ /*
+ * Check for the object going away on us. This can
+ * happen since we don't hold a reference to it.
+ * If so, we're responsible for freeing the page.
+ */
+ if (pp->wire_count == 0 && pp->object == NULL)
+ vm_page_free(pp);
+ vm_page_unlock_queues();
+ socow_stats.fail_sf_buf++;
+ splx(s);
+ return(0);
+ }
/*
* attach to mbuf
*/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?16392.14283.178714.344108>
