Re: Getting nutt...

Bill Hawes (whawes@star.net)
Thu, 07 Aug 1997 11:11:55 -0400


This is a multi-part message in MIME format.
--------------896C7E152D72C2DEF3AF6F7A
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Philippe Strauss wrote:
>
> Ahem, still for this oops-o-matic kernel that I have..

One possible cause for your oopses would be two async IOs started on the
same page. This should never happen, but if it did you would expect
exactly the synptoms you report.

Could you try applying the attached patch to your oops-o-matic (TM)
kernel and see if you can make an oops? If it triggers the tested
conditions, a fix will be easy; otherwise I can rule out these cases.

Regards,
Bill
--------------896C7E152D72C2DEF3AF6F7A
Content-Type: text/plain; charset=us-ascii; name="oops31-patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="oops31-patch"

--- linux-2.0.31/fs/buffer.c.old Wed Aug 6 10:18:22 1997
+++ linux-2.0.31/fs/buffer.c Thu Aug 7 08:24:49 1997
@@ -1274,7 +1281,13 @@
unsigned long block;
int *p, nr[PAGE_SIZE/512];
int i;
+ static int oopsed = 0;

+ if (test_bit(PG_locked, &page->flags)) {
+ printk("generic_readpage: page already locked!\n");
+ if (!oopsed++)
+ *(int *) 0x12345678 = 0;
+ }
page->count++;
set_bit(PG_locked, &page->flags);
set_bit(PG_free_after, &page->flags);
--- linux-2.0.31/mm/page_alloc.c.old Wed Aug 6 10:18:25 1997
+++ linux-2.0.31/mm/page_alloc.c Thu Aug 7 08:24:32 1997
@@ -126,6 +126,13 @@
{
if (!PageReserved(page) && atomic_dec_and_test(&page->count)) {
unsigned long map_nr = page->map_nr;
+ static int oopsed = 0;
+
+ if (test_bit(PG_locked, &page->flags)) {
+ printk("__free_page: page still locked!\n");
+ if (!oopsed++)
+ *(int *) 0x12345678 = 0;
+ }
delete_from_swap_cache(map_nr);
free_pages_ok(map_nr, 0);
}

--------------896C7E152D72C2DEF3AF6F7A--