svn commit: r345123 - stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Alexander Motin
mav at FreeBSD.org
Thu Mar 14 00:58:58 UTC 2019
Author: mav
Date: Thu Mar 14 00:58:57 2019
New Revision: 345123
URL: https://svnweb.freebsd.org/changeset/base/345123
Log:
MFC r344903: 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.
Modified:
stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c Thu Mar 14 00:58:39 2019 (r345122)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c Thu Mar 14 00:58:57 2019 (r345123)
@@ -1063,7 +1063,8 @@ spa_taskq_dispatch_ent(spa_t *spa, zio_type_t t, zio_t
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
More information about the svn-src-stable-11
mailing list