My intention was removed special var 'after_clear'. The main idea was use a list as a flag. But Jeremy has right, I used list_empty_careful() in wrong place. I can change this for that: static void condition_mt_destroy(const struct xt_mtdtor_param *par) { const struct xt_condition_mtinfo *info = par->matchinfo; struct condition_variable *var = info->condvar; struct condition_net *cnet = get_condition_pernet(par->net); mutex_lock(&proc_lock); // is called after net namespace deleted? if (list_empty_careful(&cnet->conditions_list)) { mutex_unlock(&proc_lock); return; } if (--var->refcount == 0) { list_del(&var->list); remove_proc_entry(var->name, cnet->proc_net_condition); mutex_unlock(&proc_lock); kfree(var); return; } mutex_unlock(&proc_lock); } But now I realized that one var bool is less expensive than call a function. So my improved is turned out the fail :) ... sorry for taking the time. -- Grzegorz Kuczyński