mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-12 20:31:49 +00:00
batman-adv: convert bat_priv->tt.req_list to hlist
Since the list's tail is never accessed using a double linked list head wastes memory. Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> Signed-off-by: Antonio Quartulli <antonio@meshcoding.com>
This commit is contained in:
parent
0b8336f5fc
commit
7c26a53ba5
@ -148,7 +148,7 @@ int batadv_mesh_init(struct net_device *soft_iface)
|
|||||||
INIT_HLIST_HEAD(&bat_priv->mcast.want_all_ipv6_list);
|
INIT_HLIST_HEAD(&bat_priv->mcast.want_all_ipv6_list);
|
||||||
#endif
|
#endif
|
||||||
INIT_LIST_HEAD(&bat_priv->tt.changes_list);
|
INIT_LIST_HEAD(&bat_priv->tt.changes_list);
|
||||||
INIT_LIST_HEAD(&bat_priv->tt.req_list);
|
INIT_HLIST_HEAD(&bat_priv->tt.req_list);
|
||||||
INIT_LIST_HEAD(&bat_priv->tt.roam_list);
|
INIT_LIST_HEAD(&bat_priv->tt.roam_list);
|
||||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||||
INIT_HLIST_HEAD(&bat_priv->mcast.mla_list);
|
INIT_HLIST_HEAD(&bat_priv->mcast.mla_list);
|
||||||
|
@ -2224,12 +2224,13 @@ static u32 batadv_tt_local_crc(struct batadv_priv *bat_priv,
|
|||||||
|
|
||||||
static void batadv_tt_req_list_free(struct batadv_priv *bat_priv)
|
static void batadv_tt_req_list_free(struct batadv_priv *bat_priv)
|
||||||
{
|
{
|
||||||
struct batadv_tt_req_node *node, *safe;
|
struct batadv_tt_req_node *node;
|
||||||
|
struct hlist_node *safe;
|
||||||
|
|
||||||
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
||||||
|
|
||||||
list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
|
hlist_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
|
||||||
list_del_init(&node->list);
|
hlist_del_init(&node->list);
|
||||||
kfree(node);
|
kfree(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2259,13 +2260,14 @@ static void batadv_tt_save_orig_buffer(struct batadv_priv *bat_priv,
|
|||||||
|
|
||||||
static void batadv_tt_req_purge(struct batadv_priv *bat_priv)
|
static void batadv_tt_req_purge(struct batadv_priv *bat_priv)
|
||||||
{
|
{
|
||||||
struct batadv_tt_req_node *node, *safe;
|
struct batadv_tt_req_node *node;
|
||||||
|
struct hlist_node *safe;
|
||||||
|
|
||||||
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
||||||
list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
|
hlist_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
|
||||||
if (batadv_has_timed_out(node->issued_at,
|
if (batadv_has_timed_out(node->issued_at,
|
||||||
BATADV_TT_REQUEST_TIMEOUT)) {
|
BATADV_TT_REQUEST_TIMEOUT)) {
|
||||||
list_del_init(&node->list);
|
hlist_del_init(&node->list);
|
||||||
kfree(node);
|
kfree(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2287,7 +2289,7 @@ batadv_tt_req_node_new(struct batadv_priv *bat_priv,
|
|||||||
struct batadv_tt_req_node *tt_req_node_tmp, *tt_req_node = NULL;
|
struct batadv_tt_req_node *tt_req_node_tmp, *tt_req_node = NULL;
|
||||||
|
|
||||||
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
||||||
list_for_each_entry(tt_req_node_tmp, &bat_priv->tt.req_list, list) {
|
hlist_for_each_entry(tt_req_node_tmp, &bat_priv->tt.req_list, list) {
|
||||||
if (batadv_compare_eth(tt_req_node_tmp, orig_node) &&
|
if (batadv_compare_eth(tt_req_node_tmp, orig_node) &&
|
||||||
!batadv_has_timed_out(tt_req_node_tmp->issued_at,
|
!batadv_has_timed_out(tt_req_node_tmp->issued_at,
|
||||||
BATADV_TT_REQUEST_TIMEOUT))
|
BATADV_TT_REQUEST_TIMEOUT))
|
||||||
@ -2301,7 +2303,7 @@ batadv_tt_req_node_new(struct batadv_priv *bat_priv,
|
|||||||
ether_addr_copy(tt_req_node->addr, orig_node->orig);
|
ether_addr_copy(tt_req_node->addr, orig_node->orig);
|
||||||
tt_req_node->issued_at = jiffies;
|
tt_req_node->issued_at = jiffies;
|
||||||
|
|
||||||
list_add(&tt_req_node->list, &bat_priv->tt.req_list);
|
hlist_add_head(&tt_req_node->list, &bat_priv->tt.req_list);
|
||||||
unlock:
|
unlock:
|
||||||
spin_unlock_bh(&bat_priv->tt.req_list_lock);
|
spin_unlock_bh(&bat_priv->tt.req_list_lock);
|
||||||
return tt_req_node;
|
return tt_req_node;
|
||||||
@ -2552,8 +2554,8 @@ out:
|
|||||||
batadv_hardif_free_ref(primary_if);
|
batadv_hardif_free_ref(primary_if);
|
||||||
if (ret && tt_req_node) {
|
if (ret && tt_req_node) {
|
||||||
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
||||||
/* list_del_init() verifies tt_req_node still is in the list */
|
/* hlist_del_init() verifies tt_req_node still is in the list */
|
||||||
list_del_init(&tt_req_node->list);
|
hlist_del_init(&tt_req_node->list);
|
||||||
spin_unlock_bh(&bat_priv->tt.req_list_lock);
|
spin_unlock_bh(&bat_priv->tt.req_list_lock);
|
||||||
kfree(tt_req_node);
|
kfree(tt_req_node);
|
||||||
}
|
}
|
||||||
@ -2949,7 +2951,8 @@ static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
|
|||||||
struct batadv_tvlv_tt_data *tt_data,
|
struct batadv_tvlv_tt_data *tt_data,
|
||||||
u8 *resp_src, u16 num_entries)
|
u8 *resp_src, u16 num_entries)
|
||||||
{
|
{
|
||||||
struct batadv_tt_req_node *node, *safe;
|
struct batadv_tt_req_node *node;
|
||||||
|
struct hlist_node *safe;
|
||||||
struct batadv_orig_node *orig_node = NULL;
|
struct batadv_orig_node *orig_node = NULL;
|
||||||
struct batadv_tvlv_tt_change *tt_change;
|
struct batadv_tvlv_tt_change *tt_change;
|
||||||
u8 *tvlv_ptr = (u8 *)tt_data;
|
u8 *tvlv_ptr = (u8 *)tt_data;
|
||||||
@ -2987,10 +2990,10 @@ static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
|
|||||||
|
|
||||||
/* Delete the tt_req_node from pending tt_requests list */
|
/* Delete the tt_req_node from pending tt_requests list */
|
||||||
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
spin_lock_bh(&bat_priv->tt.req_list_lock);
|
||||||
list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
|
hlist_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
|
||||||
if (!batadv_compare_eth(node->addr, resp_src))
|
if (!batadv_compare_eth(node->addr, resp_src))
|
||||||
continue;
|
continue;
|
||||||
list_del_init(&node->list);
|
hlist_del_init(&node->list);
|
||||||
kfree(node);
|
kfree(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,7 +537,7 @@ struct batadv_priv_tt {
|
|||||||
struct list_head changes_list;
|
struct list_head changes_list;
|
||||||
struct batadv_hashtable *local_hash;
|
struct batadv_hashtable *local_hash;
|
||||||
struct batadv_hashtable *global_hash;
|
struct batadv_hashtable *global_hash;
|
||||||
struct list_head req_list;
|
struct hlist_head req_list;
|
||||||
struct list_head roam_list;
|
struct list_head roam_list;
|
||||||
spinlock_t changes_list_lock; /* protects changes */
|
spinlock_t changes_list_lock; /* protects changes */
|
||||||
spinlock_t req_list_lock; /* protects req_list */
|
spinlock_t req_list_lock; /* protects req_list */
|
||||||
@ -1006,7 +1006,7 @@ struct batadv_tt_change_node {
|
|||||||
struct batadv_tt_req_node {
|
struct batadv_tt_req_node {
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
unsigned long issued_at;
|
unsigned long issued_at;
|
||||||
struct list_head list;
|
struct hlist_node list;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user