aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/xfrm4_policy.c
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2010-11-11 02:14:07 -0500
committerDavid S. Miller <davem@davemloft.net>2010-11-11 13:29:40 -0500
commit72cdd1d971c0deb1619c5c339270570c43647a78 (patch)
tree15e3c63cf135818ae1b5cbc9d85ef2c48c03804c /net/ipv4/xfrm4_policy.c
parent46b13fc5c0f239f36e84665c73087d5fa86bfd86 (diff)
net: get rid of rtable->idev
It seems idev field in struct rtable has no special purpose, but adding extra atomic ops. We hold refcounts on the device itself (using percpu data, so pretty cheap in current kernel). infiniband case is solved using dst.dev instead of idev->dev Removal of this field means routing without route cache is now using shared data, percpu data, and only potential contention is a pair of atomic ops on struct neighbour per forwarded packet. About 5% speedup on routing test. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: Roland Dreier <rolandd@cisco.com> Cc: Sean Hefty <sean.hefty@intel.com> Cc: Hal Rosenstock <hal.rosenstock@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/xfrm4_policy.c')
-rw-r--r--net/ipv4/xfrm4_policy.c24
1 files changed, 0 insertions, 24 deletions
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
index 4464f3bff6a7..dd1fd8c473fc 100644
--- a/net/ipv4/xfrm4_policy.c
+++ b/net/ipv4/xfrm4_policy.c
@@ -80,10 +80,6 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
80 xdst->u.dst.dev = dev; 80 xdst->u.dst.dev = dev;
81 dev_hold(dev); 81 dev_hold(dev);
82 82
83 xdst->u.rt.idev = in_dev_get(dev);
84 if (!xdst->u.rt.idev)
85 return -ENODEV;
86
87 xdst->u.rt.peer = rt->peer; 83 xdst->u.rt.peer = rt->peer;
88 if (rt->peer) 84 if (rt->peer)
89 atomic_inc(&rt->peer->refcnt); 85 atomic_inc(&rt->peer->refcnt);
@@ -189,8 +185,6 @@ static void xfrm4_dst_destroy(struct dst_entry *dst)
189{ 185{
190 struct xfrm_dst *xdst = (struct xfrm_dst *)dst; 186 struct xfrm_dst *xdst = (struct xfrm_dst *)dst;
191 187
192 if (likely(xdst->u.rt.idev))
193 in_dev_put(xdst->u.rt.idev);
194 if (likely(xdst->u.rt.peer)) 188 if (likely(xdst->u.rt.peer))
195 inet_putpeer(xdst->u.rt.peer); 189 inet_putpeer(xdst->u.rt.peer);
196 xfrm_dst_destroy(xdst); 190 xfrm_dst_destroy(xdst);
@@ -199,27 +193,9 @@ static void xfrm4_dst_destroy(struct dst_entry *dst)
199static void xfrm4_dst_ifdown(struct dst_entry *dst, struct net_device *dev, 193static void xfrm4_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
200 int unregister) 194 int unregister)
201{ 195{
202 struct xfrm_dst *xdst;
203
204 if (!unregister) 196 if (!unregister)
205 return; 197 return;
206 198
207 xdst = (struct xfrm_dst *)dst;
208 if (xdst->u.rt.idev->dev == dev) {
209 struct in_device *loopback_idev =
210 in_dev_get(dev_net(dev)->loopback_dev);
211 BUG_ON(!loopback_idev);
212
213 do {
214 in_dev_put(xdst->u.rt.idev);
215 xdst->u.rt.idev = loopback_idev;
216 in_dev_hold(loopback_idev);
217 xdst = (struct xfrm_dst *)xdst->u.dst.child;
218 } while (xdst->u.dst.xfrm);
219
220 __in_dev_put(loopback_idev);
221 }
222
223 xfrm_dst_ifdown(dst, dev); 199 xfrm_dst_ifdown(dst, dev);
224} 200}
225 201