Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Feb 2013 12:06:00 -0700
From:      Ian Lepore <ian@FreeBSD.org>
To:        "freebsd-hackers@freebsd.org" <freebsd-hackers@FreeBSD.org>
Subject:   rtprio_thread trouble
Message-ID:  <1361559960.1185.81.camel@revolution.hippie.lan>

next in thread | raw e-mail | index | archive | help
I ran into some trouble with rtprio_thread() today.  I have a worker
thread that I want to run at idle priority most of the time, but if it
falls too far behind I'd like to bump it back up to regular timeshare
priority until it catches up.  In a worst case, the system is
continuously busy and something scheduled at idle priority is never
going to run (for some definition of 'never').  

What I found is that in this worst case, even after my main thread has
used rtprio_thread() to change the worker thread back to
RTP_PRIO_NORMAL, the worker thread never gets scheduled.  This is with
the 4BSD scheduler but it appears that the same would be the case with
ULE, based on code inspection.  I find that this fixes it for 4BSD, and
I think the same would be true for ULE...

--- a/sys/kern/sched_4bsd.c	Wed Feb 13 12:54:36 2013 -0700
+++ b/sys/kern/sched_4bsd.c	Fri Feb 22 11:55:35 2013 -0700
@@ -881,6 +881,9 @@ sched_user_prio(struct thread *td, u_cha
 		return;
 	oldprio = td->td_user_pri;
 	td->td_user_pri = prio;
+	if (td->td_flags & TDF_BORROWING && td->td_priority <= prio)
+		return;
+	sched_priority(td, prio);
 }
 
 void

But I'm not sure if this would have any negative side effects,
especially since in the ULE case there's a comment on this function that
specifically notes that it changes the the user priority without
changing the current priority (but it doesn't say why that matters).

Is this a reasonable way to fix this problem, or is there a better way?

-- Ian





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1361559960.1185.81.camel>