On Fri, Jul 26, 2019 at 05:25:03PM -0400, Jeff Layton wrote: > On Fri, 2019-07-26 at 14:10 -0700, Alexander Duyck wrote: > > On Fri, Jul 26, 2019 at 2:01 PM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > > From: "Matthew Wilcox (Oracle)" <willy@xxxxxxxxxxxxx> > > > > > > Since vfree() can sleep, calling kvfree() from contexts where sleeping > > > is not permitted (eg holding a spinlock) is a bit of a lottery whether > > > it'll work. Introduce kvfree_safe() for situations where we know we can > > > sleep, but make kvfree() safe by default. > > > > > > Reported-by: Jeff Layton <jlayton@xxxxxxxxxx> > > > Cc: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx> > > > Cc: Luis Henriques <lhenriques@xxxxxxxx> > > > Cc: Christoph Hellwig <hch@xxxxxx> > > > Cc: Carlos Maiolino <cmaiolino@xxxxxxxxxx> > > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > > > > So you say you are adding kvfree_safe() in the patch description, but > > it looks like you are introducing kvfree_fast() below. Did something > > change and the patch description wasn't updated, or is this just the > > wrong description for this patch? Oops, bad description. Thanks, I'll fix it for v2. > > > +/** > > > + * kvfree_fast() - Free memory. > > > + * @addr: Pointer to allocated memory. > > > + * > > > + * kvfree_fast frees memory allocated by any of vmalloc(), kmalloc() or > > > + * kvmalloc(). It is slightly more efficient to use kfree() or vfree() if > > > + * you are certain that you know which one to use. > > > + * > > > + * Context: Either preemptible task context or not-NMI interrupt. Must not > > > + * hold a spinlock as it can sleep. > > > + */ > > > +void kvfree_fast(const void *addr) > > > +{ > > > + might_sleep(); > > > + > > might_sleep_if(!in_interrupt()); > > That's what vfree does anyway, so we might as well exempt the case where > you are. True, but if we are in interrupt, then we may as well call kvfree() since it'll do the same thing, and this way the rules are clearer. > > > + if (is_vmalloc_addr(addr)) > > > + vfree(addr); > > > + else > > > + kfree(addr); > > > +} > > > +EXPORT_SYMBOL(kvfree_fast); > > > + > > That said -- is this really useful? > > The only way to know that this is safe is to know what sort of > allocation it is, and in that case you can just call kfree or vfree as > appropriate. It's safe if you know you're not holding any spinlocks, for example ...