Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 931afbc21fb7256372512b67f529ef39acfc8ac8)
+++ kernel/generic/src/ipc/ipc.c	(revision d3b2ffaddcda1e7c3db7a9f643033e62c4c947a0)
@@ -550,5 +550,4 @@
 	errno_t rc;
 
-restart:
 	rc = waitq_sleep_timeout(&box->wq, usec, flags, NULL);
 	if (rc != EOK)
@@ -590,7 +589,10 @@
 		list_append(&request->ab_link, &box->dispatched_calls);
 	} else {
-		/* This can happen regularly after ipc_cleanup */
+		/*
+		 * This can happen regularly after ipc_cleanup, or in
+		 * response to ipc_poke(). Let the caller sort out the wakeup.
+		 */
 		irq_spinlock_unlock(&box->lock, true);
-		goto restart;
+		return NULL;
 	}
 
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision 931afbc21fb7256372512b67f529ef39acfc8ac8)
+++ kernel/generic/src/ipc/sysipc.c	(revision d3b2ffaddcda1e7c3db7a9f643033e62c4c947a0)
@@ -856,5 +856,5 @@
 sys_errno_t sys_ipc_poke(void)
 {
-	waitq_unsleep(&TASK->answerbox.wq);
+	waitq_wakeup(&TASK->answerbox.wq, WAKEUP_FIRST);
 	return EOK;
 }
