aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
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 /drivers/infiniband
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 'drivers/infiniband')
-rw-r--r--drivers/infiniband/core/addr.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index a5ea1bce968..c15fd2ea56c 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -200,7 +200,7 @@ static int addr4_resolve(struct sockaddr_in *src_in,
200 src_in->sin_family = AF_INET; 200 src_in->sin_family = AF_INET;
201 src_in->sin_addr.s_addr = rt->rt_src; 201 src_in->sin_addr.s_addr = rt->rt_src;
202 202
203 if (rt->idev->dev->flags & IFF_LOOPBACK) { 203 if (rt->dst.dev->flags & IFF_LOOPBACK) {
204 ret = rdma_translate_ip((struct sockaddr *) dst_in, addr); 204 ret = rdma_translate_ip((struct sockaddr *) dst_in, addr);
205 if (!ret) 205 if (!ret)
206 memcpy(addr->dst_dev_addr, addr->src_dev_addr, MAX_ADDR_LEN); 206 memcpy(addr->dst_dev_addr, addr->src_dev_addr, MAX_ADDR_LEN);
@@ -208,12 +208,12 @@ static int addr4_resolve(struct sockaddr_in *src_in,
208 } 208 }
209 209
210 /* If the device does ARP internally, return 'done' */ 210 /* If the device does ARP internally, return 'done' */
211 if (rt->idev->dev->flags & IFF_NOARP) { 211 if (rt->dst.dev->flags & IFF_NOARP) {
212 rdma_copy_addr(addr, rt->idev->dev, NULL); 212 rdma_copy_addr(addr, rt->dst.dev, NULL);
213 goto put; 213 goto put;
214 } 214 }
215 215
216 neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->idev->dev); 216 neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, rt->dst.dev);
217 if (!neigh || !(neigh->nud_state & NUD_VALID)) { 217 if (!neigh || !(neigh->nud_state & NUD_VALID)) {
218 neigh_event_send(rt->dst.neighbour, NULL); 218 neigh_event_send(rt->dst.neighbour, NULL);
219 ret = -ENODATA; 219 ret = -ENODATA;