alexandre.ferrieux@xxxxxxxxxx <alexandre.ferrieux@xxxxxxxxxx> wrote: > find_dequeue_entry(struct nfqnl_instance *queue, unsigned int id) > { > ... > list_for_each_entry(i, &queue->queue_list, list) { > if (i->id == id) { > entry = i; > break; > } > } > ... > } > > As a result, in a situation of "highly asynchronous" verdicts, i.e. when we > want some packets to linger in the queue for some time before reinjection, > the mere existence of a large number of such "old packets" may incur a > nonnegligible cost to the system. > > So I'm wondering: why is the list implemented as a simple linked list > instead of an array directly indexed by the id (like file descriptors) ? Because when this was implemented "highly asynchronous" was not on the radar. All users of this (that I know of) do in-order verdicts.