Pull locking fixes from Borislav Petkov: - Allow the compiler to optimize away unused percpu accesses and change the local_lock_* macros back to inline functions - A couple of fixes to static call insn patching * tag 'locking_urgent_for_v5.18_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: Revert "mm/page_alloc: mark pagesets as __maybe_unused" Revert "locking/local_lock: Make the empty local_lock_*() function a macro." x86/percpu: Remove volatile from arch_raw_cpu_ptr(). static_call: Remove __DEFINE_STATIC_CALL macro static_call: Properly initialise DEFINE_STATIC_CALL_RET0() static_call: Don't make __static_call_return0 static x86,static_call: Fix __static_call_return0 for i386
Showing the changes to include (2 of 10 files). Show all
Unified · Split
| @@ -44,9 +44,9 @@ static inline void local_lock_debug_init(local_lock_t *l) · 43 unmodified lines | |||
| 44 | } | 44 | } |
| 45 | #else /* CONFIG_DEBUG_LOCK_ALLOC */ | 45 | #else /* CONFIG_DEBUG_LOCK_ALLOC */ |
| 46 | # define LOCAL_LOCK_DEBUG_INIT(lockname) | 46 | # define LOCAL_LOCK_DEBUG_INIT(lockname) |
| 47 | # define local_lock_acquire(__ll) do { typecheck(local_lock_t *, __ll); } while (0) | 47 | static inline void local_lock_acquire(local_lock_t *l) { } |
| 48 | # define local_lock_release(__ll) do { typecheck(local_lock_t *, __ll); } while (0) | 48 | static inline void local_lock_release(local_lock_t *l) { } |
| 49 | # define local_lock_debug_init(__ll) do { typecheck(local_lock_t *, __ll); } while (0) | 49 | static inline void local_lock_debug_init(local_lock_t *l) { } |
| 50 | #endif /* !CONFIG_DEBUG_LOCK_ALLOC */ | 50 | #endif /* !CONFIG_DEBUG_LOCK_ALLOC */ |
| 51 | 51 | ||
| 52 | #define INIT_LOCAL_LOCK(lockname) { LOCAL_LOCK_DEBUG_INIT(lockname) } | 52 | #define INIT_LOCAL_LOCK(lockname) { LOCAL_LOCK_DEBUG_INIT(lockname) } |
| @@ -180,13 +180,13 @@ extern int static_call_text_reserved(void *start, void *end); · 179 unmodified lines | |||
| 180 | 180 | ||
| 181 | extern long __static_call_return0(void); | 181 | extern long __static_call_return0(void); |
| 182 | 182 | ||
| 183 | #define __DEFINE_STATIC_CALL(name, _func, _func_init) \ | 183 | #define DEFINE_STATIC_CALL(name, _func) \ |
| 184 | DECLARE_STATIC_CALL(name, _func); \ | 184 | DECLARE_STATIC_CALL(name, _func); \ |
| 185 | struct static_call_key STATIC_CALL_KEY(name) = { \ | 185 | struct static_call_key STATIC_CALL_KEY(name) = { \ |
| 186 | .func = _func_init, \ | 186 | .func = _func, \ |
| 187 | .type = 1, \ | 187 | .type = 1, \ |
| 188 | }; \ | 188 | }; \ |
| 189 | ARCH_DEFINE_STATIC_CALL_TRAMP(name, _func_init) | 189 | ARCH_DEFINE_STATIC_CALL_TRAMP(name, _func) |
| 190 | 190 | ||
| 191 | #define DEFINE_STATIC_CALL_NULL(name, _func) \ | 191 | #define DEFINE_STATIC_CALL_NULL(name, _func) \ |
| 192 | DECLARE_STATIC_CALL(name, _func); \ | 192 | DECLARE_STATIC_CALL(name, _func); \ |
| @@ -196,6 +196,14 @@ extern long __static_call_return0(void); · 3 unmodified lines | |||
| 196 | }; \ | 196 | }; \ |
| 197 | ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) | 197 | ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) |
| 198 | 198 | ||
| 199 | #define DEFINE_STATIC_CALL_RET0(name, _func) \ | ||
| 200 | DECLARE_STATIC_CALL(name, _func); \ | ||
| 201 | struct static_call_key STATIC_CALL_KEY(name) = { \ | ||
| 202 | .func = __static_call_return0, \ | ||
| 203 | .type = 1, \ | ||
| 204 | }; \ | ||
| 205 | ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name) | ||
| 206 | |||
| 199 | #define static_call_cond(name) (void)__static_call(name) | 207 | #define static_call_cond(name) (void)__static_call(name) |
| 200 | 208 | ||
| 201 | #define EXPORT_STATIC_CALL(name) \ | 209 | #define EXPORT_STATIC_CALL(name) \ |
| @@ -217,12 +225,12 @@ extern long __static_call_return0(void); · 15 unmodified lines | |||
| 217 | 225 | ||
| 218 | static inline int static_call_init(void) { return 0; } | 226 | static inline int static_call_init(void) { return 0; } |
| 219 | 227 | ||
| 220 | #define __DEFINE_STATIC_CALL(name, _func, _func_init) \ | 228 | #define DEFINE_STATIC_CALL(name, _func) \ |
| 221 | DECLARE_STATIC_CALL(name, _func); \ | 229 | DECLARE_STATIC_CALL(name, _func); \ |
| 222 | struct static_call_key STATIC_CALL_KEY(name) = { \ | 230 | struct static_call_key STATIC_CALL_KEY(name) = { \ |
| 223 | .func = _func_init, \ | 231 | .func = _func, \ |
| 224 | }; \ | 232 | }; \ |
| 225 | ARCH_DEFINE_STATIC_CALL_TRAMP(name, _func_init) | 233 | ARCH_DEFINE_STATIC_CALL_TRAMP(name, _func) |
| 226 | 234 | ||
| 227 | #define DEFINE_STATIC_CALL_NULL(name, _func) \ | 235 | #define DEFINE_STATIC_CALL_NULL(name, _func) \ |
| 228 | DECLARE_STATIC_CALL(name, _func); \ | 236 | DECLARE_STATIC_CALL(name, _func); \ |
| @@ -231,6 +239,12 @@ static inline int static_call_init(void) { return 0; } · 2 unmodified lines | |||
| 231 | }; \ | 239 | }; \ |
| 232 | ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) | 240 | ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) |
| 233 | 241 | ||
| 242 | #define DEFINE_STATIC_CALL_RET0(name, _func) \ | ||
| 243 | DECLARE_STATIC_CALL(name, _func); \ | ||
| 244 | struct static_call_key STATIC_CALL_KEY(name) = { \ | ||
| 245 | .func = __static_call_return0, \ | ||
| 246 | }; \ | ||
| 247 | ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name) | ||
| 234 | 248 | ||
| 235 | #define static_call_cond(name) (void)__static_call(name) | 249 | #define static_call_cond(name) (void)__static_call(name) |
| 236 | 250 | ||
| @@ -248,10 +262,7 @@ static inline int static_call_text_reserved(void *start, void *end) · 11 unmodified lines | |||
| 248 | return 0; | 262 | return 0; |
| 249 | } | 263 | } |
| 250 | 264 | ||
| 251 | static inline long __static_call_return0(void) | 265 | extern long __static_call_return0(void); |
| 252 | { | ||
| 253 | return 0; | ||
| 254 | } | ||
| 255 | 266 | ||
| 256 | #define EXPORT_STATIC_CALL(name) \ | 267 | #define EXPORT_STATIC_CALL(name) \ |
| 257 | EXPORT_SYMBOL(STATIC_CALL_KEY(name)); \ | 268 | EXPORT_SYMBOL(STATIC_CALL_KEY(name)); \ |
| @@ -281,11 +292,14 @@ static inline long __static_call_return0(void) · 23 unmodified lines | |||
| 281 | .func = _func_init, \ | 292 | .func = _func_init, \ |
| 282 | } | 293 | } |
| 283 | 294 | ||
| 295 | #define DEFINE_STATIC_CALL(name, _func) \ | ||
| 296 | __DEFINE_STATIC_CALL(name, _func, _func) | ||
| 297 | |||
| 284 | #define DEFINE_STATIC_CALL_NULL(name, _func) \ | 298 | #define DEFINE_STATIC_CALL_NULL(name, _func) \ |
| 285 | DECLARE_STATIC_CALL(name, _func); \ | 299 | __DEFINE_STATIC_CALL(name, _func, NULL) |
| 286 | struct static_call_key STATIC_CALL_KEY(name) = { \ | 300 | |
| 287 | .func = NULL, \ | 301 | #define DEFINE_STATIC_CALL_RET0(name, _func) \ |
| 288 | } | 302 | __DEFINE_STATIC_CALL(name, _func, __static_call_return0) |
| 289 | 303 | ||
| 290 | static inline void __static_call_nop(void) { } | 304 | static inline void __static_call_nop(void) { } |
| 291 | 305 | ||
| @@ -327,10 +341,4 @@ static inline int static_call_text_reserved(void *start, void *end) · 35 unmodified lines | |||
| 327 | 341 | ||
| 328 | #endif /* CONFIG_HAVE_STATIC_CALL */ | 342 | #endif /* CONFIG_HAVE_STATIC_CALL */ |
| 329 | 343 | ||
| 330 | #define DEFINE_STATIC_CALL(name, _func) \ | ||
| 331 | __DEFINE_STATIC_CALL(name, _func, _func) | ||
| 332 | |||
| 333 | #define DEFINE_STATIC_CALL_RET0(name, _func) \ | ||
| 334 | __DEFINE_STATIC_CALL(name, _func, __static_call_return0) | ||
| 335 | |||
| 336 | #endif /* _LINUX_STATIC_CALL_H */ | 344 | #endif /* _LINUX_STATIC_CALL_H */ |