Module Name:    src
Committed By:   maxv
Date:           Sat Apr  4 06:51:46 UTC 2020

Modified Files:
        src/sys/kern: kern_lwp.c subr_kcov.c
        src/sys/sys: kcov.h lwp.h

Log Message:
Drop specificdata from KCOV, kMSan doesn't interact well with it. Also
reduces the overhead.


To generate a diff of this commit:
cvs rdiff -u -r1.231 -r1.232 src/sys/kern/kern_lwp.c
cvs rdiff -u -r1.11 -r1.12 src/sys/kern/subr_kcov.c
cvs rdiff -u -r1.6 -r1.7 src/sys/sys/kcov.h
cvs rdiff -u -r1.203 -r1.204 src/sys/sys/lwp.h

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_lwp.c
diff -u src/sys/kern/kern_lwp.c:1.231 src/sys/kern/kern_lwp.c:1.232
--- src/sys/kern/kern_lwp.c:1.231	Thu Mar 26 21:31:55 2020
+++ src/sys/kern/kern_lwp.c	Sat Apr  4 06:51:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_lwp.c,v 1.231 2020/03/26 21:31:55 ad Exp $	*/
+/*	$NetBSD: kern_lwp.c,v 1.232 2020/04/04 06:51:46 maxv Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2006, 2007, 2008, 2009, 2019, 2020
@@ -211,7 +211,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.231 2020/03/26 21:31:55 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.232 2020/04/04 06:51:46 maxv Exp $");
 
 #include "opt_ddb.h"
 #include "opt_lockdebug.h"
@@ -244,6 +244,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v
 #include <sys/sysctl.h>
 #include <sys/psref.h>
 #include <sys/msan.h>
+#include <sys/kcov.h>
 
 #include <uvm/uvm_extern.h>
 #include <uvm/uvm_object.h>
@@ -1360,6 +1361,7 @@ lwp_free(struct lwp *l, bool recycle, bo
 		kmem_free(l->l_name, MAXCOMLEN);
 
 	kmsan_lwp_free(l);
+	kcov_lwp_free(l);
 	cpu_lwp_free2(l);
 	uvm_lwp_exit(l);
 

Index: src/sys/kern/subr_kcov.c
diff -u src/sys/kern/subr_kcov.c:1.11 src/sys/kern/subr_kcov.c:1.12
--- src/sys/kern/subr_kcov.c:1.11	Sat Dec  7 19:50:33 2019
+++ src/sys/kern/subr_kcov.c	Sat Apr  4 06:51:46 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: subr_kcov.c,v 1.11 2019/12/07 19:50:33 kamil Exp $	*/
+/*	$NetBSD: subr_kcov.c,v 1.12 2020/04/04 06:51:46 maxv Exp $	*/
 
 /*
- * Copyright (c) 2019 The NetBSD Foundation, Inc.
+ * Copyright (c) 2019-2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -115,8 +115,6 @@ typedef struct kcov_desc {
 	bool lwpfree;
 } kcov_t;
 
-static specificdata_key_t kcov_lwp_key;
-
 static void
 kcov_lock(kcov_t *kd)
 {
@@ -143,10 +141,10 @@ kcov_free(kcov_t *kd)
 	kmem_free(kd, sizeof(*kd));
 }
 
-static void
-kcov_lwp_free(void *arg)
+void
+kcov_lwp_free(struct lwp *l)
 {
-	kcov_t *kd = (kcov_t *)arg;
+	kcov_t *kd = (kcov_t *)l->l_kcov;
 
 	if (kd == NULL) {
 		return;
@@ -234,6 +232,7 @@ kcov_fops_close(file_t *fp)
 static int
 kcov_fops_ioctl(file_t *fp, u_long cmd, void *addr)
 {
+	struct lwp *l = curlwp;
 	int error = 0;
 	int mode;
 	kcov_t *kd;
@@ -256,7 +255,7 @@ kcov_fops_ioctl(file_t *fp, u_long cmd, 
 			error = EBUSY;
 			break;
 		}
-		if (lwp_getspecific(kcov_lwp_key) != NULL) {
+		if (l->l_kcov != NULL) {
 			error = EBUSY;
 			break;
 		}
@@ -278,7 +277,7 @@ kcov_fops_ioctl(file_t *fp, u_long cmd, 
 		if (error)
 			break;
 
-		lwp_setspecific(kcov_lwp_key, kd);
+		l->l_kcov = kd;
 		kd->enabled = true;
 		break;
 	case KCOV_IOC_DISABLE:
@@ -286,11 +285,11 @@ kcov_fops_ioctl(file_t *fp, u_long cmd, 
 			error = ENOENT;
 			break;
 		}
-		if (lwp_getspecific(kcov_lwp_key) != kd) {
+		if (l->l_kcov != kd) {
 			error = ENOENT;
 			break;
 		}
-		lwp_setspecific(kcov_lwp_key, NULL);
+		l->l_kcov = NULL;
 		kd->enabled = false;
 		break;
 	default:
@@ -339,6 +338,13 @@ out:
 	return error;
 }
 
+/* -------------------------------------------------------------------------- */
+
+/*
+ * Constraints on the functions here: they must be marked with __nomsan, and
+ * must not make any external call.
+ */
+
 static inline bool __nomsan
 in_interrupt(void)
 {
@@ -364,7 +370,7 @@ __sanitizer_cov_trace_pc(void)
 		return;
 	}
 
-	kd = lwp_getspecific(kcov_lwp_key);
+	kd = curlwp->l_kcov;
 	if (__predict_true(kd == NULL)) {
 		/* Not traced. */
 		return;
@@ -405,7 +411,7 @@ trace_cmp(uint64_t type, uint64_t arg1, 
 		return;
 	}
 
-	kd = lwp_getspecific(kcov_lwp_key);
+	kd = curlwp->l_kcov;
 	if (__predict_true(kd == NULL)) {
 		/* Not traced. */
 		return;
@@ -549,20 +555,12 @@ __sanitizer_cov_trace_switch(uint64_t va
 
 MODULE(MODULE_CLASS_MISC, kcov, NULL);
 
-static void
-kcov_init(void)
-{
-
-	lwp_specific_key_create(&kcov_lwp_key, kcov_lwp_free);
-}
-
 static int
 kcov_modcmd(modcmd_t cmd, void *arg)
 {
 
    	switch (cmd) {
 	case MODULE_CMD_INIT:
-		kcov_init();
 		return 0;
 	case MODULE_CMD_FINI:
 		return EINVAL;

Index: src/sys/sys/kcov.h
diff -u src/sys/sys/kcov.h:1.6 src/sys/sys/kcov.h:1.7
--- src/sys/sys/kcov.h:1.6	Sun May 26 01:44:34 2019
+++ src/sys/sys/kcov.h	Sat Apr  4 06:51:46 2020
@@ -1,7 +1,7 @@
-/*      $NetBSD: kcov.h,v 1.6 2019/05/26 01:44:34 kamil Exp $        */
+/*      $NetBSD: kcov.h,v 1.7 2020/04/04 06:51:46 maxv Exp $        */
 
 /*
- * Copyright (c) 2019 The NetBSD Foundation, Inc.
+ * Copyright (c) 2019-2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -32,6 +32,10 @@
 #ifndef _SYS_KCOV_H_
 #define _SYS_KCOV_H_
 
+#ifdef _KERNEL_OPT
+#include "opt_kcov.h"
+#endif
+
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/atomic.h>
@@ -47,4 +51,12 @@
 typedef volatile uint64_t kcov_int_t;
 #define KCOV_ENTRY_SIZE sizeof(kcov_int_t)
 
+#ifdef _KERNEL
+#ifdef KCOV
+void kcov_lwp_free(struct lwp *);
+#else
+#define kcov_lwp_free(a) __nothing
+#endif
+#endif
+
 #endif /* !_SYS_KCOV_H_ */

Index: src/sys/sys/lwp.h
diff -u src/sys/sys/lwp.h:1.203 src/sys/sys/lwp.h:1.204
--- src/sys/sys/lwp.h:1.203	Thu Mar 26 19:46:42 2020
+++ src/sys/sys/lwp.h	Sat Apr  4 06:51:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: lwp.h,v 1.203 2020/03/26 19:46:42 ad Exp $	*/
+/*	$NetBSD: lwp.h,v 1.204 2020/04/04 06:51:46 maxv Exp $	*/
 
 /*
  * Copyright (c) 2001, 2006, 2007, 2008, 2009, 2010, 2019, 2020
@@ -54,6 +54,7 @@ struct lwp;
 static __inline struct cpu_info *lwp_getcpu(struct lwp *);
 #include <machine/cpu.h>		/* curcpu() and cpu_info */
 #ifdef _KERNEL_OPT
+#include "opt_kcov.h"
 #include "opt_kmsan.h"
 #endif
 #endif
@@ -209,6 +210,9 @@ struct lwp {
 #ifdef KMSAN
 	void		*l_kmsan; /* !: KMSAN private data. */
 #endif
+#ifdef KCOV
+	void		*l_kcov; /* !: KCOV private data. */
+#endif
 };
 
 /*

Reply via email to