@@ -2330,6 +2330,24 @@ group_sched_out(struct perf_event *group_event, struct perf_event_context *ctx)
23302330 event_sched_out (event , ctx );
23312331}
23322332
2333+ static inline void
2334+ ctx_time_update (struct perf_cpu_context * cpuctx , struct perf_event_context * ctx )
2335+ {
2336+ if (ctx -> is_active & EVENT_TIME ) {
2337+ update_context_time (ctx );
2338+ update_cgrp_time_from_cpuctx (cpuctx , false);
2339+ }
2340+ }
2341+
2342+ static inline void
2343+ ctx_time_update_event (struct perf_event_context * ctx , struct perf_event * event )
2344+ {
2345+ if (ctx -> is_active & EVENT_TIME ) {
2346+ update_context_time (ctx );
2347+ update_cgrp_time_from_event (event );
2348+ }
2349+ }
2350+
23332351#define DETACH_GROUP 0x01UL
23342352#define DETACH_CHILD 0x02UL
23352353#define DETACH_DEAD 0x04UL
@@ -2349,10 +2367,7 @@ __perf_remove_from_context(struct perf_event *event,
23492367 struct perf_event_pmu_context * pmu_ctx = event -> pmu_ctx ;
23502368 unsigned long flags = (unsigned long )info ;
23512369
2352- if (ctx -> is_active & EVENT_TIME ) {
2353- update_context_time (ctx );
2354- update_cgrp_time_from_cpuctx (cpuctx , false);
2355- }
2370+ ctx_time_update (cpuctx , ctx );
23562371
23572372 /*
23582373 * Ensure event_sched_out() switches to OFF, at the very least
@@ -2437,12 +2452,8 @@ static void __perf_event_disable(struct perf_event *event,
24372452 if (event -> state < PERF_EVENT_STATE_INACTIVE )
24382453 return ;
24392454
2440- if (ctx -> is_active & EVENT_TIME ) {
2441- update_context_time (ctx );
2442- update_cgrp_time_from_event (event );
2443- }
2444-
24452455 perf_pmu_disable (event -> pmu_ctx -> pmu );
2456+ ctx_time_update_event (ctx , event );
24462457
24472458 if (event == event -> group_leader )
24482459 group_sched_out (event , ctx );
@@ -4529,10 +4540,7 @@ static void __perf_event_read(void *info)
45294540 return ;
45304541
45314542 raw_spin_lock (& ctx -> lock );
4532- if (ctx -> is_active & EVENT_TIME ) {
4533- update_context_time (ctx );
4534- update_cgrp_time_from_event (event );
4535- }
4543+ ctx_time_update_event (ctx , event );
45364544
45374545 perf_event_update_time (event );
45384546 if (data -> group )
@@ -4732,10 +4740,7 @@ static int perf_event_read(struct perf_event *event, bool group)
47324740 * May read while context is not active (e.g., thread is
47334741 * blocked), in that case we cannot update context time
47344742 */
4735- if (ctx -> is_active & EVENT_TIME ) {
4736- update_context_time (ctx );
4737- update_cgrp_time_from_event (event );
4738- }
4743+ ctx_time_update_event (ctx , event );
47394744
47404745 perf_event_update_time (event );
47414746 if (group )
0 commit comments