Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Dec 2010 08:39:18 +1100
From:      Peter Jeremy <peterjeremy@acm.org>
To:        John Baldwin <jhb@freebsd.org>
Cc:        arch@freebsd.org
Subject:   Re: Realtime thread priorities
Message-ID:  <20101211213918.GB21959@server.vk2pj.dyndns.org>
In-Reply-To: <201012101050.45214.jhb@freebsd.org>
References:  <201012101050.45214.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--ZPt4rx8FFjLCG7dd
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On 2010-Dec-10 10:50:45 -0500, John Baldwin <jhb@freebsd.org> wrote:
>The problem I am running into is that when a time-sharing thread goes to s=
leep=20
>in the kernel (waiting on select, socket data, tty, etc.) it actually ends=
 up=20
>in the kernel priorities range (64 - 127).  This means when it wakes up it=
=20
>will trump (and preempt) a real-time user thread even though these process=
es=20
>nominally have a priority down in the 160 - 223 range.  We do drop the ker=
nel=20
>sleep priority during userret(), but we don't recheck the scheduler queues=
 to=20
>see if we should preempt the thread during userret(), so it effectively ru=
ns=20
>with the kernel sleep priority for the rest of the quantum while it is in=
=20
>userland.

This may also explain the situation I'm seeing where idprio processes
are receiving more than "idle" time (see "idprio processes slowing
down system" in -hackers).

>My first question is if this behavior is the desired behavior?  Originally=
 I=20
>think I preferred the current layout because I thought a thread in the ker=
nel=20
>should always have priority so it can release locks, etc.

I suspect it was intended as a solution to priority inversion issues.

>1) (easy) just move the real-time priority range above the kernel sleep=20
>priority range

This won't affect the associated issue of idprio processes "preempting"
timesharing processes.

>2) (harder) make sched_userret() check the run queue to see if it should=
=20
>preempt when dropping the kernel sleep priority.

IMHO, this is the "correct" solution but that needs to be tempered by
the additional overhead this might incur.

--=20
Peter Jeremy

--ZPt4rx8FFjLCG7dd
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.15 (FreeBSD)

iEYEARECAAYFAk0D74YACgkQ/opHv/APuIcROACeNr2ajW+rBdeMeZ+kVJAJoftB
xtMAnAv9ZBzEYKvf/r67onBgf/dNZhGl
=6FHd
-----END PGP SIGNATURE-----

--ZPt4rx8FFjLCG7dd--



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