-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
kvm: defer huge page recovery vhost task to later
Some libraries want to ensure they are single threaded before forking, so making the kernel's kvm huge page recovery process a vhost task of the user process breaks those. The minijail library used by crosvm is one such affected application. Defer the task to after the first VM_RUN call, which occurs after the parent process has forked all its jailed processes. This needs to happen only once for the kvm instance, so introduce some general-purpose infrastructure for that, too. It's similar in concept to pthread_once; except it is actually usable, because the callback takes a parameter. Cc: Sean Christopherson <seanjc@google.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Tested-by: Alyssa Ross <hi@alyssa.is> Signed-off-by: Keith Busch <kbusch@kernel.org> Message-ID: <20250123153543.2769928-1-kbusch@meta.com> [Move call_once API to include/linux. - Paolo] Cc: stable@vger.kernel.org Fixes: d96c77b ("KVM: x86: switch hugepage recovery thread to vhost_task") Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
- Loading branch information
Keith Busch
authored and
Paolo Bonzini
committed
Jan 24, 2025
1 parent
86eb1ae
commit 931656b
Showing
4 changed files
with
66 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
#ifndef _LINUX_CALL_ONCE_H | ||
#define _LINUX_CALL_ONCE_H | ||
|
||
#include <linux/types.h> | ||
#include <linux/mutex.h> | ||
|
||
#define ONCE_NOT_STARTED 0 | ||
#define ONCE_RUNNING 1 | ||
#define ONCE_COMPLETED 2 | ||
|
||
struct once { | ||
atomic_t state; | ||
struct mutex lock; | ||
}; | ||
|
||
static inline void __once_init(struct once *once, const char *name, | ||
struct lock_class_key *key) | ||
{ | ||
atomic_set(&once->state, ONCE_NOT_STARTED); | ||
__mutex_init(&once->lock, name, key); | ||
} | ||
|
||
#define once_init(once) \ | ||
do { \ | ||
static struct lock_class_key __key; \ | ||
__once_init((once), #once, &__key); \ | ||
} while (0) | ||
|
||
static inline void call_once(struct once *once, void (*cb)(struct once *)) | ||
{ | ||
/* Pairs with atomic_set_release() below. */ | ||
if (atomic_read_acquire(&once->state) == ONCE_COMPLETED) | ||
return; | ||
|
||
guard(mutex)(&once->lock); | ||
WARN_ON(atomic_read(&once->state) == ONCE_RUNNING); | ||
if (atomic_read(&once->state) != ONCE_NOT_STARTED) | ||
return; | ||
|
||
atomic_set(&once->state, ONCE_RUNNING); | ||
cb(once); | ||
atomic_set_release(&once->state, ONCE_COMPLETED); | ||
} | ||
|
||
#endif /* _LINUX_CALL_ONCE_H */ |