diff options
author | Julian Anastasov <ja@ssi.bg> | 2013-03-21 05:58:12 -0400 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-04-01 18:23:46 -0400 |
commit | 9a05475cebdd6341884b5901e53870be26e65158 (patch) | |
tree | 26472546bb3f5e0c49e147790859fc7b7e307789 /net | |
parent | 1845ed0bb29fa7864781021e0c8d06af318f358a (diff) |
ipvs: avoid kmem_cache_zalloc in ip_vs_conn_new
We have many fields to set and few to reset,
use kmem_cache_alloc instead to save some cycles.
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off by: Hans Schillstrom <hans@schillstrom.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_conn.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c index 416015b34c23..e3e2b4d3b6d8 100644 --- a/net/netfilter/ipvs/ip_vs_conn.c +++ b/net/netfilter/ipvs/ip_vs_conn.c | |||
@@ -861,7 +861,7 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, | |||
861 | struct ip_vs_proto_data *pd = ip_vs_proto_data_get(p->net, | 861 | struct ip_vs_proto_data *pd = ip_vs_proto_data_get(p->net, |
862 | p->protocol); | 862 | p->protocol); |
863 | 863 | ||
864 | cp = kmem_cache_zalloc(ip_vs_conn_cachep, GFP_ATOMIC); | 864 | cp = kmem_cache_alloc(ip_vs_conn_cachep, GFP_ATOMIC); |
865 | if (cp == NULL) { | 865 | if (cp == NULL) { |
866 | IP_VS_ERR_RL("%s(): no memory\n", __func__); | 866 | IP_VS_ERR_RL("%s(): no memory\n", __func__); |
867 | return NULL; | 867 | return NULL; |
@@ -872,13 +872,13 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, | |||
872 | ip_vs_conn_net_set(cp, p->net); | 872 | ip_vs_conn_net_set(cp, p->net); |
873 | cp->af = p->af; | 873 | cp->af = p->af; |
874 | cp->protocol = p->protocol; | 874 | cp->protocol = p->protocol; |
875 | ip_vs_addr_copy(p->af, &cp->caddr, p->caddr); | 875 | ip_vs_addr_set(p->af, &cp->caddr, p->caddr); |
876 | cp->cport = p->cport; | 876 | cp->cport = p->cport; |
877 | ip_vs_addr_copy(p->af, &cp->vaddr, p->vaddr); | 877 | ip_vs_addr_set(p->af, &cp->vaddr, p->vaddr); |
878 | cp->vport = p->vport; | 878 | cp->vport = p->vport; |
879 | /* proto should only be IPPROTO_IP if d_addr is a fwmark */ | 879 | /* proto should only be IPPROTO_IP if d_addr is a fwmark */ |
880 | ip_vs_addr_copy(p->protocol == IPPROTO_IP ? AF_UNSPEC : p->af, | 880 | ip_vs_addr_set(p->protocol == IPPROTO_IP ? AF_UNSPEC : p->af, |
881 | &cp->daddr, daddr); | 881 | &cp->daddr, daddr); |
882 | cp->dport = dport; | 882 | cp->dport = dport; |
883 | cp->flags = flags; | 883 | cp->flags = flags; |
884 | cp->fwmark = fwmark; | 884 | cp->fwmark = fwmark; |
@@ -887,6 +887,10 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, | |||
887 | cp->pe = p->pe; | 887 | cp->pe = p->pe; |
888 | cp->pe_data = p->pe_data; | 888 | cp->pe_data = p->pe_data; |
889 | cp->pe_data_len = p->pe_data_len; | 889 | cp->pe_data_len = p->pe_data_len; |
890 | } else { | ||
891 | cp->pe = NULL; | ||
892 | cp->pe_data = NULL; | ||
893 | cp->pe_data_len = 0; | ||
890 | } | 894 | } |
891 | spin_lock_init(&cp->lock); | 895 | spin_lock_init(&cp->lock); |
892 | 896 | ||
@@ -897,18 +901,28 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, | |||
897 | */ | 901 | */ |
898 | atomic_set(&cp->refcnt, 1); | 902 | atomic_set(&cp->refcnt, 1); |
899 | 903 | ||
904 | cp->control = NULL; | ||
900 | atomic_set(&cp->n_control, 0); | 905 | atomic_set(&cp->n_control, 0); |
901 | atomic_set(&cp->in_pkts, 0); | 906 | atomic_set(&cp->in_pkts, 0); |
902 | 907 | ||
908 | cp->packet_xmit = NULL; | ||
909 | cp->app = NULL; | ||
910 | cp->app_data = NULL; | ||
911 | /* reset struct ip_vs_seq */ | ||
912 | cp->in_seq.delta = 0; | ||
913 | cp->out_seq.delta = 0; | ||
914 | |||
903 | atomic_inc(&ipvs->conn_count); | 915 | atomic_inc(&ipvs->conn_count); |
904 | if (flags & IP_VS_CONN_F_NO_CPORT) | 916 | if (flags & IP_VS_CONN_F_NO_CPORT) |
905 | atomic_inc(&ip_vs_conn_no_cport_cnt); | 917 | atomic_inc(&ip_vs_conn_no_cport_cnt); |
906 | 918 | ||
907 | /* Bind the connection with a destination server */ | 919 | /* Bind the connection with a destination server */ |
920 | cp->dest = NULL; | ||
908 | ip_vs_bind_dest(cp, dest); | 921 | ip_vs_bind_dest(cp, dest); |
909 | 922 | ||
910 | /* Set its state and timeout */ | 923 | /* Set its state and timeout */ |
911 | cp->state = 0; | 924 | cp->state = 0; |
925 | cp->old_state = 0; | ||
912 | cp->timeout = 3*HZ; | 926 | cp->timeout = 3*HZ; |
913 | cp->sync_endtime = jiffies & ~3UL; | 927 | cp->sync_endtime = jiffies & ~3UL; |
914 | 928 | ||