Module Name:    src
Committed By:   riastradh
Date:           Sat Feb  1 02:54:02 UTC 2020

Modified Files:
        src/sys/net: bpf.c bpfjit.c

Log Message:
Fix wrong memory order and switch bpf to atomic_load/store_*.


To generate a diff of this commit:
cvs rdiff -u -r1.233 -r1.234 src/sys/net/bpf.c
cvs rdiff -u -r1.47 -r1.48 src/sys/net/bpfjit.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/net/bpf.c
diff -u src/sys/net/bpf.c:1.233 src/sys/net/bpf.c:1.234
--- src/sys/net/bpf.c:1.233	Sun Jan 19 05:07:22 2020
+++ src/sys/net/bpf.c	Sat Feb  1 02:54:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: bpf.c,v 1.233 2020/01/19 05:07:22 thorpej Exp $	*/
+/*	$NetBSD: bpf.c,v 1.234 2020/02/01 02:54:02 riastradh Exp $	*/
 
 /*
  * Copyright (c) 1990, 1991, 1993
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.233 2020/01/19 05:07:22 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bpf.c,v 1.234 2020/02/01 02:54:02 riastradh Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_bpf.h"
@@ -301,10 +301,13 @@ const struct cdevsw bpf_cdevsw = {
 bpfjit_func_t
 bpf_jit_generate(bpf_ctx_t *bc, void *code, size_t size)
 {
-
-	membar_consumer();
-	if (bpfjit_module_ops.bj_generate_code != NULL) {
-		return bpfjit_module_ops.bj_generate_code(bc, code, size);
+	struct bpfjit_ops *ops = &bpfjit_module_ops;
+	bpfjit_func_t (*generate_code)(const bpf_ctx_t *,
+	    const struct bpf_insn *, size_t);
+
+	generate_code = atomic_load_acquire(&ops->bj_generate_code);
+	if (generate_code != NULL) {
+		return generate_code(bc, code, size);
 	}
 	return NULL;
 }
@@ -1289,7 +1292,6 @@ bpf_setf(struct bpf_d *d, struct bpf_pro
 			kmem_free(fcode, size);
 			return EINVAL;
 		}
-		membar_consumer();
 		if (bpf_jit)
 			jcode = bpf_jit_generate(NULL, fcode, flen);
 	} else {
@@ -1306,8 +1308,7 @@ bpf_setf(struct bpf_d *d, struct bpf_pro
 	mutex_enter(&bpf_mtx);
 	mutex_enter(d->bd_mtx);
 	oldf = d->bd_filter;
-	d->bd_filter = newf;
-	membar_producer();
+	atomic_store_release(&d->bd_filter, newf);
 	reset_d(d);
 	pserialize_perform(bpf_psz);
 	mutex_exit(d->bd_mtx);
@@ -1607,8 +1608,7 @@ bpf_deliver(struct bpf_if *bp, void *(*c
 		atomic_inc_ulong(&d->bd_rcount);
 		BPF_STATINC(recv);
 
-		filter = d->bd_filter;
-		membar_datadep_consumer();
+		filter = atomic_load_consume(&d->bd_filter);
 		if (filter != NULL) {
 			if (filter->bf_jitcode != NULL)
 				slen = filter->bf_jitcode(NULL, &args);
@@ -2308,13 +2308,6 @@ sysctl_net_bpf_jit(SYSCTLFN_ARGS)
 		return error;
 
 	bpf_jit = newval;
-
-	/*
-	 * Do a full sync to publish new bpf_jit value and
-	 * update bpfjit_module_ops.bj_generate_code variable.
-	 */
-	membar_sync();
-
 	if (newval && bpfjit_module_ops.bj_generate_code == NULL) {
 		printf("JIT compilation is postponed "
 		    "until after bpfjit module is loaded\n");

Index: src/sys/net/bpfjit.c
diff -u src/sys/net/bpfjit.c:1.47 src/sys/net/bpfjit.c:1.48
--- src/sys/net/bpfjit.c:1.47	Sun Jan 20 23:36:57 2019
+++ src/sys/net/bpfjit.c	Sat Feb  1 02:54:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: bpfjit.c,v 1.47 2019/01/20 23:36:57 alnsn Exp $	*/
+/*	$NetBSD: bpfjit.c,v 1.48 2020/02/01 02:54:02 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2011-2015 Alexander Nasonov.
@@ -31,9 +31,9 @@
 
 #include <sys/cdefs.h>
 #ifdef _KERNEL
-__KERNEL_RCSID(0, "$NetBSD: bpfjit.c,v 1.47 2019/01/20 23:36:57 alnsn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bpfjit.c,v 1.48 2020/02/01 02:54:02 riastradh Exp $");
 #else
-__RCSID("$NetBSD: bpfjit.c,v 1.47 2019/01/20 23:36:57 alnsn Exp $");
+__RCSID("$NetBSD: bpfjit.c,v 1.48 2020/02/01 02:54:02 riastradh Exp $");
 #endif
 
 #include <sys/types.h>
@@ -231,9 +231,8 @@ bpfjit_modcmd(modcmd_t cmd, void *arg)
 	switch (cmd) {
 	case MODULE_CMD_INIT:
 		bpfjit_module_ops.bj_free_code = &bpfjit_free_code;
-		membar_producer();
-		bpfjit_module_ops.bj_generate_code = &bpfjit_generate_code;
-		membar_producer();
+		atomic_store_release(&bpfjit_module_ops.bj_generate_code,
+		    &bpfjit_generate_code);
 		return 0;
 
 	case MODULE_CMD_FINI:

Reply via email to