add net_tq_barriers
authordlg <dlg@openbsd.org>
Tue, 30 May 2023 23:55:42 +0000 (23:55 +0000)
committerdlg <dlg@openbsd.org>
Tue, 30 May 2023 23:55:42 +0000 (23:55 +0000)
this waits once for something to end in all the net tqs.

ok claudio@

sys/net/if.c
sys/net/if.h

index ae1069b..36c5233 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if.c,v 1.697 2023/05/16 14:32:54 jan Exp $    */
+/*     $OpenBSD: if.c,v 1.698 2023/05/30 23:55:42 dlg Exp $    */
 /*     $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $  */
 
 /*
@@ -3476,3 +3476,19 @@ net_tq(unsigned int ifindex)
 
        return (sn->sn_taskq);
 }
+
+void
+net_tq_barriers(const char *wmesg)
+{
+       struct task barriers[NET_TASKQ];
+       struct refcnt r = REFCNT_INITIALIZER();
+       int i;
+
+       for (i = 0; i < nitems(barriers); i++) {
+               task_set(&barriers[i], (void (*)(void *))refcnt_rele_wake, &r);
+               refcnt_take(&r);
+               task_add(softnets[i].sn_taskq, &barriers[i]);
+       }
+       refcnt_finalize(&r, wmesg);
+}
index 189ce87..fdf04c5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if.h,v 1.213 2023/05/16 14:32:54 jan Exp $    */
+/*     $OpenBSD: if.h,v 1.214 2023/05/30 23:55:42 dlg Exp $    */
 /*     $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $  */
 
 /*
@@ -560,6 +560,7 @@ int if_congested(void);
 __dead void    unhandled_af(int);
 int    if_setlladdr(struct ifnet *, const uint8_t *);
 struct taskq * net_tq(unsigned int);
+void   net_tq_barriers(const char *);
 
 #endif /* _KERNEL */