From owner-freebsd-current@FreeBSD.ORG Mon Jun 9 19:45:36 2008 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 852DC1065686 for ; Mon, 9 Jun 2008 19:45:36 +0000 (UTC) (envelope-from kevinxlinuz@163.com) Received: from m13-90.163.com (m13-90.163.com [220.181.13.90]) by mx1.freebsd.org (Postfix) with SMTP id 4CAE58FC5A for ; Mon, 9 Jun 2008 19:45:34 +0000 (UTC) (envelope-from kevinxlinuz@163.com) Received: from 219.82.150.198 ( 219.82.150.198 [219.82.150.198] ) by ajax-webmail-wmsvr90 (Coremail) ; Tue, 10 Jun 2008 03:30:27 +0800 (CST) Date: Tue, 10 Jun 2008 03:30:27 +0800 (CST) From: kevinxlinuz To: freebsd-current@freebsd.org Message-ID: <3760478.505011213039827828.JavaMail.coremail@bj163app90.163.com> MIME-Version: 1.0 X-Originating-IP: [192.168.208.54 (219.82.150.198)] X-Priority: 3 X-Mailer: Coremail Webmail Server Version XT_Ux_snapshot build 080521(5485.1718.1717) Copyright (c) 2002-2008 www.mailtech.cn 163com Content-Type: text/plain; charset=gbk Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Subject: mutex sleepq chain not owned at /usr/src/sys/kern/subr_sleepqueue.c X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Jun 2008 19:45:37 -0000 Recently I meet a problem in freebsd 8.0/amd64. See PR/124200 http://www.freebsd.org/cgi/query-pr.cgi?pr=124200&cat= I try to find the reason. in cv_broadcastpri(...),it call sleepq_lock(cvp),next it call sleepq_broadcast(cvp, SLEEPQ_CONDVAR, pri, 0). in sleepq_broadcast(void *wchan, int flags, int pri, int queue),sleepqueue sq = sleepq_lookup(wchan) /* here wchan will be checked,and sq->sq_wchan == wchan == cvp (passed from cv_broadcastpri())*/; I add mtx_assert in /usr/src/sys/kern/subr_sleepqueue.c sleepq_broadcast(void *wchan, int flags, int pri, int queue) { struct sleepqueue *sq; struct thread *td; struct sleepqueue_chain *sc; CTR2(KTR_PROC, "sleepq_broadcast(%p, %d)", wchan, flags); KASSERT(wchan != NULL, ("%s: invalid NULL wait channel", __func__)); MPASS((queue >= 0) && (queue < NR_SLEEPQS)); sq = sleepq_lookup(wchan); //wchan == cvp, cvp from cv_broadcastpri(...),and sleepq_lock(cvp) //here sq->sq_wchan == wchan == cvp if (sq == NULL) return; KASSERT(sq->sq_type == (flags & SLEEPQ_TYPE), ("%s: mismatch between sleep/wakeup and cv_*", __func__)); /* Resume all blocked threads on the sleep queue. */ while (!TAILQ_EMPTY(&sq->sq_blocked[queue])) { td = TAILQ_FIRST(&sq->sq_blocked[queue]); thread_lock(td); /* ------test start---------- */ sc = SC_LOOKUP(sq->sq_wchan); //sq->sq_wchan should be wchan mtx_assert(&sc->sc_lock, MA_OWNED); //panic here,sq->sq_wchan != wchan ? or sleepq_unlock(wchan) was called by others /* -----test end----- */ sleepq_resume_thread(sq, td, pri); thread_unlock(td); } }