On Wednesday, February 27, 2013 17:58:15 Linus Lüssing wrote:
> +/**
> + * batadv_canceled_packets_free - Frees canceled forward packets
> + * @head:      A list of to be freed forw_packets
> + *
> + * This function canceles the scheduling of any packet in the provided
> list, + * waits for any possibly running packet forwarding thread to
> finish and + * finally, safely frees this forward packet.
> + *
> + * This function might sleep.
> + */
> +static void batadv_canceled_packets_free(struct hlist_head *head)
> +{
> +       struct batadv_forw_packet *forw_packet;
> +       struct hlist_node *tmp_node, *safe_tmp_node;
> +
> +       hlist_for_each_entry_safe(forw_packet, tmp_node, safe_tmp_node,
> head, +                                 canceled_list) {
> +               cancel_delayed_work_sync(&forw_packet->delayed_work);
> +
> +               hlist_del(&forw_packet->canceled_list);
> +               batadv_forw_packet_free(forw_packet);
> +       }
> +}

I don't quite see how your patch can work when only one interface is 
deactivated and not the mesh as a whole. batadv_purge_outstanding_packets() 
also is called from batadv_hardif_disable_interface() in which case the 
broadcast packets re-arm themselves by appending the work item to their 
respective queues. That is why we have the magic "pending" check in the 
cleanup functions.

Cheers,
Marek

Reply via email to