struct cgroup_iter_priv *p = (struct cgroup_iter_priv *)priv;
        struct cgroup *cgrp = aux->cgroup.start;
 
+       /* bpf_iter_attach_cgroup() has already acquired an extra reference
+        * for the start cgroup, but the reference may be released after
+        * cgroup_iter_seq_init(), so acquire another reference for the
+        * start cgroup.
+        */
        p->start_css = &cgrp->self;
+       css_get(p->start_css);
        p->terminate = false;
        p->visited_all = false;
        p->order = aux->cgroup.order;
        return 0;
 }
 
+static void cgroup_iter_seq_fini(void *priv)
+{
+       struct cgroup_iter_priv *p = (struct cgroup_iter_priv *)priv;
+
+       css_put(p->start_css);
+}
+
 static const struct bpf_iter_seq_info cgroup_iter_seq_info = {
        .seq_ops                = &cgroup_iter_seq_ops,
        .init_seq_private       = cgroup_iter_seq_init,
+       .fini_seq_private       = cgroup_iter_seq_fini,
        .seq_priv_size          = sizeof(struct cgroup_iter_priv),
 };