Hello, From: Hirofumi Fujita 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92 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); /* -- NOMURA, Jun'ichi HPC Operating System Group, 1st Computers Software Division, Computers Software Operations Unit, NEC Solutions.