Lines Matching defs:neigh

319 	/* remove all neigh connected to this path */
442 struct ipoib_neigh *neigh, *tn;
477 list_for_each_entry_safe(neigh, tn, &path->neigh_list, list) {
478 if (neigh->ah) {
479 WARN_ON(neigh->ah != old_ah);
487 ipoib_put_ah(neigh->ah);
490 neigh->ah = path->ah;
492 if (ipoib_cm_enabled(dev, neigh->daddr)) {
493 if (!ipoib_cm_get(neigh))
494 ipoib_cm_set(neigh, ipoib_cm_create_tx(dev,
496 neigh));
497 if (!ipoib_cm_get(neigh)) {
498 ipoib_neigh_free(neigh);
503 while ((skb = __skb_dequeue(&neigh->queue)))
591 struct ipoib_neigh *neigh;
595 neigh = ipoib_neigh_alloc(daddr, dev);
596 if (!neigh) {
612 list_add_tail(&neigh->list, &path->neigh_list);
616 neigh->ah = path->ah;
618 if (ipoib_cm_enabled(dev, neigh->daddr)) {
619 if (!ipoib_cm_get(neigh))
620 ipoib_cm_set(neigh, ipoib_cm_create_tx(dev, path, neigh));
621 if (!ipoib_cm_get(neigh)) {
622 ipoib_neigh_free(neigh);
625 if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE)
626 __skb_queue_tail(&neigh->queue, skb);
629 skb_queue_len(&neigh->queue));
635 ipoib_neigh_put(neigh);
639 neigh->ah = NULL;
644 __skb_queue_tail(&neigh->queue, skb);
648 ipoib_neigh_put(neigh);
652 ipoib_neigh_free(neigh);
658 ipoib_neigh_put(neigh);
718 struct ipoib_neigh *neigh;
741 neigh = ipoib_neigh_get(dev, cb->hwaddr);
742 if (likely(neigh))
753 neigh = ipoib_neigh_get(dev, cb->hwaddr);
754 if (unlikely(!neigh)) {
772 /* note we now hold a ref to neigh */
773 if (ipoib_cm_get(neigh)) {
774 if (ipoib_cm_up(neigh)) {
775 ipoib_cm_send(dev, skb, ipoib_cm_get(neigh));
778 } else if (neigh->ah) {
779 ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(cb->hwaddr));
783 if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
785 __skb_queue_tail(&neigh->queue, skb);
793 ipoib_neigh_put(neigh);
866 struct ipoib_neigh *neigh = NULL;
877 for (neigh = rcu_dereference_bh(htbl->buckets[hash_val]);
878 neigh != NULL;
879 neigh = rcu_dereference_bh(neigh->hnext)) {
880 if (memcmp(daddr, neigh->daddr, INFINIBAND_ALEN) == 0) {
882 if (!atomic_inc_not_zero(&neigh->refcnt)) {
884 neigh = NULL;
887 neigh->alive = jiffies;
894 return neigh;
917 /* neigh is obsolete if it was idle for two GC periods */
925 struct ipoib_neigh *neigh;
928 while ((neigh = rcu_dereference_protected(*np,
930 /* was the neigh idle for two GC periods */
931 if (time_after(neigh_obsolete, neigh->alive)) {
933 rcu_dereference_protected(neigh->hnext,
936 list_del(&neigh->list);
937 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
939 np = &neigh->hnext;
965 struct ipoib_neigh *neigh;
967 neigh = kzalloc(sizeof *neigh, GFP_ATOMIC);
968 if (!neigh)
971 neigh->dev = dev;
972 memcpy(&neigh->daddr, daddr, sizeof(neigh->daddr));
973 skb_queue_head_init(&neigh->queue);
974 INIT_LIST_HEAD(&neigh->list);
975 ipoib_cm_set(neigh, NULL);
977 atomic_set(&neigh->refcnt, 1);
979 return neigh;
988 struct ipoib_neigh *neigh;
994 neigh = NULL;
998 /* need to add a new neigh, but maybe some other thread succeeded?
1002 for (neigh = rcu_dereference_protected(htbl->buckets[hash_val],
1004 neigh != NULL;
1005 neigh = rcu_dereference_protected(neigh->hnext,
1007 if (memcmp(daddr, neigh->daddr, INFINIBAND_ALEN) == 0) {
1009 if (!atomic_inc_not_zero(&neigh->refcnt)) {
1011 neigh = NULL;
1014 neigh->alive = jiffies;
1019 neigh = ipoib_neigh_ctor(daddr, dev);
1020 if (!neigh)
1024 atomic_inc(&neigh->refcnt);
1025 neigh->alive = jiffies;
1027 rcu_assign_pointer(neigh->hnext,
1030 rcu_assign_pointer(htbl->buckets[hash_val], neigh);
1035 return neigh;
1038 void ipoib_neigh_dtor(struct ipoib_neigh *neigh)
1040 /* neigh reference count was dropprd to zero */
1041 struct net_device *dev = neigh->dev;
1044 if (neigh->ah)
1045 ipoib_put_ah(neigh->ah);
1046 while ((skb = __skb_dequeue(&neigh->queue))) {
1050 if (ipoib_cm_get(neigh))
1051 ipoib_cm_destroy_tx(ipoib_cm_get(neigh));
1053 "neigh free for %06x %pI6\n",
1054 IPOIB_QPN(neigh->daddr),
1055 neigh->daddr + 4);
1056 kfree(neigh);
1066 struct ipoib_neigh *neigh = container_of(rp, struct ipoib_neigh, rcu);
1068 ipoib_neigh_put(neigh);
1071 void ipoib_neigh_free(struct ipoib_neigh *neigh)
1073 struct net_device *dev = neigh->dev;
1086 hash_val = ipoib_addr_hash(htbl, neigh->daddr);
1093 if (n == neigh) {
1096 rcu_dereference_protected(neigh->hnext,
1099 list_del(&neigh->list);
1100 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1163 /* remove all neigh connected to a given path or mcast */
1173 struct ipoib_neigh *neigh;
1176 while ((neigh = rcu_dereference_protected(*np,
1179 if (!memcmp(gid, neigh->daddr + 4, sizeof (union ib_gid))) {
1181 rcu_dereference_protected(neigh->hnext,
1184 list_del(&neigh->list);
1185 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
1187 np = &neigh->hnext;
1217 struct ipoib_neigh *neigh;
1220 while ((neigh = rcu_dereference_protected(*np,
1223 rcu_dereference_protected(neigh->hnext,
1226 list_del(&neigh->list);
1227 call_rcu(&neigh->rcu, ipoib_neigh_reclaim);