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

Reply via email to