Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
fd851a3c NP |
2 | /* Misc low level processor primitives */ |
3 | #ifndef _LINUX_PROCESSOR_H | |
4 | #define _LINUX_PROCESSOR_H | |
5 | ||
6 | #include <asm/processor.h> | |
7 | ||
8 | /* | |
9 | * spin_begin is used before beginning a busy-wait loop, and must be paired | |
10 | * with spin_end when the loop is exited. spin_cpu_relax must be called | |
11 | * within the loop. | |
12 | * | |
13 | * The loop body should be as small and fast as possible, on the order of | |
14 | * tens of instructions/cycles as a guide. It should and avoid calling | |
15 | * cpu_relax, or any "spin" or sleep type of primitive including nested uses | |
16 | * of these primitives. It should not lock or take any other resource. | |
17 | * Violations of these guidelies will not cause a bug, but may cause sub | |
18 | * optimal performance. | |
19 | * | |
20 | * These loops are optimized to be used where wait times are expected to be | |
21 | * less than the cost of a context switch (and associated overhead). | |
22 | * | |
23 | * Detection of resource owner and decision to spin or sleep or guest-yield | |
24 | * (e.g., spin lock holder vcpu preempted, or mutex owner not on CPU) can be | |
25 | * tested within the loop body. | |
26 | */ | |
27 | #ifndef spin_begin | |
28 | #define spin_begin() | |
29 | #endif | |
30 | ||
31 | #ifndef spin_cpu_relax | |
32 | #define spin_cpu_relax() cpu_relax() | |
33 | #endif | |
34 | ||
35 | /* | |
36 | * spin_cpu_yield may be called to yield (undirected) to the hypervisor if | |
37 | * necessary. This should be used if the wait is expected to take longer | |
38 | * than context switch overhead, but we can't sleep or do a directed yield. | |
39 | */ | |
40 | #ifndef spin_cpu_yield | |
41 | #define spin_cpu_yield() cpu_relax_yield() | |
42 | #endif | |
43 | ||
44 | #ifndef spin_end | |
45 | #define spin_end() | |
46 | #endif | |
47 | ||
48 | /* | |
49 | * spin_until_cond can be used to wait for a condition to become true. It | |
50 | * may be expected that the first iteration will true in the common case | |
51 | * (no spinning), so that callers should not require a first "likely" test | |
52 | * for the uncontended case before using this primitive. | |
53 | * | |
54 | * Usage and implementation guidelines are the same as for the spin_begin | |
55 | * primitives, above. | |
56 | */ | |
57 | #ifndef spin_until_cond | |
58 | #define spin_until_cond(cond) \ | |
59 | do { \ | |
60 | if (unlikely(!(cond))) { \ | |
61 | spin_begin(); \ | |
62 | do { \ | |
63 | spin_cpu_relax(); \ | |
64 | } while (!(cond)); \ | |
65 | spin_end(); \ | |
66 | } \ | |
67 | } while (0) | |
68 | ||
69 | #endif | |
70 | ||
71 | #endif /* _LINUX_PROCESSOR_H */ |