diff --git a/src/core/lib/iomgr/async_execution_lock.h b/src/core/lib/iomgr/async_execution_lock.h
index 66551f939804c17b3d376caf1edd6b1efa30fd95..ba78f81cca78c8179e69f7f90c93834e76be5029 100644
--- a/src/core/lib/iomgr/async_execution_lock.h
+++ b/src/core/lib/iomgr/async_execution_lock.h
@@ -40,6 +40,11 @@
 #include "src/core/lib/iomgr/exec_ctx.h"
 #include "src/core/lib/support/mpscq.h"
 
+// Provides serialized access to some resource.
+// Each action queued on an aelock is executed serially in a borrowed thread.
+// The actual thread executing actions may change over time (but there will only
+// every be one at a time).
+
 typedef void (*grpc_aelock_action)(grpc_exec_ctx *exec_ctx, void *arg);
 
 typedef struct grpc_aelock_qnode {
@@ -54,8 +59,13 @@ typedef struct grpc_aelock {
   gpr_atm locked;
 } grpc_aelock;
 
+// Initialize the lock, with an optional workqueue to shift load to when
+// necessary
 void grpc_aelock_init(grpc_aelock *lock, grpc_workqueue *optional_workqueue);
+// Destroy the lock
 void grpc_aelock_destroy(grpc_aelock *lock);
+// Execute \a action within the lock. \a arg is the argument to pass to \a
+// action and sizeof_arg is the sizeof(*arg), or 0 if arg is non-copyable.
 void grpc_aelock_execute(grpc_exec_ctx *exec_ctx, grpc_aelock *lock,
                          grpc_aelock_action action, void *arg,
                          size_t sizeof_arg);