cvs commit: src/sys/kern kern_kse.c kern_thread.c src/sys/sys
proc.h
Attilio Rao
attilio at freebsd.org
Tue Jul 24 10:04:46 UTC 2007
2007/7/24, Attilio Rao <attilio at freebsd.org>:
> 2007/7/23, Jung-uk Kim <jkim at freebsd.org>:
> >
> > Probably it should be something like this?
> >
> > @@ -60,9 +60,6 @@
> > extern struct mtx kse_lock;
> >
> >
> > -TAILQ_HEAD(, kse_upcall) zombie_upcalls =
> > - TAILQ_HEAD_INITIALIZER(zombie_upcalls);
> > -
> > static int thread_update_usr_ticks(struct thread *td);
> > static void thread_alloc_spare(struct thread *td);
> > static struct thread *thread_schedule_upcall(struct thread *td, struct kse_upcall *ku);
> > @@ -106,7 +103,7 @@
> > td->td_upcall->ku_owner = NULL;
> > TAILQ_REMOVE(&td->td_upcall->ku_proc->p_upcalls, td->td_upcall,
> > ku_link);
> > - TAILQ_INSERT_HEAD(&zombie_upcalls, td->td_upcall, ku_link);
> > + upcall_free(td->td_upcall);
> > mtx_unlock_spin(&kse_lock);
> > td->td_upcall = NULL;
> > }
>
> This patch is not going to work as you call upcall_free (which uses
> uma_zfree()) with necessary a spinlock held (td_upcall is thread
> spinlock protected). UMA has its own locking stuffs in it (as
> sleepable locks) so this will create locks mismatches.
> Even if you could avoid it with rearrangement (probailly) I'm going to
> ripristinate the old way of cleaning up stuffs in thread_reap()
> through an ad-hoc upcall_reap() function.
Just for records: it seems that the upcall freeing removal has
happened after revision 1.238 (so just after the splitting up of the
KSE parts from the rest of the kernel). It is so a long-standing bug,
it seems.
Thanks,
Attilio
--
Peace can only be achieved by understanding - A. Einstein
More information about the cvs-src
mailing list