Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fix from Ingo Molnar:
"irq-tracing fixlet"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86/tracing: Add irq_enter/exit() in smp_trace_reschedule_interrupt()

+23 -16
+23 -16
arch/x86/kernel/smp.c
··· 265 265 */ 266 266 } 267 267 268 - void smp_trace_reschedule_interrupt(struct pt_regs *regs) 269 - { 270 - ack_APIC_irq(); 271 - trace_reschedule_entry(RESCHEDULE_VECTOR); 272 - __smp_reschedule_interrupt(); 273 - trace_reschedule_exit(RESCHEDULE_VECTOR); 274 - /* 275 - * KVM uses this interrupt to force a cpu out of guest mode 276 - */ 277 - } 278 - 279 - static inline void call_function_entering_irq(void) 268 + static inline void smp_entering_irq(void) 280 269 { 281 270 ack_APIC_irq(); 282 271 irq_enter(); 272 + } 273 + 274 + void smp_trace_reschedule_interrupt(struct pt_regs *regs) 275 + { 276 + /* 277 + * Need to call irq_enter() before calling the trace point. 278 + * __smp_reschedule_interrupt() calls irq_enter/exit() too (in 279 + * scheduler_ipi(). This is OK, since those functions are allowed 280 + * to nest. 281 + */ 282 + smp_entering_irq(); 283 + trace_reschedule_entry(RESCHEDULE_VECTOR); 284 + __smp_reschedule_interrupt(); 285 + trace_reschedule_exit(RESCHEDULE_VECTOR); 286 + exiting_irq(); 287 + /* 288 + * KVM uses this interrupt to force a cpu out of guest mode 289 + */ 283 290 } 284 291 285 292 static inline void __smp_call_function_interrupt(void) ··· 297 290 298 291 void smp_call_function_interrupt(struct pt_regs *regs) 299 292 { 300 - call_function_entering_irq(); 293 + smp_entering_irq(); 301 294 __smp_call_function_interrupt(); 302 295 exiting_irq(); 303 296 } 304 297 305 298 void smp_trace_call_function_interrupt(struct pt_regs *regs) 306 299 { 307 - call_function_entering_irq(); 300 + smp_entering_irq(); 308 301 trace_call_function_entry(CALL_FUNCTION_VECTOR); 309 302 __smp_call_function_interrupt(); 310 303 trace_call_function_exit(CALL_FUNCTION_VECTOR); ··· 319 312 320 313 void smp_call_function_single_interrupt(struct pt_regs *regs) 321 314 { 322 - call_function_entering_irq(); 315 + smp_entering_irq(); 323 316 __smp_call_function_single_interrupt(); 324 317 exiting_irq(); 325 318 } 326 319 327 320 void smp_trace_call_function_single_interrupt(struct pt_regs *regs) 328 321 { 329 - call_function_entering_irq(); 322 + smp_entering_irq(); 330 323 trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR); 331 324 __smp_call_function_single_interrupt(); 332 325 trace_call_function_single_exit(CALL_FUNCTION_SINGLE_VECTOR);