diff options
author | Florian Westphal <fw@strlen.de> | 2016-08-09 06:16:04 -0400 |
---|---|---|
committer | Steffen Klassert <steffen.klassert@secunet.com> | 2016-08-10 05:23:23 -0400 |
commit | ae3fb6d32140e5c5b491892105ca89066171d217 (patch) | |
tree | a41a8b5e7c83ffb40e7d6bc512dfe168d69c12bb /net/xfrm | |
parent | e45a8a9e60ff1dd5ad118c794337a1101b46ab0d (diff) |
xfrm: state: use hlist_for_each_entry_rcu helper
This is required once we allow lockless access of bydst/bysrc hash tables.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Diffstat (limited to 'net/xfrm')
-rw-r--r-- | net/xfrm/xfrm_state.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 9895a8c56d8c..904ab4d4ac05 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -76,18 +76,18 @@ static void xfrm_hash_transfer(struct hlist_head *list, | |||
76 | h = __xfrm_dst_hash(&x->id.daddr, &x->props.saddr, | 76 | h = __xfrm_dst_hash(&x->id.daddr, &x->props.saddr, |
77 | x->props.reqid, x->props.family, | 77 | x->props.reqid, x->props.family, |
78 | nhashmask); | 78 | nhashmask); |
79 | hlist_add_head(&x->bydst, ndsttable+h); | 79 | hlist_add_head_rcu(&x->bydst, ndsttable + h); |
80 | 80 | ||
81 | h = __xfrm_src_hash(&x->id.daddr, &x->props.saddr, | 81 | h = __xfrm_src_hash(&x->id.daddr, &x->props.saddr, |
82 | x->props.family, | 82 | x->props.family, |
83 | nhashmask); | 83 | nhashmask); |
84 | hlist_add_head(&x->bysrc, nsrctable+h); | 84 | hlist_add_head_rcu(&x->bysrc, nsrctable + h); |
85 | 85 | ||
86 | if (x->id.spi) { | 86 | if (x->id.spi) { |
87 | h = __xfrm_spi_hash(&x->id.daddr, x->id.spi, | 87 | h = __xfrm_spi_hash(&x->id.daddr, x->id.spi, |
88 | x->id.proto, x->props.family, | 88 | x->id.proto, x->props.family, |
89 | nhashmask); | 89 | nhashmask); |
90 | hlist_add_head(&x->byspi, nspitable+h); | 90 | hlist_add_head_rcu(&x->byspi, nspitable + h); |
91 | } | 91 | } |
92 | } | 92 | } |
93 | } | 93 | } |
@@ -520,10 +520,10 @@ int __xfrm_state_delete(struct xfrm_state *x) | |||
520 | x->km.state = XFRM_STATE_DEAD; | 520 | x->km.state = XFRM_STATE_DEAD; |
521 | spin_lock(&net->xfrm.xfrm_state_lock); | 521 | spin_lock(&net->xfrm.xfrm_state_lock); |
522 | list_del(&x->km.all); | 522 | list_del(&x->km.all); |
523 | hlist_del(&x->bydst); | 523 | hlist_del_rcu(&x->bydst); |
524 | hlist_del(&x->bysrc); | 524 | hlist_del_rcu(&x->bysrc); |
525 | if (x->id.spi) | 525 | if (x->id.spi) |
526 | hlist_del(&x->byspi); | 526 | hlist_del_rcu(&x->byspi); |
527 | net->xfrm.state_num--; | 527 | net->xfrm.state_num--; |
528 | spin_unlock(&net->xfrm.xfrm_state_lock); | 528 | spin_unlock(&net->xfrm.xfrm_state_lock); |
529 | 529 | ||
@@ -659,7 +659,7 @@ static struct xfrm_state *__xfrm_state_lookup(struct net *net, u32 mark, | |||
659 | unsigned int h = xfrm_spi_hash(net, daddr, spi, proto, family); | 659 | unsigned int h = xfrm_spi_hash(net, daddr, spi, proto, family); |
660 | struct xfrm_state *x; | 660 | struct xfrm_state *x; |
661 | 661 | ||
662 | hlist_for_each_entry(x, net->xfrm.state_byspi+h, byspi) { | 662 | hlist_for_each_entry_rcu(x, net->xfrm.state_byspi + h, byspi) { |
663 | if (x->props.family != family || | 663 | if (x->props.family != family || |
664 | x->id.spi != spi || | 664 | x->id.spi != spi || |
665 | x->id.proto != proto || | 665 | x->id.proto != proto || |
@@ -683,7 +683,7 @@ static struct xfrm_state *__xfrm_state_lookup_byaddr(struct net *net, u32 mark, | |||
683 | unsigned int h = xfrm_src_hash(net, daddr, saddr, family); | 683 | unsigned int h = xfrm_src_hash(net, daddr, saddr, family); |
684 | struct xfrm_state *x; | 684 | struct xfrm_state *x; |
685 | 685 | ||
686 | hlist_for_each_entry(x, net->xfrm.state_bysrc+h, bysrc) { | 686 | hlist_for_each_entry_rcu(x, net->xfrm.state_bysrc + h, bysrc) { |
687 | if (x->props.family != family || | 687 | if (x->props.family != family || |
688 | x->id.proto != proto || | 688 | x->id.proto != proto || |
689 | !xfrm_addr_equal(&x->id.daddr, daddr, family) || | 689 | !xfrm_addr_equal(&x->id.daddr, daddr, family) || |
@@ -781,7 +781,7 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, | |||
781 | 781 | ||
782 | spin_lock_bh(&net->xfrm.xfrm_state_lock); | 782 | spin_lock_bh(&net->xfrm.xfrm_state_lock); |
783 | h = xfrm_dst_hash(net, daddr, saddr, tmpl->reqid, encap_family); | 783 | h = xfrm_dst_hash(net, daddr, saddr, tmpl->reqid, encap_family); |
784 | hlist_for_each_entry(x, net->xfrm.state_bydst+h, bydst) { | 784 | hlist_for_each_entry_rcu(x, net->xfrm.state_bydst + h, bydst) { |
785 | if (x->props.family == encap_family && | 785 | if (x->props.family == encap_family && |
786 | x->props.reqid == tmpl->reqid && | 786 | x->props.reqid == tmpl->reqid && |
787 | (mark & x->mark.m) == x->mark.v && | 787 | (mark & x->mark.m) == x->mark.v && |
@@ -797,7 +797,7 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, | |||
797 | goto found; | 797 | goto found; |
798 | 798 | ||
799 | h_wildcard = xfrm_dst_hash(net, daddr, &saddr_wildcard, tmpl->reqid, encap_family); | 799 | h_wildcard = xfrm_dst_hash(net, daddr, &saddr_wildcard, tmpl->reqid, encap_family); |
800 | hlist_for_each_entry(x, net->xfrm.state_bydst+h_wildcard, bydst) { | 800 | hlist_for_each_entry_rcu(x, net->xfrm.state_bydst + h_wildcard, bydst) { |
801 | if (x->props.family == encap_family && | 801 | if (x->props.family == encap_family && |
802 | x->props.reqid == tmpl->reqid && | 802 | x->props.reqid == tmpl->reqid && |
803 | (mark & x->mark.m) == x->mark.v && | 803 | (mark & x->mark.m) == x->mark.v && |
@@ -852,12 +852,12 @@ found: | |||
852 | if (km_query(x, tmpl, pol) == 0) { | 852 | if (km_query(x, tmpl, pol) == 0) { |
853 | x->km.state = XFRM_STATE_ACQ; | 853 | x->km.state = XFRM_STATE_ACQ; |
854 | list_add(&x->km.all, &net->xfrm.state_all); | 854 | list_add(&x->km.all, &net->xfrm.state_all); |
855 | hlist_add_head(&x->bydst, net->xfrm.state_bydst+h); | 855 | hlist_add_head_rcu(&x->bydst, net->xfrm.state_bydst + h); |
856 | h = xfrm_src_hash(net, daddr, saddr, encap_family); | 856 | h = xfrm_src_hash(net, daddr, saddr, encap_family); |
857 | hlist_add_head(&x->bysrc, net->xfrm.state_bysrc+h); | 857 | hlist_add_head_rcu(&x->bysrc, net->xfrm.state_bysrc + h); |
858 | if (x->id.spi) { | 858 | if (x->id.spi) { |
859 | h = xfrm_spi_hash(net, &x->id.daddr, x->id.spi, x->id.proto, encap_family); | 859 | h = xfrm_spi_hash(net, &x->id.daddr, x->id.spi, x->id.proto, encap_family); |
860 | hlist_add_head(&x->byspi, net->xfrm.state_byspi+h); | 860 | hlist_add_head_rcu(&x->byspi, net->xfrm.state_byspi + h); |
861 | } | 861 | } |
862 | x->lft.hard_add_expires_seconds = net->xfrm.sysctl_acq_expires; | 862 | x->lft.hard_add_expires_seconds = net->xfrm.sysctl_acq_expires; |
863 | tasklet_hrtimer_start(&x->mtimer, ktime_set(net->xfrm.sysctl_acq_expires, 0), HRTIMER_MODE_REL); | 863 | tasklet_hrtimer_start(&x->mtimer, ktime_set(net->xfrm.sysctl_acq_expires, 0), HRTIMER_MODE_REL); |
@@ -945,16 +945,16 @@ static void __xfrm_state_insert(struct xfrm_state *x) | |||
945 | 945 | ||
946 | h = xfrm_dst_hash(net, &x->id.daddr, &x->props.saddr, | 946 | h = xfrm_dst_hash(net, &x->id.daddr, &x->props.saddr, |
947 | x->props.reqid, x->props.family); | 947 | x->props.reqid, x->props.family); |
948 | hlist_add_head(&x->bydst, net->xfrm.state_bydst+h); | 948 | hlist_add_head_rcu(&x->bydst, net->xfrm.state_bydst + h); |
949 | 949 | ||
950 | h = xfrm_src_hash(net, &x->id.daddr, &x->props.saddr, x->props.family); | 950 | h = xfrm_src_hash(net, &x->id.daddr, &x->props.saddr, x->props.family); |
951 | hlist_add_head(&x->bysrc, net->xfrm.state_bysrc+h); | 951 | hlist_add_head_rcu(&x->bysrc, net->xfrm.state_bysrc + h); |
952 | 952 | ||
953 | if (x->id.spi) { | 953 | if (x->id.spi) { |
954 | h = xfrm_spi_hash(net, &x->id.daddr, x->id.spi, x->id.proto, | 954 | h = xfrm_spi_hash(net, &x->id.daddr, x->id.spi, x->id.proto, |
955 | x->props.family); | 955 | x->props.family); |
956 | 956 | ||
957 | hlist_add_head(&x->byspi, net->xfrm.state_byspi+h); | 957 | hlist_add_head_rcu(&x->byspi, net->xfrm.state_byspi + h); |
958 | } | 958 | } |
959 | 959 | ||
960 | tasklet_hrtimer_start(&x->mtimer, ktime_set(1, 0), HRTIMER_MODE_REL); | 960 | tasklet_hrtimer_start(&x->mtimer, ktime_set(1, 0), HRTIMER_MODE_REL); |
@@ -1063,9 +1063,9 @@ static struct xfrm_state *__find_acq_core(struct net *net, | |||
1063 | xfrm_state_hold(x); | 1063 | xfrm_state_hold(x); |
1064 | tasklet_hrtimer_start(&x->mtimer, ktime_set(net->xfrm.sysctl_acq_expires, 0), HRTIMER_MODE_REL); | 1064 | tasklet_hrtimer_start(&x->mtimer, ktime_set(net->xfrm.sysctl_acq_expires, 0), HRTIMER_MODE_REL); |
1065 | list_add(&x->km.all, &net->xfrm.state_all); | 1065 | list_add(&x->km.all, &net->xfrm.state_all); |
1066 | hlist_add_head(&x->bydst, net->xfrm.state_bydst+h); | 1066 | hlist_add_head_rcu(&x->bydst, net->xfrm.state_bydst + h); |
1067 | h = xfrm_src_hash(net, daddr, saddr, family); | 1067 | h = xfrm_src_hash(net, daddr, saddr, family); |
1068 | hlist_add_head(&x->bysrc, net->xfrm.state_bysrc+h); | 1068 | hlist_add_head_rcu(&x->bysrc, net->xfrm.state_bysrc + h); |
1069 | 1069 | ||
1070 | net->xfrm.state_num++; | 1070 | net->xfrm.state_num++; |
1071 | 1071 | ||
@@ -1581,7 +1581,7 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high) | |||
1581 | if (x->id.spi) { | 1581 | if (x->id.spi) { |
1582 | spin_lock_bh(&net->xfrm.xfrm_state_lock); | 1582 | spin_lock_bh(&net->xfrm.xfrm_state_lock); |
1583 | h = xfrm_spi_hash(net, &x->id.daddr, x->id.spi, x->id.proto, x->props.family); | 1583 | h = xfrm_spi_hash(net, &x->id.daddr, x->id.spi, x->id.proto, x->props.family); |
1584 | hlist_add_head(&x->byspi, net->xfrm.state_byspi+h); | 1584 | hlist_add_head_rcu(&x->byspi, net->xfrm.state_byspi + h); |
1585 | spin_unlock_bh(&net->xfrm.xfrm_state_lock); | 1585 | spin_unlock_bh(&net->xfrm.xfrm_state_lock); |
1586 | 1586 | ||
1587 | err = 0; | 1587 | err = 0; |