Greg Kroah-Hartman | b244131 | 2017-11-01 15:07:57 +0100 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
Nicholas Piggin | fd851a3 | 2017-05-29 12:22:23 +1000 | [diff] [blame] | 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 */ |