Lines Matching +full:post +full:- +full:processing
1 // SPDX-License-Identifier: GPL-2.0-only
9 #include "../cgroup/cgroup-internal.h" /* cgroup_mutex and cgroup_is_dead */
13 * 1. Walk the descendants of a cgroup in pre-order.
14 * 2. Walk the descendants of a cgroup in post-order.
19 * For walking descendants, cgroup_iter can walk in either pre-order or
20 * post-order. For walking ancestors, the iter walks up from a cgroup to
26 * The prog can check (seq->num == 0) to determine whether this is
29 * do post-processing, such as outputting an epilogue.
60 struct cgroup_iter_priv *p = seq->private;
66 if (p->visited_all)
70 * return -EOPNOTSUPP to indicate incomplete iteration.
72 return ERR_PTR(-EOPNOTSUPP);
76 p->terminate = false;
77 p->visited_all = false;
78 if (p->order == BPF_CGROUP_ITER_DESCENDANTS_PRE)
79 return css_next_descendant_pre(NULL, p->start_css);
80 else if (p->order == BPF_CGROUP_ITER_DESCENDANTS_POST)
81 return css_next_descendant_post(NULL, p->start_css);
82 else if (p->order == BPF_CGROUP_ITER_CHILDREN)
83 return css_next_child(NULL, p->start_css);
85 return p->start_css;
93 struct cgroup_iter_priv *p = seq->private;
97 /* pass NULL to the prog for post-processing */
100 p->visited_all = true;
107 struct cgroup_iter_priv *p = seq->private;
110 if (p->terminate)
113 if (p->order == BPF_CGROUP_ITER_DESCENDANTS_PRE)
114 return css_next_descendant_pre(curr, p->start_css);
115 else if (p->order == BPF_CGROUP_ITER_DESCENDANTS_POST)
116 return css_next_descendant_post(curr, p->start_css);
117 else if (p->order == BPF_CGROUP_ITER_ANCESTORS_UP)
118 return curr->parent;
119 else if (p->order == BPF_CGROUP_ITER_CHILDREN)
120 return css_next_child(curr, p->start_css);
128 struct cgroup_iter_priv *p = seq->private;
135 if (css && cgroup_is_dead(css->cgroup))
139 ctx.cgroup = css ? css->cgroup : NULL;
147 p->terminate = true;
170 struct cgroup *cgrp = aux->cgroup.start;
177 p->start_css = &cgrp->self;
178 css_get(p->start_css);
179 p->terminate = false;
180 p->visited_all = false;
181 p->order = aux->cgroup.order;
189 css_put(p->start_css);
203 int fd = linfo->cgroup.cgroup_fd;
204 u64 id = linfo->cgroup.cgroup_id;
205 int order = linfo->cgroup.order;
216 return -EINVAL;
220 return -EINVAL;
232 aux->cgroup.start = cgrp;
233 aux->cgroup.order = order;
239 cgroup_put(aux->cgroup.start);
258 cgroup_path_ns(aux->cgroup.start, buf, PATH_MAX,
259 current->nsproxy->cgroup_ns);
264 if (aux->cgroup.order == BPF_CGROUP_ITER_DESCENDANTS_PRE)
266 else if (aux->cgroup.order == BPF_CGROUP_ITER_DESCENDANTS_POST)
268 else if (aux->cgroup.order == BPF_CGROUP_ITER_ANCESTORS_UP)
270 else if (aux->cgroup.order == BPF_CGROUP_ITER_CHILDREN)
279 info->iter.cgroup.order = aux->cgroup.order;
280 info->iter.cgroup.cgroup_id = cgroup_id(aux->cgroup.start);
330 kit->start = NULL;
338 return -EINVAL;
341 kit->start = start;
342 kit->pos = NULL;
343 kit->flags = flags;
351 if (!kit->start)
354 switch (kit->flags) {
356 kit->pos = css_next_descendant_pre(kit->pos, kit->start);
359 kit->pos = css_next_descendant_post(kit->pos, kit->start);
362 kit->pos = css_next_child(kit->pos, kit->start);
365 kit->pos = kit->pos ? kit->pos->parent : kit->start;
368 return kit->pos;