• Andra Paraschiv's avatar
    nitro_enclaves: Add logic for setting an enclave memory region · 7dc9d430
    Andra Paraschiv authored
    Another resource that is being set for an enclave is memory. User space
    memory regions, that need to be backed by contiguous memory regions,
    are associated with the enclave.
    
    One solution for allocating / reserving contiguous memory regions, that
    is used for integration, is hugetlbfs. The user space process that is
    associated with the enclave passes to the driver these memory regions.
    
    The enclave memory regions need to be from the same NUMA node as the
    enclave CPUs.
    
    Add ioctl command logic for setting user space memory region for an
    enclave.
    
    Changelog
    
    v9 -> v10
    
    * Update commit message to include the changelog before the SoB tag(s).
    
    v8 -> v9
    
    * Use the ne_devs data structure to get the refs for the NE PCI device.
    
    v7 -> v8
    
    * Add early check, while getting user pages, to be multiple of 2 MiB for
      the pages that back the user space memory region.
    * Add custom error code for incorrect user space memory region flag.
    * Include in a separate function the sanity checks for each page of the
      user space memory region.
    
    v6 -> v7
    
    * Update check for duplicate user space memory regions to cover
      additional possible scenarios.
    
    v5 -> v6
    
    * Check for max number of pages allocated for the internal data
      structure for pages.
    * Check for invalid memory region flags.
    * Check for aligned physical memory regions.
    * Update documentation to kernel-doc format.
    * Check for duplicate user space memory regions.
    * Use directly put_page() instead of unpin_user_pages(), to match the
      get_user_pages() calls.
    
    v4 -> v5
    
    * Add early exit on set memory region ioctl function call error.
    * Remove log on copy_from_user() failure.
    * Exit without unpinning the pages on NE PCI dev request failure as
      memory regions from the user space range may have already been added.
    * Add check for the memory region user space address to be 2 MiB
      aligned.
    * Update logic to not have a hardcoded check for 2 MiB memory regions.
    
    v3 -> v4
    
    * Check enclave memory regions are from the same NUMA node as the
      enclave CPUs.
    * Use dev_err instead of custom NE log pattern.
    * Update the NE ioctl call to match the decoupling from the KVM API.
    
    v2 -> v3
    
    * Remove the WARN_ON calls.
    * Update static calls sanity checks.
    * Update kzfree() calls to kfree().
    
    v1 -> v2
    
    * Add log pattern for NE.
    * Update goto labels to match their purpose.
    * Remove the BUG_ON calls.
    * Check if enclave max memory regions is reached when setting an enclave
      memory region.
    * Check if enclave state is init when setting an enclave memory region.
    Reviewed-by: default avatarAlexander Graf <graf@amazon.com>
    Signed-off-by: default avatarAlexandru Vasile <lexnv@amazon.com>
    Signed-off-by: default avatarAndra Paraschiv <andraprs@amazon.com>
    Link: https://lore.kernel.org/r/20200921121732.44291-12-andraprs@amazon.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    7dc9d430
ne_misc_dev.c 36.2 KB