Lines Matching refs:neigh
616 /* remove all neigh connected to this path */
748 struct ipoib_neigh *neigh, *tn;
804 list_for_each_entry_safe(neigh, tn, &path->neigh_list, list) {
805 if (neigh->ah) {
806 WARN_ON(neigh->ah != old_ah);
814 ipoib_put_ah(neigh->ah);
817 neigh->ah = path->ah;
819 if (ipoib_cm_enabled(dev, neigh->daddr)) {
820 if (!ipoib_cm_get(neigh))
821 ipoib_cm_set(neigh, ipoib_cm_create_tx(dev,
823 neigh));
824 if (!ipoib_cm_get(neigh)) {
825 ipoib_neigh_free(neigh);
830 while ((skb = __skb_dequeue(&neigh->queue)))
926 static void neigh_refresh_path(struct ipoib_neigh *neigh, u8 *daddr,
950 struct ipoib_neigh *neigh;
954 neigh = ipoib_neigh_alloc(daddr, dev);
955 if (!neigh) {
963 * neigh will be added only once.
965 if (unlikely(!list_empty(&neigh->list))) {
967 return neigh;
979 list_add_tail(&neigh->list, &path->neigh_list);
983 neigh->ah = path->ah;
985 if (ipoib_cm_enabled(dev, neigh->daddr)) {
986 if (!ipoib_cm_get(neigh))
987 ipoib_cm_set(neigh, ipoib_cm_create_tx(dev, path, neigh));
988 if (!ipoib_cm_get(neigh)) {
989 ipoib_neigh_free(neigh);
992 if (skb_queue_len(&neigh->queue) <
994 push_pseudo_header(skb, neigh->daddr);
995 __skb_queue_tail(&neigh->queue, skb);
998 skb_queue_len(&neigh->queue));
1005 ipoib_neigh_put(neigh);
1009 neigh->ah = NULL;
1013 if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
1014 push_pseudo_header(skb, neigh->daddr);
1015 __skb_queue_tail(&neigh->queue, skb);
1022 ipoib_neigh_put(neigh);
1026 ipoib_neigh_free(neigh);
1032 ipoib_neigh_put(neigh);
1096 struct ipoib_neigh *neigh;
1121 neigh = ipoib_neigh_get(dev, phdr->hwaddr);
1122 if (likely(neigh))
1133 neigh = ipoib_neigh_get(dev, phdr->hwaddr);
1134 if (unlikely(!neigh)) {
1135 neigh = neigh_add_path(skb, phdr->hwaddr, dev);
1136 if (likely(!neigh))
1153 /* note we now hold a ref to neigh */
1154 if (ipoib_cm_get(neigh)) {
1155 if (ipoib_cm_up(neigh)) {
1156 ipoib_cm_send(dev, skb, ipoib_cm_get(neigh));
1159 } else if (neigh->ah && neigh->ah->valid) {
1160 neigh->ah->last_send = rn->send(dev, skb, neigh->ah->ah,
1163 } else if (neigh->ah) {
1164 neigh_refresh_path(neigh, phdr->hwaddr, dev);
1167 if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
1170 __skb_queue_tail(&neigh->queue, skb);
1178 ipoib_neigh_put(neigh);
1266 struct ipoib_neigh *neigh = NULL;
1277 for (neigh = rcu_dereference_bh(htbl->buckets[hash_val]);
1278 neigh != NULL;
1279 neigh = rcu_dereference_bh(neigh->hnext)) {
1280 if (memcmp(daddr, neigh->daddr, INFINIBAND_ALEN) == 0) {
1282 if (!atomic_inc_not_zero(&neigh->refcnt)) {
1284 neigh = NULL;
1288 if (likely(skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE))
1289 neigh->alive = jiffies;
1296 return neigh;
1317 /* neigh is obsolete if it was idle for two GC periods */
1322 struct ipoib_neigh *neigh;
1325 while ((neigh = rcu_dereference_protected(*np,
1327 /* was the neigh idle for two GC periods */
1328 if (time_after(neigh_obsolete, neigh->alive)) {
1330 ipoib_check_and_add_mcast_sendonly(priv, neigh->daddr + 4, &remove_list);
1333 rcu_dereference_protected(neigh->hnext,
1336 list_del_init(&neigh->list);
1337 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1339 np = &neigh->hnext;
1365 struct ipoib_neigh *neigh;
1367 neigh = kzalloc(sizeof(*neigh), GFP_ATOMIC);
1368 if (!neigh)
1371 neigh->dev = dev;
1372 memcpy(&neigh->daddr, daddr, sizeof(neigh->daddr));
1373 skb_queue_head_init(&neigh->queue);
1374 INIT_LIST_HEAD(&neigh->list);
1375 ipoib_cm_set(neigh, NULL);
1377 atomic_set(&neigh->refcnt, 1);
1379 return neigh;
1388 struct ipoib_neigh *neigh;
1394 neigh = NULL;
1398 /* need to add a new neigh, but maybe some other thread succeeded?
1402 for (neigh = rcu_dereference_protected(htbl->buckets[hash_val],
1404 neigh != NULL;
1405 neigh = rcu_dereference_protected(neigh->hnext,
1407 if (memcmp(daddr, neigh->daddr, INFINIBAND_ALEN) == 0) {
1409 if (!atomic_inc_not_zero(&neigh->refcnt)) {
1411 neigh = NULL;
1414 neigh->alive = jiffies;
1419 neigh = ipoib_neigh_ctor(daddr, dev);
1420 if (!neigh)
1424 atomic_inc(&neigh->refcnt);
1425 neigh->alive = jiffies;
1427 rcu_assign_pointer(neigh->hnext,
1430 rcu_assign_pointer(htbl->buckets[hash_val], neigh);
1435 return neigh;
1438 void ipoib_neigh_dtor(struct ipoib_neigh *neigh)
1440 /* neigh reference count was dropprd to zero */
1441 struct net_device *dev = neigh->dev;
1444 if (neigh->ah)
1445 ipoib_put_ah(neigh->ah);
1446 while ((skb = __skb_dequeue(&neigh->queue))) {
1450 if (ipoib_cm_get(neigh))
1451 ipoib_cm_destroy_tx(ipoib_cm_get(neigh));
1453 "neigh free for %06x %pI6\n",
1454 IPOIB_QPN(neigh->daddr),
1455 neigh->daddr + 4);
1456 kfree(neigh);
1466 struct ipoib_neigh *neigh = container_of(rp, struct ipoib_neigh, rcu);
1468 ipoib_neigh_put(neigh);
1471 void ipoib_neigh_free(struct ipoib_neigh *neigh)
1473 struct net_device *dev = neigh->dev;
1486 hash_val = ipoib_addr_hash(htbl, neigh->daddr);
1493 if (n == neigh) {
1496 rcu_dereference_protected(neigh->hnext,
1499 list_del_init(&neigh->list);
1500 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1561 /* remove all neigh connected to a given path or mcast */
1571 struct ipoib_neigh *neigh;
1574 while ((neigh = rcu_dereference_protected(*np,
1577 if (!memcmp(gid, neigh->daddr + 4, sizeof (union ib_gid))) {
1579 rcu_dereference_protected(neigh->hnext,
1582 list_del_init(&neigh->list);
1583 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1585 np = &neigh->hnext;
1616 struct ipoib_neigh *neigh;
1619 while ((neigh = rcu_dereference_protected(*np,
1622 rcu_dereference_protected(neigh->hnext,
1625 list_del_init(&neigh->list);
1626 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1777 pr_warn("%s failed to init neigh hash\n", dev->name);