Skip to contentSkip to conversation

BIO Usage Error or Conflicting Designs

DISCUSSION Manfred Spraul 2 participants 2 messages Jan 13, 2002 – Jan 14, 2002 Block layer

lore
Share & tools
lore
#0 lore raw

Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Quoted 5 lines

Is this with the highmem debug stuff enabled? That's the only way I can see this BUG triggering, otherwise q->bounce_pfn _cannot_ be smaller than the max_pfn.

Have you tested that?

Unless I misread arch/i386/kernel/setup.c, line 740 to 760, max_pfn is the upper end of the highmem area, if highmem is configured. For non-highmem setup, it's set to min(system_memory, 4 GB). It was a local variable within setup_arch, and someone made it a global variable.

I.e. max_pfn is 1 GB with Andre's setup.

His patch doesn't touch the bounce limit, the default limit from blk_queue_make_request() is used: BLK_BOUNCE_HIGH, which is max_low_pfn.

max_low_pfn is 896 MB.

--> BUG in create_bounce(), because a request comes in with a bounce limit less than the total system memory, and no highmem configured.

--
Manfred

#1 lore raw
Quoted 15 lines · Manfred Spraul
Quoted 5 lines

Is this with the highmem debug stuff enabled? That's the only way I can see this BUG triggering, otherwise q->bounce_pfn _cannot_ be smaller than the max_pfn.

Have you tested that?

Unless I misread arch/i386/kernel/setup.c, line 740 to 760, max_pfn is the upper end of the highmem area, if highmem is configured. For non-highmem setup, it's set to min(system_memory, 4 GB). It was a local variable within setup_arch, and someone made it a global variable.

I.e. max_pfn is 1 GB with Andre's setup.

Quoted 7 lines

His patch doesn't touch the bounce limit, the default limit from blk_queue_make_request() is used: BLK_BOUNCE_HIGH, which is max_low_pfn.

max_low_pfn is 896 MB.

--> BUG in create_bounce(), because a request comes in with a bounce limit less than the total system memory, and no highmem configured.

Indeed, I misread the max_pfn stuff when I added that.

block/ll_rw_blk.c renamed from opt/kernel/linux-2.5.2-pre11/drivers/block/ll_rw_blk.c +4 -0
@@ -1711,7 +1705,11 @@
 	printk("block: %d slots per queue, batch=%d\n", queue_nr_requests, batch_requests);
 
 	blk_max_low_pfn = max_low_pfn;
+#ifdef CONFIG_HIGHMEM
 	blk_max_pfn = max_pfn;
+#else
+	blk_max_pfn = max_low_pfn;
+#endif
 
 #if defined(CONFIG_IDE) && defined(CONFIG_BLK_DEV_IDE)
 	ide_init();		/* this MUST precede hd_init */
highmem.c renamed from opt/kernel/linux-2.5.2-pre11/mm/highmem.c +0 -6
@@ -367,12 +367,6 @@
 		if (pfn >= blk_max_pfn)
 			return;
 
-#ifndef CONFIG_HIGHMEM
-		/*
-		 * should not hit for non-highmem case
-		 */
-		BUG();
-#endif
 		bio_gfp = GFP_NOHIGHIO;
 		pool = page_pool;
 	} else {
Signature · 1 line
Jens Axboe