* Question on __torture_rt_boost() else clause
@ 2023-08-22 3:12 Paul E. McKenney
2023-08-22 16:18 ` Joel Fernandes
0 siblings, 1 reply; 4+ messages in thread
From: Paul E. McKenney @ 2023-08-22 3:12 UTC (permalink / raw)
To: joel; +Cc: linux-kernel
Hello, Joel!
A quick question for you...
I am doing catch-up additions of locktorture module parameters
to kernel-parameters.txt, and came across rt_boost_factor. The
multiplication by cxt.nrealwriters_stress in the !rt_task(current)
then-clause makes sense: No matter how many writers you have, the
number of boost operations per unit time remains roughly constant.
But I am having some difficulty rationalizing a similar multiplication
in the else-clause. That would seem to leave boosting in effect for
longer times the more writers there were.
Is that the intent?
Also, I am rationalizing the choice of 2 as default for rt_boost by
noting that "mutex" and "ww_mutex_lock" don't do boosting and that
preemption-disabling makes non-RT spinlocks immune from priority
inversion. Is this what you had in mind, or am I off in the weeds here?
I am putting my best guess in the patch, and am including you on CC.
Thanx, Paul
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Question on __torture_rt_boost() else clause
2023-08-22 3:12 Question on __torture_rt_boost() else clause Paul E. McKenney
@ 2023-08-22 16:18 ` Joel Fernandes
2023-08-22 17:46 ` Paul E. McKenney
0 siblings, 1 reply; 4+ messages in thread
From: Joel Fernandes @ 2023-08-22 16:18 UTC (permalink / raw)
To: Paul E. McKenney; +Cc: linux-kernel
Hi Paul,
On Mon, Aug 21, 2023 at 08:12:50PM -0700, Paul E. McKenney wrote:
> Hello, Joel!
>
> A quick question for you...
>
> I am doing catch-up additions of locktorture module parameters
> to kernel-parameters.txt, and came across rt_boost_factor. The
> multiplication by cxt.nrealwriters_stress in the !rt_task(current)
> then-clause makes sense: No matter how many writers you have, the
> number of boost operations per unit time remains roughly constant.
> But I am having some difficulty rationalizing a similar multiplication
> in the else-clause. That would seem to leave boosting in effect for
> longer times the more writers there were.
But the number of de-boost operations per-unit time should also remain a
constant? I think you (or the original authors) wanted it to boost at every
50k ops at deboost at 500k ops originally.
> Is that the intent?
The original change before my patch to make boosting possible for non-rtmutex
types already had that multiplication, see below for diff from my patch. My
patch just kept the same thing to make the logic consistent (i.e. deboost
less often).
> Also, I am rationalizing the choice of 2 as default for rt_boost by
> noting that "mutex" and "ww_mutex_lock" don't do boosting and that
> preemption-disabling makes non-RT spinlocks immune from priority
> inversion. Is this what you had in mind, or am I off in the weeds here?
The 2 was just to make sure that we don't deboost as often as we boost, which
is also what the old logic was trying to do.
What is the drawback of keeping the boost active for longer than not? It will
trigger the PI-boosting (and in the future proxy exec) more often.
Also by making the factor configurable, I allow it to control how often we
boost and deboost. IIRC, it was boosting much less often before I did that.
> I am putting my best guess in the patch, and am including you on CC.
Ok, thanks,
- Joel
-static void torture_rtmutex_boost(struct torture_random_state *trsp)
-{
- const unsigned int factor = 50000; /* yes, quite arbitrary */
-
- if (!rt_task(current)) {
- /*
- * Boost priority once every ~50k operations. When the
- * task tries to take the lock, the rtmutex it will account
- * for the new priority, and do any corresponding pi-dance.
- */
- if (trsp && !(torture_random(trsp) %
- (cxt.nrealwriters_stress * factor))) {
- sched_set_fifo(current);
- } else /* common case, do nothing */
- return;
- } else {
- /*
- * The task will remain boosted for another ~500k operations,
- * then restored back to its original prio, and so forth.
- *
- * When @trsp is nil, we want to force-reset the task for
- * stopping the kthread.
- */
- if (!trsp || !(torture_random(trsp) %
- (cxt.nrealwriters_stress * factor * 2))) {
- sched_set_normal(current, 0);
- } else /* common case, do nothing */
- return;
- }
-}
-
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Question on __torture_rt_boost() else clause
2023-08-22 16:18 ` Joel Fernandes
@ 2023-08-22 17:46 ` Paul E. McKenney
2023-08-22 18:52 ` Joel Fernandes
0 siblings, 1 reply; 4+ messages in thread
From: Paul E. McKenney @ 2023-08-22 17:46 UTC (permalink / raw)
To: Joel Fernandes; +Cc: linux-kernel
On Tue, Aug 22, 2023 at 04:18:50PM +0000, Joel Fernandes wrote:
> Hi Paul,
>
> On Mon, Aug 21, 2023 at 08:12:50PM -0700, Paul E. McKenney wrote:
> > Hello, Joel!
> >
> > A quick question for you...
> >
> > I am doing catch-up additions of locktorture module parameters
> > to kernel-parameters.txt, and came across rt_boost_factor. The
> > multiplication by cxt.nrealwriters_stress in the !rt_task(current)
> > then-clause makes sense: No matter how many writers you have, the
> > number of boost operations per unit time remains roughly constant.
>
> > But I am having some difficulty rationalizing a similar multiplication
> > in the else-clause. That would seem to leave boosting in effect for
> > longer times the more writers there were.
>
> But the number of de-boost operations per-unit time should also remain a
> constant? I think you (or the original authors) wanted it to boost at every
> 50k ops at deboost at 500k ops originally.
The else-clause controls the boost duration. So if I am understanding
the code correctly, the more writers there are, the longer each writer
stays boosted. Which might be a good thing, but seemed strange.
> > Is that the intent?
>
> The original change before my patch to make boosting possible for non-rtmutex
> types already had that multiplication, see below for diff from my patch. My
> patch just kept the same thing to make the logic consistent (i.e. deboost
> less often).
Ah, you are right, I should have told "git blame" to dig deeper.
But hey, you did touch the code at one point! ;-)
> > Also, I am rationalizing the choice of 2 as default for rt_boost by
> > noting that "mutex" and "ww_mutex_lock" don't do boosting and that
> > preemption-disabling makes non-RT spinlocks immune from priority
> > inversion. Is this what you had in mind, or am I off in the weeds here?
>
> The 2 was just to make sure that we don't deboost as often as we boost, which
> is also what the old logic was trying to do.
This is a different "2". The rt_boost=0 says never boost, rt_boost=1
says boost only if the lock in question supports priority boosting, and
rt_boost=2 (the default) says boost unconditionally, aside from lock
types that don't define cur_ops->task_boost. Except that they all
define cur_ops->task_boost.
I am not seeing failures in my torture.sh testing, so maybe OK, but it
does seem a bit strange.
(And this probably predates your involvement as well, but so it goes!)
> What is the drawback of keeping the boost active for longer than not? It will
> trigger the PI-boosting (and in the future proxy exec) more often.
My concern is someone running this on a 1,000-CPU system. Though locking
being what it is, there is a non-negligible possibility that something
else breaks first.
> Also by making the factor configurable, I allow it to control how often we
> boost and deboost. IIRC, it was boosting much less often before I did that.
No argument with the frequency of boosting, just curiosity about the
duration increasing with increasing numbers of CPUs. I can rationalize
it, but then again, I can rationalize pretty much anything. ;-)
> > I am putting my best guess in the patch, and am including you on CC.
>
> Ok, thanks,
On the other hand, it looks like I can now reproduce a qspinlock hang
that happens maybe five to ten times a week across the entire fleet
in a few tens of minutes. On my laptop. ;-)
Now to start adding debug. Which will affect the reproduction times,
but life is like that sometimes...
Thanx, Paul
> - Joel
>
>
> -static void torture_rtmutex_boost(struct torture_random_state *trsp)
> -{
> - const unsigned int factor = 50000; /* yes, quite arbitrary */
> -
> - if (!rt_task(current)) {
> - /*
> - * Boost priority once every ~50k operations. When the
> - * task tries to take the lock, the rtmutex it will account
> - * for the new priority, and do any corresponding pi-dance.
> - */
> - if (trsp && !(torture_random(trsp) %
> - (cxt.nrealwriters_stress * factor))) {
> - sched_set_fifo(current);
> - } else /* common case, do nothing */
> - return;
> - } else {
> - /*
> - * The task will remain boosted for another ~500k operations,
> - * then restored back to its original prio, and so forth.
> - *
> - * When @trsp is nil, we want to force-reset the task for
> - * stopping the kthread.
> - */
> - if (!trsp || !(torture_random(trsp) %
> - (cxt.nrealwriters_stress * factor * 2))) {
> - sched_set_normal(current, 0);
> - } else /* common case, do nothing */
> - return;
> - }
> -}
> -
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Question on __torture_rt_boost() else clause
2023-08-22 17:46 ` Paul E. McKenney
@ 2023-08-22 18:52 ` Joel Fernandes
0 siblings, 0 replies; 4+ messages in thread
From: Joel Fernandes @ 2023-08-22 18:52 UTC (permalink / raw)
To: paulmck; +Cc: linux-kernel
On Tue, Aug 22, 2023 at 1:46 PM Paul E. McKenney <paulmck@kernel.org> wrote:
[..]
> > > I am putting my best guess in the patch, and am including you on CC.
> >
> > Ok, thanks,
>
> On the other hand, it looks like I can now reproduce a qspinlock hang
> that happens maybe five to ten times a week across the entire fleet
> in a few tens of minutes. On my laptop. ;-)
>
> Now to start adding debug. Which will affect the reproduction times,
> but life is like that sometimes...
I would be happy to review any locktorture changes that come out from
your qspinlock debug effort.
Thanks,
- Joel
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-08-22 18:52 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-22 3:12 Question on __torture_rt_boost() else clause Paul E. McKenney
2023-08-22 16:18 ` Joel Fernandes
2023-08-22 17:46 ` Paul E. McKenney
2023-08-22 18:52 ` Joel Fernandes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox