[PATCH 00/11] preempt_count rework -v3

From: Peter Zijlstra
Date: Tue Sep 17 2013 - 05:17:33 EST


These patches optimize preempt_enable by firstly folding the preempt and
need_resched tests into one -- this should work for all architectures. And
secondly by providing per-arch preempt_count implementations; with x86 using
per-cpu preempt_count for fastest access.

These patches have been boot tested on CONFIG_PREEMPT=y x86_64 and survive
building a x86_64-defconfig kernel.

text data bss filename
11387014 1454776 1187840 defconfig-build/vmlinux.before
11352294 1454776 1187840 defconfig-build/vmlinux.after

void kick_process(struct task_struct *p)
{
int cpu;

preempt_disable();
cpu = task_cpu(p);
if ((cpu != smp_processor_id()) && task_curr(p))
smp_send_reschedule(cpu);
preempt_enable();
}

before:

ffffffff81073f00 <kick_process>:
ffffffff81073f00: 55 push %rbp
I ffffffff81073f01: 65 48 8b 04 25 f0 b7 mov %gs:0xb7f0,%rax
ffffffff81073f08: 00 00
I ffffffff81073f0a: 83 80 44 e0 ff ff 01 addl $0x1,-0x1fbc(%rax)
ffffffff81073f11: 48 89 e5 mov %rsp,%rbp
ffffffff81073f14: 48 8b 47 08 mov 0x8(%rdi),%rax
ffffffff81073f18: 8b 50 18 mov 0x18(%rax),%edx
ffffffff81073f1b: 65 8b 04 25 1c b0 00 mov %gs:0xb01c,%eax
ffffffff81073f22: 00
ffffffff81073f23: 39 c2 cmp %eax,%edx
ffffffff81073f25: 74 1b je ffffffff81073f42 <kick_process+0x42>
ffffffff81073f27: 89 d1 mov %edx,%ecx
ffffffff81073f29: 48 c7 c0 40 2c 01 00 mov $0x12c40,%rax
ffffffff81073f30: 48 8b 0c cd 00 25 cc mov -0x7e33db00(,%rcx,8),%rcx
ffffffff81073f37: 81
ffffffff81073f38: 48 3b bc 08 00 08 00 cmp 0x800(%rax,%rcx,1),%rdi
ffffffff81073f3f: 00
ffffffff81073f40: 74 2e je ffffffff81073f70 <kick_process+0x70>
D ffffffff81073f42: 65 48 8b 04 25 f0 b7 mov %gs:0xb7f0,%rax
ffffffff81073f49: 00 00
D ffffffff81073f4b: 83 a8 44 e0 ff ff 01 subl $0x1,-0x1fbc(%rax)
D ffffffff81073f52: 48 8b 80 38 e0 ff ff mov -0x1fc8(%rax),%rax
D ffffffff81073f59: a8 08 test $0x8,%al
D ffffffff81073f5b: 75 02 jne ffffffff81073f5f <kick_process+0x5f>
ffffffff81073f5d: 5d pop %rbp
ffffffff81073f5e: c3 retq
D ffffffff81073f5f: e8 9c 6f 75 00 callq ffffffff817caf00 <preempt_schedule>
ffffffff81073f64: 5d pop %rbp
ffffffff81073f65: c3 retq
ffffffff81073f66: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
ffffffff81073f6d: 00 00 00
ffffffff81073f70: 89 d7 mov %edx,%edi
ffffffff81073f72: ff 15 a8 99 ba 00 callq *0xba99a8(%rip) # ffffffff81c1d920 <smp_ops+0x20>
ffffffff81073f78: eb c8 jmp ffffffff81073f42 <kick_process+0x42>
ffffffff81073f7a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)


after:

ffffffff8106f5e0 <kick_process>:
ffffffff8106f5e0: 55 push %rbp
I ffffffff8106f5e1: 65 ff 04 25 e0 b7 00 incl %gs:0xb7e0
ffffffff8106f5e8: 00
ffffffff8106f5e9: 48 89 e5 mov %rsp,%rbp
ffffffff8106f5ec: 48 8b 47 08 mov 0x8(%rdi),%rax
ffffffff8106f5f0: 8b 50 18 mov 0x18(%rax),%edx
ffffffff8106f5f3: 65 8b 04 25 1c b0 00 mov %gs:0xb01c,%eax
ffffffff8106f5fa: 00
ffffffff8106f5fb: 39 c2 cmp %eax,%edx
ffffffff8106f5fd: 74 1b je ffffffff8106f61a <kick_process+0x3a>
ffffffff8106f5ff: 89 d1 mov %edx,%ecx
ffffffff8106f601: 48 c7 c0 40 2c 01 00 mov $0x12c40,%rax
ffffffff8106f608: 48 8b 0c cd 00 25 cc mov -0x7e33db00(,%rcx,8),%rcx
ffffffff8106f60f: 81
ffffffff8106f610: 48 3b bc 08 00 08 00 cmp 0x800(%rax,%rcx,1),%rdi
ffffffff8106f617: 00
ffffffff8106f618: 74 26 je ffffffff8106f640 <kick_process+0x60>
D ffffffff8106f61a: 65 ff 0c 25 e0 b7 00 decl %gs:0xb7e0
ffffffff8106f621: 00
D ffffffff8106f622: 74 0c je ffffffff8106f630 <kick_process+0x50>
ffffffff8106f624: 5d pop %rbp
ffffffff8106f625: c3 retq
ffffffff8106f626: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
ffffffff8106f62d: 00 00 00
D ffffffff8106f630: e8 fb b4 f9 ff callq ffffffff8100ab30 <___preempt_schedule>
ffffffff8106f635: 5d pop %rbp
ffffffff8106f636: c3 retq
ffffffff8106f637: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
ffffffff8106f63e: 00 00
ffffffff8106f640: 89 d7 mov %edx,%edi
ffffffff8106f642: ff 15 d8 e2 ba 00 callq *0xbae2d8(%rip) # ffffffff81c1d920 <smp_ops+0x20>
ffffffff8106f648: eb d0 jmp ffffffff8106f61a <kick_process+0x3a>
ffffffff8106f64a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/