Steven Rostedt (Red Hat)
3205f8063b
ring-buffer: Add unlikelys to make fast path the default
I was running the trace_event benchmark and noticed that the times
to record a trace_event was all over the place. I looked at the assembly
of the ring_buffer_lock_reserver() and saw this:
<ring_buffer_lock_reserve>:
31 c0 xor %eax,%eax
48 83 3d 76 47 bd 00 cmpq $0x1,0xbd4776(%rip) # ffffffff81d10d60 <ring_buffer_flags>
01
55 push %rbp
48 89 e5 mov %rsp,%rbp
75 1d jne ffffffff8113c60d <ring_buffer_lock_reserve+0x2d>
65 ff 05 69 e3 ec 7e incl %gs:0x7eece369(%rip) # a960 <__preempt_count>
8b 47 08 mov 0x8(%rdi),%eax
85 c0 test %eax,%eax
+---- 74 12 je ffffffff8113c610 <ring_buffer_lock_reserve+0x30>
| 65 ff 0d 5b e3 ec 7e decl %gs:0x7eece35b(%rip) # a960 <__preempt_count>
| 0f 84 85 00 00 00 je ffffffff8113c690 <ring_buffer_lock_reserve+0xb0>
| 31 c0 xor %eax,%eax
| 5d pop %rbp
| c3 retq
| 90 nop
+---> 65 44 8b 05 48 e3 ec mov %gs:0x7eece348(%rip),%r8d # a960 <__preempt_count>
7e
41 81 e0 ff ff ff 7f and $0x7fffffff,%r8d
b0 08 mov $0x8,%al
65 8b 0d 58 36 ed 7e mov %gs:0x7eed3658(%rip),%ecx # fc80 <current_context>
41 f7 c0 00 ff 1f 00 test $0x1fff00,%r8d
74 1e je ffffffff8113c64f <ring_buffer_lock_reserve+0x6f>
41 f7 c0 00 00 10 00 test $0x100000,%r8d
b0 01 mov $0x1,%al
75 13 jne ffffffff8113c64f <ring_buffer_lock_reserve+0x6f>
41 81 e0 00 00 0f 00 and $0xf0000,%r8d
49 83 f8 01 cmp $0x1,%r8
19 c0 sbb %eax,%eax
83 e0 02 and $0x2,%eax
83 c0 02 add $0x2,%eax
85 c8 test %ecx,%eax
75 ab jne ffffffff8113c5fe <ring_buffer_lock_reserve+0x1e>
09 c8 or %ecx,%eax
65 89 05 24 36 ed 7e mov %eax,%gs:0x7eed3624(%rip) # fc80 <current_context>
The arrow is the fast path.
After adding the unlikely's, the fast path looks a bit better:
<ring_buffer_lock_reserve>:
31 c0 xor %eax,%eax
48 83 3d 76 47 bd 00 cmpq $0x1,0xbd4776(%rip) # ffffffff81d10d60 <ring_buffer_flags>
01
55 push %rbp
48 89 e5 mov %rsp,%rbp
75 7b jne ffffffff8113c66b <ring_buffer_lock_reserve+0x8b>
65 ff 05 69 e3 ec 7e incl %gs:0x7eece369(%rip) # a960 <__preempt_count>
8b 47 08 mov 0x8(%rdi),%eax
85 c0 test %eax,%eax
0f 85 9f 00 00 00 jne ffffffff8113c6a1 <ring_buffer_lock_reserve+0xc1>
65 8b 0d 57 e3 ec 7e mov %gs:0x7eece357(%rip),%ecx # a960 <__preempt_count>
81 e1 ff ff ff 7f and $0x7fffffff,%ecx
b0 08 mov $0x8,%al
65 8b 15 68 36 ed 7e mov %gs:0x7eed3668(%rip),%edx # fc80 <current_context>
f7 c1 00 ff 1f 00 test $0x1fff00,%ecx
75 50 jne ffffffff8113c670 <ring_buffer_lock_reserve+0x90>
85 d0 test %edx,%eax
75 7d jne ffffffff8113c6a1 <ring_buffer_lock_reserve+0xc1>
09 d0 or %edx,%eax
65 89 05 53 36 ed 7e mov %eax,%gs:0x7eed3653(%rip) # fc80 <current_context>
65 8b 05 fc da ec 7e mov %gs:0x7eecdafc(%rip),%eax # a130 <cpu_number>
89 c2 mov %eax,%edx
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2015-05-21 17:39:29 -04:00
..
2015-04-27 23:11:49 -04:00
2015-02-19 12:39:03 -06:00
2015-05-13 14:05:12 -04:00
2015-04-17 09:04:08 -04:00
2015-04-24 20:57:06 +02:00
2015-04-13 23:57:20 +02:00
2015-04-17 09:42:14 +02:00
2015-04-10 12:01:59 +02:00
2015-04-21 09:33:10 -07:00
2015-05-13 14:05:12 -04:00
2015-04-30 14:23:31 -07:00
2015-05-09 14:57:49 -07:00
2015-05-21 17:39:29 -04:00
2015-04-11 22:27:55 -04:00
2014-10-09 22:26:04 -04:00
2015-04-26 17:22:07 -07:00
2015-04-15 15:06:55 -04:00
2015-04-26 17:22:07 -07:00
2015-04-22 14:49:23 -07:00
2015-02-11 20:07:47 -08:00
2015-04-26 17:22:07 -07:00
2015-04-15 16:35:22 -07:00
2015-04-15 16:35:25 -07:00
2015-02-12 18:54:12 -08:00
2015-03-09 15:43:00 +01:00
2015-04-14 13:36:04 -07:00
2015-04-14 16:49:03 -07:00
2015-04-15 16:35:22 -07:00
2015-04-12 21:03:31 +02:00
2015-04-12 20:58:24 +02:00
2014-11-19 15:25:26 -05:00
2015-04-17 09:04:11 -04:00
2014-10-21 23:44:20 +02:00
2015-02-24 08:41:07 +01:00
2015-04-15 16:35:22 -07:00
2015-04-15 16:35:22 -07:00
2014-10-29 11:18:18 -04:00
2014-10-14 02:18:16 +02:00
2015-01-14 15:07:32 +01:00
2015-04-23 16:52:01 +02:00
2014-12-10 17:41:17 -08:00
2015-02-13 21:21:42 -08:00
2014-10-09 22:25:51 -04:00
2015-04-30 09:35:41 -07:00
2015-05-13 14:05:12 -04:00
2015-01-06 11:04:29 -08:00
2014-12-04 14:34:54 -05:00
2015-02-13 21:21:38 -08:00
2014-12-22 15:40:48 +01:00
2015-04-15 13:31:23 +09:30
2014-12-16 15:53:03 -08:00
2015-04-17 09:04:06 -04:00
2015-02-13 21:21:38 -08:00
2015-04-17 09:04:06 -04:00
2015-01-17 10:02:23 +13:00
2015-04-15 16:35:23 -07:00
2015-04-15 15:06:55 -04:00
2015-04-15 16:35:22 -07:00
2015-02-17 14:34:55 -08:00
2015-04-17 09:04:06 -04:00
2015-04-19 13:19:23 -07:00
2015-03-11 13:20:25 -07:00
2015-02-09 15:24:03 -08:00
2014-12-13 12:42:48 -08:00
2015-04-15 16:35:22 -07:00
2015-04-17 09:04:07 -04:00
2014-12-10 17:41:10 -08:00
2015-04-17 09:04:08 -04:00
2015-01-18 01:03:45 -05:00
2014-12-05 17:19:27 -06:00
2014-12-17 12:31:40 -08:00
2014-12-17 12:31:40 -08:00
2014-12-04 14:34:47 -05:00
2015-04-14 16:49:17 -07:00
2015-04-06 11:16:04 -04:00