diff --git a/src/core/support/time_posix.c b/src/core/support/time_posix.c
index dcecff0d05dfc206ca222691c6af69a6c6bb3f12..889b63a88af6367b6499c6dffd3f63a7a4df64c3 100644
--- a/src/core/support/time_posix.c
+++ b/src/core/support/time_posix.c
@@ -41,6 +41,7 @@
 #include <unistd.h>
 #include <grpc/support/log.h>
 #include <grpc/support/time.h>
+#include "src/core/iomgr/block_annotate.h"
 
 static struct timespec timespec_from_gpr(gpr_timespec gts) {
   struct timespec rv;
@@ -126,6 +127,7 @@ void gpr_sleep_until(gpr_timespec until) {
   gpr_timespec now;
   gpr_timespec delta;
   struct timespec delta_ts;
+  int ns_result;
 
   for (;;) {
     /* We could simplify by using clock_nanosleep instead, but it might be
@@ -137,7 +139,10 @@ void gpr_sleep_until(gpr_timespec until) {
 
     delta = gpr_time_sub(until, now);
     delta_ts = timespec_from_gpr(delta);
-    if (nanosleep(&delta_ts, NULL) == 0) {
+    GRPC_IOMGR_START_BLOCKING_REGION;
+    ns_result = nanosleep(&delta_ts, NULL);
+    GRPC_IOMGR_END_BLOCKING_REGION;
+    if (ns_result == 0) {
       break;
     }
   }
diff --git a/src/core/support/time_win32.c b/src/core/support/time_win32.c
index f794855429b56e0ed6bee350ed82729de3f1a709..710c7969badcebb40da49ab34557c88de108ea0a 100644
--- a/src/core/support/time_win32.c
+++ b/src/core/support/time_win32.c
@@ -41,6 +41,8 @@
 #include <src/core/support/time_precise.h>
 #include <sys/timeb.h>
 
+#include "src/core/iomgr/block_annotate.h"
+
 static LARGE_INTEGER g_start_time;
 static double g_time_scale;
 
@@ -92,7 +94,9 @@ void gpr_sleep_until(gpr_timespec until) {
     delta = gpr_time_sub(until, now);
     sleep_millis =
         (DWORD)delta.tv_sec * GPR_MS_PER_SEC + delta.tv_nsec / GPR_NS_PER_MS;
+    GRPC_IOMGR_START_BLOCKING_REGION;
     Sleep(sleep_millis);
+    GRPC_IOMGR_END_BLOCKING_REGION;
   }
 }