Improve entropy for ZFS taskqueue selection.
I just found that at least on Skylake CPUs cpu_ticks() never returns odd values, only even, and possibly has even bigger step (176/2?), that makes its lower bits very bad entropy source, leaving half of taskqueues unused. Switch to sbinuptime(), closer to upstreams, mitigates the problem by the rate conversion working as kind of hash function. In case that is somehow not enough (timer rate is too low or too divisible) mix in curcpu. MFC after: 1 week
This commit is contained in:
parent
56ada93f8a
commit
ede8782611
@ -1070,7 +1070,8 @@ spa_taskq_dispatch_ent(spa_t *spa, zio_type_t t, zio_taskq_type_t q,
|
||||
tq = tqs->stqs_taskq[0];
|
||||
} else {
|
||||
#ifdef _KERNEL
|
||||
tq = tqs->stqs_taskq[cpu_ticks() % tqs->stqs_count];
|
||||
tq = tqs->stqs_taskq[(u_int)(sbinuptime() + curcpu) %
|
||||
tqs->stqs_count];
|
||||
#else
|
||||
tq = tqs->stqs_taskq[gethrtime() % tqs->stqs_count];
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user