diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c
index 2f1d81ee84776b4035686834fbee360bddb57750..060a8ff54a8b3ec649d702903f544f3100e7db1e 100644
--- a/src/core/surface/completion_queue.c
+++ b/src/core/surface/completion_queue.c
@@ -163,6 +163,7 @@ void grpc_cq_end_op(grpc_completion_queue *cc, void *tag, grpc_call *call,
   ev->base.success = success;
   end_op_locked(cc, GRPC_OP_COMPLETE);
   gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset));
+  if (call) GRPC_CALL_INTERNAL_UNREF(call, "cq", 0);
 }
 
 /* Create a GRPC_QUEUE_SHUTDOWN event without queuing it anywhere */