freezer
sdiodev->freezer = kzalloc_obj(*sdiodev->freezer);
if (!sdiodev->freezer)
atomic_set(&sdiodev->freezer->thread_count, 0);
atomic_set(&sdiodev->freezer->freezing, 0);
init_waitqueue_head(&sdiodev->freezer->thread_freeze);
init_completion(&sdiodev->freezer->resumed);
if (sdiodev->freezer) {
WARN_ON(atomic_read(&sdiodev->freezer->freezing));
kfree(sdiodev->freezer);
sdiodev->freezer = NULL;
atomic_t *expect = &sdiodev->freezer->thread_count;
sdiodev->freezer->frozen_count = 0;
reinit_completion(&sdiodev->freezer->resumed);
atomic_set(&sdiodev->freezer->freezing, 1);
wait_event(sdiodev->freezer->thread_freeze,
atomic_read(expect) == sdiodev->freezer->frozen_count);
atomic_set(&sdiodev->freezer->freezing, 0);
complete_all(&sdiodev->freezer->resumed);
atomic_read(&sdiodev->freezer->freezing);
sdiodev->freezer->frozen_count++;
wake_up(&sdiodev->freezer->thread_freeze);
wait_for_completion(&sdiodev->freezer->resumed);
atomic_inc(&sdiodev->freezer->thread_count);
atomic_dec(&sdiodev->freezer->thread_count);
struct brcmf_sdiod_freezer *freezer;
struct cgroup_freezer_state freezer;
SUBSYS(freezer)
sequence = read_seqcount_begin(&cgrp->freezer.freeze_seq);
freeze_time = cgrp->freezer.frozen_nsec;
cgrp->freezer.freeze_start_nsec);
} while (read_seqcount_retry(&cgrp->freezer.freeze_seq, sequence));
seq_printf(seq, "%d\n", cgrp->freezer.freeze);
cgrp->freezer.e_freeze = parent->freezer.e_freeze;
seqcount_spinlock_init(&cgrp->freezer.freeze_seq, &css_set_lock);
if (cgrp->freezer.e_freeze) {
cgrp->freezer.freeze_start_nsec = ktime_get_ns();
if (cgrp->freezer.e_freeze)
tcgrp->freezer.nr_frozen_descendants++;
tcgrp->freezer.nr_frozen_descendants--;
write_seqcount_begin(&cgrp->freezer.freeze_seq);
cgrp->freezer.freeze_start_nsec = ts_nsec;
cgrp->freezer.frozen_nsec += (ts_nsec -
cgrp->freezer.freeze_start_nsec);
write_seqcount_end(&cgrp->freezer.freeze_seq);
if (cgrp->nr_descendants == cgrp->freezer.nr_frozen_descendants)
if (cgrp->freezer.freeze == freeze)
cgrp->freezer.freeze = freeze;
old_e = dsct->freezer.e_freeze;
dsct->freezer.e_freeze = (dsct->freezer.freeze ||
parent->freezer.e_freeze);
if (dsct->freezer.e_freeze == old_e) {
cgrp->freezer.nr_frozen_descendants += desc;
(cgrp->freezer.nr_frozen_descendants !=
cgrp->freezer.nr_frozen_descendants -= desc;
cgrp->freezer.nr_frozen_tasks == __cgroup_task_count(cgrp);
cgrp->freezer.nr_frozen_tasks++;
cgrp->freezer.nr_frozen_tasks--;
WARN_ON_ONCE(cgrp->freezer.nr_frozen_tasks < 0);
struct freezer *freezer = css_freezer(css);
struct freezer *parent = parent_freezer(freezer);
freezer->state |= CGROUP_FREEZER_ONLINE;
freezer->state |= CGROUP_FREEZING_PARENT | CGROUP_FROZEN;
struct freezer *freezer = css_freezer(css);
if (freezer->state & CGROUP_FREEZING)
freezer->state = 0;
struct freezer *freezer = css_freezer(new_css);
if (!(freezer->state & CGROUP_FREEZING)) {
while (freezer && (freezer->state & CGROUP_FROZEN)) {
freezer->state &= ~CGROUP_FROZEN;
freezer = parent_freezer(freezer);
struct freezer *freezer;
freezer = task_freezer(task);
if (freezer->state & CGROUP_FREEZING)
struct freezer *freezer = css_freezer(css);
if (!(freezer->state & CGROUP_FREEZING) ||
(freezer->state & CGROUP_FROZEN))
struct freezer *child = css_freezer(pos);
freezer->state |= CGROUP_FROZEN;
static void freeze_cgroup(struct freezer *freezer)
css_task_iter_start(&freezer->css, 0, &it);
static void unfreeze_cgroup(struct freezer *freezer)
css_task_iter_start(&freezer->css, 0, &it);
static void freezer_apply_state(struct freezer *freezer, bool freeze,
if (!(freezer->state & CGROUP_FREEZER_ONLINE))
if (!(freezer->state & CGROUP_FREEZING))
freezer->state |= state;
freeze_cgroup(freezer);
bool was_freezing = freezer->state & CGROUP_FREEZING;
freezer->state &= ~state;
if (!(freezer->state & CGROUP_FREEZING)) {
freezer->state &= ~CGROUP_FROZEN;
unfreeze_cgroup(freezer);
static void freezer_change_state(struct freezer *freezer, bool freeze)
css_for_each_descendant_pre(pos, &freezer->css) {
struct freezer *pos_f = css_freezer(pos);
struct freezer *parent = parent_freezer(pos_f);
if (pos_f == freezer)
struct freezer *freezer = css_freezer(css);
return (bool)(freezer->state & CGROUP_FREEZING_SELF);
static inline struct freezer *css_freezer(struct cgroup_subsys_state *css)
struct freezer *freezer = css_freezer(css);
return (bool)(freezer->state & CGROUP_FREEZING_PARENT);
return css ? container_of(css, struct freezer, css) : NULL;
static inline struct freezer *task_freezer(struct task_struct *task)
static struct freezer *parent_freezer(struct freezer *freezer)
return css_freezer(freezer->css.parent);
struct freezer *freezer;
freezer = kzalloc_obj(struct freezer);
if (!freezer)
return &freezer->css;