Module Name: src Committed By: riastradh Date: Sat Feb 1 02:58:06 UTC 2020
Modified Files: src/sys/net: if_l2tp.c if_l2tp.h Log Message: Switch if_l2tp to atomic_load/store_*. Fix missing membar_datadep_consumer -- now atomic_load_consume -- in l2tp_lookup_session_ref. To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/sys/net/if_l2tp.c cvs rdiff -u -r1.8 -r1.9 src/sys/net/if_l2tp.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/net/if_l2tp.c diff -u src/sys/net/if_l2tp.c:1.41 src/sys/net/if_l2tp.c:1.42 --- src/sys/net/if_l2tp.c:1.41 Wed Jan 29 04:18:34 2020 +++ src/sys/net/if_l2tp.c Sat Feb 1 02:58:05 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_l2tp.c,v 1.41 2020/01/29 04:18:34 thorpej Exp $ */ +/* $NetBSD: if_l2tp.c,v 1.42 2020/02/01 02:58:05 riastradh Exp $ */ /* * Copyright (c) 2017 Internet Initiative Japan Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.41 2020/01/29 04:18:34 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_l2tp.c,v 1.42 2020/02/01 02:58:05 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -1061,7 +1061,6 @@ l2tp_set_tunnel(struct ifnet *ifp, struc encap_lock_exit(); goto error; } - membar_producer(); l2tp_variant_update(sc, nvar); mutex_exit(&sc->l2tp_lock); @@ -1110,7 +1109,6 @@ l2tp_delete_tunnel(struct ifnet *ifp) psref_target_init(&nvar->lv_psref, lv_psref_class); nvar->lv_psrc = NULL; nvar->lv_pdst = NULL; - membar_producer(); l2tp_variant_update(sc, nvar); mutex_exit(&sc->l2tp_lock); @@ -1185,7 +1183,6 @@ l2tp_set_session(struct l2tp_softc *sc, psref_target_init(&nvar->lv_psref, lv_psref_class); nvar->lv_my_sess_id = my_sess_id; nvar->lv_peer_sess_id = peer_sess_id; - membar_producer(); mutex_enter(&l2tp_hash.lock); if (ovar->lv_my_sess_id > 0 && ovar->lv_peer_sess_id > 0) { @@ -1226,7 +1223,6 @@ l2tp_clear_session(struct l2tp_softc *sc psref_target_init(&nvar->lv_psref, lv_psref_class); nvar->lv_my_sess_id = 0; nvar->lv_peer_sess_id = 0; - membar_producer(); mutex_enter(&l2tp_hash.lock); if (ovar->lv_my_sess_id > 0 && ovar->lv_peer_sess_id > 0) { @@ -1253,7 +1249,7 @@ l2tp_lookup_session_ref(uint32_t id, str s = pserialize_read_enter(); PSLIST_READER_FOREACH(sc, &l2tp_hash.lists[idx], struct l2tp_softc, l2tp_hash) { - struct l2tp_variant *var = sc->l2tp_var; + struct l2tp_variant *var = atomic_load_consume(&sc->l2tp_var); if (var == NULL) continue; if (var->lv_my_sess_id != id) @@ -1282,17 +1278,12 @@ l2tp_variant_update(struct l2tp_softc *s KASSERT(mutex_owned(&sc->l2tp_lock)); - sc->l2tp_var = nvar; + atomic_store_release(&sc->l2tp_var, nvar); pserialize_perform(sc->l2tp_psz); psref_target_destroy(&ovar->lv_psref, lv_psref_class); - /* - * In the manual of atomic_swap_ptr(3), there is no mention if 2nd - * argument is rewrite or not. So, use sc->l2tp_var instead of nvar. - */ - if (sc->l2tp_var != NULL) { - if (sc->l2tp_var->lv_psrc != NULL - && sc->l2tp_var->lv_pdst != NULL) + if (nvar != NULL) { + if (nvar->lv_psrc != NULL && nvar->lv_pdst != NULL) ifp->if_flags |= IFF_RUNNING; else ifp->if_flags &= ~IFF_RUNNING; @@ -1323,7 +1314,6 @@ l2tp_set_cookie(struct l2tp_softc *sc, u nvar->lv_peer_cookie = peer_cookie; nvar->lv_peer_cookie_len = peer_cookie_len; nvar->lv_use_cookie = L2TP_COOKIE_ON; - membar_producer(); l2tp_variant_update(sc, nvar); mutex_exit(&sc->l2tp_lock); @@ -1357,7 +1347,6 @@ l2tp_clear_cookie(struct l2tp_softc *sc) nvar->lv_peer_cookie = 0; nvar->lv_peer_cookie_len = 0; nvar->lv_use_cookie = L2TP_COOKIE_OFF; - membar_producer(); l2tp_variant_update(sc, nvar); mutex_exit(&sc->l2tp_lock); @@ -1376,7 +1365,6 @@ l2tp_set_state(struct l2tp_softc *sc, in *nvar = *sc->l2tp_var; psref_target_init(&nvar->lv_psref, lv_psref_class); nvar->lv_state = state; - membar_producer(); l2tp_variant_update(sc, nvar); if (nvar->lv_state == L2TP_STATE_UP) { Index: src/sys/net/if_l2tp.h diff -u src/sys/net/if_l2tp.h:1.8 src/sys/net/if_l2tp.h:1.9 --- src/sys/net/if_l2tp.h:1.8 Thu Sep 19 06:07:24 2019 +++ src/sys/net/if_l2tp.h Sat Feb 1 02:58:05 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_l2tp.h,v 1.8 2019/09/19 06:07:24 knakahara Exp $ */ +/* $NetBSD: if_l2tp.h,v 1.9 2020/02/01 02:58:05 riastradh Exp $ */ /* * Copyright (c) 2017 Internet Initiative Japan Inc. @@ -131,12 +131,11 @@ l2tp_getref_variant(struct l2tp_softc *s int s; s = pserialize_read_enter(); - var = sc->l2tp_var; + var = atomic_load_consume(&sc->l2tp_var); if (var == NULL) { pserialize_read_exit(s); return NULL; } - membar_datadep_consumer(); psref_acquire(psref, &var->lv_psref, lv_psref_class); pserialize_read_exit(s);