qemu-devel
[Top][All Lists]
Advanced

[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>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]