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