sched_userret priority adjustment patch for sched_4bsd
John Baldwin
jhb at FreeBSD.org
Mon Sep 27 07:15:57 PDT 2004
On Saturday 25 September 2004 01:29 pm, Stephan Uphoff wrote:
> When a thread is about to return to user space it resets its priority to
> the user level priority.
> However after lowering the permission its priority it needs to check if
> its priority is still better than all other runable threads.
> This is currently not implemented.
> Without the check the thread can block kernel or user threads with
> better priority until a switch is forced by by an interrupt.
>
> The attached patch checks the relevant runqueues and threads without
> slots in the same ksegrp and forces a thread switch if the currently
> running thread is no longer the best thread to run after it changed its
> priority.
>
> The patch should improve interactive response under heavy load somewhat.
> It needs a lot of testing.
Perhaps the better fix is to teach the schedulers to set TDF_NEEDRESCHED based
on on a comparison against user_pri rather than td_priority inside of
sched_add()? Having the flag set by sched_add() is supposed to make this
sort of check unnecessary. Even 4.x has the same bug I think as a process
can make another process runnable after it's priority has been boosted by a
tsleep() and need_resched() is only called based on a comparison of p_pri.
Ah, 4.x doesn't have the bug because it caches the priority of curproc when
it enters the kernel and compares against that. Thus, I think the correct
fix is more like this:
Index: sched_4bsd.c
===================================================================
RCS file: /usr/cvs/src/sys/kern/sched_4bsd.c,v
retrieving revision 1.63
diff -u -r1.63 sched_4bsd.c
--- sched_4bsd.c 11 Sep 2004 10:07:22 -0000 1.63
+++ sched_4bsd.c 27 Sep 2004 14:12:03 -0000
@@ -272,7 +272,7 @@
{
mtx_assert(&sched_lock, MA_OWNED);
- if (td->td_priority < curthread->td_priority)
+ if (td->td_priority < curthread->td_ksegrp->kg_user_pri)
curthread->td_flags |= TDF_NEEDRESCHED;
}
Index: sched_ule.c
===================================================================
RCS file: /usr/cvs/src/sys/kern/sched_ule.c,v
retrieving revision 1.129
diff -u -r1.129 sched_ule.c
--- sched_ule.c 11 Sep 2004 10:07:22 -0000 1.129
+++ sched_ule.c 27 Sep 2004 14:13:01 -0000
@@ -723,7 +723,7 @@
*/
pcpu = pcpu_find(cpu);
td = pcpu->pc_curthread;
- if (ke->ke_thread->td_priority < td->td_priority ||
+ if (ke->ke_thread->td_priority < td->td_ksegrp->kg_user_pri ||
td == pcpu->pc_idlethread) {
td->td_flags |= TDF_NEEDRESCHED;
ipi_selected(1 << cpu, IPI_AST);
An even better fix might be to fix td_base_pri by having it be set on kernel
entry similar to how 4.x sets curpriority. The above fix should be
sufficient for now, however.
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the freebsd-arch
mailing list