Le 12/02/2019 à 04:12, Callum Sinclair a écrit : [snip] > /* Wipe the cache */ > - list_for_each_entry_safe(c, tmp, &mrt->mfc_cache_list, list) { > - if (!all && (c->mfc_flags & MFC_STATIC)) > - continue; > - rhltable_remove(&mrt->mfc_hash, &c->mnode, ipmr_rht_params); > - list_del_rcu(&c->list); > - cache = (struct mfc_cache *)c; > - call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, cache, > - mrt->id); > - mroute_netlink_event(mrt, cache, RTM_DELROUTE); > - mr_cache_put(c); > - } > - > - if (atomic_read(&mrt->cache_resolve_queue_len) != 0) { > - spin_lock_bh(&mfc_unres_lock); > - list_for_each_entry_safe(c, tmp, &mrt->mfc_unres_queue, list) { > - list_del(&c->list); > + if (flags & (MRT_FLUSH_MFC | MRT_FLUSH_MFC_STATIC)) { > + list_for_each_entry_safe(c, tmp, &mrt->mfc_cache_list, list) { > + if (((c->mfc_flags & MFC_STATIC) && !(flags & > MRT_FLUSH_MFC_STATIC)) || > + (!(c->mfc_flags & MFC_STATIC) && !(flags & > MRT_FLUSH_MFC))) > + continue; > + rhltable_remove(&mrt->mfc_hash, &c->mnode, > ipmr_rht_params); > + list_del_rcu(&c->list); > cache = (struct mfc_cache *)c; > + call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, > cache, > + mrt->id); > mroute_netlink_event(mrt, cache, RTM_DELROUTE); > - ipmr_destroy_unres(mrt, cache); > + mr_cache_put(c); > + } > + > + if (atomic_read(&mrt->cache_resolve_queue_len) != 0) { I wonder if the mfc_unres_queue must be cleaned up when only MRT_FLUSH_MFC_STATIC is provided. My first intuition would be to do it only with MRT_FLUSH_MFC. Any opinion?
Regards, Nicolas