unexpected idprio 31 behavior on 9.2-BETA2 and 9.2-RC1
John Baldwin
jhb at freebsd.org
Wed Sep 4 14:11:21 UTC 2013
On Thursday, August 08, 2013 10:41:12 am Eric van Gyzen wrote:
> On 08/08/2013 09:19, Eric van Gyzen wrote:
> > On 08/06/2013 14:23, J David wrote:
> >> On Tue, Aug 6, 2013 at 1:59 PM, Eric van Gyzen <eric at vangyzen.net> wrote:
> >>>> on an otherwise idle amd64 system with 4 CPUs. The first command in
the
> >>>> build.log file:
> >>>>
> >>>> rm -rf /usr/obj/home/freebsd/tmp
> >>>>
> >>>> took over three minutes. It should have taken about three /seconds/.
> >>>>
> >>>> "uptime" reported a load average of around 1.00.
> >>>> "top" showed no threads (user or kernel) using CPU.
> >>>> "iostat" showed an average of less than 20 tps on ada0.
> >>>> "rm" was usually in the RUN state.
> >> We are looking at something similar. Would you be able to try to
> >> reproduce it using a kernel with:
> >>
> >> nooptions SCHED_ULE
> >> options SCHED_4BSD
> >>
> >> to see if it makes a difference? It seems to, but the problem is
> >> inconsistent enough that I can't be sure.
> > The 4BSD scheduler does //not// exhibit this problem. I tested with the
> > latest releng/9.2 (r254054) and an otherwise GENERIC config.
>
> To be thorough, I built a GENERIC kernel at the same rev, and it still
> exhibits the problem.
Please try this change:
Index: sched_ule.c
===================================================================
--- sched_ule.c (revision 255020)
+++ sched_ule.c (working copy)
@@ -243,7 +243,7 @@ struct tdq {
int tdq_transferable; /* Transferable thread count. */
short tdq_switchcnt; /* Switches this tick. */
short tdq_oldswitchcnt; /* Switches last tick. */
- u_char tdq_lowpri; /* Lowest priority thread. */
+ u_short tdq_lowpri; /* Lowest priority thread. */
u_char tdq_ipipending; /* IPI pending. */
u_char tdq_idx; /* Current insert index. */
u_char tdq_ridx; /* Current removal index. */
@@ -2323,7 +2323,7 @@ sched_choose(void)
tdq->tdq_lowpri = td->td_priority;
return (td);
}
- tdq->tdq_lowpri = PRI_MAX_IDLE;
+ tdq->tdq_lowpri = PRI_MAX_IDLE + 1;
return (PCPU_GET(idlethread));
}
--
John Baldwin
More information about the freebsd-stable
mailing list