Re: [PATCH] mm/util.c: Make kvfree() safe for calling while holding spinlocks

From: Manfred Spraul
Date: Thu Dec 23 2021 - 06:52:33 EST


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