Commit | Line | Data |
---|---|---|
4fb05a39 CW |
1 | /* SPDX-License-Identifier: MIT */ |
2 | /* | |
3 | * Copyright © 2020 Intel Corporation | |
4 | */ | |
5 | ||
6 | #ifndef __INTEL_ENGINE_STATS_H__ | |
7 | #define __INTEL_ENGINE_STATS_H__ | |
8 | ||
9 | #include <linux/atomic.h> | |
10 | #include <linux/ktime.h> | |
11 | #include <linux/seqlock.h> | |
12 | ||
13 | #include "i915_gem.h" /* GEM_BUG_ON */ | |
14 | #include "intel_engine.h" | |
15 | ||
16 | static inline void intel_engine_context_in(struct intel_engine_cs *engine) | |
17 | { | |
18 | unsigned long flags; | |
19 | ||
f530a41d CW |
20 | if (engine->stats.active) { |
21 | engine->stats.active++; | |
4fb05a39 | 22 | return; |
4fb05a39 | 23 | } |
f530a41d CW |
24 | |
25 | /* The writer is serialised; but the pmu reader may be from hardirq */ | |
26 | local_irq_save(flags); | |
27 | write_seqcount_begin(&engine->stats.lock); | |
28 | ||
29 | engine->stats.start = ktime_get(); | |
30 | engine->stats.active++; | |
31 | ||
32 | write_seqcount_end(&engine->stats.lock); | |
33 | local_irq_restore(flags); | |
34 | ||
35 | GEM_BUG_ON(!engine->stats.active); | |
4fb05a39 CW |
36 | } |
37 | ||
38 | static inline void intel_engine_context_out(struct intel_engine_cs *engine) | |
39 | { | |
40 | unsigned long flags; | |
41 | ||
f530a41d CW |
42 | GEM_BUG_ON(!engine->stats.active); |
43 | if (engine->stats.active > 1) { | |
44 | engine->stats.active--; | |
4fb05a39 | 45 | return; |
4fb05a39 | 46 | } |
f530a41d CW |
47 | |
48 | local_irq_save(flags); | |
49 | write_seqcount_begin(&engine->stats.lock); | |
50 | ||
51 | engine->stats.active--; | |
52 | engine->stats.total = | |
53 | ktime_add(engine->stats.total, | |
54 | ktime_sub(ktime_get(), engine->stats.start)); | |
55 | ||
56 | write_seqcount_end(&engine->stats.lock); | |
57 | local_irq_restore(flags); | |
4fb05a39 CW |
58 | } |
59 | ||
60 | #endif /* __INTEL_ENGINE_STATS_H__ */ |