replace the bare sleep state handling in barriers with wait cond code
authordlg <dlg@openbsd.org>
Thu, 14 Dec 2017 00:45:16 +0000 (00:45 +0000)
committerdlg <dlg@openbsd.org>
Thu, 14 Dec 2017 00:45:16 +0000 (00:45 +0000)
sys/kern/kern_task.c
sys/kern/kern_timeout.c
sys/net/ifq.c

index feaa7be..5c4f159 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_task.c,v 1.21 2017/11/13 23:52:49 dlg Exp $ */
+/*     $OpenBSD: kern_task.c,v 1.22 2017/12/14 00:45:16 dlg Exp $ */
 
 /*
  * Copyright (c) 2013 David Gwynne <dlg@openbsd.org>
@@ -183,25 +183,19 @@ taskq_create_thread(void *arg)
 void
 taskq_barrier(struct taskq *tq)
 {
-       struct sleep_state sls;
-       unsigned int notdone = 1;
-       struct task t = TASK_INITIALIZER(taskq_barrier_task, &notdone);
+       struct cond c = COND_INITIALIZER();
+       struct task t = TASK_INITIALIZER(taskq_barrier_task, &c);
 
        task_add(tq, &t);
 
-       while (notdone) {
-               sleep_setup(&sls, &notdone, PWAIT, "tqbar");
-               sleep_finish(&sls, notdone);
-       }
+       cond_wait(&c, "tqbar");
 }
 
 void
 taskq_barrier_task(void *p)
 {
-       unsigned int *notdone = p;
-
-       *notdone = 0;
-       wakeup_one(notdone);
+       struct cond *c = p;
+       cond_signal(c);
 }
 
 void
index 00565e8..757663e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_timeout.c,v 1.51 2017/11/24 02:36:53 dlg Exp $   */
+/*     $OpenBSD: kern_timeout.c,v 1.52 2017/12/14 00:45:16 dlg Exp $   */
 /*
  * Copyright (c) 2001 Thomas Nordin <nordin@openbsd.org>
  * Copyright (c) 2000-2001 Artur Grabowski <art@openbsd.org>
@@ -334,11 +334,10 @@ timeout_barrier(struct timeout *to)
                splx(splsoftclock());
                KERNEL_UNLOCK();
        } else {
-               int wait = 1;
+               struct cond c = COND_INITIALIZER();
                struct timeout barrier;
-               struct sleep_state sls;
 
-               timeout_set_proc(&barrier, timeout_proc_barrier, &wait);
+               timeout_set_proc(&barrier, timeout_proc_barrier, &c);
 
                mtx_enter(&timeout_mutex);
                barrier.to_flags |= TIMEOUT_ONQUEUE;
@@ -347,10 +346,7 @@ timeout_barrier(struct timeout *to)
 
                wakeup_one(&timeout_proc);
 
-               while (wait) {
-                       sleep_setup(&sls, &wait, PSWP, "tmobar");
-                       sleep_finish(&sls, wait);
-               }
+               cond_wait(&c, "tmobar");
        }
 }
 
index 4c6d894..22eba97 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ifq.c,v 1.15 2017/11/14 08:44:11 dlg Exp $ */
+/*     $OpenBSD: ifq.c,v 1.16 2017/12/14 00:45:16 dlg Exp $ */
 
 /*
  * Copyright (c) 2015 David Gwynne <dlg@openbsd.org>
@@ -133,9 +133,8 @@ ifq_restart_task(void *p)
 void
 ifq_barrier(struct ifqueue *ifq)
 {
-       struct sleep_state sls;
-       unsigned int notdone = 1;
-       struct task t = TASK_INITIALIZER(ifq_barrier_task, &notdone);
+       struct cond c = COND_INITIALIZER();
+       struct task t = TASK_INITIALIZER(ifq_barrier_task, &c);
 
        /* this should only be called from converted drivers */
        KASSERT(ISSET(ifq->ifq_if->if_xflags, IFXF_MPSAFE));
@@ -145,10 +144,7 @@ ifq_barrier(struct ifqueue *ifq)
 
        ifq_serialize(ifq, &t);
 
-       while (notdone) {
-               sleep_setup(&sls, &notdone, PWAIT, "ifqbar");
-               sleep_finish(&sls, notdone);
-       }
+       cond_wait(&c, "ifqbar");
 }
 
 void