Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: NFS swap on current appears to deadlock



On Mon, May 18, 2020 at 09:41:17PM +0000, Andrew Doran wrote:
> Hi,
> 
> Finally got around to trying this.  Having beaten on it for a while with
> real hardware I don't see any problem with swapping over NFS on 9.99.63.

Sorry for the delay, finally getting around to trying this again.

I wonder - was your test unicore or multi? I have qemu configured with
a single core.

> On Sat, May 02, 2020 at 12:06:48PM +1000, Paul Ripke wrote:
> 
> > I have a qemu guest for experimenting with -current, 1 CPU & 64MiB RAM.
> 
> 64 megs, I'm surprised it makes to the login prompt.

Ok, it's 128MiB now for a KASAN kernel... and still appears to lock up
fairly easily. Note, this is via tmpfs, but I can get the same lockup
just allocating anonymous memory, as below:

qemu:ksh$ uname -a
NetBSD qemu 9.99.67 NetBSD 9.99.67 (QEMU) #29: Wed Jun 17 09:44:35 AEST 2020  stix@slave:/home/netbsd/current/obj.amd64/home/netbsd/current/src/sys/arch/amd64/compile/QEMU amd64
qemu:ksh$ swapctl -lk
Device      1K-blocks     Used    Avail Capacity  Priority
/dev/wd0b      131040     2224   128816     2%    0
qemu:ksh$ df -k /tmp
Filesystem    1K-blocks       Used      Avail %Cap Mounted on
tmpfs            128104          4     128100   0% /tmp
qemu:ksh$ dd if=/dev/zero of=/tmp/zz bs=64k count=1600
1600+0 records in
1600+0 records out
104857600 bytes transferred in 27.861 secs (3763597 bytes/sec)
qemu:ksh$ rm /tmp/zz
qemu:ksh$ sudo swapctl -a /swap
qemu:ksh$ swapctl -lk
Device      1K-blocks     Used    Avail Capacity  Priority
/dev/wd0b      131040     9472   121568     7%    0
/swap         1048576        0  1048576     0%    0
Total         1179616     9472  1170144     1%
qemu:ksh$ dd if=/dev/zero of=/tmp/zz bs=64k count=1600
<lockup>

Or, via anonymous:

qemu:ksh$ swapctl -lk
Device      1K-blocks     Used    Avail Capacity  Priority
/dev/wd0b      131040     9596   121444     7%    0
qemu:ksh$ dd if=/dev/zero of=/dev/null bs=20m count=1
1+0 records in
1+0 records out
20971520 bytes transferred in 4.242 secs (4943781 bytes/sec)
qemu:ksh$ sudo swapctl -a /swap
qemu:ksh$ swapctl -lk                                
Device      1K-blocks     Used    Avail Capacity  Priority
/dev/wd0b      131040    10468   120572     8%    0
/swap         1048576        0  1048576     0%    0
Total         1179616    10468  1169148     1%
qemu:ksh$ dd if=/dev/zero of=/dev/null bs=20m count=1
<lockup>

Once locked up, there's a <30% chance the an NMI will drop me into ddb.
When it does, I see a variety of stacks, which change if I continue and
retrigger an NMI, eg:

binuptime() at netbsd:binuptime+0xbe
mi_switch() at netbsd:mi_switch+0xdd
sleepq_block() at netbsd:sleepq_block+0xf1
mtsleep() at netbsd:mtsleep+0x1bb
uao_get() at netbsd:uao_get+0x643
ubc_alloc() at netbsd:ubc_alloc+0x49d
ubc_uiomove() at netbsd:ubc_uiomove+0x280
tmpfs_write() at netbsd:tmpfs_write+0x2a4
VOP_WRITE() at netbsd:VOP_WRITE+0x11f
vn_write() at netbsd:vn_write+0x16b
dofilewrite() at netbsd:dofilewrite+0x19e
sys_write() at netbsd:sys_write+0x78
syscall() at netbsd:syscall+0x4d2
--- syscall (number 4) ---
netbsd:syscall+0x4d2:

lockdebug_unlocked() at netbsd:lockdebug_unlocked+0x439
mutex_exit() at netbsd:mutex_exit+0x1b8
uvm_pageout() at netbsd:uvm_pageout+0x1f7

binuptime() at netbsd:binuptime+0xbe
mi_switch() at netbsd:mi_switch+0xdd
sleepq_block() at netbsd:sleepq_block+0xf1
mtsleep() at netbsd:mtsleep+0x1bb
uvmfault_anonget() at netbsd:uvmfault_anonget+0x5c9
uvm_fault_internal() at netbsd:uvm_fault_internal+0x1f78
trap() at netbsd:trap+0x814
--- trap (number 6) ---
_ustore_8() at netbsd:_ustore_8+0x21
ttread() at netbsd:ttread+0x6ab
cdev_read() at netbsd:cdev_read+0xca
cnread() at netbsd:cnread+0xe3
cdev_read() at netbsd:cdev_read+0xca
spec_read() at netbsd:spec_read+0x1ce
VOP_READ() at netbsd:VOP_READ+0x11f
vn_read() at netbsd:vn_read+0xd7
dofileread() at netbsd:dofileread+0x1a9
sys_read() at netbsd:sys_read+0x78
syscall() at netbsd:syscall+0x4d2
--- syscall (number 3) ---
netbsd:syscall+0x4d2:

And from an older kernel:

binuptime() at netbsd:binuptime+0xbe
mi_switch() at netbsd:mi_switch+0xe1
sleepq_block() at netbsd:sleepq_block+0xed
mtsleep() at netbsd:mtsleep+0x1b8
uvm_pageout() at netbsd:uvm_pageout+0xa3c

mutex_enter() at netbsd:mutex_enter+0x1ab
uvmpdpol_tune() at netbsd:uvmpdpol_tune+0x15
uvm_pageout() at netbsd:uvm_pageout+0x1f7

binuptime() at netbsd:binuptime+0xbe
mi_switch() at netbsd:mi_switch+0xe1
sleepq_block() at netbsd:sleepq_block+0xed
mtsleep() at netbsd:mtsleep+0x1b8
uvmfault_anonget() at netbsd:uvmfault_anonget+0x5c9
uvm_fault_internal() at netbsd:uvm_fault_internal+0x1f78
trap() at netbsd:trap+0x814
--- trap (number 6) ---
copyout() at netbsd:copyout+0x33
sys___kevent50() at netbsd:sys___kevent50+0x8a
syscall() at netbsd:syscall+0x4d7
--- syscall (number 435) ---
netbsd:syscall+0x4d7:

lockdebug_wantlock() at netbsd:lockdebug_wantlock+0xbb
mutex_enter() at netbsd:mutex_enter+0x6a8
sleepq_remove() at netbsd:sleepq_remove+0x289
sleepq_wake() at netbsd:sleepq_wake+0xa2
uvm_wait() at netbsd:uvm_wait+0x61
uvmfault_anonget() at netbsd:uvmfault_anonget+0x5c9
uvm_fault_internal() at netbsd:uvm_fault_internal+0x1f78
trap() at netbsd:trap+0x814
--- trap (number 6) ---
copyout() at netbsd:copyout+0x33
syscall() at netbsd:syscall+0x4d7
--- syscall (number 430) ---
netbsd:syscall+0x4d7:

-- 
Paul Ripke
"Great minds discuss ideas, average minds discuss events, small minds
 discuss people."
-- Disputed: Often attributed to Eleanor Roosevelt. 1948.


Home | Main Index | Thread Index | Old Index