On 03/30/2018 12:18 AM, Herbert Xu wrote:
> Instead of using the walk interface, how about
> rhashtable_free_and_destroy?
Oh, I was not aware of this beast ;)
I guess I will need to add a cond_resched() in it, right ?
My rough guess is that freeing 30 million frags would take few seconds ;)
>
>> void inet_frag_kill(struct inet_frag_queue *fq)
>> {
>> if (del_timer(&fq->timer))
>> refcount_dec(&fq->refcnt);
>>
>> if (!(fq->flags & INET_FRAG_COMPLETE)) {
>> - fq_unlink(fq);
>> + struct netns_frags *nf = fq->net;
>> +
>> + fq->flags |= INET_FRAG_COMPLETE;
>> + rhashtable_remove_fast(&nf->rhashtable, &fq->node,
>> nf->f->rhash_params);
>> refcount_dec(&fq->refcnt);
>> }
>> }
>
> This means that the hash won't inline properly. Don't know big
> of an issue it is to you. But you could fix it by doing the same
> hack as rhashtable by making inet_frag_kill an inline function and
> take the rhash_params as an explicit argument.
I will investigate this, thanks !