KVM cleanups for 6.10:
- Misc cleanups extracted from the "exit on missing userspace mapping" series,
which has been put on hold in anticipation of a "KVM Userfault" approach,
which should provide a superset of functionality.
- Remove kvm_make_all_cpus_request_except(), which got added to hack around an
AVIC bug, and then became dead code when a more robust fix came along.
- Fix a goof in the KVM_CREATE_GUEST_MEMFD documentation.
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEKTobbabEP7vbhhN9OlYIJqCjN/0FAmY+oHQACgkQOlYIJqCj
N/3c/w//dmgqxFGpPoCvZ2+pVarrbpsMdfO5skaMF0EN1a0Rb0oJcVYj7z1zqsjQ
4DCCANxVrcEGVBZG5I8nhk1lDlGS7zOTOBBovgVDNj7wL9p/fzOhR6UlLKG5QMMn
0nWY9raC8ubcrtKgOm/qOtSgZrL9rEWh3QUK1FRPKaF12r1CLPmJIvVvpCm8t//f
YZrqpHj/JqXbc8V8toBHqvi3DaMIOA2gWRvjfwSWfCL+x7ZPYny3Q+nw9fl2fSR6
f6w1lB6VhyDudzscu4l7U4y5wI0LMmYhJ5p5tvQBB5qtbAJ7vpIUxxYh4CT/YdbH
WLQCIBr2wR0Mkl0g4FwNlnnt6a5Sa6V4nVKfzkl37L0Ucyu+SpP8t6YO4nb/dJmb
Sicx3qqeHC7N9Y9VVKzK3Kb33KVaBFawvzjIcc+GFXMDFZ35b33vWhYzTl3sJpLY
hjfGpYTB1zHSj6f7a9mW7d15E/lyfqMKCzewZWnko0hISM8Jm1LxU3PMFJa8TR2/
yB6IUDDJnEk6fSwUwaCluAJv3kfnhs/S3fMFw+5cYkcmgW7yaE+K9nJ3aEkx5l7x
9sXjAtc7zbAwEuJZ+5C1+CgwWGKsfLKtXbjqMYAIAYep5oa+UrJ4L77aZyTV1mSD
oRJs0LmNmachV5nxKFHAaijVc6vmZNhcD9ygbM5qeLGoGby+W8g=
=dgM4
-----END PGP SIGNATURE-----
Merge tag 'kvm-x86-generic-6.10' of https://github.com/kvm-x86/linux into HEAD
KVM cleanups for 6.10:
- Misc cleanups extracted from the "exit on missing userspace mapping" series,
which has been put on hold in anticipation of a "KVM Userfault" approach,
which should provide a superset of functionality.
- Remove kvm_make_all_cpus_request_except(), which got added to hack around an
AVIC bug, and then became dead code when a more robust fix came along.
- Fix a goof in the KVM_CREATE_GUEST_MEMFD documentation.
pull/873/head
commit
f4bc1373d5
|
|
@ -6316,7 +6316,7 @@ The "flags" field is reserved for future extensions and must be '0'.
|
||||||
:Architectures: none
|
:Architectures: none
|
||||||
:Type: vm ioctl
|
:Type: vm ioctl
|
||||||
:Parameters: struct kvm_create_guest_memfd(in)
|
:Parameters: struct kvm_create_guest_memfd(in)
|
||||||
:Returns: 0 on success, <0 on error
|
:Returns: A file descriptor on success, <0 on error
|
||||||
|
|
||||||
KVM_CREATE_GUEST_MEMFD creates an anonymous file and returns a file descriptor
|
KVM_CREATE_GUEST_MEMFD creates an anonymous file and returns a file descriptor
|
||||||
that refers to it. guest_memfd files are roughly analogous to files created
|
that refers to it. guest_memfd files are roughly analogous to files created
|
||||||
|
|
|
||||||
|
|
@ -193,8 +193,6 @@ static inline bool is_error_page(struct page *page)
|
||||||
bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
|
bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
|
||||||
unsigned long *vcpu_bitmap);
|
unsigned long *vcpu_bitmap);
|
||||||
bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req);
|
bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req);
|
||||||
bool kvm_make_all_cpus_request_except(struct kvm *kvm, unsigned int req,
|
|
||||||
struct kvm_vcpu *except);
|
|
||||||
|
|
||||||
#define KVM_USERSPACE_IRQ_SOURCE_ID 0
|
#define KVM_USERSPACE_IRQ_SOURCE_ID 0
|
||||||
#define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1
|
#define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1
|
||||||
|
|
|
||||||
|
|
@ -311,8 +311,7 @@ bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
|
||||||
return called;
|
return called;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool kvm_make_all_cpus_request_except(struct kvm *kvm, unsigned int req,
|
bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req)
|
||||||
struct kvm_vcpu *except)
|
|
||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu;
|
struct kvm_vcpu *vcpu;
|
||||||
struct cpumask *cpus;
|
struct cpumask *cpus;
|
||||||
|
|
@ -325,22 +324,14 @@ bool kvm_make_all_cpus_request_except(struct kvm *kvm, unsigned int req,
|
||||||
cpus = this_cpu_cpumask_var_ptr(cpu_kick_mask);
|
cpus = this_cpu_cpumask_var_ptr(cpu_kick_mask);
|
||||||
cpumask_clear(cpus);
|
cpumask_clear(cpus);
|
||||||
|
|
||||||
kvm_for_each_vcpu(i, vcpu, kvm) {
|
kvm_for_each_vcpu(i, vcpu, kvm)
|
||||||
if (vcpu == except)
|
|
||||||
continue;
|
|
||||||
kvm_make_vcpu_request(vcpu, req, cpus, me);
|
kvm_make_vcpu_request(vcpu, req, cpus, me);
|
||||||
}
|
|
||||||
|
|
||||||
called = kvm_kick_many_cpus(cpus, !!(req & KVM_REQUEST_WAIT));
|
called = kvm_kick_many_cpus(cpus, !!(req & KVM_REQUEST_WAIT));
|
||||||
put_cpu();
|
put_cpu();
|
||||||
|
|
||||||
return called;
|
return called;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req)
|
|
||||||
{
|
|
||||||
return kvm_make_all_cpus_request_except(kvm, req, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(kvm_make_all_cpus_request);
|
EXPORT_SYMBOL_GPL(kvm_make_all_cpus_request);
|
||||||
|
|
||||||
void kvm_flush_remote_tlbs(struct kvm *kvm)
|
void kvm_flush_remote_tlbs(struct kvm *kvm)
|
||||||
|
|
@ -2932,7 +2923,7 @@ out:
|
||||||
/*
|
/*
|
||||||
* Pin guest page in memory and return its pfn.
|
* Pin guest page in memory and return its pfn.
|
||||||
* @addr: host virtual address which maps memory to the guest
|
* @addr: host virtual address which maps memory to the guest
|
||||||
* @atomic: whether this function can sleep
|
* @atomic: whether this function is forbidden from sleeping
|
||||||
* @interruptible: whether the process can be interrupted by non-fatal signals
|
* @interruptible: whether the process can be interrupted by non-fatal signals
|
||||||
* @async: whether this function need to wait IO complete if the
|
* @async: whether this function need to wait IO complete if the
|
||||||
* host page is not in the memory
|
* host page is not in the memory
|
||||||
|
|
@ -3004,16 +2995,12 @@ kvm_pfn_t __gfn_to_pfn_memslot(const struct kvm_memory_slot *slot, gfn_t gfn,
|
||||||
if (hva)
|
if (hva)
|
||||||
*hva = addr;
|
*hva = addr;
|
||||||
|
|
||||||
if (addr == KVM_HVA_ERR_RO_BAD) {
|
|
||||||
if (writable)
|
|
||||||
*writable = false;
|
|
||||||
return KVM_PFN_ERR_RO_FAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kvm_is_error_hva(addr)) {
|
if (kvm_is_error_hva(addr)) {
|
||||||
if (writable)
|
if (writable)
|
||||||
*writable = false;
|
*writable = false;
|
||||||
return KVM_PFN_NOSLOT;
|
|
||||||
|
return addr == KVM_HVA_ERR_RO_BAD ? KVM_PFN_ERR_RO_FAULT :
|
||||||
|
KVM_PFN_NOSLOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do not map writable pfn in the readonly memslot. */
|
/* Do not map writable pfn in the readonly memslot. */
|
||||||
|
|
@ -3277,6 +3264,7 @@ static int next_segment(unsigned long len, int offset)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copy @len bytes from guest memory at '(@gfn * PAGE_SIZE) + @offset' to @data */
|
||||||
static int __kvm_read_guest_page(struct kvm_memory_slot *slot, gfn_t gfn,
|
static int __kvm_read_guest_page(struct kvm_memory_slot *slot, gfn_t gfn,
|
||||||
void *data, int offset, int len)
|
void *data, int offset, int len)
|
||||||
{
|
{
|
||||||
|
|
@ -3378,6 +3366,7 @@ int kvm_vcpu_read_guest_atomic(struct kvm_vcpu *vcpu, gpa_t gpa,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_vcpu_read_guest_atomic);
|
EXPORT_SYMBOL_GPL(kvm_vcpu_read_guest_atomic);
|
||||||
|
|
||||||
|
/* Copy @len bytes from @data into guest memory at '(@gfn * PAGE_SIZE) + @offset' */
|
||||||
static int __kvm_write_guest_page(struct kvm *kvm,
|
static int __kvm_write_guest_page(struct kvm *kvm,
|
||||||
struct kvm_memory_slot *memslot, gfn_t gfn,
|
struct kvm_memory_slot *memslot, gfn_t gfn,
|
||||||
const void *data, int offset, int len)
|
const void *data, int offset, int len)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue