diff --git a/gtests/net/packetdrill/run.c b/gtests/net/packetdrill/run.c
index 778e2b5947f63e57dc3d6a707d2ece13837d540a..574c0cca40a31a987a2eda05539eda819792953c 100644
--- a/gtests/net/packetdrill/run.c
+++ b/gtests/net/packetdrill/run.c
@@ -318,6 +318,7 @@ void wait_for_event(struct state *state)
 			state, state->event->time_usecs);
 	DEBUGP("waiting until %lld -- now is %lld\n",
 	       event_usecs, now_usecs());
+	run_unlock(state);
 	while (1) {
 		const s64 wait_usecs = event_usecs - now_usecs();
 		if (wait_usecs <= 0)
@@ -333,9 +334,7 @@ void wait_for_event(struct state *state)
 		 * event we're waiting for and then spin.
 		 */
 		if (wait_usecs > MAX_SPIN_USECS) {
-			run_unlock(state);
 			usleep(wait_usecs - MAX_SPIN_USECS);
-			run_lock(state);
 		}
 #endif
 
@@ -343,7 +342,7 @@ void wait_for_event(struct state *state)
 		 * two to wait, so we spin.
 		 */
 	}
-
+	run_lock(state);
 	check_event_time(state, now_usecs());
 }