Lines Matching refs:neigh

620 	/* remove all neigh connected to this path */
752 struct ipoib_neigh *neigh, *tn;
808 list_for_each_entry_safe(neigh, tn, &path->neigh_list, list) {
809 if (neigh->ah) {
810 WARN_ON(neigh->ah != old_ah);
818 ipoib_put_ah(neigh->ah);
821 neigh->ah = path->ah;
823 if (ipoib_cm_enabled(dev, neigh->daddr)) {
824 if (!ipoib_cm_get(neigh))
825 ipoib_cm_set(neigh, ipoib_cm_create_tx(dev,
827 neigh));
828 if (!ipoib_cm_get(neigh)) {
829 ipoib_neigh_free(neigh);
834 while ((skb = __skb_dequeue(&neigh->queue)))
930 static void neigh_refresh_path(struct ipoib_neigh *neigh, u8 *daddr,
954 struct ipoib_neigh *neigh;
958 neigh = ipoib_neigh_alloc(daddr, dev);
959 if (!neigh) {
967 * neigh will be added only once.
969 if (unlikely(!list_empty(&neigh->list))) {
971 return neigh;
983 list_add_tail(&neigh->list, &path->neigh_list);
987 neigh->ah = path->ah;
989 if (ipoib_cm_enabled(dev, neigh->daddr)) {
990 if (!ipoib_cm_get(neigh))
991 ipoib_cm_set(neigh, ipoib_cm_create_tx(dev, path, neigh));
992 if (!ipoib_cm_get(neigh)) {
993 ipoib_neigh_free(neigh);
996 if (skb_queue_len(&neigh->queue) <
998 push_pseudo_header(skb, neigh->daddr);
999 __skb_queue_tail(&neigh->queue, skb);
1002 skb_queue_len(&neigh->queue));
1009 ipoib_neigh_put(neigh);
1013 neigh->ah = NULL;
1017 if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
1018 push_pseudo_header(skb, neigh->daddr);
1019 __skb_queue_tail(&neigh->queue, skb);
1026 ipoib_neigh_put(neigh);
1030 ipoib_neigh_free(neigh);
1036 ipoib_neigh_put(neigh);
1100 struct ipoib_neigh *neigh;
1125 neigh = ipoib_neigh_get(dev, phdr->hwaddr);
1126 if (likely(neigh))
1137 neigh = ipoib_neigh_get(dev, phdr->hwaddr);
1138 if (unlikely(!neigh)) {
1139 neigh = neigh_add_path(skb, phdr->hwaddr, dev);
1140 if (likely(!neigh))
1157 /* note we now hold a ref to neigh */
1158 if (ipoib_cm_get(neigh)) {
1159 if (ipoib_cm_up(neigh)) {
1160 ipoib_cm_send(dev, skb, ipoib_cm_get(neigh));
1163 } else if (neigh->ah && neigh->ah->valid) {
1164 neigh->ah->last_send = rn->send(dev, skb, neigh->ah->ah,
1167 } else if (neigh->ah) {
1168 neigh_refresh_path(neigh, phdr->hwaddr, dev);
1171 if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
1174 __skb_queue_tail(&neigh->queue, skb);
1182 ipoib_neigh_put(neigh);
1275 struct ipoib_neigh *neigh = NULL;
1286 for (neigh = rcu_dereference_bh(htbl->buckets[hash_val]);
1287 neigh != NULL;
1288 neigh = rcu_dereference_bh(neigh->hnext)) {
1289 if (memcmp(daddr, neigh->daddr, INFINIBAND_ALEN) == 0) {
1291 if (!refcount_inc_not_zero(&neigh->refcnt)) {
1293 neigh = NULL;
1297 if (likely(skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE))
1298 neigh->alive = jiffies;
1305 return neigh;
1326 /* neigh is obsolete if it was idle for two GC periods */
1331 struct ipoib_neigh *neigh;
1334 while ((neigh = rcu_dereference_protected(*np,
1336 /* was the neigh idle for two GC periods */
1337 if (time_after(neigh_obsolete, neigh->alive)) {
1339 ipoib_check_and_add_mcast_sendonly(priv, neigh->daddr + 4, &remove_list);
1342 rcu_dereference_protected(neigh->hnext,
1345 list_del_init(&neigh->list);
1346 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1348 np = &neigh->hnext;
1374 struct ipoib_neigh *neigh;
1376 neigh = kzalloc(sizeof(*neigh), GFP_ATOMIC);
1377 if (!neigh)
1380 neigh->dev = dev;
1381 memcpy(&neigh->daddr, daddr, sizeof(neigh->daddr));
1382 skb_queue_head_init(&neigh->queue);
1383 INIT_LIST_HEAD(&neigh->list);
1384 ipoib_cm_set(neigh, NULL);
1386 refcount_set(&neigh->refcnt, 1);
1388 return neigh;
1397 struct ipoib_neigh *neigh;
1403 neigh = NULL;
1407 /* need to add a new neigh, but maybe some other thread succeeded?
1411 for (neigh = rcu_dereference_protected(htbl->buckets[hash_val],
1413 neigh != NULL;
1414 neigh = rcu_dereference_protected(neigh->hnext,
1416 if (memcmp(daddr, neigh->daddr, INFINIBAND_ALEN) == 0) {
1418 if (!refcount_inc_not_zero(&neigh->refcnt)) {
1420 neigh = NULL;
1423 neigh->alive = jiffies;
1428 neigh = ipoib_neigh_ctor(daddr, dev);
1429 if (!neigh)
1433 refcount_inc(&neigh->refcnt);
1434 neigh->alive = jiffies;
1436 rcu_assign_pointer(neigh->hnext,
1439 rcu_assign_pointer(htbl->buckets[hash_val], neigh);
1444 return neigh;
1447 void ipoib_neigh_dtor(struct ipoib_neigh *neigh)
1449 /* neigh reference count was dropprd to zero */
1450 struct net_device *dev = neigh->dev;
1453 if (neigh->ah)
1454 ipoib_put_ah(neigh->ah);
1455 while ((skb = __skb_dequeue(&neigh->queue))) {
1459 if (ipoib_cm_get(neigh))
1460 ipoib_cm_destroy_tx(ipoib_cm_get(neigh));
1462 "neigh free for %06x %pI6\n",
1463 IPOIB_QPN(neigh->daddr),
1464 neigh->daddr + 4);
1465 kfree(neigh);
1475 struct ipoib_neigh *neigh = container_of(rp, struct ipoib_neigh, rcu);
1477 ipoib_neigh_put(neigh);
1480 void ipoib_neigh_free(struct ipoib_neigh *neigh)
1482 struct net_device *dev = neigh->dev;
1495 hash_val = ipoib_addr_hash(htbl, neigh->daddr);
1502 if (n == neigh) {
1505 rcu_dereference_protected(neigh->hnext,
1508 list_del_init(&neigh->list);
1509 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1570 /* remove all neigh connected to a given path or mcast */
1580 struct ipoib_neigh *neigh;
1583 while ((neigh = rcu_dereference_protected(*np,
1586 if (!memcmp(gid, neigh->daddr + 4, sizeof (union ib_gid))) {
1588 rcu_dereference_protected(neigh->hnext,
1591 list_del_init(&neigh->list);
1592 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1594 np = &neigh->hnext;
1625 struct ipoib_neigh *neigh;
1628 while ((neigh = rcu_dereference_protected(*np,
1631 rcu_dereference_protected(neigh->hnext,
1634 list_del_init(&neigh->list);
1635 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1790 pr_warn("%s failed to init neigh hash\n", dev->name);