From c9280efe81e06a45f727cdc6d3bb6940c3059312 Mon Sep 17 00:00:00 2001 From: jdolecek Date: Thu, 27 Apr 2017 17:07:22 +0000 Subject: [PATCH] do not attach nvme ld as randomness source - device is too fast, it overwhelms the rndq handling code, and causes system crashes; gathering rnd there is also bad idea from performance perspective --- sys/dev/dksubr.c | 21 +++++++++++++-------- sys/dev/dkvar.h | 3 ++- sys/dev/ic/ld_nvme.c | 6 +++--- sys/dev/ld.c | 7 +++++-- sys/dev/ldvar.h | 3 ++- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/sys/dev/dksubr.c b/sys/dev/dksubr.c index ea2ea6eb2bfe..0d9011e4565d 100644 --- a/sys/dev/dksubr.c +++ b/sys/dev/dksubr.c @@ -1,4 +1,4 @@ -/* $NetBSD: dksubr.c,v 1.96 2017/03/05 23:07:12 mlelstv Exp $ */ +/* $NetBSD: dksubr.c,v 1.97 2017/04/27 17:07:22 jdolecek Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 1999, 2002, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.96 2017/03/05 23:07:12 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.97 2017/04/27 17:07:22 jdolecek Exp $"); #include #include @@ -102,16 +102,20 @@ dk_attach(struct dk_softc *dksc) dksc->sc_flags |= DKF_WARNLABEL | DKF_LABELSANITY; #endif - /* Attach the device into the rnd source list. */ - rnd_attach_source(&dksc->sc_rnd_source, dksc->sc_xname, - RND_TYPE_DISK, RND_FLAG_DEFAULT); + if ((dksc->sc_flags & DKF_NO_RND) == 0) { + /* Attach the device into the rnd source list. */ + rnd_attach_source(&dksc->sc_rnd_source, dksc->sc_xname, + RND_TYPE_DISK, RND_FLAG_DEFAULT); + } } void dk_detach(struct dk_softc *dksc) { - /* Unhook the entropy source. */ - rnd_detach_source(&dksc->sc_rnd_source); + if ((dksc->sc_flags & DKF_NO_RND) == 0) { + /* Unhook the entropy source. */ + rnd_detach_source(&dksc->sc_rnd_source); + } dksc->sc_flags &= ~DKF_READYFORDUMP; mutex_destroy(&dksc->sc_iolock); @@ -458,7 +462,8 @@ dk_done1(struct dk_softc *dksc, struct buf *bp, bool lock) if (lock) mutex_exit(&dksc->sc_iolock); - rnd_add_uint32(&dksc->sc_rnd_source, bp->b_rawblkno); + if ((dksc->sc_flags & DKF_NO_RND) == 0) + rnd_add_uint32(&dksc->sc_rnd_source, bp->b_rawblkno); biodone(bp); } diff --git a/sys/dev/dkvar.h b/sys/dev/dkvar.h index aef844a5fc1a..437aafa2b993 100644 --- a/sys/dev/dkvar.h +++ b/sys/dev/dkvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: dkvar.h,v 1.28 2016/12/22 13:42:14 mlelstv Exp $ */ +/* $NetBSD: dkvar.h,v 1.29 2017/04/27 17:07:22 jdolecek Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -68,6 +68,7 @@ struct dk_softc { #define DKF_KLABEL 0x00400000 /* keep label on close */ #define DKF_VLABEL 0x00800000 /* label is valid */ #define DKF_SLEEP 0x80000000 /* dk_start/dk_done may sleep */ +#define DKF_NO_RND 0x01000000 /* do not attach as rnd source */ /* Mask of flags that dksubr.c understands, other flags are fair game */ #define DK_FLAGMASK 0xffff0000 diff --git a/sys/dev/ic/ld_nvme.c b/sys/dev/ic/ld_nvme.c index 8ba7d642bac1..9006a85a3b3c 100644 --- a/sys/dev/ic/ld_nvme.c +++ b/sys/dev/ic/ld_nvme.c @@ -1,4 +1,4 @@ -/* $NetBSD: ld_nvme.c,v 1.15 2017/04/05 20:15:49 jdolecek Exp $ */ +/* $NetBSD: ld_nvme.c,v 1.16 2017/04/27 17:07:22 jdolecek Exp $ */ /*- * Copyright (C) 2016 NONAKA Kimihiro @@ -26,7 +26,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ld_nvme.c,v 1.15 2017/04/05 20:15:49 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ld_nvme.c,v 1.16 2017/04/27 17:07:22 jdolecek Exp $"); #include #include @@ -128,7 +128,7 @@ ld_nvme_attach(device_t parent, device_t self, void *aux) ld->sc_start = ld_nvme_start; ld->sc_dump = ld_nvme_dump; ld->sc_ioctl = ld_nvme_ioctl; - ld->sc_flags = LDF_ENABLED; + ld->sc_flags = LDF_ENABLED | LDF_NO_RND; ldattach(ld, "fcfs"); } diff --git a/sys/dev/ld.c b/sys/dev/ld.c index d0669004d201..5d3eb54cd3ab 100644 --- a/sys/dev/ld.c +++ b/sys/dev/ld.c @@ -1,4 +1,4 @@ -/* $NetBSD: ld.c,v 1.100 2017/02/27 21:32:33 jdolecek Exp $ */ +/* $NetBSD: ld.c,v 1.101 2017/04/27 17:07:22 jdolecek Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.100 2017/02/27 21:32:33 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.101 2017/04/27 17:07:22 jdolecek Exp $"); #include #include @@ -149,6 +149,9 @@ ldattach(struct ld_softc *sc, const char *default_strategy) sc->sc_disksize512 = sc->sc_secperunit * sc->sc_secsize / DEV_BSIZE; + if (sc->sc_flags & LDF_NO_RND) + dksc->sc_flags |= DKF_NO_RND; + /* Attach dk and disk subsystems */ dk_attach(dksc); disk_attach(&dksc->sc_dkdev); diff --git a/sys/dev/ldvar.h b/sys/dev/ldvar.h index 37625e88fef7..bb6675604de4 100644 --- a/sys/dev/ldvar.h +++ b/sys/dev/ldvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: ldvar.h,v 1.29 2017/02/27 21:32:33 jdolecek Exp $ */ +/* $NetBSD: ldvar.h,v 1.30 2017/04/27 17:07:22 jdolecek Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -67,6 +67,7 @@ struct ld_softc { /* sc_flags */ #define LDF_ENABLED 0x001 /* device enabled */ #define LDF_DRAIN 0x020 /* maxqueuecnt has changed; drain */ +#define LDF_NO_RND 0x040 /* do not attach rnd source */ int ldadjqparam(struct ld_softc *, int); void ldattach(struct ld_softc *, const char *);