Add sleepq_remove_nested()

The helper removes the thread from a sleep queue, assuming that it would
need to sleep. The sleepq_remove_nested() function is intended for quite
special case, where suspended thread from traced stopped process is
temporary unsuspended to do some work on behalf of the debugger in the
target context, and this work might require sleep.

Reviewed by:	markj
Tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D29955
This commit is contained in:
Konstantin Belousov 2021-04-25 03:01:32 +03:00
parent 86ffb3d1a0
commit 15465a2c25
2 changed files with 21 additions and 0 deletions

View File

@ -854,6 +854,26 @@ sleepq_remove_thread(struct sleepqueue *sq, struct thread *td)
(void *)td, (long)td->td_proc->p_pid, td->td_name);
}
void
sleepq_remove_nested(struct thread *td)
{
struct sleepqueue_chain *sc;
struct sleepqueue *sq;
const void *wchan;
MPASS(TD_ON_SLEEPQ(td));
wchan = td->td_wchan;
sc = SC_LOOKUP(wchan);
mtx_lock_spin(&sc->sc_lock);
sq = sleepq_lookup(wchan);
MPASS(sq != NULL);
thread_lock(td);
sleepq_remove_thread(sq, td);
mtx_unlock_spin(&sc->sc_lock);
/* Returns with the thread lock owned. */
}
#ifdef INVARIANTS
/*
* UMA zone item deallocator.

View File

@ -100,6 +100,7 @@ void sleepq_release(const void *wchan);
void sleepq_remove(struct thread *td, const void *wchan);
int sleepq_remove_matching(struct sleepqueue *sq, int queue,
bool (*matches)(struct thread *), int pri);
void sleepq_remove_nested(struct thread *td);
int sleepq_signal(const void *wchan, int flags, int pri, int queue);
void sleepq_set_timeout_sbt(const void *wchan, sbintime_t sbt,
sbintime_t pr, int flags);