[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v8 2/8] KVM: Extend the memslot to support fd-based private m
From: |
Isaku Yamahata |
Subject: |
Re: [PATCH v8 2/8] KVM: Extend the memslot to support fd-based private memory |
Date: |
Thu, 29 Sep 2022 15:45:16 -0700 |
On Thu, Sep 15, 2022 at 10:29:07PM +0800,
Chao Peng <chao.p.peng@linux.intel.com> wrote:
...
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 584a5bab3af3..12dc0dc57b06 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
...
> @@ -4622,6 +4622,33 @@ static int kvm_vm_ioctl_get_stats_fd(struct kvm *kvm)
> return fd;
> }
>
> +#define SANITY_CHECK_MEM_REGION_FIELD(field)
> \
> +do {
> \
> + BUILD_BUG_ON(offsetof(struct kvm_user_mem_region, field) !=
> \
> + offsetof(struct kvm_userspace_memory_region, field));
> \
> + BUILD_BUG_ON(sizeof_field(struct kvm_user_mem_region, field) !=
> \
> + sizeof_field(struct kvm_userspace_memory_region, field));
> \
> +} while (0)
> +
> +#define SANITY_CHECK_MEM_REGION_EXT_FIELD(field)
> \
> +do {
> \
> + BUILD_BUG_ON(offsetof(struct kvm_user_mem_region, field) !=
> \
> + offsetof(struct kvm_userspace_memory_region_ext, field));
> \
> + BUILD_BUG_ON(sizeof_field(struct kvm_user_mem_region, field) !=
> \
> + sizeof_field(struct kvm_userspace_memory_region_ext,
> field)); \
> +} while (0)
> +
> +static void kvm_sanity_check_user_mem_region_alias(void)
> +{
> + SANITY_CHECK_MEM_REGION_FIELD(slot);
> + SANITY_CHECK_MEM_REGION_FIELD(flags);
> + SANITY_CHECK_MEM_REGION_FIELD(guest_phys_addr);
> + SANITY_CHECK_MEM_REGION_FIELD(memory_size);
> + SANITY_CHECK_MEM_REGION_FIELD(userspace_addr);
> + SANITY_CHECK_MEM_REGION_EXT_FIELD(private_offset);
> + SANITY_CHECK_MEM_REGION_EXT_FIELD(private_fd);
> +}
> +
> static long kvm_vm_ioctl(struct file *filp,
> unsigned int ioctl, unsigned long arg)
> {
> @@ -4645,14 +4672,20 @@ static long kvm_vm_ioctl(struct file *filp,
> break;
> }
> case KVM_SET_USER_MEMORY_REGION: {
> - struct kvm_userspace_memory_region kvm_userspace_mem;
> + struct kvm_user_mem_region mem;
> + unsigned long size = sizeof(struct kvm_userspace_memory_region);
> +
> + kvm_sanity_check_user_mem_region_alias();
>
> r = -EFAULT;
> - if (copy_from_user(&kvm_userspace_mem, argp,
> - sizeof(kvm_userspace_mem)))
> + if (copy_from_user(&mem, argp, size);
> + goto out;
> +
> + r = -EINVAL;
> + if (mem.flags & KVM_MEM_PRIVATE)
> goto out;
Nit: It's better to check if padding is zero. Maybe rename it to reserved.
+ if (mem.pad1 || memchr_inv(mem.pad2, 0, sizeof(mem.pad2)))
+ goto out;
--
Isaku Yamahata <isaku.yamahata@gmail.com>
- Re: [PATCH v8 1/8] mm/memfd: Introduce userspace inaccessible memfd, (continued)
[PATCH v8 3/8] KVM: Add KVM_EXIT_MEMORY_FAULT exit, Chao Peng, 2022/09/15
[PATCH v8 2/8] KVM: Extend the memslot to support fd-based private memory, Chao Peng, 2022/09/15
[PATCH v8 4/8] KVM: Use gfn instead of hva for mmu_notifier_retry, Chao Peng, 2022/09/15
[PATCH v8 5/8] KVM: Register/unregister the guest private memory regions, Chao Peng, 2022/09/15
[PATCH v8 6/8] KVM: Update lpage info when private/shared memory are mixed, Chao Peng, 2022/09/15
[PATCH v8 7/8] KVM: Handle page fault for private memory, Chao Peng, 2022/09/15
[PATCH v8 8/8] KVM: Enable and expose KVM_MEM_PRIVATE, Chao Peng, 2022/09/15