From owner-freebsd-current Wed Oct 2 20:32:11 2002 Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E081137B404 for ; Wed, 2 Oct 2002 20:32:09 -0700 (PDT) Received: from gw.catspoiler.org (217-ip-163.nccn.net [209.79.217.163]) by mx1.FreeBSD.org (Postfix) with ESMTP id 42CD143E81 for ; Wed, 2 Oct 2002 20:32:09 -0700 (PDT) (envelope-from dl-freebsd@catspoiler.org) Received: from mousie.catspoiler.org (mousie.catspoiler.org [192.168.101.2]) by gw.catspoiler.org (8.12.5/8.12.5) with ESMTP id g933W1vU017519; Wed, 2 Oct 2002 20:32:05 -0700 (PDT) (envelope-from dl-freebsd@catspoiler.org) Message-Id: <200210030332.g933W1vU017519@gw.catspoiler.org> Date: Wed, 2 Oct 2002 20:32:01 -0700 (PDT) From: Don Lewis Subject: Re: Junior Kernel Hacker page updated... To: e0026813@stud3.tuwien.ac.at Cc: current@FreeBSD.ORG In-Reply-To: <20021002214028.GA94673@frog.fafoe> MIME-Version: 1.0 Content-Type: TEXT/plain; charset=us-ascii Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On 2 Oct, Stefan Farfeleder wrote: > /freebsd/current/src/sys/vm/uma_core.c:1307: could sleep with "filedesc structure" locked from /freebsd/current/src/sys/kern/kern_event.c:959 > > at me and freezes badly at some point (no breaking into ddb possible). > This is totally repeatable. Is anybody able to reproduce (and maybe > fix) this? It looks like the problem is that knote_attach() calls hashinit() while holding the lock, and that hashinit() calls MALLOC(..., M_WAITOK). Try the following patch: Index: sys/kern/kern_event.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_event.c,v retrieving revision 1.45 diff -u -r1.45 kern_event.c --- sys/kern/kern_event.c 17 Aug 2002 02:36:16 -0000 1.45 +++ sys/kern/kern_event.c 3 Oct 2002 03:10:09 -0000 @@ -953,15 +953,27 @@ static void knote_attach(struct knote *kn, struct filedesc *fdp) { - struct klist *list, *oldlist; + struct klist *list, *oldlist, *tmp_knhash; + u_long tmp_knhashmask; int size, newsize; FILEDESC_LOCK(fdp); if (! kn->kn_fop->f_isfd) { - if (fdp->fd_knhashmask == 0) - fdp->fd_knhash = hashinit(KN_HASHSIZE, M_KQUEUE, - &fdp->fd_knhashmask); + if (fdp->fd_knhashmask == 0) { + FILEDESC_UNLOCK(fdp); + tmp_knhash = hashinit(KN_HASHSIZE, M_KQUEUE, + &tmp_knhashmask); + FILEDESC_LOCK(fdp); + if (fdp->fd_knhashmask == 0) { + fdp->fd_knhash = tmp_knhash; + fdp->fd_knhashmask = tmp_knhashmask; + } else { + FILEDESC_UNLOCK(fdp); + free(tmp_knhash, M_KQUEUE); + FILEDESC_LOCK(fdp); + } + } list = &fdp->fd_knhash[KN_HASH(kn->kn_id, fdp->fd_knhashmask)]; goto done; } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message