Module Name:    src
Committed By:   riastradh
Date:           Fri Mar 18 23:35:28 UTC 2022

Modified Files:
        src/sys/kern: kern_entropy.c

Log Message:
entropy(9): Count dropped or truncated interrupt samples.


To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/kern/kern_entropy.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_entropy.c
diff -u src/sys/kern/kern_entropy.c:1.39 src/sys/kern/kern_entropy.c:1.40
--- src/sys/kern/kern_entropy.c:1.39	Fri Mar 18 23:35:19 2022
+++ src/sys/kern/kern_entropy.c	Fri Mar 18 23:35:28 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_entropy.c,v 1.39 2022/03/18 23:35:19 riastradh Exp $	*/
+/*	$NetBSD: kern_entropy.c,v 1.40 2022/03/18 23:35:28 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_entropy.c,v 1.39 2022/03/18 23:35:19 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_entropy.c,v 1.40 2022/03/18 23:35:28 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -130,7 +130,11 @@ __KERNEL_RCSID(0, "$NetBSD: kern_entropy
  *	evcnt(9) assumes it stays put in memory.
  */
 struct entropy_cpu {
-	struct evcnt		*ec_softint_evcnt;
+	struct entropy_cpu_evcnt {
+		struct evcnt		softint;
+		struct evcnt		intrdrop;
+		struct evcnt		intrtrunc;
+	}			*ec_evcnt;
 	struct entpool		*ec_pool;
 	unsigned		ec_pending;
 	bool			ec_locked;
@@ -466,17 +470,21 @@ static void
 entropy_init_cpu(void *ptr, void *cookie, struct cpu_info *ci)
 {
 	struct entropy_cpu *ec = ptr;
+	const char *cpuname;
 
-	ec->ec_softint_evcnt = kmem_alloc(sizeof(*ec->ec_softint_evcnt),
-	    KM_SLEEP);
+	ec->ec_evcnt = kmem_alloc(sizeof(*ec->ec_evcnt), KM_SLEEP);
 	ec->ec_pool = kmem_zalloc(sizeof(*ec->ec_pool), KM_SLEEP);
 	ec->ec_pending = 0;
 	ec->ec_locked = false;
 
 	/* XXX ci_cpuname may not be initialized early enough.  */
-	evcnt_attach_dynamic(ec->ec_softint_evcnt, EVCNT_TYPE_MISC, NULL,
-	    ci->ci_cpuname[0] == '\0' ? "cpu0" : ci->ci_cpuname,
-	    "entropy softint");
+	cpuname = ci->ci_cpuname[0] == '\0' ? "cpu0" : ci->ci_cpuname;
+	evcnt_attach_dynamic(&ec->ec_evcnt->softint, EVCNT_TYPE_MISC, NULL,
+	    cpuname, "entropy softint");
+	evcnt_attach_dynamic(&ec->ec_evcnt->intrdrop, EVCNT_TYPE_MISC, NULL,
+	    cpuname, "entropy intrdrop");
+	evcnt_attach_dynamic(&ec->ec_evcnt->intrtrunc, EVCNT_TYPE_MISC, NULL,
+	    cpuname, "entropy intrtrunc");
 }
 
 /*
@@ -497,10 +505,12 @@ entropy_fini_cpu(void *ptr, void *cookie
 	 */
 	explicit_memset(ec->ec_pool, 0, sizeof(*ec->ec_pool));
 
-	evcnt_detach(ec->ec_softint_evcnt);
+	evcnt_detach(&ec->ec_evcnt->intrtrunc);
+	evcnt_detach(&ec->ec_evcnt->intrdrop);
+	evcnt_detach(&ec->ec_evcnt->softint);
 
 	kmem_free(ec->ec_pool, sizeof(*ec->ec_pool));
-	kmem_free(ec->ec_softint_evcnt, sizeof(*ec->ec_softint_evcnt));
+	kmem_free(ec->ec_evcnt, sizeof(*ec->ec_evcnt));
 }
 
 /*
@@ -872,8 +882,10 @@ entropy_enter_intr(const void *buf, size
 	 * higher-priority interrupts will drop their samples.
 	 */
 	ec = percpu_getref(entropy_percpu);
-	if (ec->ec_locked)
+	if (ec->ec_locked) {
+		ec->ec_evcnt->intrdrop.ev_count++;
 		goto out0;
+	}
 	ec->ec_locked = true;
 	__insn_barrier();
 
@@ -885,6 +897,7 @@ entropy_enter_intr(const void *buf, size
 		sih = atomic_load_relaxed(&entropy_sih);
 		if (__predict_true(sih != NULL))
 			softint_schedule(sih);
+		ec->ec_evcnt->intrtrunc.ev_count++;
 		goto out1;
 	}
 	fullyused = true;
@@ -936,7 +949,7 @@ entropy_softintr(void *cookie)
 	__insn_barrier();
 
 	/* Count statistics.  */
-	ec->ec_softint_evcnt->ev_count++;
+	ec->ec_evcnt->softint.ev_count++;
 
 	/* Stir the pool if necessary.  */
 	entpool_stir(ec->ec_pool);

Reply via email to