hardif_neigh = container_of(rcu, struct batadv_hardif_neigh_node, rcu);
 
-       spin_lock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
-       hlist_del_init_rcu(&hardif_neigh->list);
-       spin_unlock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
-
        batadv_hardif_free_ref_now(hardif_neigh->if_incoming);
        kfree(hardif_neigh);
 }
 static void
 batadv_hardif_neigh_free_now(struct batadv_hardif_neigh_node *hardif_neigh)
 {
-       if (atomic_dec_and_test(&hardif_neigh->refcount))
+       if (atomic_dec_and_test(&hardif_neigh->refcount)) {
+               spin_lock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
+               hlist_del_init_rcu(&hardif_neigh->list);
+               spin_unlock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
+
                batadv_hardif_neigh_free_rcu(&hardif_neigh->rcu);
+       }
 }
 
 /**
  */
 void batadv_hardif_neigh_free_ref(struct batadv_hardif_neigh_node *hardif_neigh)
 {
-       if (atomic_dec_and_test(&hardif_neigh->refcount))
+       if (atomic_dec_and_test(&hardif_neigh->refcount)) {
+               spin_lock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
+               hlist_del_init_rcu(&hardif_neigh->list);
+               spin_unlock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
+
                call_rcu(&hardif_neigh->rcu, batadv_hardif_neigh_free_rcu);
+       }
 }
 
 /**