Re: [PATCH net 6/6] net/sched: qdisc_destroy() old ingress and clsact Qdiscs before grafting
From: Vlad Buslov <hidden>
Date: 2023-05-16 19:49:59
Also in:
lkml
On Tue 16 May 2023 at 12:22, Jakub Kicinski [off-list ref] wrote:
On Mon, 15 May 2023 15:45:15 -0700 Peilin Ye wrote:quoted
On Thu, May 11, 2023 at 05:11:23PM -0700, Peilin Ye wrote:quoted
quoted
You're right, it's in qdisc_create(), argh...->destroy() is called for all error points between ->init() and dev_graft_qdisc(). I'll try handling it in ->destroy().Sorry for any confusion: there is no point at all undoing "setting dev pointer to b1" in ->destroy() because datapath has already been affected. To summarize, grafting B mustn't fail after setting dev pointer to b1, so ->init() is too early, because e.g. if user requested [1] to create a rate estimator, gen_new_estimator() could fail after ->init() in qdisc_create(). On the other hand, ->attach() is too late because it's later than dev_graft_qdisc(), so concurrent filter requests might see uninitialized dev pointer in theory. Please suggest; is adding another callback (or calling ->attach()) right before dev_graft_qdisc() for ingress (clsact) Qdiscs too much for this fix? [1] e.g. $ tc qdisc add dev eth0 estimator 1s 8s clsactVlad, could you please clarify how you expect the unlocked filter operations to work when the qdisc has global state?
Jakub, I didn't account for per-net_device pointer usage by miniqp code hence this bug. I didn't comment on the fix because I was away from my PC last week but Peilin's approach seems reasonable to me. When Peilin brought up the issue initially I also tried to come up with some trick to contain the changes to miniqp code instead of changing core but couldn't think of anything workable due to the limitations already discussed in this thread. I'm open to explore alternative approaches to solving this issue, if that is what you suggest.