Project

General

Profile

Bug #200 » 0001-TT-memory-leak-debug-patch.patch

Linus Lüssing, 12/13/2014 08:02 AM

View differences:

Makefile
# B.A.T.M.A.N. debugging:
export CONFIG_BATMAN_ADV_DEBUG=n
# B.A.T.M.A.N. bridge loop avoidance:
export CONFIG_BATMAN_ADV_BLA=y
export CONFIG_BATMAN_ADV_BLA=n
# B.A.T.M.A.N. distributed ARP table:
export CONFIG_BATMAN_ADV_DAT=y
export CONFIG_BATMAN_ADV_DAT=n
# B.A.T.M.A.N network coding (catwoman):
export CONFIG_BATMAN_ADV_NC=n
# B.A.T.M.A.N. multicast optimizations:
export CONFIG_BATMAN_ADV_MCAST=y
export CONFIG_BATMAN_ADV_MCAST=n
PWD:=$(shell pwd)
KERNELPATH ?= /lib/modules/$(shell uname -r)/build
bat_iv_ogm.c
if (!n_ifinfo)
goto next;
if (n_ifinfo->bat_iv.tq_avg == 0)
goto next;
// if (n_ifinfo->bat_iv.tq_avg == 0)
// goto next;
last_seen_jiffies = jiffies - orig_node->last_seen;
last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
gateway_client.c
if (!orig_node)
goto unlock;
printk("~~~ batadv_gw_get_selected() - refcount++ (%pM)!\n", orig_node->orig);
if (!atomic_inc_not_zero(&orig_node->refcount))
orig_node = NULL;
......
*/
void batadv_gw_reselect(struct batadv_priv *bat_priv)
{
printk("~~~ Calling batadv_gw_reselect\n");
atomic_set(&bat_priv->gw.reselect, 1);
}
......
if (atomic_read(&bat_priv->gw_mode) != BATADV_GW_MODE_CLIENT)
goto out;
printk("~~~ Doing batadv_gw_election\n");
curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
if (!batadv_atomic_dec_not_zero(&bat_priv->gw.reselect) && curr_gw)
......
if (gateway->bandwidth_down == 0)
return;
printk("~~~ batadv_gw_node_add() - refcount++ (%pM)!\n", orig_node->orig);
if (!atomic_inc_not_zero(&orig_node->refcount))
return;
......
struct batadv_orig_node *orig_node)
{
struct batadv_gw_node *gw_node_tmp, *gw_node = NULL;
//printk("~~~ Calling batadv_gw_node_get for %pM\n", orig_node->orig);
rcu_read_lock();
hlist_for_each_entry_rcu(gw_node_tmp, &bat_priv->gw.list, list) {
......
struct batadv_tvlv_gateway_data *gateway)
{
struct batadv_gw_node *gw_node, *curr_gw = NULL;
//printk("~~~ Calling batadv_gw_node_update for %pM\n", orig_node->orig);
gw_node = batadv_gw_node_get(bat_priv, orig_node);
if (!gw_node) {
......
struct batadv_orig_node *orig_node)
{
struct batadv_tvlv_gateway_data gateway;
printk("~~~ Calling batadv_gw_node_delete for %pM\n", orig_node->orig);
gateway.bandwidth_down = 0;
gateway.bandwidth_up = 0;
......
do_reselect = 1;
hlist_del_rcu(&gw_node->list);
printk("~~~ batadv_gw_node_purge for %pM%s\n", gw_node->orig_node->orig, do_reselect ? " (reselecting)" : "");
batadv_gw_node_free_ref(gw_node);
}
main.h
/* purge originators after time in seconds if no valid packet comes in
* -> TODO: check influence on BATADV_TQ_LOCAL_WINDOW_SIZE
*/
#define BATADV_PURGE_TIMEOUT 200000 /* 200 seconds */
#define BATADV_TT_LOCAL_TIMEOUT 600000 /* in milliseconds */
#define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000 /* in milliseconds */
#define BATADV_TT_CLIENT_TEMP_TIMEOUT 600000 /* in milliseconds */
#define BATADV_PURGE_TIMEOUT 2000 /* 200 seconds */
#define BATADV_TT_LOCAL_TIMEOUT 6000 /* in milliseconds */
#define BATADV_TT_CLIENT_ROAM_TIMEOUT 6000 /* in milliseconds */
#define BATADV_TT_CLIENT_TEMP_TIMEOUT 6000 /* in milliseconds */
#define BATADV_TT_WORK_PERIOD 5000 /* 5 seconds */
#define BATADV_ORIG_WORK_PERIOD 1000 /* 1 second */
#define BATADV_DAT_ENTRY_TIMEOUT (5*60000) /* 5 mins in milliseconds */
#define BATADV_ORIG_WORK_PERIOD 500 /* 1 second */
#define BATADV_DAT_ENTRY_TIMEOUT (5*600) /* 5 mins in milliseconds */
/* sliding packet range of received originator messages in sequence numbers
* (should be a multiple of our word size)
*/
originator.c
orig_node = container_of(rcu, struct batadv_orig_node, rcu);
atomic_set(&orig_node->curse_timeout, 0);
cancel_delayed_work_sync(&orig_node->curse);
spin_lock_bh(&orig_node->neigh_list_lock);
/* for all neighbors towards this originator ... */
......
batadv_hash_destroy(hash);
}
static void batadv_orig_node_cursed(struct work_struct *work)
{
struct delayed_work *delayed_work;
struct batadv_orig_node *orig_node;
unsigned long timeout;
delayed_work = container_of(work, struct delayed_work, work);
orig_node = container_of(delayed_work, struct batadv_orig_node, curse);
timeout = atomic_inc_return(&orig_node->curse_timeout);
if (timeout <= 1)
return;
timeout = 15 * (2 << (timeout-2)) / 2;
pr_warn("Orig node %pM (%p) not purged after %lu seconds - did it become a zombie?\n", orig_node->orig, orig_node, timeout);
timeout = msecs_to_jiffies(1000*2*timeout);
queue_delayed_work(batadv_event_workqueue,
&orig_node->curse, timeout);
}
/**
* batadv_orig_node_new - creates a new orig_node
* @bat_priv: the bat priv with all the soft interface information
......
INIT_HLIST_HEAD(&orig_node->neigh_list);
INIT_LIST_HEAD(&orig_node->vlan_list);
INIT_HLIST_HEAD(&orig_node->ifinfo_list);
INIT_DELAYED_WORK(&orig_node->curse, batadv_orig_node_cursed);
spin_lock_init(&orig_node->bcast_seqno_lock);
spin_lock_init(&orig_node->neigh_list_lock);
spin_lock_init(&orig_node->tt_buff_lock);
......
if (batadv_purge_orig_node(bat_priv, orig_node)) {
batadv_gw_node_delete(bat_priv, orig_node);
hlist_del_rcu(&orig_node->hash_entry);
atomic_set(&orig_node->curse_timeout, 1);
queue_delayed_work(batadv_event_workqueue,
&orig_node->curse,
msecs_to_jiffies(15000));
batadv_orig_node_free_ref(orig_node);
continue;
}
soft-interface.c
atomic_set(&bat_priv->gw_sel_class, 20);
atomic_set(&bat_priv->gw.bandwidth_down, 100);
atomic_set(&bat_priv->gw.bandwidth_up, 20);
atomic_set(&bat_priv->orig_interval, 1000);
atomic_set(&bat_priv->orig_interval, 100);
atomic_set(&bat_priv->hop_penalty, 30);
#ifdef CONFIG_BATMAN_ADV_DEBUG
atomic_set(&bat_priv->log_level, 0);
translation-table.c
struct batadv_orig_node *orig_node = NULL;
struct batadv_tt_orig_list_entry *best_entry;
printk("~~~ batadv_transtable_search() addr: %pM\n", addr);
if (src && batadv_vlan_ap_isola_get(bat_priv, vid)) {
tt_local_entry = batadv_tt_local_hash_find(bat_priv, src, vid);
if (!tt_local_entry ||
types.h
struct list_head vlan_list;
spinlock_t vlan_list_lock; /* protects vlan_list */
struct batadv_orig_bat_iv bat_iv;
struct delayed_work curse;
atomic_t curse_timeout;
};
/**
(1-1/2)