Hello, Barret. On Fri, Dec 02, 2022 at 08:01:37AM -1000, Tejun Heo wrote: > > you still end up grabbing both locks, but just not at the same time. > > Yeah, this probably would look better than the current double lock dancing, > especially in the finish_dispatch() path. > > > plus, task_rq_lock() takes the guesswork out of whether you're getting p's > > rq lock or not. it looks like you're using the holding_cpu to handle the > > race where p moves cpus after you read task_rq(p) but before you lock that > > task_rq. maybe you can drop the whole concept of the holding_cpu? > > ->holding_cpu is there to basically detect intervening dequeues, so if we > lock them out with TASK_ON_RQ_MIGRATING, we might be able to drop it. I need > to look into it more tho. Things get pretty subtle around there, so I could > easily be missing something. I'll try this and let you know how it goes. I tried both and I'm pretty ambivalent. The problem is that the finish_dispatch() path can't use TASK_ON_RQ_MIGRATING the way the consume path does because the dispatch path isn't starting with the task locked. The only claim it has to the task is through p->scx.ops_state. It can be argued that getting rid of double locking is still nice but given that holding_cpu is needed anyway and can play the same role, I'm not sure how attractive it is. I suppose we can go either way. Thanks. -- tejun