diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-04 14:55:10 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-04 14:55:10 -0400 |
| commit | 816434ec4a674fcdb3c2221a6dffdc8f34020550 (patch) | |
| tree | 6b8a319171270b20bf1b2e1c98d333f47988553a /include/linux | |
| parent | f357a82048ff1e5645861475b014570e11ad1911 (diff) | |
| parent | 36bd621337c91a1ecda588e5bbbae8dd9698bae7 (diff) | |
Merge branch 'x86-spinlocks-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 spinlock changes from Ingo Molnar:
"The biggest change here are paravirtualized ticket spinlocks (PV
spinlocks), which bring a nice speedup on various benchmarks.
The KVM host side will come to you via the KVM tree"
* 'x86-spinlocks-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86/kvm/guest: Fix sparse warning: "symbol 'klock_waiting' was not declared as static"
kvm: Paravirtual ticketlocks support for linux guests running on KVM hypervisor
kvm guest: Add configuration support to enable debug information for KVM Guests
kvm uapi: Add KICK_CPU and PV_UNHALT definition to uapi
xen, pvticketlock: Allow interrupts to be enabled while blocking
x86, ticketlock: Add slowpath logic
jump_label: Split jumplabel ratelimit
x86, pvticketlock: When paravirtualizing ticket locks, increment by 2
x86, pvticketlock: Use callee-save for lock_spinning
xen, pvticketlocks: Add xen_nopvspin parameter to disable xen pv ticketlocks
xen, pvticketlock: Xen implementation for PV ticket locks
xen: Defer spinlock setup until boot CPU setup
x86, ticketlock: Collapse a layer of functions
x86, ticketlock: Don't inline _spin_unlock when using paravirt spinlocks
x86, spinlock: Replace pv spinlocks with pv ticketlocks
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/jump_label.h | 28 | ||||
| -rw-r--r-- | include/linux/jump_label_ratelimit.h | 34 | ||||
| -rw-r--r-- | include/linux/perf_event.h | 1 |
3 files changed, 36 insertions, 27 deletions
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index 0976fc46d1e0..a5079072da66 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h | |||
| @@ -48,7 +48,6 @@ | |||
| 48 | 48 | ||
| 49 | #include <linux/types.h> | 49 | #include <linux/types.h> |
| 50 | #include <linux/compiler.h> | 50 | #include <linux/compiler.h> |
| 51 | #include <linux/workqueue.h> | ||
| 52 | 51 | ||
| 53 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) | 52 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) |
| 54 | 53 | ||
| @@ -61,12 +60,6 @@ struct static_key { | |||
| 61 | #endif | 60 | #endif |
| 62 | }; | 61 | }; |
| 63 | 62 | ||
| 64 | struct static_key_deferred { | ||
| 65 | struct static_key key; | ||
| 66 | unsigned long timeout; | ||
| 67 | struct delayed_work work; | ||
| 68 | }; | ||
| 69 | |||
| 70 | # include <asm/jump_label.h> | 63 | # include <asm/jump_label.h> |
| 71 | # define HAVE_JUMP_LABEL | 64 | # define HAVE_JUMP_LABEL |
| 72 | #endif /* CC_HAVE_ASM_GOTO && CONFIG_JUMP_LABEL */ | 65 | #endif /* CC_HAVE_ASM_GOTO && CONFIG_JUMP_LABEL */ |
| @@ -78,6 +71,7 @@ enum jump_label_type { | |||
| 78 | 71 | ||
| 79 | struct module; | 72 | struct module; |
| 80 | 73 | ||
| 74 | #include <linux/atomic.h> | ||
| 81 | #ifdef HAVE_JUMP_LABEL | 75 | #ifdef HAVE_JUMP_LABEL |
| 82 | 76 | ||
| 83 | #define JUMP_LABEL_TRUE_BRANCH 1UL | 77 | #define JUMP_LABEL_TRUE_BRANCH 1UL |
| @@ -119,10 +113,7 @@ extern void arch_jump_label_transform_static(struct jump_entry *entry, | |||
| 119 | extern int jump_label_text_reserved(void *start, void *end); | 113 | extern int jump_label_text_reserved(void *start, void *end); |
| 120 | extern void static_key_slow_inc(struct static_key *key); | 114 | extern void static_key_slow_inc(struct static_key *key); |
| 121 | extern void static_key_slow_dec(struct static_key *key); | 115 | extern void static_key_slow_dec(struct static_key *key); |
| 122 | extern void static_key_slow_dec_deferred(struct static_key_deferred *key); | ||
| 123 | extern void jump_label_apply_nops(struct module *mod); | 116 | extern void jump_label_apply_nops(struct module *mod); |
| 124 | extern void | ||
| 125 | jump_label_rate_limit(struct static_key_deferred *key, unsigned long rl); | ||
| 126 | 117 | ||
| 127 | #define STATIC_KEY_INIT_TRUE ((struct static_key) \ | 118 | #define STATIC_KEY_INIT_TRUE ((struct static_key) \ |
| 128 | { .enabled = ATOMIC_INIT(1), .entries = (void *)1 }) | 119 | { .enabled = ATOMIC_INIT(1), .entries = (void *)1 }) |
| @@ -131,8 +122,6 @@ jump_label_rate_limit(struct static_key_deferred *key, unsigned long rl); | |||
| 131 | 122 | ||
| 132 | #else /* !HAVE_JUMP_LABEL */ | 123 | #else /* !HAVE_JUMP_LABEL */ |
| 133 | 124 | ||
| 134 | #include <linux/atomic.h> | ||
| 135 | |||
| 136 | struct static_key { | 125 | struct static_key { |
| 137 | atomic_t enabled; | 126 | atomic_t enabled; |
| 138 | }; | 127 | }; |
| @@ -141,10 +130,6 @@ static __always_inline void jump_label_init(void) | |||
| 141 | { | 130 | { |
| 142 | } | 131 | } |
| 143 | 132 | ||
| 144 | struct static_key_deferred { | ||
| 145 | struct static_key key; | ||
| 146 | }; | ||
| 147 | |||
| 148 | static __always_inline bool static_key_false(struct static_key *key) | 133 | static __always_inline bool static_key_false(struct static_key *key) |
| 149 | { | 134 | { |
| 150 | if (unlikely(atomic_read(&key->enabled)) > 0) | 135 | if (unlikely(atomic_read(&key->enabled)) > 0) |
| @@ -169,11 +154,6 @@ static inline void static_key_slow_dec(struct static_key *key) | |||
| 169 | atomic_dec(&key->enabled); | 154 | atomic_dec(&key->enabled); |
| 170 | } | 155 | } |
| 171 | 156 | ||
| 172 | static inline void static_key_slow_dec_deferred(struct static_key_deferred *key) | ||
| 173 | { | ||
| 174 | static_key_slow_dec(&key->key); | ||
| 175 | } | ||
| 176 | |||
| 177 | static inline int jump_label_text_reserved(void *start, void *end) | 157 | static inline int jump_label_text_reserved(void *start, void *end) |
| 178 | { | 158 | { |
| 179 | return 0; | 159 | return 0; |
| @@ -187,12 +167,6 @@ static inline int jump_label_apply_nops(struct module *mod) | |||
| 187 | return 0; | 167 | return 0; |
| 188 | } | 168 | } |
| 189 | 169 | ||
| 190 | static inline void | ||
| 191 | jump_label_rate_limit(struct static_key_deferred *key, | ||
| 192 | unsigned long rl) | ||
| 193 | { | ||
| 194 | } | ||
| 195 | |||
| 196 | #define STATIC_KEY_INIT_TRUE ((struct static_key) \ | 170 | #define STATIC_KEY_INIT_TRUE ((struct static_key) \ |
| 197 | { .enabled = ATOMIC_INIT(1) }) | 171 | { .enabled = ATOMIC_INIT(1) }) |
| 198 | #define STATIC_KEY_INIT_FALSE ((struct static_key) \ | 172 | #define STATIC_KEY_INIT_FALSE ((struct static_key) \ |
diff --git a/include/linux/jump_label_ratelimit.h b/include/linux/jump_label_ratelimit.h new file mode 100644 index 000000000000..113788389b3d --- /dev/null +++ b/include/linux/jump_label_ratelimit.h | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | #ifndef _LINUX_JUMP_LABEL_RATELIMIT_H | ||
| 2 | #define _LINUX_JUMP_LABEL_RATELIMIT_H | ||
| 3 | |||
| 4 | #include <linux/jump_label.h> | ||
| 5 | #include <linux/workqueue.h> | ||
| 6 | |||
| 7 | #if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) | ||
| 8 | struct static_key_deferred { | ||
| 9 | struct static_key key; | ||
| 10 | unsigned long timeout; | ||
| 11 | struct delayed_work work; | ||
| 12 | }; | ||
| 13 | #endif | ||
| 14 | |||
| 15 | #ifdef HAVE_JUMP_LABEL | ||
| 16 | extern void static_key_slow_dec_deferred(struct static_key_deferred *key); | ||
| 17 | extern void | ||
| 18 | jump_label_rate_limit(struct static_key_deferred *key, unsigned long rl); | ||
| 19 | |||
| 20 | #else /* !HAVE_JUMP_LABEL */ | ||
| 21 | struct static_key_deferred { | ||
| 22 | struct static_key key; | ||
| 23 | }; | ||
| 24 | static inline void static_key_slow_dec_deferred(struct static_key_deferred *key) | ||
| 25 | { | ||
| 26 | static_key_slow_dec(&key->key); | ||
| 27 | } | ||
| 28 | static inline void | ||
| 29 | jump_label_rate_limit(struct static_key_deferred *key, | ||
| 30 | unsigned long rl) | ||
| 31 | { | ||
| 32 | } | ||
| 33 | #endif /* HAVE_JUMP_LABEL */ | ||
| 34 | #endif /* _LINUX_JUMP_LABEL_RATELIMIT_H */ | ||
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 4019d82c3d03..866e85c5eb94 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -48,6 +48,7 @@ struct perf_guest_info_callbacks { | |||
| 48 | #include <linux/cpu.h> | 48 | #include <linux/cpu.h> |
| 49 | #include <linux/irq_work.h> | 49 | #include <linux/irq_work.h> |
| 50 | #include <linux/static_key.h> | 50 | #include <linux/static_key.h> |
| 51 | #include <linux/jump_label_ratelimit.h> | ||
| 51 | #include <linux/atomic.h> | 52 | #include <linux/atomic.h> |
| 52 | #include <linux/sysfs.h> | 53 | #include <linux/sysfs.h> |
| 53 | #include <linux/perf_regs.h> | 54 | #include <linux/perf_regs.h> |
