Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Oct 2005 14:39:55 -0600 (MDT)
From:      joonas <joonas@3jane.math.ualberta.ca>
To:        FreeBSD-gnats-submit@FreeBSD.org
Cc:        Machine Owner <bvowk@math.ualberta.ca>
Subject:   misc/87544: mmaping large files on a gbde filesystem deadlocks the system
Message-ID:  <200510162039.j9GKdtEB001309@3jane.math.ualberta.ca>
Resent-Message-ID: <200510162040.j9GKeHu0000533@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         87544
>Category:       misc
>Synopsis:       mmaping large files on a gbde filesystem deadlocks the system
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Oct 16 20:40:16 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     joonas
>Release:        FreeBSD 5.4-RC3 amd64
>Organization:
Helsinki University
>Environment:
System: FreeBSD 3jane.math.ualberta.ca 5.4-RC3 FreeBSD 5.4-RC3 #1: Wed Sep 14 13:20:57 MDT 2005 bvowk@3jane.math.ualberta.ca:/usr/obj/usr/src/sys/SMP amd64

	
Hi, 

It appears that large file i/o using mmap on files residing in an encrypted filesystem may deadlock the kernel.  The problem is repeatable using the python program below, a test of a large 2D byte array class using mmap backed files.

Machine details:

3jane: ~ $ uname -a
FreeBSD 3jane.math.ualberta.ca 5.4-RC3 FreeBSD 5.4-RC3 #1: Wed Sep 14 13:20:57 MDT 2005     bvowk@3jane.math.ualberta.ca:/usr/obj/usr/src/sys/SMP  amd64

3jane: ~ $ python
Python 2.4 (#2, Feb  9 2005, 09:38:26) 
[GCC 3.4.2 [FreeBSD] 20040728] on freebsd5
Type "help", "copyright", "credits" or "license" for more information.
>Description:

The python program does this: write an ~1GB file, mmap it into memory using MAP_SHARED and PROT_READ|PROT_WRITE, write a byte to every 80000'th byte in the file, unmap file; rinse & repeat five more times.  Sometime after writing out the first file it seems like the system deadlocks.  Namely, system cpu usage is up at 75%, 25% idle, with no i/o happening at all.  The system won't come out of deadlock, won't respond to ssh, but must be manually rebooted.  My sysadmin said he could type on the console, but the system didn't respond.

>How-To-Repeat:

Cut & paste the following program into tmp.py and run "python tmp.py" in a directory on an encrypted filesystem.   Open another window, go to the directory, and repeatedly do ls -lrt.  At some point the system will hang.  On a gbde file system io stops completely.  When run on a non-gbde file system the the disks churn like mad, and even though repeated ls -lrt hang also then, it also unhangs after a while and the program completes successfully.

---START---
import sys
import mmap
import os

# python is choking at mmap indices ~ 220M.
MAXCHUNKSIZE = 1024*1024*1024L
WANTCHUNKSIZE = MAXCHUNKSIZE

class charary:

    def __init__(self, basename, width, height, initval='\000'):
        self.width = width
        self.height = height
        self.basename = basename
        self.initval = initval

        totbytes = int(width)*1L*int(height)

        maxchunksize = WANTCHUNKSIZE
        self.rows_per_chunk = (maxchunksize + width - 1) / width
        while self.rows_per_chunk*width > MAXCHUNKSIZE:
                self.rows_per_chunk += -1
        self.chunksize = self.rows_per_chunk * width
        self.nchunks = (totbytes + self.chunksize-1) / self.chunksize

        assert self.rows_per_chunk > 0

        self.curchix = None;
        self.curmap = None

    def initfile(self, fd, size):
        i=0
        len = 16384
        block = self.initval * len
        os.lseek(fd, 0, 0)
        while i + len < size: 
            os.write(fd, block)
            i += len
        while i < size:
            os.write(fd, self.initval)
            i += 1
        os.lseek(fd, 0, 0)


    def mapchunk(self, chix):
        if chix <> self.curchix:
            if self.curmap <> None:
                self.curmap.close()
                self.curmap = None
            filename = "%s%03d" % (self.basename, chix)
            filesize = self.chunksize
            if chix == self.nchunks - 1:
                filesize = (self.height % self.rows_per_chunk)*self.width

            fd = os.open(filename, os.O_RDWR | os.O_CREAT)
            sbuf = os.fstat(fd)
            if sbuf.st_size < filesize:
                self.initfile(fd, filesize)
            self.curchix = chix
            self.curmap = mmap.mmap(fd, filesize, mmap.MAP_SHARED)
        return self.curmap

    def get(self,x,y):
        chix = y / self.rows_per_chunk
        c = self.mapchunk(chix)
        y = y % self.rows_per_chunk
        return c[x + self.width*y]

    def set(self,x,y,val):
        chix = y / self.rows_per_chunk
        c = self.mapchunk(chix)
        y = y % self.rows_per_chunk
        c[x + self.width*y] = val

    def close(self):
        if self.curchix <> None:
                self.curmap.close()
                self.curchix = None
                self.curmap = None

n=80000
a = charary("./ary", n, n)
for i in xrange(n):
        a.get(10, i)
        a.set(10,i,'A')
---END---

Best Regards,

Joonas
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
 >>> 
 
 3jane: ~ $ dmesg
 Copyright (c) 1992-2005 The FreeBSD Project.
 Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
         The Regents of the University of California. All rights reserved.
 FreeBSD 5.4-RC3 #1: Wed Sep 14 13:20:57 MDT 2005
     bvowk@3jane.math.ualberta.ca:/usr/obj/usr/src/sys/SMP
 Timecounter "i8254" frequency 1193182 Hz quality 0
 CPU: AMD Opteron(tm) Processor 248 (2191.53-MHz K8-class CPU)
   Origin = "AuthenticAMD"  Id = 0xf5a  Stepping = 10
   Features=0x78bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,
 MMX,FXSR,SSE,SSE2>
   AMD Features=0xe0500800<SYSCALL,NX,MMX+,LM,3DNow+,3DNow>
 real memory  = 2147418112 (2047 MB)
 avail memory = 2061656064 (1966 MB)
 ACPI APIC Table: <A M I  OEMAPIC >
 FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
  cpu0 (BSP): APIC ID:  0
  cpu1 (AP): APIC ID:  1
 MADT: Forcing active-low polarity and level trigger for SCI
 ioapic0 <Version 1.1> irqs 0-23 on motherboard
 acpi0: <A M I OEMXSDT> on motherboard
 acpi0: Power Button (fixed)
 Timecounter "ACPI-safe" frequency 3579545 Hz quality 1000
 acpi_timer0: <24-bit timer at 3.579545MHz> port 0x5008-0x500b on acpi0
 cpu0: <ACPI CPU> on acpi0
 acpi_throttle0: <ACPI CPU Throttling> on cpu0
 cpu1: <ACPI CPU> on acpi0
 pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
 pci0: <ACPI PCI bus> on pcib0
 agp0: <AMD 8151 AGP graphics tunnel> mem 0xf0000000-0xf7ffffff at device 0.0 on pci0
 pcib1: <ACPI PCI-PCI bridge> at device 1.0 on pci0
 pci2: <ACPI PCI bus> on pcib1
 pci2: <display, VGA> at device 0.0 (no driver attached)
 pci2: <display> at device 0.1 (no driver attached)
 pcib2: <ACPI PCI-PCI bridge> at device 6.0 on pci0
 pci1: <ACPI PCI bus> on pcib2
 ohci0: <OHCI (generic) USB controller> mem 0xff4fd000-0xff4fdfff irq 19 at device 0.0 on pci1
 usb0: OHCI version 1.0, legacy support
 usb0: SMM does not respond, resetting
 usb0: <OHCI (generic) USB controller> on ohci0
 usb0: USB revision 1.0
 uhub0: AMD OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
 uhub0: 3 ports with 3 removable, self powered
 ohci1: <OHCI (generic) USB controller> mem 0xff4fe000-0xff4fefff irq 19 at device 0.1 on pci1
 usb1: OHCI version 1.0, legacy support
 usb1: SMM does not respond, resetting
 usb1: <OHCI (generic) USB controller> on ohci1
 usb1: USB revision 1.0
 uhub1: AMD OHCI root hub, class 9/0, rev 1.00/1.00, addr 1
 uhub1: 3 ports with 3 removable, self powered
 em0: <Intel(R) PRO/1000 Network Connection, Version - 1.7.35> port 0x8c00-0x8c3f mem 0xff4a0000-0xff4
 bffff,0xff4c0000-0xff4dffff irq 18 at device 3.0 on pci1
 em0: Ethernet address: 00:e0:81:2c:0e:4e
 em0:  Speed:N/A  Duplex:N/A
 atapci0: <SiI 3114 SATA150 controller> port 0x9c00-0x9c0f,0xa000-0xa003,0xa400-0xa407,0xa800-0xa803,0
 xac00-0xac07 mem 0xff4ffc00-0xff4fffff irq 19 at device 5.0 on pci1
 ata2: channel #0 on atapci0
 ata3: channel #1 on atapci0
 ata4: channel #2 on atapci0
 ata5: channel #3 on atapci0
 pci1: <serial bus, FireWire> at device 10.0 (no driver attached)
 uhci0: <VIA 83C572 USB controller> port 0x9400-0x941f irq 17 at device 11.0 on pci1
 usb2: <VIA 83C572 USB controller> on uhci0
 usb2: USB revision 1.0
 uhub2: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
 uhub2: 2 ports with 2 removable, self powered
 uhci1: <VIA 83C572 USB controller> port 0x9800-0x981f irq 18 at device 11.1 on pci1
 usb3: <VIA 83C572 USB controller> on uhci1
 usb3: USB revision 1.0
 uhub3: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
 uhub3: 2 ports with 2 removable, self powered
 ehci0: <VIA VT6202 USB 2.0 controller> mem 0xff4ff800-0xff4ff8ff irq 19 at device 11.2 on pci1
 usb4: EHCI version 1.0
 usb4: companion controllers, 2 ports each: usb2 usb3
 usb4: <VIA VT6202 USB 2.0 controller> on ehci0
 usb4: USB revision 2.0
 uhub4: VIA EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
 uhub4: 4 ports with 4 removable, self powered
 isab0: <PCI-ISA bridge> at device 7.0 on pci0
 isa0: <ISA bus> on isab0
 atapci1: <AMD 8111 UDMA133 controller> port 0xffa0-0xffaf,0x376,0x170-0x177,0x3f6,0x1f0-0x1f7 at devi
 ce 7.1 on pci0
 ata0: channel #0 on atapci1
 ata1: channel #1 on atapci1
 pci0: <serial bus, SMBus> at device 7.2 (no driver attached)
 pci0: <bridge> at device 7.3 (no driver attached)
 pci0: <multimedia, audio> at device 7.5 (no driver attached)
 acpi_button0: <Power Button> on acpi0
 sio0: configured irq 4 not in bitmap of probed irqs 0
 sio0: port may not be enabled
 sio0: <16550A-compatible COM port> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
 sio0: type 16550A
 sio1: configured irq 3 not in bitmap of probed irqs 0
 sio1: port may not be enabled
 sio1: <16550A-compatible COM port> port 0x2f8-0x2ff irq 3 on acpi0
 sio1: type 16550A
 fdc0: <floppy drive controller (FDE)> port 0x3f7,0x3f0-0x3f5 irq 6 drq 2 on acpi0
 ppc0: <Standard parallel printer port> port 0x378-0x37f irq 7 on acpi0
 ppc0: Generic chipset (NIBBLE-only) in COMPATIBLE mode
 ppbus0: <Parallel port bus> on ppc0
 plip0: <PLIP network interface> on ppbus0
 lpt0: <Printer> on ppbus0
 lpt0: Interrupt-driven port
 ppi0: <Parallel I/O> on ppbus0
 orm0: <ISA Option ROMs> at iomem 0xd0000-0xd47ff,0xc0000-0xcffff on isa0
 atkbdc0: <Keyboard controller (i8042)> at port 0x64,0x60 on isa0
 sc0: <System console> at flags 0x100 on isa0
 sc0: VGA <16 virtual consoles, flags=0x300>
 vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
 ums0: Logitech Trackball, rev 1.10/2.20, addr 2, iclass 3/1
 ums0: 3 buttons and Z dir.
 uhub5: PI Engineering Kinesis Keyboard Hub, class 9/0, rev 1.10/3.20, addr 2
 uhub5: 4 ports with 2 removable, bus powered
 ukbd0: P.I. Engineering product 0x0007, rev 1.10/3.20, addr 3, iclass 3/1
 kbd0 at ukbd0
 uhid0: P.I. Engineering product 0x0007, rev 1.10/3.20, addr 3, iclass 3/1
 ums1: Microsoft Microsoft Wheel Mouse Optical\M-., rev 1.10/1.21, addr 2, iclass 3/1
 ums1: 3 buttons and Z dir.
 Timecounters tick every 1.000 msec
 em0: Link is up 1000 Mbps Full Duplex
 ad0: 114473MB <ST3120026A/3.06> [232581/16/63] at ata0-master UDMA100
 acd0: DVDR <HL-DT-ST DVDRAM GSA-4120B/A102> at ata1-slave PIO4
 ad4: 114473MB <ST3120827AS/3.42> [232581/16/63] at ata2-master SATA150
 ad6: 114473MB <ST3120827AS/3.42> [232581/16/63] at ata3-master SATA150
 ar0: 228942MB <ATA RAID0 array> [29186/255/63] status: READY subdisks:
  disk0 READY on ad4 at ata2-master
  disk1 READY on ad6 at ata3-master
 SMP: AP CPU #1 Launched!
 Mounting root from ufs:/dev/ad0s1a
 WARNING: / was not properly dismounted
 WARNING: /usr was not properly dismounted
 WARNING: /var was not properly dismounted
 WARNING: /mysql was not properly dismounted
 em0: Link is up 1000 Mbps Full Duplex
 Accounting enabled
 Accounting suspended
 drm0: <ATI Radeon RV280 9200> port 0xb800-0xb8ff mem 0xff5f0000-0xff5fffff,0xe0000000-0xe7ffffff irq 
 16 at device 0.0 on pci2
 info: [drm] AGP at 0xf0000000 128MB
 info: [drm] Initialized radeon 1.11.0 20020828 on minor 0
 info: [drm] Loading R200 Microcode
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200510162039.j9GKdtEB001309>