[Linux-ia64] Re: SW IO TLB buffer management in kernel test10

From: Hirofumi Fujita <h-fujita_at_ebina.hitachi.co.jp>
Date: 2000-11-17 13:48:17
Thanks. I understand the problem.

I tried the patch but swiotlb=8192 option is needed to successfully
format 4GB ext2 partition, otherwise kernel panics.

I don't know why such huge buffer is needed.

Hirofumi Fujita
Hitachi, Ltd.

> 
> Hello,
> From: Hirofumi Fujita <h-fujita@ebina.hitachi.co.jp>
> Subject: [Linux-ia64] SW IO TLB buffer management in kernel test10
> Date: Wed, 15 Nov 2000 17:15:52 +0900
> 
>> there seems to be a problem on buffer management of SW IO TLB.
>> The contents of io_tlb_list[] become broken.
> ...
>> I applied the attached patch and kernel panic when mke2fs /dev/sda4.
>> (QLogic BIOS setting: >4GB addressing is disabled)
>> Kernel panic: __pci_map_single: could not allocate software IO TLB (16384 bytes)
>> At this time, io_tlb_list[] are almost 0.
> ...
>> With swiotlb=8192 option, mke2fs successes,
>> but 60% of io_tlb_list[] remain 0 after mke2fs finished.
>> This is because pci_unmap is not called correctly ?
> 
> I think it's because your patch makes pci_unmap do nothing on io_tlb_list[].
> In __pci_unmap_single, making 2 steps apart has its meaning.
> 
> The patch should be something like this?


--- arch/ia64/kernel/pci-dma.c	2000/11/07 06:49:39	1.1.1.4.2.1
+++ arch/ia64/kernel/pci-dma.c	2000/11/15 13:50:28
@@ -109,7 +109,8 @@
 {
 	unsigned long flags;
 	char *dma_addr;
-	unsigned int i, nslots, stride, index, wrap;
+	unsigned int nslots, stride, index, wrap, count;
+	int i;
 
 	/*
 	 * For mappings greater than a page size, we limit the stride (and hence alignment)
@@ -133,7 +134,7 @@
 		wrap = index = ALIGN(io_tlb_index, stride);
 
 		if (index >= io_tlb_nslabs) 
-			index = 0;
+			wrap = index = 0;
 
 		do {
 			/*
@@ -144,6 +145,9 @@
 			if (io_tlb_list[index] >= nslots) {
 				for (i = index; i < index + nslots; i++)
 					io_tlb_list[i] = 0;
+				count = 0;
+				for (i = index - 1; (i >= 0) && io_tlb_list[i]; i--)
+					io_tlb_list[i] = ++count;
 				dma_addr = io_tlb_start + (index << IO_TLB_SHIFT);
 
 				/*
Received on Thu Nov 16 18:49:58 2000

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:00 EST