kernel/cgroup/debug.c

Source file repositories/reference/linux-study-clean/kernel/cgroup/debug.c

File Facts

System
Linux kernel
Corpus path
kernel/cgroup/debug.c
Extension
.c
Size
8317 bytes
Lines
378
Domain
Core OS
Bucket
Scheduler, Processes, Timers, Sync, And Syscalls
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

if (rcu_dereference_protected(cset->dom_cset, 1) != cset) {
			threaded_csets++;
			seq_printf(seq, "=>%pK", cset->dom_cset);
		}
		if (!list_empty(&cset->threaded_csets)) {
			struct css_set *tcset;
			int idx = 0;

			list_for_each_entry(tcset, &cset->threaded_csets,
					    threaded_csets_node) {
				seq_puts(seq, idx ? "," : "<=");
				seq_printf(seq, "%pK", tcset);
				idx++;
			}
		} else {
			seq_printf(seq, " %d", refcnt);
			if (refcnt - cset->nr_tasks > 0) {
				int extra = refcnt - cset->nr_tasks;

				seq_printf(seq, " +%d", extra);
				/*
				 * Take out the one additional reference in
				 * init_css_set.
				 */
				if (cset == &init_css_set)
					extra--;
				extra_refs += extra;
			}
		}
		seq_puts(seq, "\n");

		list_for_each_entry(task, &cset->tasks, cg_list) {
			if (count++ <= MAX_TASKS_SHOWN_PER_CSS)
				seq_printf(seq, "  task %d\n",
					   task_pid_vnr(task));
		}

		list_for_each_entry(task, &cset->mg_tasks, cg_list) {
			if (count++ <= MAX_TASKS_SHOWN_PER_CSS)
				seq_printf(seq, "  task %d\n",
					   task_pid_vnr(task));
		}
		/* show # of overflowed tasks */
		if (count > MAX_TASKS_SHOWN_PER_CSS)
			seq_printf(seq, "  ... (%d)\n",
				   count - MAX_TASKS_SHOWN_PER_CSS);

		if (cset->dead) {
			seq_puts(seq, "    [dead]\n");
			dead_cnt++;
		}

		WARN_ON(count != cset->nr_tasks);
	}
	spin_unlock_irq(&css_set_lock);

	if (!dead_cnt && !extra_refs && !threaded_csets)
		return 0;

	seq_puts(seq, "\n");
	if (threaded_csets)
		seq_printf(seq, "threaded css_sets = %d\n", threaded_csets);
	if (extra_refs)
		seq_printf(seq, "extra references = %d\n", extra_refs);
	if (dead_cnt)
		seq_printf(seq, "dead css_sets = %d\n", dead_cnt);

	return 0;
}

static int cgroup_subsys_states_read(struct seq_file *seq, void *v)
{
	struct kernfs_open_file *of = seq->private;
	struct cgroup *cgrp;
	struct cgroup_subsys *ss;
	struct cgroup_subsys_state *css;
	char pbuf[16];
	int i;

	cgrp = cgroup_kn_lock_live(of->kn, false);
	if (!cgrp)
		return -ENODEV;

	for_each_subsys(ss, i) {
		css = rcu_dereference_check(cgrp->subsys[ss->id], true);
		if (!css)
			continue;

		pbuf[0] = '\0';

Annotation

Implementation Notes