Skip to content
  • Alexey Dobriyan's avatar
    netns: make struct pernet_operations::id unsigned int · c7d03a00
    Alexey Dobriyan authored
    
    
    Make struct pernet_operations::id unsigned.
    
    There are 2 reasons to do so:
    
    1)
    This field is really an index into an zero based array and
    thus is unsigned entity. Using negative value is out-of-bound
    access by definition.
    
    2)
    On x86_64 unsigned 32-bit data which are mixed with pointers
    via array indexing or offsets added or subtracted to pointers
    are preffered to signed 32-bit data.
    
    "int" being used as an array index needs to be sign-extended
    to 64-bit before being used.
    
    	void f(long *p, int i)
    	{
    		g(p[i]);
    	}
    
      roughly translates to
    
    	movsx	rsi, esi
    	mov	rdi, [rsi+...]
    	call 	g
    
    MOVSX is 3 byte instruction which isn't necessary if the variable is
    unsigned because x86_64 is zero extending by default.
    
    Now, there is net_generic() function which, you guessed it right, uses
    "int" as an array index:
    
    	static inline void *net_generic(const struct net *net, int id)
    	{
    		...
    		ptr = ng->ptr[id - 1];
    		...
    	}
    
    And this function is used a lot, so those sign extensions add up.
    
    Patch snipes ~1730 bytes on allyesconfig kernel (without all junk
    messing with code generation):
    
    	add/remove: 0/0 grow/shrink: 70/598 up/down: 396/-2126 (-1730)
    
    Unfortunately some functions actually grow bigger.
    This is a semmingly random artefact of code generation with register
    allocator being used differently. gcc decides that some variable
    needs to live in new r8+ registers and every access now requires REX
    prefix. Or it is shifted into r12, so [r12+0] addressing mode has to be
    used which is longer than [r8]
    
    However, overall balance is in negative direction:
    
    	add/remove: 0/0 grow/shrink: 70/598 up/down: 396/-2126 (-1730)
    	function                                     old     new   delta
    	nfsd4_lock                                  3886    3959     +73
    	tipc_link_build_proto_msg                   1096    1140     +44
    	mac80211_hwsim_new_radio                    2776    2808     +32
    	tipc_mon_rcv                                1032    1058     +26
    	svcauth_gss_legacy_init                     1413    1429     +16
    	tipc_bcbase_select_primary                   379     392     +13
    	nfsd4_exchange_id                           1247    1260     +13
    	nfsd4_setclientid_confirm                    782     793     +11
    		...
    	put_client_renew_locked                      494     480     -14
    	ip_set_sockfn_get                            730     716     -14
    	geneve_sock_add                              829     813     -16
    	nfsd4_sequence_done                          721     703     -18
    	nlmclnt_lookup_host                          708     686     -22
    	nfsd4_lockt                                 1085    1063     -22
    	nfs_get_client                              1077    1050     -27
    	tcf_bpf_init                                1106    1076     -30
    	nfsd4_encode_fattr                          5997    5930     -67
    	Total: Before=154856051, After=154854321, chg -0.00%
    
    Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c7d03a00