Matthew Wilcox <willy@xxxxxxxxxxxxx> writes:Any better ideas and suggestions are welcomed. :)
On Wed, Dec 13, 2023 at 06:17:45PM +0800, Maria Yu wrote:
+static inline void write_lock_tasklist_lock(void)
+{
+ while (1) {
+ local_irq_disable();
+ if (write_trylock(&tasklist_lock))
+ break;
+ local_irq_enable();
+ cpu_relax();
This is a bad implementation though. You don't set the _QW_WAITING flag
Let me think about this.so readers don't know that there's a pending writer. Also, I've see >> cpu_relax() pessimise CPU behaviour; putting it into a low-power mode
that takes a while to wake up from.
I think the right way to fix this is to pass a boolean flag to
queued_write_lock_slowpath() to let it know whether it can re-enable
interrupts while checking whether _QW_WAITING is set.
Yes. It seems to make sense to distinguish between write_lock_irq and
write_lock_irqsave and fix this for all of write_lock_irq.
Either that or someone can put in the work to start making the
tasklist_lock go away.
Eric