netns: make struct pernet_operations::id unsigned int
authorAlexey Dobriyan <adobriyan@gmail.com>
Thu, 17 Nov 2016 01:58:21 +0000 (04:58 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Nov 2016 15:59:15 +0000 (10:59 -0500)
commitc7d03a00b56fc23c3a01a8353789ad257363e281
treec4b4b9bbdf0ab8d53c213769052a4875c2866010
parente68b6e50fa359cc5aad4d2f8ac2bdbc1a8f4fd59
netns: make struct pernet_operations::id unsigned int

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: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
73 files changed:
drivers/infiniband/core/cma.c
drivers/net/bonding/bond_main.c
drivers/net/geneve.c
drivers/net/gtp.c
drivers/net/ppp/ppp_generic.c
drivers/net/ppp/pppoe.c
drivers/net/vxlan.c
drivers/net/wireless/mac80211_hwsim.c
fs/lockd/netns.h
fs/lockd/svc.c
fs/nfs/inode.c
fs/nfs/netns.h
fs/nfs_common/grace.c
fs/nfsd/netns.h
fs/nfsd/nfsctl.c
include/net/bonding.h
include/net/ip_tunnels.h
include/net/net_namespace.h
include/net/netfilter/nf_conntrack_l4proto.h
include/net/netfilter/nf_conntrack_synproxy.h
include/net/netns/generic.h
kernel/audit.c
net/8021q/vlan.c
net/8021q/vlan.h
net/bridge/br_netfilter_hooks.c
net/caif/caif_dev.c
net/core/net_namespace.c
net/core/pktgen.c
net/ipv4/ip_gre.c
net/ipv4/ip_tunnel.c
net/ipv4/ip_vti.c
net/ipv4/ipip.c
net/ipv4/netfilter/ipt_CLUSTERIP.c
net/ipv6/ip6_gre.c
net/ipv6/ip6_tunnel.c
net/ipv6/ip6_vti.c
net/ipv6/sit.c
net/ipv6/xfrm6_tunnel.c
net/key/af_key.c
net/netfilter/ipset/ip_set_core.c
net/netfilter/ipvs/ip_vs_core.c
net/netfilter/nf_conntrack_proto_dccp.c
net/netfilter/nf_conntrack_proto_gre.c
net/netfilter/nf_conntrack_proto_sctp.c
net/netfilter/nf_conntrack_proto_udplite.c
net/netfilter/nf_synproxy_core.c
net/netfilter/nfnetlink_log.c
net/netfilter/nfnetlink_queue.c
net/netfilter/xt_hashlimit.c
net/netfilter/xt_recent.c
net/openvswitch/datapath.c
net/openvswitch/datapath.h
net/phonet/pn_dev.c
net/rds/tcp.c
net/sched/act_bpf.c
net/sched/act_connmark.c
net/sched/act_csum.c
net/sched/act_gact.c
net/sched/act_ife.c
net/sched/act_ipt.c
net/sched/act_mirred.c
net/sched/act_nat.c
net/sched/act_pedit.c
net/sched/act_police.c
net/sched/act_simple.c
net/sched/act_skbedit.c
net/sched/act_skbmod.c
net/sched/act_tunnel_key.c
net/sched/act_vlan.c
net/sunrpc/netns.h
net/sunrpc/sunrpc_syms.c
net/tipc/core.c
net/tipc/core.h