Mark Kettenis <mark.kette...@xs4all.nl> writes: > I'm looking for testers for this diff. This should be safe to run on > amd64, i386 and sparc64. But has been reported to lock up i386 > machines. I can't reproduce this on any of my own systems. So I'm > looking for help. I'm looking for people that are able to build a > kernel with this diff and the MP_LOCKDEBUG option enabled > (uncommented) in their GENERIC.MP kernel, run it on an MP machine and > put some load on it to see if it locks up and/or panics. > > Being able to move forward with this would make OpenBSD run > significantly better on MP systems. > > Thanks, > > Mark > > > Index: uvm_addr.c > =================================================================== > RCS file: /home/cvs/src/sys/uvm/uvm_addr.c,v > retrieving revision 1.13 > diff -u -p -r1.13 uvm_addr.c > --- uvm_addr.c 30 Mar 2015 21:08:40 -0000 1.13 > +++ uvm_addr.c 4 Apr 2015 11:08:49 -0000 > @@ -287,14 +287,19 @@ uvm_addr_init(void) > { > pool_init(&uaddr_pool, sizeof(struct uvm_addr_state), > 0, 0, PR_WAITOK, "uaddr", NULL); > + pool_setipl(&uaddr_pool, IPL_VM); > pool_init(&uaddr_hint_pool, sizeof(struct uaddr_hint_state), > 0, 0, PR_WAITOK, "uaddrhint", NULL); > + pool_setipl(&uaddr_hint_pool, IPL_VM); > pool_init(&uaddr_bestfit_pool, sizeof(struct uaddr_bestfit_state), > 0, 0, PR_WAITOK, "uaddrbest", NULL); > + pool_setipl(&uaddr_bestfit_pool, IPL_VM); > pool_init(&uaddr_pivot_pool, sizeof(struct uaddr_pivot_state), > 0, 0, PR_WAITOK, "uaddrpivot", NULL); > + pool_setipl(&uaddr_pivot_pool, IPL_VM); > pool_init(&uaddr_rnd_pool, sizeof(struct uaddr_rnd_state), > 0, 0, PR_WAITOK, "uaddrrnd", NULL); > + pool_setipl(&uaddr_rnd_pool, IPL_VM); > > uaddr_kbootstrap.uaddr_minaddr = PAGE_SIZE; > uaddr_kbootstrap.uaddr_maxaddr = -(vaddr_t)PAGE_SIZE; > Index: uvm_map.c > =================================================================== > RCS file: /home/cvs/src/sys/uvm/uvm_map.c,v > retrieving revision 1.191 > diff -u -p -r1.191 uvm_map.c > --- uvm_map.c 23 Apr 2015 00:49:37 -0000 1.191 > +++ uvm_map.c 28 Apr 2015 20:55:03 -0000 > @@ -1842,8 +1842,10 @@ uvm_unmap_kill_entry(struct vm_map *map, > { > /* Unwire removed map entry. */ > if (VM_MAPENT_ISWIRED(entry)) { > + KERNEL_LOCK(); > entry->wired_count = 0; > uvm_fault_unwire_locked(map, entry->start, entry->end); > + KERNEL_UNLOCK(); > } > > /* Entry-type specific code. */ > @@ -2422,18 +2424,20 @@ void > uvm_map_teardown(struct vm_map *map) > { > struct uvm_map_deadq dead_entries; > - int i, waitok = 0; > struct vm_map_entry *entry, *tmp; > #ifdef VMMAP_DEBUG > size_t numq, numt; > #endif > + int i; > > - if ((map->flags & VM_MAP_INTRSAFE) == 0) > - waitok = 1; > - if (waitok) { > - if (rw_enter(&map->lock, RW_NOSLEEP | RW_WRITE) != 0) > - panic("uvm_map_teardown: rw_enter failed on free map"); > - } > + KERNEL_ASSERT_LOCKED(); > + KERNEL_UNLOCK(); > + KERNEL_ASSERT_UNLOCKED(); > + > + KASSERT((map->flags & VM_MAP_INTRSAFE) == 0); > + > + if (rw_enter(&map->lock, RW_NOSLEEP | RW_WRITE) != 0) > + panic("uvm_map_teardown: rw_enter failed on free map"); > > /* Remove address selectors. */ > uvm_addr_destroy(map->uaddr_exe); > @@ -2466,8 +2470,7 @@ uvm_map_teardown(struct vm_map *map) > if ((entry = RB_ROOT(&map->addr)) != NULL) > DEAD_ENTRY_PUSH(&dead_entries, entry); > while (entry != NULL) { > - if (waitok) > - uvm_pause(); > + sched_pause(); > uvm_unmap_kill_entry(map, entry); > if ((tmp = RB_LEFT(entry, daddrs.addr_entry)) != NULL) > DEAD_ENTRY_PUSH(&dead_entries, tmp); > @@ -2477,8 +2480,7 @@ uvm_map_teardown(struct vm_map *map) > entry = TAILQ_NEXT(entry, dfree.deadq); > } > > - if (waitok) > - rw_exit(&map->lock); > + rw_exit(&map->lock); > > #ifdef VMMAP_DEBUG > numt = numq = 0; > @@ -2488,7 +2490,10 @@ uvm_map_teardown(struct vm_map *map) > numq++; > KASSERT(numt == numq); > #endif > - uvm_unmap_detach(&dead_entries, waitok ? UVM_PLA_WAITOK : 0); > + uvm_unmap_detach(&dead_entries, UVM_PLA_WAITOK); > + > + KERNEL_LOCK(); > + > pmap_destroy(map->pmap); > map->pmap = NULL; > } > @@ -3185,6 +3190,8 @@ void > uvmspace_init(struct vmspace *vm, struct pmap *pmap, vaddr_t min, vaddr_t > max, > boolean_t pageable, boolean_t remove_holes) > { > + KASSERT(pmap == NULL || pmap == pmap_kernel()); > + > if (pmap) > pmap_reference(pmap); > else
Hi, Compiled kernel with this on my Thinkpad X201 (amd64). I run few compilations in parallel (kernel + few ports) in background with normal desktop use and got load bumped to ~8.0. So far no regressions spotted. I'll continue to with this. Timo OpenBSD 5.8-beta (GENERIC.MP) #27: Wed Jul 8 22:50:34 EEST 2015 r...@mandrake.wickedbsd.net:/usr/src/sys/arch/amd64/compile/GENERIC.MP real mem = 8357658624 (7970MB) avail mem = 8100495360 (7725MB) mpath0 at root scsibus0 at mpath0: 256 targets mainbus0 at root bios0 at mainbus0: SMBIOS rev. 2.6 @ 0xe0010 (78 entries) bios0: vendor LENOVO version "6QET69WW (1.39 )" date 04/26/2012 bios0: LENOVO 32492EU acpi0 at bios0: rev 2 acpi0: sleep states S0 S3 S4 S5 acpi0: tables DSDT FACP SSDT ECDT APIC MCFG HPET ASF! SLIC BOOT SSDT TCPA DMAR SSDT SSDT SSDT acpi0: wakeup devices LID_(S3) SLPB(S3) IGBE(S4) EXP1(S4) EXP2(S4) EXP3(S4) EXP4(S4) EXP5(S4) EHC1(S3) EHC2(S3) HDEF(S4) acpitimer0 at acpi0: 3579545 Hz, 24 bits acpiec0 at acpi0 acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat cpu0 at mainbus0: apid 0 (boot processor) cpu0: Intel(R) Core(TM) i5 CPU M 540 @ 2.53GHz, 2793.42 MHz cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT,AES,NXE,LONG,LAHF,PERF,ITSC,SENSOR,ARAT cpu0: 256KB 64b/line 8-way L2 cache cpu0: smt 0, core 0, package 0 mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges cpu0: apic clock running at 133MHz cpu0: mwait min=64, max=64, C-substates=0.2.1.1, IBE cpu1 at mainbus0: apid 1 (application processor) cpu1: Intel(R) Core(TM) i5 CPU M 540 @ 2.53GHz, 2793.01 MHz cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT,AES,NXE,LONG,LAHF,PERF,ITSC,SENSOR,ARAT cpu1: 256KB 64b/line 8-way L2 cache cpu1: smt 1, core 0, package 0 cpu2 at mainbus0: apid 4 (application processor) cpu2: Intel(R) Core(TM) i5 CPU M 540 @ 2.53GHz, 2793.01 MHz cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT,AES,NXE,LONG,LAHF,PERF,ITSC,SENSOR,ARAT cpu2: 256KB 64b/line 8-way L2 cache cpu2: smt 0, core 2, package 0 cpu3 at mainbus0: apid 5 (application processor) cpu3: Intel(R) Core(TM) i5 CPU M 540 @ 2.53GHz, 2793.01 MHz cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT,AES,NXE,LONG,LAHF,PERF,ITSC,SENSOR,ARAT cpu3: 256KB 64b/line 8-way L2 cache cpu3: smt 1, core 2, package 0 ioapic0 at mainbus0: apid 1 pa 0xfec00000, version 20, 24 pins ioapic0: misconfigured as apic 2, remapped to apid 1 acpimcfg0 at acpi0 addr 0xe0000000, bus 0-255 acpihpet0 at acpi0: 14318179 Hz acpiprt0 at acpi0: bus 0 (PCI0) acpiprt1 at acpi0: bus -1 (PEG_) acpiprt2 at acpi0: bus 13 (EXP1) acpiprt3 at acpi0: bus -1 (EXP2) acpiprt4 at acpi0: bus -1 (EXP3) acpiprt5 at acpi0: bus 5 (EXP4) acpiprt6 at acpi0: bus 2 (EXP5) acpicpu0 at acpi0: C3(350@245 mwait.3@0x20), C2(500@205 mwait.3@0x10), C1(1000@3 mwait.1), PSS acpicpu1 at acpi0: C3(350@245 mwait.3@0x20), C2(500@205 mwait.3@0x10), C1(1000@3 mwait.1), PSS acpicpu2 at acpi0: C3(350@245 mwait.3@0x20), C2(500@205 mwait.3@0x10), C1(1000@3 mwait.1), PSS acpicpu3 at acpi0: C3(350@245 mwait.3@0x20), C2(500@205 mwait.3@0x10), C1(1000@3 mwait.1), PSS acpipwrres0 at acpi0: PUBS, resource for EHC1, EHC2 acpitz0 at acpi0: critical temperature is 100 degC acpibtn0 at acpi0: LID_ acpibtn1 at acpi0: SLPB acpibat0 at acpi0: BAT0 model "42T4650" serial 8908 type LION oem "Panasonic" acpibat1 at acpi0: BAT1 not present acpiac0 at acpi0: AC unit online acpithinkpad0 at acpi0 acpidock0 at acpi0: GDCK not docked (0) cpu0: Enhanced SpeedStep 2793 MHz: speeds: 2534, 2533, 2399, 2266, 2133, 1999, 1866, 1733, 1599, 1466, 1333, 1199 MHz pci0 at mainbus0 bus 0 pchb0 at pci0 dev 0 function 0 "Intel Core Host" rev 0x02 vga1 at pci0 dev 2 function 0 "Intel HD Graphics" rev 0x02 intagp0 at vga1 agp0 at intagp0: aperture at 0xd0000000, size 0x10000000 inteldrm0 at vga1 drm0 at inteldrm0 inteldrm0: 1280x800 wsdisplay0 at vga1 mux 1: console (std, vt100 emulation) wsdisplay0: screen 1-5 added (std, vt100 emulation) "Intel 3400 MEI" rev 0x06 at pci0 dev 22 function 0 not configured puc0 at pci0 dev 22 function 3 "Intel 3400 KT" rev 0x06: ports: 1 com com4 at puc0 port 0 apic 1 int 17: ns16550a, 16 byte fifo com4: probed fifo depth: 0 bytes em0 at pci0 dev 25 function 0 "Intel 82577LM" rev 0x06: msi, address 00:26:2d:f1:da:75 ehci0 at pci0 dev 26 function 0 "Intel 3400 USB" rev 0x06: apic 1 int 23 usb0 at ehci0: USB revision 2.0 uhub0 at usb0 "Intel EHCI root hub" rev 2.00/1.00 addr 1 azalia0 at pci0 dev 27 function 0 "Intel 3400 HD Audio" rev 0x06: msi azalia0: codecs: Conexant/0x5069, Intel/0x2804, using Conexant/0x5069 audio0 at azalia0 ppb0 at pci0 dev 28 function 0 "Intel 3400 PCIE" rev 0x06: msi pci1 at ppb0 bus 13 ppb1 at pci0 dev 28 function 3 "Intel 3400 PCIE" rev 0x06: msi pci2 at ppb1 bus 5 ppb2 at pci0 dev 28 function 4 "Intel 3400 PCIE" rev 0x06: msi pci3 at ppb2 bus 2 iwn0 at pci3 dev 0 function 0 "Intel Centrino Advanced-N 6200" rev 0x35: msi, MIMO 2T2R, MoW, address 00:23:14:23:6e:18 ehci1 at pci0 dev 29 function 0 "Intel 3400 USB" rev 0x06: apic 1 int 19 usb1 at ehci1: USB revision 2.0 uhub1 at usb1 "Intel EHCI root hub" rev 2.00/1.00 addr 1 ppb3 at pci0 dev 30 function 0 "Intel 82801BAM Hub-to-PCI" rev 0xa6 pci4 at ppb3 bus 14 pcib0 at pci0 dev 31 function 0 "Intel QM57 LPC" rev 0x06 ahci0 at pci0 dev 31 function 2 "Intel 3400 AHCI" rev 0x06: msi, AHCI 1.3 ahci0: port 0: 3.0Gb/s scsibus1 at ahci0: 32 targets sd0 at scsibus1 targ 0 lun 0: <ATA, INTEL SSDSA2M160, 2CV1> SCSI3 0/direct fixed naa.5001517959106b36 sd0: 152627MB, 512 bytes/sector, 312581808 sectors, thin ichiic0 at pci0 dev 31 function 3 "Intel 3400 SMBus" rev 0x06: apic 1 int 23 iic0 at ichiic0 spdmem0 at iic0 addr 0x50: 4GB DDR3 SDRAM PC3-10600 SO-DIMM spdmem1 at iic0 addr 0x51: 4GB DDR3 SDRAM PC3-10600 SO-DIMM itherm0 at pci0 dev 31 function 6 "Intel 3400 Thermal" rev 0x06 isa0 at pcib0 isadma0 at isa0 pckbc0 at isa0 port 0x60/5 irq 1 irq 12 pckbd0 at pckbc0 (kbd slot) wskbd0 at pckbd0: console keyboard, using wsdisplay0 pms0 at pckbc0 (aux slot) wsmouse0 at pms0 mux 0 pcppi0 at isa0 port 0x61 spkr0 at pcppi0 aps0 at isa0 port 0x1600/31 pci5 at mainbus0 bus 255 pchb1 at pci5 dev 0 function 0 "Intel QuickPath" rev 0x02 pchb2 at pci5 dev 0 function 1 "Intel QuickPath" rev 0x02 pchb3 at pci5 dev 2 function 0 "Intel QPI Link" rev 0x02 pchb4 at pci5 dev 2 function 1 "Intel QPI Physical" rev 0x02 pchb5 at pci5 dev 2 function 2 "Intel Reserved" rev 0x02 pchb6 at pci5 dev 2 function 3 "Intel Reserved" rev 0x02 uhub2 at uhub0 port 1 "Intel Rate Matching Hub" rev 2.00/0.00 addr 2 ugen0 at uhub2 port 3 "UPEK Biometric Coprocessor" rev 1.01/0.02 addr 3 ugen1 at uhub2 port 4 "Broadcom Corp Broadcom Bluetooth Device" rev 2.00/3.60 addr 4 uhub3 at uhub1 port 1 "Intel Rate Matching Hub" rev 2.00/0.00 addr 2 vscsi0 at root scsibus2 at vscsi0: 256 targets softraid0 at root scsibus3 at softraid0: 256 targets sd1 at scsibus3 targ 1 lun 0: <OPENBSD, SR CRYPTO, 005> SCSI2 0/direct fixed sd1: 152625MB, 512 bytes/sector, 312576113 sectors root on sd1a (741cf65615793b8b.a) swap on sd1b dump on sd1b