aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorDavid Miller <davem@davemloft.net>2011-12-02 11:52:18 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-05 15:20:19 -0500
commita4757123aeadf450b5b3c5f51f214660e20477f3 (patch)
tree075d43113136926357be2863b2efb3b6a099e553 /drivers/infiniband
parent51d45974515c35cd401f6194a6e728a2d1c3e3c6 (diff)
cxgb3: Rework t3_l2t_get to take a dst_entry instead of a neighbour.
This way we consolidate the RCU locking down into the place where it actually matters, and also we can make the code handle dst_get_neighbour_noref() returning NULL properly. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_cm.c15
1 files changed, 2 insertions, 13 deletions
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
index 23686df0517c..740dcc065cf2 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
@@ -1338,7 +1338,6 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
1338 struct iwch_ep *child_ep, *parent_ep = ctx; 1338 struct iwch_ep *child_ep, *parent_ep = ctx;
1339 struct cpl_pass_accept_req *req = cplhdr(skb); 1339 struct cpl_pass_accept_req *req = cplhdr(skb);
1340 unsigned int hwtid = GET_TID(req); 1340 unsigned int hwtid = GET_TID(req);
1341 struct neighbour *neigh;
1342 struct dst_entry *dst; 1341 struct dst_entry *dst;
1343 struct l2t_entry *l2t; 1342 struct l2t_entry *l2t;
1344 struct rtable *rt; 1343 struct rtable *rt;
@@ -1375,10 +1374,7 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
1375 goto reject; 1374 goto reject;
1376 } 1375 }
1377 dst = &rt->dst; 1376 dst = &rt->dst;
1378 rcu_read_lock(); 1377 l2t = t3_l2t_get(tdev, dst, NULL);
1379 neigh = dst_get_neighbour_noref(dst);
1380 l2t = t3_l2t_get(tdev, neigh, neigh->dev);
1381 rcu_read_unlock();
1382 if (!l2t) { 1378 if (!l2t) {
1383 printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", 1379 printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n",
1384 __func__); 1380 __func__);
@@ -1889,7 +1885,6 @@ static int is_loopback_dst(struct iw_cm_id *cm_id)
1889int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) 1885int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
1890{ 1886{
1891 struct iwch_dev *h = to_iwch_dev(cm_id->device); 1887 struct iwch_dev *h = to_iwch_dev(cm_id->device);
1892 struct neighbour *neigh;
1893 struct iwch_ep *ep; 1888 struct iwch_ep *ep;
1894 struct rtable *rt; 1889 struct rtable *rt;
1895 int err = 0; 1890 int err = 0;
@@ -1947,13 +1942,7 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
1947 goto fail3; 1942 goto fail3;
1948 } 1943 }
1949 ep->dst = &rt->dst; 1944 ep->dst = &rt->dst;
1950 1945 ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst, NULL);
1951 rcu_read_lock();
1952 neigh = dst_get_neighbour_noref(ep->dst);
1953
1954 /* get a l2t entry */
1955 ep->l2t = t3_l2t_get(ep->com.tdev, neigh, neigh->dev);
1956 rcu_read_unlock();
1957 if (!ep->l2t) { 1946 if (!ep->l2t) {
1958 printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); 1947 printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
1959 err = -ENOMEM; 1948 err = -ENOMEM;