[Bug 211947] bconsole won't die sitting on do_rw_wrlock

[email protected]
Newsgroups gmane.os.freebsd.devel.threading
Message-ID <[email protected]/bugzilla/>
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=211947

[email protected] changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |[email protected]

--- Comment #1 from [email protected] ---
I need help with this problem and give some more infos:

bconsole creates two threads: watchdog and checker_deadlock. When trying to
quit bconsole the main thread sends first a special ping to the watchdog thread
and this thread always stops cleanly without any problems. Second the main
thread tries to stop the sleeping thread checker_deadlock with
pthread_cancel(). Both the main thread and the checker_deadlock thread do some
housekeeping in exit routines. I give ktraces of good and bad case starting
with pthread_cancel:

good (quit exits normally):
 54503 100490 bconsole CALL  thr_kill(0x18b71,SIG 32)
 54503 100490 bconsole RET   thr_kill 0
 54503 101233 bconsole RET   nanosleep -1 errno 4 Interrupted system call
 54503 101233 bconsole PSIG  SIG 32 caught handler=0x80205b080 mask=0x0
code=SI_LWP
 54503 100490 bconsole CALL  _umtx_op(0x802270880,UMTX_OP_RW_WRLOCK,0,0,0)
 54503 101233 bconsole CALL  thr_wake(0x18b71)
 54503 100490 bconsole RET   _umtx_op 0
 54503 101233 bconsole RET   thr_wake 0
 54503 101233 bconsole CALL  thr_wake(0x18b71)
 54503 101233 bconsole RET   thr_wake 0
 54503 101233 bconsole CALL  sigreturn(0x7fffdfffda60)
 54503 101233 bconsole RET   sigreturn JUSTRETURN
 54503 100490 bconsole CALL  _umtx_op(0x802270880,UMTX_OP_RW_WRLOCK,0,0,0)
 54503 100490 bconsole RET   _umtx_op 0
 54503 101233 bconsole CALL  _umtx_op(0x802270880,UMTX_OP_RW_RDLOCK,0,0,0)
 54503 101233 bconsole RET   _umtx_op 0
 54503 100490 bconsole CALL  _umtx_op(0x802270880,UMTX_OP_RW_WRLOCK,0,0,0)
 54503 100490 bconsole RET   _umtx_op 0
 54503 101233 bconsole CALL  _umtx_op(0x802270880,UMTX_OP_RW_RDLOCK,0,0,0)
 54503 101233 bconsole RET   _umtx_op 0
 54503 100490 bconsole CALL  _umtx_op(0x802270880,UMTX_OP_RW_WRLOCK,0,0,0)
 54503 101233 bconsole CALL  _umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 54503 101233 bconsole RET   _umtx_op 0
 54503 100490 bconsole RET   _umtx_op 0
 54503 101233 bconsole CALL  _umtx_op(0x802270880,UMTX_OP_RW_RDLOCK,0,0,0)
 54503 101233 bconsole RET   _umtx_op 0
 54503 101233 bconsole CALL  munmap(0x800663000,0x1000)
 54503 101233 bconsole RET   munmap 0
 54503 101233 bconsole CALL  madvise(0x803806000,0x8000,MADV_FREE)
 54503 101233 bconsole RET   madvise 0
 54503 100490 bconsole CALL  exit(0)
 54503 101233 bconsole CALL  thr_exit(0x803406800) 

bad (hang on quit):
 62196 100096 bconsole 0.655701 CALL  thr_kill(0x186f8,SIG 32)
 62196 100096 bconsole 0.655717 RET   thr_kill 0
 62196 100088 bconsole 0.655726 RET   nanosleep -1 errno 4 Interrupted system
call
 62196 100088 bconsole 0.655742 PSIG  SIG 32 caught handler=0x80205b080
mask=0x0 code=SI_LWP
 62196 100096 bconsole 0.655766 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_WRLOCK,0,0,0)
 62196 100088 bconsole 0.655770 CALL  thr_wake(0x186f8)
 62196 100096 bconsole 0.655774 RET   _umtx_op 0
 62196 100088 bconsole 0.655781 RET   thr_wake 0
 62196 100088 bconsole 0.655791 CALL  thr_wake(0x186f8)
 62196 100088 bconsole 0.655795 RET   thr_wake 0
 62196 100088 bconsole 0.655800 CALL  sigreturn(0x7fffdfffda60)
 62196 100088 bconsole 0.655807 RET   sigreturn JUSTRETURN
 62196 100096 bconsole 0.655830 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_WRLOCK,0,0,0)
 62196 100096 bconsole 0.655837 RET   _umtx_op 0
 62196 100088 bconsole 0.655838 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_RDLOCK,0,0,0)
 62196 100088 bconsole 0.655848 RET   _umtx_op 0
 62196 100096 bconsole 0.655848 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_WRLOCK,0,0,0)
 62196 100088 bconsole 0.655862 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.655875 RET   _umtx_op 0
 62196 100088 bconsole 0.655885 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_RDLOCK,0,0,0)
 62196 100096 bconsole 0.655885 RET   _umtx_op 0
 62196 100088 bconsole 0.655897 RET   _umtx_op -1 errno 4 Interrupted system
call
 62196 100096 bconsole 0.655901 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.655903 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_RDLOCK,0,0,0)
 62196 100096 bconsole 0.655912 RET   _umtx_op 0
 62196 100088 bconsole 0.655915 RET   _umtx_op 0
 62196 100096 bconsole 0.655930 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_WRLOCK,0,0,0)
 62196 100088 bconsole 0.655930 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.655942 RET   _umtx_op 0
 62196 100088 bconsole 0.655952 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.655956 RET   _umtx_op 0
 62196 100088 bconsole 0.655966 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.655971 RET   _umtx_op 0
 62196 100088 bconsole 0.655978 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.655982 RET   _umtx_op 0
 62196 100088 bconsole 0.655989 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.655993 RET   _umtx_op 0
 62196 100088 bconsole 0.655999 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.656005 RET   _umtx_op 0
 62196 100088 bconsole 0.656010 CALL80,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.656014 RET   _umtx_op 0
 62196 100088 bconsole 0.656022 CALL 
_umtx_op(0x802270880,UMTX_OP_RW_UNLOCK,0,0,0)
 62196 100088 bconsole 0.656026 RET   _umtx_op 0
 62196 100088 bconsole 0.656032 CALL  munmap(0x800663000,0x1000)
 62196 100088 bconsole 0.656042 RET   munmap 0
 62196 100088 bconsole 0.656089 CALL  madvise(0x803806000,0x8000,MADV_FREE)
 62196 100088 bconsole 0.656099 RET   madvise 0
 62196 100088 bconsole 0.656105 CALL  thr_exit(0x803406800)

and the main thread does not die, he sits on WCHAN uwrlck. Especially I like to
know, why the kernel sends a second signal to the checker_deadlock thread.

I can avoid the libthr/kernel problem by sleeping some ms in the main thread
after pthread_cancel(), the resulting ktrace looks like rather clean, because
no _umtx_op calls to the kernel are necessary:

 81803 100271 bconsole 8.425361 CALL  thr_kill(0x18a20,SIG 32)
 81803 100271 bconsole 8.425374 RET   thr_kill 0
 81803 100271 bconsole 8.425380 CALL  nanosleep(0x7fffffffe2f0,0)
 81803 100896 bconsole 8.425382 RET   nanosleep -1 errno 4 Interrupted system
call
 81803 100896 bconsole 8.425400 PSIG  SIG 32 caught handler=0x80205b080
mask=0x0 code=SI_LWP
 81803 100896 bconsole 8.425426 CALL  thr_wake(0x18a20)
 81803 100896 bconsole 8.425433 RET   thr_wake 0
 81803 100896 bconsole 8.425438 CALL  thr_wake(0x18a20)
 81803 100896 bconsole 8.425442 RET   thr_wake 0
 81803 100896 bconsole 8.425446 CALL  sigreturn(0x7fffdfffda60)
 81803 100896 bconsole 8.425452 RET   sigreturn JUSTRETURN
 81803 100896 bconsole 8.425519 CALL  munmap(0x800663000,0x1000)
 81803 100896 bconsole 8.425529 RET   munmap 0
 81803 100896 bconsole 8.425575 CALL  madvise(0x80380e000,0x22000,MADV_FREE)
 81803 100896 bconsole 8.425585 RET   madvise 0
 81803 100896 bconsole 8.425595 CALL  madvise(0x803806000,0x8000,MADV_FREE)
 81803 100896 bconsole 8.425603 RET   madvise 0
 81803 100896 bconsole 8.425609 CALL  thr_exit(0x803406800)
 81803 100271 bconsole 8.427522 RET   nanosleep 0
 81803 100271 bconsole 8.427717 CALL  exit(0)

In my opinion this problem must be solved in libthr/kernel and not in userland.

-- 
You are receiving this mail because:
You are the assignee for the bug.
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-threads
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.