From owner-cvs-src@FreeBSD.ORG Mon Jul 21 10:00:12 2008 Return-Path: Delivered-To: cvs-src@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 39EDB1065671; Mon, 21 Jul 2008 10:00:12 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 1957D8FC1E; Mon, 21 Jul 2008 10:00:12 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m6LA0BNm084665; Mon, 21 Jul 2008 10:00:12 GMT (envelope-from kib@repoman.freebsd.org) Received: (from svn2cvs@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m6LA0BRT084664; Mon, 21 Jul 2008 10:00:11 GMT (envelope-from kib@repoman.freebsd.org) Message-Id: <200807211000.m6LA0BRT084664@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: svn2cvs set sender to kib@repoman.freebsd.org using -f From: Konstantin Belousov Date: Mon, 21 Jul 2008 09:59:40 +0000 (UTC) To: src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org X-FreeBSD-CVS-Branch: RELENG_7 Cc: Subject: cvs commit: src/sys/kern kern_event.c kern_fork.c src/sys/sys event.h X-BeenThere: cvs-src@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: CVS commit messages for the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Jul 2008 10:00:12 -0000 kib 2008-07-21 09:59:40 UTC FreeBSD src repository Modified files: (Branch: RELENG_7) sys/kern kern_event.c kern_fork.c sys/sys event.h Log: SVN rev 180653 on 2008-07-21 09:59:40Z by kib MFC r180340: 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 NOTE_TRACKERR fflag. PR: 108201 Revision Changes Path 1.113.2.4 +67 -15 src/sys/kern/kern_event.c 1.282.2.4 +2 -4 src/sys/kern/kern_fork.c 1.37.2.2 +1 -0 src/sys/sys/event.h