• D
    x86/asm/entry/irq: Simplify interrupt dispatch table (IDT) layout · 3304c9c3
    Denys Vlasenko 提交于
    Interrupt entry points are handled with the following code,
    each 32-byte code block contains seven entry points:
    
    		...
    		[push][jump 22] // 4 bytes
    		[push][jump 18] // 4 bytes
    		[push][jump 14] // 4 bytes
    		[push][jump 10] // 4 bytes
    		[push][jump  6] // 4 bytes
    		[push][jump  2] // 4 bytes
    		[push][jump common_interrupt][padding] // 8 bytes
    
    		[push][jump]
    		[push][jump]
    		[push][jump]
    		[push][jump]
    		[push][jump]
    		[push][jump]
    		[push][jump common_interrupt][padding]
    
    		[padding_2]
    	common_interrupt:
    
    And there is a table which holds pointers to every entry point,
    IOW: to every push.
    
    In cold cache, two jumps are still costlier than one, even
    though we get the benefit of them residing in the same
    cacheline.
    
    This change replaces short jumps with near ones to
    'common_interrupt', and pads every push+jump pair to 8 bytes. This
    way, each interrupt takes only one jump.
    
    This change replaces ".p2align CONFIG_X86_L1_CACHE_SHIFT" before
    dispatch table with ".align 8" - we do not need anything
    stronger than that.
    
    The table of entry addresses (the interrupt[] array) is no
    longer necessary, the address of entries can be easily
    calculated as (irq_entries_start + i*8).
    
       text	   data	    bss	    dec	    hex	filename
      12546	      0	      0	  12546	   3102	entry_64.o.before
      11626	      0	      0	  11626	   2d6a	entry_64.o
    
    The size decrease is because 1656 bytes of .init.rodata are
    gone. That's initdata, though. The resident size does go up a
    bit.
    
    Run-tested (32 and 64 bits).
    Acked-and-Tested-by: NBorislav Petkov <bp@suse.de>
    Signed-off-by: NDenys Vlasenko <dvlasenk@redhat.com>
    Cc: Alexei Starovoitov <ast@plumgrid.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Will Drewry <wad@chromium.org>
    Link: http://lkml.kernel.org/r/1428090553-7283-1-git-send-email-dvlasenk@redhat.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    3304c9c3
hw_irq.h 6.5 KB