Skip to content

Commit 6162cef

Browse files
committed
cgroup: Factor out and expose cgroup_rstat_*() interface functions
cgroup_rstat is being generalized so that controllers can use it too. This patch factors out and exposes the following interface functions. * cgroup_rstat_updated(): Renamed from cgroup_rstat_cpu_updated() for consistency. * cgroup_rstat_flush_hold/release(): Factored out from base stat implementation. * cgroup_rstat_flush(): Verbatim expose. While at it, drop assert on cgroup_rstat_mutex in cgroup_base_stat_flush() as it crosses layers and make a minor comment update. v2: Added EXPORT_SYMBOL_GPL(cgroup_rstat_updated) to fix a build bug. Signed-off-by: Tejun Heo <[email protected]>
1 parent a17556f commit 6162cef

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

include/linux/cgroup.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -690,11 +690,18 @@ static inline void cgroup_path_from_kernfs_id(const union kernfs_node_id *id,
690690
char *buf, size_t buflen) {}
691691
#endif /* !CONFIG_CGROUPS */
692692

693+
#ifdef CONFIG_CGROUPS
693694
/*
694-
* Basic resource stats.
695+
* cgroup scalable recursive statistics.
695696
*/
696-
#ifdef CONFIG_CGROUPS
697+
void cgroup_rstat_updated(struct cgroup *cgrp, int cpu);
698+
void cgroup_rstat_flush(struct cgroup *cgrp);
699+
void cgroup_rstat_flush_hold(struct cgroup *cgrp);
700+
void cgroup_rstat_flush_release(void);
697701

702+
/*
703+
* Basic resource stats.
704+
*/
698705
#ifdef CONFIG_CGROUP_CPUACCT
699706
void cpuacct_charge(struct task_struct *tsk, u64 cputime);
700707
void cpuacct_account_field(struct task_struct *tsk, int index, u64 val);

kernel/cgroup/cgroup-internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,6 @@ int cgroup_task_count(const struct cgroup *cgrp);
203203
/*
204204
* rstat.c
205205
*/
206-
void cgroup_rstat_flush(struct cgroup *cgrp);
207206
int cgroup_rstat_init(struct cgroup *cgrp);
208207
void cgroup_rstat_exit(struct cgroup *cgrp);
209208
void cgroup_rstat_boot(void);

kernel/cgroup/rstat.c

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ static struct cgroup_rstat_cpu *cgroup_rstat_cpu(struct cgroup *cgrp, int cpu)
1313
}
1414

1515
/**
16-
* cgroup_rstat_cpu_updated - keep track of updated rstat_cpu
16+
* cgroup_rstat_updated - keep track of updated rstat_cpu
1717
* @cgrp: target cgroup
1818
* @cpu: cpu on which rstat_cpu was updated
1919
*
2020
* @cgrp's rstat_cpu on @cpu was updated. Put it on the parent's matching
2121
* rstat_cpu->updated_children list. See the comment on top of
2222
* cgroup_rstat_cpu definition for details.
2323
*/
24-
static void cgroup_rstat_cpu_updated(struct cgroup *cgrp, int cpu)
24+
void cgroup_rstat_updated(struct cgroup *cgrp, int cpu)
2525
{
2626
raw_spinlock_t *cpu_lock = per_cpu_ptr(&cgroup_rstat_cpu_lock, cpu);
2727
struct cgroup *parent;
@@ -59,6 +59,7 @@ static void cgroup_rstat_cpu_updated(struct cgroup *cgrp, int cpu)
5959

6060
raw_spin_unlock_irqrestore(cpu_lock, flags);
6161
}
62+
EXPORT_SYMBOL_GPL(cgroup_rstat_updated);
6263

6364
/**
6465
* cgroup_rstat_cpu_pop_updated - iterate and dismantle rstat_cpu updated tree
@@ -167,6 +168,29 @@ void cgroup_rstat_flush(struct cgroup *cgrp)
167168
mutex_unlock(&cgroup_rstat_mutex);
168169
}
169170

171+
/**
172+
* cgroup_rstat_flush_begin - flush stats in @cgrp's subtree and hold
173+
* @cgrp: target cgroup
174+
*
175+
* Flush stats in @cgrp's subtree and prevent further flushes. Must be
176+
* paired with cgroup_rstat_flush_release().
177+
*/
178+
void cgroup_rstat_flush_hold(struct cgroup *cgrp)
179+
__acquires(&cgroup_rstat_mutex)
180+
{
181+
mutex_lock(&cgroup_rstat_mutex);
182+
cgroup_rstat_flush_locked(cgrp);
183+
}
184+
185+
/**
186+
* cgroup_rstat_flush_release - release cgroup_rstat_flush_hold()
187+
*/
188+
void cgroup_rstat_flush_release(void)
189+
__releases(&cgroup_rstat_mutex)
190+
{
191+
mutex_unlock(&cgroup_rstat_mutex);
192+
}
193+
170194
int cgroup_rstat_init(struct cgroup *cgrp)
171195
{
172196
int cpu;
@@ -239,15 +263,13 @@ static void cgroup_base_stat_flush(struct cgroup *cgrp, int cpu)
239263
struct cgroup_base_stat delta;
240264
unsigned seq;
241265

242-
lockdep_assert_held(&cgroup_rstat_mutex);
243-
244266
/* fetch the current per-cpu values */
245267
do {
246268
seq = __u64_stats_fetch_begin(&rstatc->bsync);
247269
cputime = rstatc->bstat.cputime;
248270
} while (__u64_stats_fetch_retry(&rstatc->bsync, seq));
249271

250-
/* accumulate the deltas to propgate */
272+
/* calculate the delta to propgate */
251273
delta.cputime.utime = cputime.utime - last_cputime->utime;
252274
delta.cputime.stime = cputime.stime - last_cputime->stime;
253275
delta.cputime.sum_exec_runtime = cputime.sum_exec_runtime -
@@ -278,7 +300,7 @@ static void cgroup_base_stat_cputime_account_end(struct cgroup *cgrp,
278300
struct cgroup_rstat_cpu *rstatc)
279301
{
280302
u64_stats_update_end(&rstatc->bsync);
281-
cgroup_rstat_cpu_updated(cgrp, smp_processor_id());
303+
cgroup_rstat_updated(cgrp, smp_processor_id());
282304
put_cpu_ptr(rstatc);
283305
}
284306

@@ -323,14 +345,10 @@ void cgroup_base_stat_cputime_show(struct seq_file *seq)
323345
if (!cgroup_parent(cgrp))
324346
return;
325347

326-
mutex_lock(&cgroup_rstat_mutex);
327-
328-
cgroup_rstat_flush_locked(cgrp);
329-
348+
cgroup_rstat_flush_hold(cgrp);
330349
usage = cgrp->bstat.cputime.sum_exec_runtime;
331350
cputime_adjust(&cgrp->bstat.cputime, &cgrp->prev_cputime, &utime, &stime);
332-
333-
mutex_unlock(&cgroup_rstat_mutex);
351+
cgroup_rstat_flush_release();
334352

335353
do_div(usage, NSEC_PER_USEC);
336354
do_div(utime, NSEC_PER_USEC);

0 commit comments

Comments
 (0)