Loading net/batman-adv/translation-table.c +16 −1 Original line number Original line Diff line number Diff line Loading @@ -137,10 +137,22 @@ static void tt_local_entry_free_ref(struct tt_local_entry *tt_local_entry) kfree_rcu(tt_local_entry, rcu); kfree_rcu(tt_local_entry, rcu); } } static void tt_global_entry_free_rcu(struct rcu_head *rcu) { struct tt_global_entry *tt_global_entry; tt_global_entry = container_of(rcu, struct tt_global_entry, rcu); if (tt_global_entry->orig_node) orig_node_free_ref(tt_global_entry->orig_node); kfree(tt_global_entry); } static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry) static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry) { { if (atomic_dec_and_test(&tt_global_entry->refcount)) if (atomic_dec_and_test(&tt_global_entry->refcount)) kfree_rcu(tt_global_entry, rcu); call_rcu(&tt_global_entry->rcu, tt_global_entry_free_rcu); } } static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr, static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr, Loading Loading @@ -710,6 +722,9 @@ void tt_global_del_orig(struct bat_priv *bat_priv, struct hlist_head *head; struct hlist_head *head; spinlock_t *list_lock; /* protects write access to the hash lists */ spinlock_t *list_lock; /* protects write access to the hash lists */ if (!hash) return; for (i = 0; i < hash->size; i++) { for (i = 0; i < hash->size; i++) { head = &hash->table[i]; head = &hash->table[i]; list_lock = &hash->list_locks[i]; list_lock = &hash->list_locks[i]; Loading net/batman-adv/types.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -224,22 +224,22 @@ struct socket_packet { struct tt_local_entry { struct tt_local_entry { uint8_t addr[ETH_ALEN]; uint8_t addr[ETH_ALEN]; struct hlist_node hash_entry; unsigned long last_seen; unsigned long last_seen; uint16_t flags; uint16_t flags; atomic_t refcount; atomic_t refcount; struct rcu_head rcu; struct rcu_head rcu; struct hlist_node hash_entry; }; }; struct tt_global_entry { struct tt_global_entry { uint8_t addr[ETH_ALEN]; uint8_t addr[ETH_ALEN]; struct hlist_node hash_entry; /* entry in the global table */ struct orig_node *orig_node; struct orig_node *orig_node; uint8_t ttvn; uint8_t ttvn; uint16_t flags; /* only TT_GLOBAL_ROAM is used */ uint16_t flags; /* only TT_GLOBAL_ROAM is used */ unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ atomic_t refcount; atomic_t refcount; struct rcu_head rcu; struct rcu_head rcu; struct hlist_node hash_entry; /* entry in the global table */ }; }; struct tt_change_node { struct tt_change_node { Loading Loading
net/batman-adv/translation-table.c +16 −1 Original line number Original line Diff line number Diff line Loading @@ -137,10 +137,22 @@ static void tt_local_entry_free_ref(struct tt_local_entry *tt_local_entry) kfree_rcu(tt_local_entry, rcu); kfree_rcu(tt_local_entry, rcu); } } static void tt_global_entry_free_rcu(struct rcu_head *rcu) { struct tt_global_entry *tt_global_entry; tt_global_entry = container_of(rcu, struct tt_global_entry, rcu); if (tt_global_entry->orig_node) orig_node_free_ref(tt_global_entry->orig_node); kfree(tt_global_entry); } static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry) static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry) { { if (atomic_dec_and_test(&tt_global_entry->refcount)) if (atomic_dec_and_test(&tt_global_entry->refcount)) kfree_rcu(tt_global_entry, rcu); call_rcu(&tt_global_entry->rcu, tt_global_entry_free_rcu); } } static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr, static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr, Loading Loading @@ -710,6 +722,9 @@ void tt_global_del_orig(struct bat_priv *bat_priv, struct hlist_head *head; struct hlist_head *head; spinlock_t *list_lock; /* protects write access to the hash lists */ spinlock_t *list_lock; /* protects write access to the hash lists */ if (!hash) return; for (i = 0; i < hash->size; i++) { for (i = 0; i < hash->size; i++) { head = &hash->table[i]; head = &hash->table[i]; list_lock = &hash->list_locks[i]; list_lock = &hash->list_locks[i]; Loading
net/batman-adv/types.h +2 −2 Original line number Original line Diff line number Diff line Loading @@ -224,22 +224,22 @@ struct socket_packet { struct tt_local_entry { struct tt_local_entry { uint8_t addr[ETH_ALEN]; uint8_t addr[ETH_ALEN]; struct hlist_node hash_entry; unsigned long last_seen; unsigned long last_seen; uint16_t flags; uint16_t flags; atomic_t refcount; atomic_t refcount; struct rcu_head rcu; struct rcu_head rcu; struct hlist_node hash_entry; }; }; struct tt_global_entry { struct tt_global_entry { uint8_t addr[ETH_ALEN]; uint8_t addr[ETH_ALEN]; struct hlist_node hash_entry; /* entry in the global table */ struct orig_node *orig_node; struct orig_node *orig_node; uint8_t ttvn; uint8_t ttvn; uint16_t flags; /* only TT_GLOBAL_ROAM is used */ uint16_t flags; /* only TT_GLOBAL_ROAM is used */ unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ atomic_t refcount; atomic_t refcount; struct rcu_head rcu; struct rcu_head rcu; struct hlist_node hash_entry; /* entry in the global table */ }; }; struct tt_change_node { struct tt_change_node { Loading