* Patrick McHardy <418F9AD0.1040701@xxxxxxxxx> 2004-11-08 17:12
> Thomas Graf wrote:
> >>+ /* unlink inner qdiscs from dev->qdisc_list immediately */
> >>+ if (qdisc->ops->cl_ops != NULL)
> >>+ list_add(&qdisc->list, &cql);
> >I think you should extend the above to:
> >if (qdisc->ops->cl_ops != NULL && !list_empty(&qdisc->list))
> >Otherwise you might unlink entries just added before the
> >rcu callback and it prevents an unneeded attempt to delete
> >qdiscs for inner classful qdiscs
> There is some optimization possible, I will do this for the final
> patch. But I don't understand the problem you refer to, can you
> please explain ?
I don't have the time to verify this at the moment but:
1) qdisc_destroy unlinking all the lists
2) RTM_NEWQDISC creating a new qdisc with the same major classid as the old one
which will suceed since the old one cannot be found anymore.
3) rcu callback __qdisc_destroy -> qdisc_destroy looking through qdisc_list
again and then deleting the new entries because their major classid matches.
I might be missing something though.