From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 23B63C54FB3 for ; Thu, 29 May 2025 18:58:35 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 65F046B0085; Thu, 29 May 2025 14:58:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 60F766B0088; Thu, 29 May 2025 14:58:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 525D96B0089; Thu, 29 May 2025 14:58:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 2CD626B0085 for ; Thu, 29 May 2025 14:58:35 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id B8A30120E48 for ; Thu, 29 May 2025 18:58:34 +0000 (UTC) X-FDA: 83496856548.20.829EFA6 Received: from out-187.mta1.migadu.com (out-187.mta1.migadu.com [95.215.58.187]) by imf16.hostedemail.com (Postfix) with ESMTP id 9A17F180009 for ; Thu, 29 May 2025 18:58:31 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=VtgYLdCG; spf=pass (imf16.hostedemail.com: domain of ihor.solodrai@linux.dev designates 95.215.58.187 as permitted sender) smtp.mailfrom=ihor.solodrai@linux.dev; dmarc=pass (policy=none) header.from=linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1748545113; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=bOHe7a4ltmWqU1e5ZS3U2ls9kKsTWCwuykifpUWa7fs=; b=IcO8xVRaw90xWEYE7ZDq1+5DLK0skRtQfECXcv0hHB5IqoQSyaHazo43g8hGZauzJFXkUO hovbtU42a48FSkDWRXSD+8l8qOduQBbEZjPIwPA1ORVmWOqWglLIKab8VKjWV5JZJJtWMo GhgPee2IkN7XQ07+NFin/eoOnK2UxrU= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=VtgYLdCG; spf=pass (imf16.hostedemail.com: domain of ihor.solodrai@linux.dev designates 95.215.58.187 as permitted sender) smtp.mailfrom=ihor.solodrai@linux.dev; dmarc=pass (policy=none) header.from=linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1748545113; a=rsa-sha256; cv=none; b=FYeytwQFP2dT5aEKhtiOy+CeYBlwnkXwMm7msIj1crNA2d1KHVJcP6BZWzPwy5ZHitu/8u rGA8kkRr23HilGwrZuAz26KXaAP/HgX5IC8h1amqPhffhFeeDEjCAv1qOTzQWEXY40F8Sy rfl9wOhSdNl6gHmL0/kpUX63T6e0+iw= Message-ID: <6f688f2e-7d26-423a-9029-d1b1ef1c938a@linux.dev> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1748545109; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bOHe7a4ltmWqU1e5ZS3U2ls9kKsTWCwuykifpUWa7fs=; b=VtgYLdCGWWtZxWhQVaE20Jrx/LldVehE0PJCfOKVrqNgrnWGgXGpsBM7eVN23clwEmliho GQUhZsaz5b8m1oaK2Mx/XoVNwY6T20jmR4ydzzDEUexemsKiZh6kou1HCCfRjK3P+6SvtD oDhdQDsdcTNnrCrcxDfzztsxaC14pb0= Date: Thu, 29 May 2025 11:58:17 -0700 MIME-Version: 1.0 Subject: Re: [PATCH v4 1/5] cgroup: move rstat base stat objects into their own struct To: JP Kobryn , tj@kernel.org, shakeel.butt@linux.dev, yosryahmed@google.com, mkoutny@suse.com, hannes@cmpxchg.org, akpm@linux-foundation.org Cc: linux-mm@kvack.org, cgroups@vger.kernel.org, kernel-team@meta.com, bpf@vger.kernel.org References: <20250404011050.121777-1-inwardvessel@gmail.com> <20250404011050.121777-2-inwardvessel@gmail.com> Content-Language: en-US X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Ihor Solodrai In-Reply-To: <20250404011050.121777-2-inwardvessel@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Migadu-Flow: FLOW_OUT X-Rspam-User: X-Stat-Signature: qum3zhpntbbtrterknx773sya77qzh6j X-Rspamd-Queue-Id: 9A17F180009 X-Rspamd-Server: rspam11 X-HE-Tag: 1748545111-981164 X-HE-Meta: U2FsdGVkX1+/bYeG5ieCvy1uQUllz+LrmjcOClSEZwgjoHkOXlHUIOhbkjnljhA11b9Ezbipkv/1xy4X5w9tsqkq86jXz4IDQOglvCQghS8dVfhx9782RuNsmrGrQ8g8cwybeXzzslA7jcNjt8Y6QCsWUeEA1DMMsz25kx+LxOKUQv2ZIn/xQoZZcb1+bAKGoMOb6gvx9zhi9sp7sQvy+H/Nsjubeg2joA1buWUsU3pncV4hR6KA8Kkvg/fLDr0uIXL3Mo7FrwZs19ulWbrEkGyuHJyt/t6X8kCFNPUyEU0kZ35BOTdDBET0Tu5dp1y9eOOoSwrixhqC9kPhrLiZdba9g3qcpvHuqi2QdJBuuScIG7xtLNNxVwhmj/zln7B+xykp+KZtork6oGgs5QDAPv4HFUIcX3kbBKcBjHtcy+U1rlgfeIJJEXzrVD+1r5VnrcsFB9kMjJ7wJCrP7TX530pq2LKj/NOOAq2vnuU4W8ua8j/em8+Om3ciWAOI9qGzbGIWp4XhHl59eiRTz0MkDILztBiwpnFKgSSqLcXrRtg/F9HYUuYKo0wx0HdCAe2dQHf0z3cUL6ALOyx3gCtqLnto9PUgr1BdpS/v3YgljrxEuiXekQw0q81348d6JhrazbNt7sjClLwWMEsE/tRFpMORHTeAKV3c8g9ijFz9AwaniOubgUptsCwqxx2qckgnoObXxr40wXGT3AyU0HwUhe0PdvBHnVpoeH+3yL8HMjJZzCYZwMxkOa0JTmZomzkAgXfEtyQMMUw/Eyfvu3c+kJXlGndqFlWK+7utslR62IMzlCPIG29GidRdE2QnHT5+aDog+9GzbmUt9GDoD5Hxo/xXeZCdpiSw4CiT76NwFNAwehrqfHvG4itnGLcUezmT4rW9YjyJFD0EKJ7ogTzNBCOyu7vZ62HSWQWusTKvy9mYaiIqPdVB5Cin9cVjoVFuxe3e77oItxMU8h0MEld xGxT4dKE OEfa4uKIm8ian/krTxQL3hUo1Qz7Ykr9yeLAB8LGWwLxfydFD1tC95TtP6TYq2fY6jW0QtI5Flc/efofavIq62wLHJmfvPGcPHGN+mKr1xmoVazWGF7eiqjvGRRznsdYHiTZhr8oXcbVB8VQQzs+FD3m8TfA0Y6kIa6p0nas/erJ0t6KA4tvNrjNBHJmfATho3iOkn1r+uVGmMkzRIv/B6gLTzrvzCel9BgGL5ui86CqYaf/jXsog04Ymnk92f3ddNpaW9SWFpzf9vYdSu5vIH+/pV9cM6VRGzLco X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On 4/3/25 6:10 PM, JP Kobryn wrote: > This non-functional change serves as preparation for moving to > subsystem-based rstat trees. The base stats are not an actual subsystem, > but in future commits they will have exclusive rstat trees just as other > subsystems will. > > Moving the base stat objects into a new struct allows the cgroup_rstat_cpu > struct to become more compact since it now only contains the minimum amount > of pointers needed for rstat participation. Subsystems will (in future > commits) make use of the compact cgroup_rstat_cpu struct while avoiding the > memory overhead of the base stat objects which they will not use. > > An instance of the new struct cgroup_rstat_base_cpu was placed on the > cgroup struct so it can retain ownership of these base stats common to all > cgroups. A helper function was added for looking up the cpu-specific base > stats of a given cgroup. Finally, initialization and variable names were > adjusted where applicable. > > Signed-off-by: JP Kobryn > --- > include/linux/cgroup-defs.h | 38 ++++++++++------- > kernel/cgroup/cgroup.c | 8 +++- > kernel/cgroup/rstat.c | 84 ++++++++++++++++++++++--------------- > 3 files changed, 79 insertions(+), 51 deletions(-) > Hi everyone. BPF CI started failing after recent upstream merges (tip: 90b83efa6701). I bisected the issue to this patch, see a log snippet below [1]: ##[error]#44/9 btf_tag/btf_type_tag_percpu_vmlinux_helper load_btfs:PASS:could not load vmlinux BTF 0 nsec test_btf_type_tag_vmlinux_percpu:PASS:btf_type_tag_percpu 0 nsec libbpf: prog 'test_percpu_helper': BPF program load failed: -EACCES libbpf: prog 'test_percpu_helper': -- BEGIN PROG LOAD LOG -- 0: R1=ctx() R10=fp0 ; int BPF_PROG(test_percpu_helper, struct cgroup *cgrp, const char *path) @ btf_type_tag_percpu.c:58 0: (79) r1 = *(u64 *)(r1 +0) func 'cgroup_mkdir' arg0 has btf_id 437 type STRUCT 'cgroup' 1: R1_w=trusted_ptr_cgroup() ; cpu = bpf_get_smp_processor_id(); @ btf_type_tag_percpu.c:63 1: (7b) *(u64 *)(r10 -8) = r1 ; R1_w=trusted_ptr_cgroup() R10=fp0 fp-8_w=trusted_ptr_cgroup() 2: (85) call bpf_get_smp_processor_id#8 ; R0_w=scalar(smin=smin32=0,smax=umax=smax32=umax32=1,var_off=(0x0; 0x1)) 3: (79) r1 = *(u64 *)(r10 -8) ; R1_w=trusted_ptr_cgroup() R10=fp0 fp-8_w=trusted_ptr_cgroup() ; cgrp->self.rstat_cpu, cpu); @ btf_type_tag_percpu.c:65 4: (79) r1 = *(u64 *)(r1 +32) ; R1_w=percpu_ptr_css_rstat_cpu() ; rstat = (struct cgroup_rstat_cpu *)bpf_per_cpu_ptr( @ btf_type_tag_percpu.c:64 5: (bc) w2 = w0 ; R0_w=scalar(id=1,smin=smin32=0,smax=umax=smax32=umax32=1,var_off=(0x0; 0x1)) R2_w=scalar(id=1,smin=smin32=0,smax=umax=smax32=umax32=1,var_off=(0x0; 0x1)) 6: (85) call bpf_per_cpu_ptr#153 ; R0=ptr_or_null_css_rstat_cpu(id=2) ; if (rstat) { @ btf_type_tag_percpu.c:66 7: (15) if r0 == 0x0 goto pc+1 ; R0=ptr_css_rstat_cpu() ; *(volatile int *)rstat; @ btf_type_tag_percpu.c:68 8: (61) r1 = *(u32 *)(r0 +0) cannot access ptr member updated_children with moff 0 in struct css_rstat_cpu with off 0 size 4 processed 9 insns (limit 1000000) max_states_per_insn 0 total_states 1 peak_states 1 mark_read 1 -- END PROG LOAD LOG -- libbpf: prog 'test_percpu_helper': failed to load: -EACCES libbpf: failed to load object 'btf_type_tag_percpu' libbpf: failed to load BPF skeleton 'btf_type_tag_percpu': -EACCES test_btf_type_tag_vmlinux_percpu:FAIL:btf_type_tag_percpu_helper unexpected error: -13 (errno 13) The test in question [2]: SEC("tp_btf/cgroup_mkdir") int BPF_PROG(test_percpu_helper, struct cgroup *cgrp, const char *path) { struct cgroup_rstat_cpu *rstat; __u32 cpu; cpu = bpf_get_smp_processor_id(); rstat = (struct cgroup_rstat_cpu *)bpf_per_cpu_ptr(cgrp->rstat_cpu, cpu); if (rstat) { /* READ_ONCE */ *(volatile int *)rstat; // BPF verification fails here } return 0; } Any ideas about how to properly fix this? Thanks. [1] https://github.com/kernel-patches/bpf/actions/runs/15316839796/job/43125242673 [2] https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/testing/selftests/bpf/progs/btf_type_tag_percpu.c#n68 > diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h > index 485b651869d9..6d177f770d28 100644 > --- a/include/linux/cgroup-defs.h > +++ b/include/linux/cgroup-defs.h > @@ -344,10 +344,29 @@ struct cgroup_base_stat { > * frequency decreases the cost of each read. > * > * This struct hosts both the fields which implement the above - > - * updated_children and updated_next - and the fields which track basic > - * resource statistics on top of it - bsync, bstat and last_bstat. > + * updated_children and updated_next. > */ > struct cgroup_rstat_cpu { > + /* > + * Child cgroups with stat updates on this cpu since the last read > + * are linked on the parent's ->updated_children through > + * ->updated_next. > + * > + * In addition to being more compact, singly-linked list pointing > + * to the cgroup makes it unnecessary for each per-cpu struct to > + * point back to the associated cgroup. > + * > + * Protected by per-cpu cgroup_rstat_cpu_lock. > + */ > + struct cgroup *updated_children; /* terminated by self cgroup */ > + struct cgroup *updated_next; /* NULL iff not on the list */ > +}; > + > +/* > + * This struct hosts the fields which track basic resource statistics on > + * top of it - bsync, bstat and last_bstat. > + */ > +struct cgroup_rstat_base_cpu { > /* > * ->bsync protects ->bstat. These are the only fields which get > * updated in the hot path. > @@ -374,20 +393,6 @@ struct cgroup_rstat_cpu { > * deltas to propagate to the per-cpu subtree_bstat. > */ > struct cgroup_base_stat last_subtree_bstat; > - > - /* > - * Child cgroups with stat updates on this cpu since the last read > - * are linked on the parent's ->updated_children through > - * ->updated_next. > - * > - * In addition to being more compact, singly-linked list pointing > - * to the cgroup makes it unnecessary for each per-cpu struct to > - * point back to the associated cgroup. > - * > - * Protected by per-cpu cgroup_rstat_cpu_lock. > - */ > - struct cgroup *updated_children; /* terminated by self cgroup */ > - struct cgroup *updated_next; /* NULL iff not on the list */ > }; > > struct cgroup_freezer_state { > @@ -518,6 +523,7 @@ struct cgroup { > > /* per-cpu recursive resource statistics */ > struct cgroup_rstat_cpu __percpu *rstat_cpu; > + struct cgroup_rstat_base_cpu __percpu *rstat_base_cpu; > struct list_head rstat_css_list; > > /* > diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c > index ac2db99941ca..77349d07b117 100644 > --- a/kernel/cgroup/cgroup.c > +++ b/kernel/cgroup/cgroup.c > @@ -161,10 +161,14 @@ static struct static_key_true *cgroup_subsys_on_dfl_key[] = { > }; > #undef SUBSYS > > -static DEFINE_PER_CPU(struct cgroup_rstat_cpu, cgrp_dfl_root_rstat_cpu); > +static DEFINE_PER_CPU(struct cgroup_rstat_cpu, root_rstat_cpu); > +static DEFINE_PER_CPU(struct cgroup_rstat_base_cpu, root_rstat_base_cpu); > > /* the default hierarchy */ > -struct cgroup_root cgrp_dfl_root = { .cgrp.rstat_cpu = &cgrp_dfl_root_rstat_cpu }; > +struct cgroup_root cgrp_dfl_root = { > + .cgrp.rstat_cpu = &root_rstat_cpu, > + .cgrp.rstat_base_cpu = &root_rstat_base_cpu, > +}; > EXPORT_SYMBOL_GPL(cgrp_dfl_root); > > /* > diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c > index 4bb587d5d34f..a20e3ab3f7d3 100644 > --- a/kernel/cgroup/rstat.c > +++ b/kernel/cgroup/rstat.c > @@ -19,6 +19,12 @@ static struct cgroup_rstat_cpu *cgroup_rstat_cpu(struct cgroup *cgrp, int cpu) > return per_cpu_ptr(cgrp->rstat_cpu, cpu); > } > > +static struct cgroup_rstat_base_cpu *cgroup_rstat_base_cpu( > + struct cgroup *cgrp, int cpu) > +{ > + return per_cpu_ptr(cgrp->rstat_base_cpu, cpu); > +} > + > /* > * Helper functions for rstat per CPU lock (cgroup_rstat_cpu_lock). > * > @@ -351,12 +357,22 @@ int cgroup_rstat_init(struct cgroup *cgrp) > return -ENOMEM; > } > > + if (!cgrp->rstat_base_cpu) { > + cgrp->rstat_base_cpu = alloc_percpu(struct cgroup_rstat_base_cpu); > + if (!cgrp->rstat_cpu) { > + free_percpu(cgrp->rstat_cpu); > + return -ENOMEM; > + } > + } > + > /* ->updated_children list is self terminated */ > for_each_possible_cpu(cpu) { > struct cgroup_rstat_cpu *rstatc = cgroup_rstat_cpu(cgrp, cpu); > + struct cgroup_rstat_base_cpu *rstatbc = > + cgroup_rstat_base_cpu(cgrp, cpu); > > rstatc->updated_children = cgrp; > - u64_stats_init(&rstatc->bsync); > + u64_stats_init(&rstatbc->bsync); > } > > return 0; > @@ -379,6 +395,8 @@ void cgroup_rstat_exit(struct cgroup *cgrp) > > free_percpu(cgrp->rstat_cpu); > cgrp->rstat_cpu = NULL; > + free_percpu(cgrp->rstat_base_cpu); > + cgrp->rstat_base_cpu = NULL; > } > > void __init cgroup_rstat_boot(void) > @@ -419,9 +437,9 @@ static void cgroup_base_stat_sub(struct cgroup_base_stat *dst_bstat, > > static void cgroup_base_stat_flush(struct cgroup *cgrp, int cpu) > { > - struct cgroup_rstat_cpu *rstatc = cgroup_rstat_cpu(cgrp, cpu); > + struct cgroup_rstat_base_cpu *rstatbc = cgroup_rstat_base_cpu(cgrp, cpu); > struct cgroup *parent = cgroup_parent(cgrp); > - struct cgroup_rstat_cpu *prstatc; > + struct cgroup_rstat_base_cpu *prstatbc; > struct cgroup_base_stat delta; > unsigned seq; > > @@ -431,15 +449,15 @@ static void cgroup_base_stat_flush(struct cgroup *cgrp, int cpu) > > /* fetch the current per-cpu values */ > do { > - seq = __u64_stats_fetch_begin(&rstatc->bsync); > - delta = rstatc->bstat; > - } while (__u64_stats_fetch_retry(&rstatc->bsync, seq)); > + seq = __u64_stats_fetch_begin(&rstatbc->bsync); > + delta = rstatbc->bstat; > + } while (__u64_stats_fetch_retry(&rstatbc->bsync, seq)); > > /* propagate per-cpu delta to cgroup and per-cpu global statistics */ > - cgroup_base_stat_sub(&delta, &rstatc->last_bstat); > + cgroup_base_stat_sub(&delta, &rstatbc->last_bstat); > cgroup_base_stat_add(&cgrp->bstat, &delta); > - cgroup_base_stat_add(&rstatc->last_bstat, &delta); > - cgroup_base_stat_add(&rstatc->subtree_bstat, &delta); > + cgroup_base_stat_add(&rstatbc->last_bstat, &delta); > + cgroup_base_stat_add(&rstatbc->subtree_bstat, &delta); > > /* propagate cgroup and per-cpu global delta to parent (unless that's root) */ > if (cgroup_parent(parent)) { > @@ -448,73 +466,73 @@ static void cgroup_base_stat_flush(struct cgroup *cgrp, int cpu) > cgroup_base_stat_add(&parent->bstat, &delta); > cgroup_base_stat_add(&cgrp->last_bstat, &delta); > > - delta = rstatc->subtree_bstat; > - prstatc = cgroup_rstat_cpu(parent, cpu); > - cgroup_base_stat_sub(&delta, &rstatc->last_subtree_bstat); > - cgroup_base_stat_add(&prstatc->subtree_bstat, &delta); > - cgroup_base_stat_add(&rstatc->last_subtree_bstat, &delta); > + delta = rstatbc->subtree_bstat; > + prstatbc = cgroup_rstat_base_cpu(parent, cpu); > + cgroup_base_stat_sub(&delta, &rstatbc->last_subtree_bstat); > + cgroup_base_stat_add(&prstatbc->subtree_bstat, &delta); > + cgroup_base_stat_add(&rstatbc->last_subtree_bstat, &delta); > } > } > > -static struct cgroup_rstat_cpu * > +static struct cgroup_rstat_base_cpu * > cgroup_base_stat_cputime_account_begin(struct cgroup *cgrp, unsigned long *flags) > { > - struct cgroup_rstat_cpu *rstatc; > + struct cgroup_rstat_base_cpu *rstatbc; > > - rstatc = get_cpu_ptr(cgrp->rstat_cpu); > - *flags = u64_stats_update_begin_irqsave(&rstatc->bsync); > - return rstatc; > + rstatbc = get_cpu_ptr(cgrp->rstat_base_cpu); > + *flags = u64_stats_update_begin_irqsave(&rstatbc->bsync); > + return rstatbc; > } > > static void cgroup_base_stat_cputime_account_end(struct cgroup *cgrp, > - struct cgroup_rstat_cpu *rstatc, > + struct cgroup_rstat_base_cpu *rstatbc, > unsigned long flags) > { > - u64_stats_update_end_irqrestore(&rstatc->bsync, flags); > + u64_stats_update_end_irqrestore(&rstatbc->bsync, flags); > cgroup_rstat_updated(cgrp, smp_processor_id()); > - put_cpu_ptr(rstatc); > + put_cpu_ptr(rstatbc); > } > > void __cgroup_account_cputime(struct cgroup *cgrp, u64 delta_exec) > { > - struct cgroup_rstat_cpu *rstatc; > + struct cgroup_rstat_base_cpu *rstatbc; > unsigned long flags; > > - rstatc = cgroup_base_stat_cputime_account_begin(cgrp, &flags); > - rstatc->bstat.cputime.sum_exec_runtime += delta_exec; > - cgroup_base_stat_cputime_account_end(cgrp, rstatc, flags); > + rstatbc = cgroup_base_stat_cputime_account_begin(cgrp, &flags); > + rstatbc->bstat.cputime.sum_exec_runtime += delta_exec; > + cgroup_base_stat_cputime_account_end(cgrp, rstatbc, flags); > } > > void __cgroup_account_cputime_field(struct cgroup *cgrp, > enum cpu_usage_stat index, u64 delta_exec) > { > - struct cgroup_rstat_cpu *rstatc; > + struct cgroup_rstat_base_cpu *rstatbc; > unsigned long flags; > > - rstatc = cgroup_base_stat_cputime_account_begin(cgrp, &flags); > + rstatbc = cgroup_base_stat_cputime_account_begin(cgrp, &flags); > > switch (index) { > case CPUTIME_NICE: > - rstatc->bstat.ntime += delta_exec; > + rstatbc->bstat.ntime += delta_exec; > fallthrough; > case CPUTIME_USER: > - rstatc->bstat.cputime.utime += delta_exec; > + rstatbc->bstat.cputime.utime += delta_exec; > break; > case CPUTIME_SYSTEM: > case CPUTIME_IRQ: > case CPUTIME_SOFTIRQ: > - rstatc->bstat.cputime.stime += delta_exec; > + rstatbc->bstat.cputime.stime += delta_exec; > break; > #ifdef CONFIG_SCHED_CORE > case CPUTIME_FORCEIDLE: > - rstatc->bstat.forceidle_sum += delta_exec; > + rstatbc->bstat.forceidle_sum += delta_exec; > break; > #endif > default: > break; > } > > - cgroup_base_stat_cputime_account_end(cgrp, rstatc, flags); > + cgroup_base_stat_cputime_account_end(cgrp, rstatbc, flags); > } > > /*