Date: Sat, 23 Aug 2008 00:03:43 -0400 From: John Baldwin <jhb@freebsd.org> To: freebsd-current@freebsd.org Cc: kevinxlinuz <kevinxlinuz@163.com> Subject: Re: [BUG] I think sleepqueue need to be protected in sleepq_broadcast Message-ID: <200808230003.44081.jhb@freebsd.org> In-Reply-To: <11617822.2511219426408994.JavaMail.coremail@bj163app64.163.com> References: <11617822.2511219426408994.JavaMail.coremail@bj163app64.163.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Friday 22 August 2008 01:33:28 pm kevinxlinuz wrote: > Hi, > I'm looking in the problem ( amd64/124200: kernel panic on mutex sleepq > chain).It troubles me for a long time.I add a KASSERT in sleepq_broadcast() > to check the sleepqueue's wait channel.At last it turn out that the > sleepqueue's wait channel was changed before sleepq_resume_thread(). In > sleepq_lookup(),We can easily find sq->sq_wchan == wchan.But after a short > time,the sq->sq_wchan nolonger equal with wchan,so I think it was changed > by other threads. The sleepq chain lock is already held for all of sleepq_broadcast() by the caller (see wakeup() and cv_broadcastpri()). That said, I don't have any other good ideas for the panic you are seeing. Do you have a crash dump? It might be interesting to see what other thread is using that sleep queue. > sleepq_broadcast(void *wchan, int flags, int pri, int queue) > { > struct sleepqueue *sq; > struct thread *td; > int wakeup_swapper; > > 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); > if (sq == NULL) > return (0); > KASSERT(sq->sq_type == (flags & SLEEPQ_TYPE), > ("%s: mismatch between sleep/wakeup and cv_*", __func__)); > > /* Resume all blocked threads on the sleep queue. */ > wakeup_swapper = 0; > while (!TAILQ_EMPTY(&sq->sq_blocked[queue])) { > td = TAILQ_FIRST(&sq->sq_blocked[queue]); > thread_lock(td); > /* test */ > KASSERT(sq->sq_wchan == wchan, > ("%s:mismatch between wchan and sq_wchan in > sq",__func__)); /* I find the panic here */ > if (sleepq_resume_thread(sq, td, pri)) > wakeup_swapper = 1; > thread_unlock(td); > } > return (wakeup_swapper); > } > > Thanks, > kevin 2008/08/23 > > _______________________________________________ > freebsd-current@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-current > To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org" -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808230003.44081.jhb>