On Fri, Dec 13, 2024 at 06:53:55PM +0000, Matthew Wilcox wrote: > On Fri, Dec 13, 2024 at 07:51:50PM +0100, Christian Brauner wrote: > > Yeah, it does. Did you see the patch that is included in the series? > > I've replaced the macro with always inline functions that select the > > lock based on the flag: > > > > static __always_inline void mtree_lock(struct maple_tree *mt) > > { > > if (mt->ma_flags & MT_FLAGS_LOCK_IRQ) > > spin_lock_irq(&mt->ma_lock); > > else > > spin_lock(&mt->ma_lock); > > } > > static __always_inline void mtree_unlock(struct maple_tree *mt) > > { > > if (mt->ma_flags & MT_FLAGS_LOCK_IRQ) > > spin_unlock_irq(&mt->ma_lock); > > else > > spin_unlock(&mt->ma_lock); > > } > > > > Does that work for you? > > See the way the XArray works; we're trying to keep the two APIs as > close as possible. > > The caller should use mtree_lock_irq() or mtree_lock_irqsave() > as appropriate. Say I need: spin_lock_irqsave(&mt->ma_lock, flags); mas_erase(...); -> mas_nomem() -> mtree_unlock() // uses spin_unlock(); // allocate -> mtree_lock() // uses spin_lock(); spin_lock_irqrestore(&mt->ma_lock, flags); So that doesn't work, right? IOW, the maple tree does internal drop and retake locks and they need to match the locks of the outer context. So, I think I need a way to communicate to mas_*() what type of lock to take, no? Any idea how you would like me to do this in case I'm not wrong?