OpenBSD/sgi on octane2 - mplock周りで落ちるバグについて#2
しかたがないので追っかけてみる事にした。
mplock.hを追っかけやすいようにデバッグprint追加:
static __inline void __mp_lock_init(struct __mp_lock *lock) { asm volatile("nop;nop;nop;"); extern int printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); printf("[%s:%s:%d] lock:%p ra:%p\n", __FILE__, __func__, __LINE__, lock, __builtin_return_address(0)); __cpu_simple_lock_init(&lock->mpl_lock); lock->mpl_cpu = LK_NOCPU; lock->mpl_count = 0; asm volatile("nop;nop;nop;"); } //#if defined(MP_LOCKDEBUG) #ifndef DDB #error "MP_LOCKDEBUG requires DDB" #endif extern void Debugger(void); extern int db_printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); /* CPU-dependent timing, needs this to be settable from ddb. */ extern int __mp_lock_spinout; //#endif static __inline void __mp_lock(struct __mp_lock *lock) { asm volatile("nop;nop;nop;"); int s = spllock(); extern int printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); printf("[%s:%s:%d] lock:%p ra:%p\n", __FILE__, __func__, __LINE__, lock, __builtin_return_address(0)); if (lock->mpl_cpu != cpu_number()) { #ifndef MP_LOCKDEBUG __cpu_simple_lock(&lock->mpl_lock); #else { int got_it; do { int ticks = __mp_lock_spinout; do { got_it = __cpu_simple_lock_try( &lock->mpl_lock); } while (!got_it && ticks-- > 0); if (!got_it) { db_printf( "__mp_lock(0x%x): lock spun out", lock); Debugger(); } } while (!got_it); } if (lock->mpl_lock != __SIMPLELOCK_LOCKED) { db_printf("[%s:%s:%d] lock->mpl_lock != __SIMPLELOCK_LOCKED\n", __FILE__, __func__, __LINE__); Debugger(); } #endif lock->mpl_cpu = cpu_number(); } lock->mpl_count++; splx(s); asm volatile("nop;nop;nop;"); } /* * Try to acquire the lock, if another cpu has it, fill it in the * call-by-reference cpu parameter. Return true if acquired. */ static __inline int __mp_lock_try(struct __mp_lock *lock, cpuid_t *cpu) { asm volatile("nop;nop;nop;"); int s = spllock(); extern int printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); printf("[%s:%s:%d] lock:%p *cpu:%d ra:%p\n", __FILE__, __func__, __LINE__, lock, *cpu, __builtin_return_address(0)); if (lock->mpl_cpu != cpu_number()) { if (!__cpu_simple_lock_try(&lock->mpl_lock)) { *cpu = lock->mpl_cpu; splx(s); return 0; } lock->mpl_cpu = cpu_number(); if (lock->mpl_lock != __SIMPLELOCK_LOCKED) { db_printf("[%s:%s:%d] lock->mpl_lock != __SIMPLELOCK_LOCKED\n", __FILE__, __func__, __LINE__); Debugger(); } } lock->mpl_count++; splx(s); return 1; asm volatile("nop;nop;nop;"); } static __inline void __mp_unlock(struct __mp_lock *lock) { asm volatile("nop;nop;nop;"); int s = spllock(); extern int printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); printf("[%s:%s:%d] lock:%p ra:%p\n", __FILE__, __func__, __LINE__, lock, __builtin_return_address(0)); #ifdef MP_LOCKDEBUG if (lock->mpl_count == 0 || lock->mpl_cpu == LK_NOCPU) { db_printf("__mp_unlock(0x%x): releasing not locked lock\n", lock); Debugger(); } #endif if (--lock->mpl_count == 0) { lock->mpl_cpu = LK_NOCPU; __cpu_simple_unlock(&lock->mpl_lock); if (lock->mpl_lock != __SIMPLELOCK_UNLOCKED) { db_printf("[%s:%s:%d] lock->mpl_lock != __SIMPLELOCK_UNLOCKED\n", __FILE__, __func__, __LINE__); Debugger(); } } splx(s); asm volatile("nop;nop;nop;"); } static __inline int __mp_release_all(struct __mp_lock *lock) { asm volatile("nop;nop;nop;"); int s = spllock(); int rv = lock->mpl_count; extern int printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); printf("[%s:%s:%d] lock:%p ra:%p\n", __FILE__, __func__, __LINE__, lock, __builtin_return_address(0)); #ifdef MP_LOCKDEBUG if (lock->mpl_count == 0 || lock->mpl_cpu == LK_NOCPU) { db_printf( "__mp_release_all(0x%x): releasing not locked lock\n", lock); Debugger(); } #endif lock->mpl_cpu = LK_NOCPU; lock->mpl_count = 0; __cpu_simple_unlock(&lock->mpl_lock); if (lock->mpl_lock != __SIMPLELOCK_UNLOCKED) { db_printf("[%s:%s:%d] lock->mpl_lock != __SIMPLELOCK_LOCKED\n", __FILE__, __func__, __LINE__); Debugger(); } splx(s); return (rv); asm volatile("nop;nop;nop;"); } static __inline int __mp_release_all_but_one(struct __mp_lock *lock) { asm volatile("nop;nop;nop;"); int s = spllock(); int rv = lock->mpl_count - 1; extern int printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); printf("[%s:%s:%d] lock:%p ra:%p\n", __FILE__, __func__, __LINE__, lock, __builtin_return_address(0)); #ifdef MP_LOCKDEBUG if (lock->mpl_count == 0 || lock->mpl_cpu == LK_NOCPU) { db_printf( "__mp_release_all_but_one(0x%x): releasing not locked lock\n", lock); Debugger(); } #endif lock->mpl_count = 1; splx(s); return (rv); asm volatile("nop;nop;nop;"); } static __inline void __mp_acquire_count(struct __mp_lock *lock, int count) { asm volatile("nop;nop;nop;"); int s = spllock(); extern int printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); printf("[%s:%s:%d] lock:%p count:%d ra:%p\n", __FILE__, __func__, __LINE__, lock, count, __builtin_return_address(0)); while (count--) __mp_lock(lock); splx(s); asm volatile("nop;nop;nop;"); } static __inline int __mp_lock_held(struct __mp_lock *lock) { asm volatile("nop;nop;nop;"); extern int printf(const char *, ...) __attribute__((__format__(__kprintf__,1,2))); printf("[%s:%s:%d] lock:%p ra:%p\n", __FILE__, __func__, __LINE__, lock, __builtin_return_address(0)); return lock->mpl_count && lock->mpl_cpu == cpu_number(); asm volatile("nop;nop;nop;"); }
で、結果はこんな感じ:
Option? 5 Command Monitor. Type "exit" to return to the menu. >> bootp()192.168.3.1:bsd Setting $netaddr to 192.168.3.2 (from server ) Obtaining bsd from server 5944752+492712 entry: 0xa800000020020000 ARCS64 Firmware Version 64.0 Found SGI-IP30, setting up. Initial setup done, switching console. cpu_id:0 Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2009 OpenBSD. All rights reserved. http://www.OpenBSD.org [machine/mplock.h:__mp_lock_init:46] lock:0xa800000020617570 ra:0xa80000002004a850 OpenBSD 4.5-current (OCTANE_RAMDISK_MP) #8: Fri May 8 20:35:28 JST 2009 real mem = 1073741824 (1024MB) rsvd mem = 1064960 (1MB) avail mem = 1013731328 (966MB) [machine/mplock.h:__mp_lock_init:46] lock:0xa80000002061f6a0 ra:0xa80000002004ae70 mainbus0 at root cpu0 at mainbus0: MIPS R12000 CPU rev 3.5 400 MHz with R10000 FPU rev 0.0 cpu0: cache L1-I 32KB D 32KB 2 way, L2 2048KB 2 way clock0 at mainbus0: ticker on int5 using count register xbow0 at mainbus0: XBow revision 5 xheart0 at xbow0 widget 8: Heart revision 6 onewire0 at xheart0 owserial0 at onewire0 family 0x0b sn 0000004d74fa owserial0: "PM20400MHZ" p/n 030-1476-001, serial KWL381 "Odyssey" revision 2 at xbow0 widget 11 not configured xbridge0 at xbow0 widget 15: Bridge revision 4 pci0 at xbridge0 bus 0 isp0 at pci0 dev 0 function 0 "QLogic ISP1020" rev 0x05: irq 0 isp0: invalid NVRAM header scsibus0 at isp0: 16 targets, initiator 7 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 sd0 at scsibus0 targ 1 lun 0: <QUANTUM, ATLAS_V__9_SCA, 0238> SCSI3 0/direct fixed [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 sd0: 8682MB, 512 bytes/sec, 17781964 sec total [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 isp1 at pci0 dev 1 function 0 "QLogic ISP1020" rev 0x05: irq 1 isp1: invalid NVRAM header scsibus1 at isp1: 16 targets, initiator 7 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 ioc0 at pci0 dev 2 function 0 "SGI IOC3" rev 0x01 onewire1 at ioc0 owmac0 at onewire1 family 0x09 sn 000002d29696 owmac0: Ethernet Address 08:00:69:13:67:82 owserial1 at onewire1 family 0x0b sn 0000004d4ee4 owserial1: "FP1" p/n 030-0891-003, serial LMR447 owserial2 at onewire1 family 0x0b sn 0000004e12fb owserial2: "PWR.SPPLY.ER" p/n 060-0035-002, serial AAE0420107 ioc0: superio irq 4, ethernet irq 2 com0 at ioc0 base 0x00020178: ns16550a, 16 byte fifo com0: console com1 at ioc0 base 0x00020170: ns16550a, 16 byte fifo "SGI Rad1" rev 0xc0 at pci0 dev 3 function 0 not configured [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa80000002004aeec [machine/mplock.h:__mp_lock:72] lock:0xa800000020617570 ra:0xa8000000200562bc rd0: fixed, 8192 blocks [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa80000002006e44c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa80000002006c254 [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa80000002006c2a0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 boot device: sd0 root on rd0a swap on rd0b dump on rd0b [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 WARNING: No TOD clock, believing file system. WARNING: CHECK AND RESET THE DATE! [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa800000020054d5c [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020053f9c [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa800000020053fb0 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa8000000200663c4 [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa800000020066aa0 [machine/mplock.h:__mp_release_all_but_one:204] lock:0xa80000002061f6a0 ra:0xa80000002006cfb4 [machine/mplock.h:__mp_release_all:174] lock:0xa800000020617570 ra:0xa80000002006da18 [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa80000002006d1cc [machine/mplock.h:__mp_lock_held:237] lock:0xa80000002061f6a0 ra:0xa80000002005d5fc [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_lock:72] lock:0xa80000002061f6a0 ra:0xa8000000200675dc [machine/mplock.h:__mp_unlock:145] lock:0xa80000002061f6a0 ra:0xa8000000200671f4 [machine/mplock.h:__mp_unlock:145] lock:0xa800000020617570 ra:0xa800000020056070 __mp_unlock(0x20617570): releasing not locked lock Stopped at 0xa80000002016768c: jr ra 0xa800000020167690: nop ddb{0}> trace 0xa800000020167688 (0,0,5,d) sp ffffffffcffa3ce8 ra a800000020056270, sz 0 0xa800000020056220 (0,0,5,d) sp ffffffffcffa3ce8 ra 0, sz 0 User-level: pid 1
releasing not locked lockになっているlock:0xa800000020617570への操作のみを抽出してみる:
[machine/mplock.h:__mp_lock_init:46] lock:0xa800000020617570 ra:0xa80000002004a850 (main -> _kernel_lock_init) [machine/mplock.h:__mp_lock:72] lock:0xa800000020617570 ra:0xa8000000200562bc (__mp_lock) [machine/mplock.h:__mp_release_all:174] lock:0xa800000020617570 ra:0xa80000002006da18(mi_switch) [machine/mplock.h:__mp_unlock:145] lock:0xa800000020617570 ra:0xa800000020056070(_kernel_proc_unlock)
init→lock→release_all→unlockでエラー。となっている。
ロック機構が悪いというより、やっぱり呼ぶ側が間違ってる気がする。
では、コール元の_kernel_proc_unlockを見てみる。
void _kernel_proc_unlock(struct proc *p) { atomic_clearbits_int(&p->p_flag, P_BIGLOCK); __mp_unlock(&kernel_lock); }
見事なジャイアントロックだ。
このkernel_lockってのは誰が触ってるんだろうと探してみたら、こんな感じだった:
$ gtags-cscope >> 4kernel_lock cscope: 43 lines arch/amd64/amd64/intr.c <unknown> 630 __mp_lock(&kernel_lock); arch/amd64/amd64/intr.c <unknown> 637 __mp_unlock(&kernel_lock); arch/amd64/amd64/intr.c <unknown> 643 __mp_lock(&kernel_lock); arch/amd64/amd64/intr.c <unknown> 649 __mp_unlock(&kernel_lock); arch/i386/i386/machdep.c <unknown> 3720 __mp_lock(&kernel_lock); arch/i386/i386/machdep.c <unknown> 3731 __mp_unlock(&kernel_lock); arch/i386/i386/machdep.c <unknown> 3737 __mp_lock(&kernel_lock); arch/i386/i386/machdep.c <unknown> 3745 __mp_unlock(&kernel_lock); arch/m88k/m88k/m88k_machdep.c <unknown> 359 __mp_lock(&kernel_lock); arch/m88k/m88k/m88k_machdep.c <unknown> 368 __mp_unlock(&kernel_lock); arch/mvme88k/mvme88k/m187_machdep.c <unknown> 132 __mp_lock(&kernel_lock); arch/mvme88k/mvme88k/m187_machdep.c <unknown> 196 __mp_unlock(&kernel_lock); arch/mvme88k/mvme88k/m188_machdep.c <unknown> 563 __mp_lock(&kernel_lock); arch/mvme88k/mvme88k/m188_machdep.c <unknown> 680 __mp_unlock(&kernel_lock); arch/mvme88k/mvme88k/m197_machdep.c <unknown> 204 __mp_lock(&kernel_lock); arch/mvme88k/mvme88k/m197_machdep.c <unknown> 257 __mp_unlock(&kernel_lock); arch/mvme88k/mvme88k/m197_machdep.c <unknown> 700 __mp_lock(&kernel_lock); arch/mvme88k/mvme88k/m197_machdep.c <unknown> 720 __mp_unlock(&kernel_lock); arch/sparc64/sparc64/intr.c <unknown> 365 __mp_lock(&kernel_lock); arch/sparc64/sparc64/intr.c <unknown> 372 __mp_unlock(&kernel_lock); kern/kern_fork.c <unknown> 522 KASSERT(__mp_lock_held(&kernel_lock) == 0); kern/kern_lock.c <unknown> 750 * Functions for manipulating the kernel_lock. We put them here kern/kern_lock.c <unknown> 754 struct __mp_lock kernel_lock; kern/kern_lock.c <unknown> 757 _kernel_lock_init(void) kern/kern_lock.c <unknown> 759 __mp_lock_init(&kernel_lock); kern/kern_lock.c <unknown> 768 _kernel_lock(void) kern/kern_lock.c <unknown> 771 __mp_lock(&kernel_lock); kern/kern_lock.c <unknown> 777 __mp_unlock(&kernel_lock); kern/kern_lock.c <unknown> 781 * Acquire/release the kernel_lock on behalf of a process. Intended for kern/kern_lock.c <unknown> 788 __mp_lock(&kernel_lock); kern/kern_lock.c <unknown> 796 __mp_unlock(&kernel_lock); kern/kern_sched.c <unknown> 184 KASSERT(__mp_lock_held(&kernel_lock) == 0); kern/sched_bsd.c <unknown> 366 * Release the kernel_lock, as we are about to yield the CPU. kern/sched_bsd.c <unknown> 370 hold_count = __mp_release_all(&kernel_lock); kern/sched_bsd.c <unknown> 447 * Reacquire the kernel_lock now. We do this after we've kern/sched_bsd.c <unknown> 452 __mp_acquire_count(&kernel_lock, hold_count); sys/mplock.h <unknown> 46 extern struct __mp_lock kernel_lock; sys/systm.h <unknown> 320 void _kernel_lock_init(void); sys/systm.h <unknown> 321 void _kernel_lock(void); sys/systm.h <unknown> 326 #define KERNEL_LOCK_INIT() _kernel_lock_init() sys/systm.h <unknown> 327 #define KERNEL_LOCK() _kernel_lock() xfs/xfs_config.h <unknown> 455 /* Define to 1 if you have the `kernel_lockmgr' function. */ xfs/xfs_config.h <unknown> 458 /* Define to 1 if you have the `kernel_lockstatus' function. */
結構ジャイアントロック使ってんだなぁ。
このカーネルはロック粒度を下げるって作業はあまり進んでないんだろうか。
_kernel_proc_unlock()はsys/systm.hで以下のようにマクロ経由で使われている:
#if defined(MULTIPROCESSOR) void _kernel_lock_init(void); void _kernel_lock(void); void _kernel_unlock(void); void _kernel_proc_lock(struct proc *); void _kernel_proc_unlock(struct proc *); #define KERNEL_LOCK_INIT() _kernel_lock_init() #define KERNEL_LOCK() _kernel_lock() #define KERNEL_UNLOCK() _kernel_unlock() #define KERNEL_PROC_LOCK(p) _kernel_proc_lock((p)) #define KERNEL_PROC_UNLOCK(p) _kernel_proc_unlock((p)) #else /* ! MULTIPROCESSOR */ #define KERNEL_LOCK_INIT() /* nothing */ #define KERNEL_LOCK() /* nothing */ #define KERNEL_UNLOCK() /* nothing */ #define KERNEL_PROC_LOCK(p) /* nothing */ #define KERNEL_PROC_UNLOCK(p) /* nothing */ #endif /* MULTIPROCESSOR */
このマクロを追ってみるのが良いかな。