cvs commit: src/sys/kern kern_event.c kern_fork.c src/sys/sys
kib at FreeBSD.org
Mon Jul 21 10:00:12 UTC 2008
kib 2008-07-21 09:59:40 UTC
FreeBSD src repository
Modified files: (Branch: RELENG_7)
sys/kern kern_event.c kern_fork.c
SVN rev 180653 on 2008-07-21 09:59:40Z by kib
The kqueue_register() function assumes that it is called from the top of
the syscall code and acquires various event subsystem locks as needed.
The handling of the NOTE_TRACK for EVFILT_PROC is currently done by
calling the kqueue_register() from filt_proc() filter, causing recursive
entrance of the kqueue code. This results in the LORs and recursive
acquisition of the locks.
Implement the variant of the knote() function designed to only handle
the fork() event. It mostly copies the knote() body, but also handles
the NOTE_TRACK, removing the handling from the filt_proc(), where it
causes problems described above. The function is called from the fork1()
instead of knote().
When encountering NOTE_TRACK knote, it marks the knote as influx
and drops the knlist and kqueue lock. In this context call to
kqueue_register is safe from the problems.
An error from the kqueue_register() is reported to the observer as
Revision Changes Path
18.104.22.168 +67 -15 src/sys/kern/kern_event.c
1.282.2.4 +2 -4 src/sys/kern/kern_fork.c
22.214.171.124 +1 -0 src/sys/sys/event.h
More information about the cvs-src