5a1e0e3f |
1 | |
2 | #define MARK_TRAP 1 |
3 | #define _MARK_TRAP (1 << MARK_TRAP) |
4 | Can generate a trap |
5 | |
6 | #define MARK_PREEMPT 2 |
7 | #define _MARK_PREEMPT (1 << MARK_PREEMPT) |
8 | Permits blocking calls within probe. |
9 | How to deal with probe removal : |
10 | Each site has its per cpu probe_exec counters. The sum of the signed values |
11 | gives the number of executors. Operations inc/dec on those values are done |
12 | within preempt disable so they can be done non atomically without risking |
13 | to be corrupted by another CPU. |
14 | 1 - disable site and remove call |
15 | 2 - while sum of probe_exec counters != 0, sleep 50ms |
16 | fail after 10 loops |
17 | - if someone sleeps in here for a long time or waits for |
18 | a busy ressource, removal may fail with -EBUSY. |
19 | |
20 | site : |
21 | |
22 | if (enable) { |
23 | preempt_disable(); |
24 | probe_exec[smp_processor_id()]++; |
25 | preempt_enable(); |
26 | handler(); |
27 | preempt_disable(); |
28 | probe_exec[smp_processor_id()]--; |
29 | preempt_enable(); |
30 | } |
31 | |
32 | #define MARK_RESCHED 3 |
33 | #define _MARK_RESCHED (1 << MARK_RESCHED) |
34 | preempt_schedule() will be called by the marker. |
35 | |
36 | #define _MARK_DEFAULT (~_MARK_PREEMPT | _MARK_TRAP | _MARK_RESCHED) |
37 | |
38 | #define MARK (format, ...) MARK_OPTIONS(MARK_DEFAULT, format, __VA_ARGS__) |
39 | |
40 | ex. i386 |
41 | #define MARK_OPTIONS(opt, format, ...) \ |
42 | { \ |
43 | if (opt & _MARK_NO_TRAP) \ |
44 | GEN_MARK(opt, format, __VA_ARGS__); \ |
45 | else \ |
46 | MARK(opt, format, __VA_ARGS__); \ |
47 | } |
48 | |
49 | ex. powerpc |
50 | #define MARK_OPTIONS(opt, format, ...) MARK(opt, format, __VA_ARGS__); |
51 | |
52 | |
53 | MARK(opt, format, ...) \ |
54 | static declare opt in struct; \ |
55 | if (enable) { |
56 | preempt_disable(); |
57 | if (opt & _MARK_PREEMPT) { |
58 | probe_exec[smp_processor_id()]++; |
59 | if (opt & _MARK_RESCHED) |
60 | preempt_enable(); |
61 | else |
62 | preempt_enable_no_resched(); |
63 | } |
64 | handler(); |
65 | if (opt & _MARK_PREEMPT) { |
66 | preempt_disable(); |
67 | probe_exec[smp_processor_id()]--; |
68 | } |
69 | if (opt & _MARK_RESCHED) |
70 | preempt_enable(); |
71 | else |
72 | preempt_enable_no_resched(); |
73 | } |
74 | |
75 | |
76 | |