Make sched_random() return an unsigned number, and use uint32_t
consistently. This also matches the per-cpu pointer declaration anyway. This changes the tweak we give to the load from -32..31 to be 0..31 which seems more inline with the rest of the code (- rnd and the -= 64). It should also provide the randomness we need, and may fix a signedness bug in the old code (it isn't clear that the effect was intentional as opposed to sloppy, and the right shift of a signed value is undefined to boot). This stores sched_balance() behavior when it used random(). Differential Revision: https://reviews.freebsd.org/D1981
This commit is contained in:
parent
e52a2dc83c
commit
b250ad3499
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=279373
@ -360,17 +360,19 @@ SDT_PROBE_DEFINE2(sched, , , surrender, "struct thread *",
|
||||
/*
|
||||
* We need some randomness. Implement the classic Linear Congruential
|
||||
* generator X_{n+1}=(aX_n+c) mod m. These values are optimized for
|
||||
* m = 2^32, a = 69069 and c = 5. This is signed so that we can get
|
||||
* both positive and negative values from it by shifting the value
|
||||
* right.
|
||||
* m = 2^32, a = 69069 and c = 5. We only return the upper 16 bits
|
||||
* of the random state (in the low bits of our answer) to return
|
||||
* the maximum randomness.
|
||||
*/
|
||||
static int sched_random(void)
|
||||
static uint32_t
|
||||
sched_random()
|
||||
{
|
||||
int rnd, *rndptr;
|
||||
rndptr = DPCPU_PTR(randomval);
|
||||
rnd = *rndptr * 69069 + 5;
|
||||
*rndptr = rnd;
|
||||
return(rnd);
|
||||
uint32_t *rndptr;
|
||||
|
||||
rndptr = DPCPU_PTR(randomval);
|
||||
*rndptr = *rndptr * 69069 + 5;
|
||||
|
||||
return (*rndptr >> 16);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -718,7 +720,7 @@ cpu_search(const struct cpu_group *cg, struct cpu_search *low,
|
||||
CPU_CLR(cpu, &cpumask);
|
||||
tdq = TDQ_CPU(cpu);
|
||||
load = tdq->tdq_load * 256;
|
||||
rnd = sched_random() >> 26; /* -32 to +31 */
|
||||
rnd = sched_random() % 32;
|
||||
if (match & CPU_SEARCH_LOWEST) {
|
||||
if (cpu == low->cs_prefer)
|
||||
load -= 64;
|
||||
@ -882,7 +884,7 @@ sched_balance(void)
|
||||
return;
|
||||
|
||||
balance_ticks = max(balance_interval / 2, 1) +
|
||||
((sched_random() >> 16) % balance_interval);
|
||||
(sched_random() % balance_interval);
|
||||
tdq = TDQ_SELF();
|
||||
TDQ_UNLOCK(tdq);
|
||||
sched_balance_group(cpu_top);
|
||||
|
Loading…
Reference in New Issue
Block a user