Messages in this thread | | | Date | Thu, 23 Dec 2021 12:52:17 +0100 | Subject | Re: [PATCH] mm/util.c: Make kvfree() safe for calling while holding spinlocks | From | Manfred Spraul <> |
| |
Hello Vasily,
On 12/23/21 08:21, Vasily Averin wrote: > > I would prefer to release memory ASAP if it's possible. > What do you think about this change? > --- a/mm/util.c > +++ b/mm/util.c > @@ -614,9 +614,12 @@ EXPORT_SYMBOL(kvmalloc_node); > */ > void kvfree(const void *addr) > { > - if (is_vmalloc_addr(addr)) > - vfree(addr); > - else > + if (is_vmalloc_addr(addr)) { > + if (in_atomic()) > + vfree_atomic(); > + else > + vfree(addr); > + } else > kfree(addr); > } > EXPORT_SYMBOL(kvfree); > Unfortunately this cannot work:
> /* > * Are we running in atomic context? WARNING: this macro cannot > * always detect atomic context; in particular, it cannot know about > * held spinlocks in non-preemptible kernels. Thus it should not be > * used in the general case to determine whether sleeping is possible. > * Do not use in_atomic() in driver code. > */ > #define in_atomic() (preempt_count() != 0) >
--
Manfred
| |