* drivers/virt/nitro_enclaves/ne_misc_dev.c:935 ne_set_user_memory_region_ioctl() warn: should - mem_map) + (0)) << 12' be a 64 bit
@ 2020-11-28 9:57 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2020-11-28 9:57 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 15714 bytes --]
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Andra Paraschiv <andraprs@amazon.com>
CC: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
CC: Alexander Graf <graf@amazon.com>
Hi Andra,
First bad commit (maybe != root cause):
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: c84e1efae022071a4fcf9f1899bf71777c49943a
commit: 0f5c7b7484394e26afc07c063290fb43c4ba42c7 nitro_enclaves: Add Makefile for the Nitro Enclaves driver
date: 10 weeks ago
:::::: branch date: 11 hours ago
:::::: commit date: 10 weeks ago
config: i386-randconfig-m031-20201128 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
drivers/virt/nitro_enclaves/ne_misc_dev.c:935 ne_set_user_memory_region_ioctl() warn: should '(((phys_contig_mem_regions[i]) - mem_map) + (0)) << 12' be a 64 bit type?
Old smatch warnings:
drivers/virt/nitro_enclaves/ne_misc_dev.c:967 ne_set_user_memory_region_ioctl() warn: should '(((phys_contig_mem_regions[i]) - mem_map) + (0)) << 12' be a 64 bit type?
vim +935 drivers/virt/nitro_enclaves/ne_misc_dev.c
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 826
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 827 /**
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 828 * ne_set_user_memory_region_ioctl() - Add user space memory region to the slot
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 829 * associated with the current enclave.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 830 * @ne_enclave : Private data associated with the current enclave.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 831 * @mem_region : User space memory region to be associated with the given slot.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 832 *
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 833 * Context: Process context. This function is called with the ne_enclave mutex held.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 834 * Return:
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 835 * * 0 on success.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 836 * * Negative return value on failure.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 837 */
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 838 static int ne_set_user_memory_region_ioctl(struct ne_enclave *ne_enclave,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 839 struct ne_user_memory_region mem_region)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 840 {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 841 long gup_rc = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 842 unsigned long i = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 843 unsigned long max_nr_pages = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 844 unsigned long memory_size = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 845 struct ne_mem_region *ne_mem_region = NULL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 846 unsigned long nr_phys_contig_mem_regions = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 847 struct pci_dev *pdev = ne_devs.ne_pci_dev->pdev;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 848 struct page **phys_contig_mem_regions = NULL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 849 int rc = -EINVAL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 850
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 851 rc = ne_sanity_check_user_mem_region(ne_enclave, mem_region);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 852 if (rc < 0)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 853 return rc;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 854
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 855 ne_mem_region = kzalloc(sizeof(*ne_mem_region), GFP_KERNEL);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 856 if (!ne_mem_region)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 857 return -ENOMEM;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 858
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 859 max_nr_pages = mem_region.memory_size / NE_MIN_MEM_REGION_SIZE;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 860
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 861 ne_mem_region->pages = kcalloc(max_nr_pages, sizeof(*ne_mem_region->pages),
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 862 GFP_KERNEL);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 863 if (!ne_mem_region->pages) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 864 rc = -ENOMEM;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 865
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 866 goto free_mem_region;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 867 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 868
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 869 phys_contig_mem_regions = kcalloc(max_nr_pages, sizeof(*phys_contig_mem_regions),
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 870 GFP_KERNEL);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 871 if (!phys_contig_mem_regions) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 872 rc = -ENOMEM;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 873
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 874 goto free_mem_region;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 875 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 876
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 877 do {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 878 i = ne_mem_region->nr_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 879
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 880 if (i == max_nr_pages) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 881 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 882 "Reached max nr of pages in the pages data struct\n");
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 883
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 884 rc = -ENOMEM;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 885
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 886 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 887 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 888
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 889 gup_rc = get_user_pages(mem_region.userspace_addr + memory_size, 1, FOLL_GET,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 890 ne_mem_region->pages + i, NULL);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 891 if (gup_rc < 0) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 892 rc = gup_rc;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 893
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 894 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 895 "Error in get user pages [rc=%d]\n", rc);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 896
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 897 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 898 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 899
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 900 rc = ne_sanity_check_user_mem_region_page(ne_enclave, ne_mem_region->pages[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 901 if (rc < 0)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 902 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 903
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 904 /*
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 905 * TODO: Update once handled non-contiguous memory regions
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 906 * received from user space or contiguous physical memory regions
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 907 * larger than 2 MiB e.g. 8 MiB.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 908 */
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 909 phys_contig_mem_regions[i] = ne_mem_region->pages[i];
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 910
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 911 memory_size += page_size(ne_mem_region->pages[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 912
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 913 ne_mem_region->nr_pages++;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 914 } while (memory_size < mem_region.memory_size);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 915
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 916 /*
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 917 * TODO: Update once handled non-contiguous memory regions received
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 918 * from user space or contiguous physical memory regions larger than
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 919 * 2 MiB e.g. 8 MiB.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 920 */
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 921 nr_phys_contig_mem_regions = ne_mem_region->nr_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 922
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 923 if ((ne_enclave->nr_mem_regions + nr_phys_contig_mem_regions) >
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 924 ne_enclave->max_mem_regions) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 925 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 926 "Reached max memory regions %lld\n",
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 927 ne_enclave->max_mem_regions);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 928
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 929 rc = -NE_ERR_MEM_MAX_REGIONS;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 930
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 931 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 932 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 933
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 934 for (i = 0; i < nr_phys_contig_mem_regions; i++) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 @935 u64 phys_region_addr = page_to_phys(phys_contig_mem_regions[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 936 u64 phys_region_size = page_size(phys_contig_mem_regions[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 937
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 938 if (phys_region_size & (NE_MIN_MEM_REGION_SIZE - 1)) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 939 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 940 "Physical mem region size is not multiple of 2 MiB\n");
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 941
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 942 rc = -EINVAL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 943
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 944 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 945 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 946
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 947 if (!IS_ALIGNED(phys_region_addr, NE_MIN_MEM_REGION_SIZE)) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 948 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 949 "Physical mem region address is not 2 MiB aligned\n");
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 950
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 951 rc = -EINVAL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 952
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 953 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 954 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 955 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 956
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 957 ne_mem_region->memory_size = mem_region.memory_size;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 958 ne_mem_region->userspace_addr = mem_region.userspace_addr;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 959
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 960 list_add(&ne_mem_region->mem_region_list_entry, &ne_enclave->mem_regions_list);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 961
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 962 for (i = 0; i < nr_phys_contig_mem_regions; i++) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 963 struct ne_pci_dev_cmd_reply cmd_reply = {};
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 964 struct slot_add_mem_req slot_add_mem_req = {};
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 965
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 966 slot_add_mem_req.slot_uid = ne_enclave->slot_uid;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 967 slot_add_mem_req.paddr = page_to_phys(phys_contig_mem_regions[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 968 slot_add_mem_req.size = page_size(phys_contig_mem_regions[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 969
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 970 rc = ne_do_request(pdev, SLOT_ADD_MEM,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 971 &slot_add_mem_req, sizeof(slot_add_mem_req),
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 972 &cmd_reply, sizeof(cmd_reply));
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 973 if (rc < 0) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 974 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 975 "Error in slot add mem [rc=%d]\n", rc);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 976
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 977 kfree(phys_contig_mem_regions);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 978
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 979 /*
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 980 * Exit here without put pages as memory regions may
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 981 * already been added.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 982 */
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 983 return rc;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 984 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 985
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 986 ne_enclave->mem_size += slot_add_mem_req.size;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 987 ne_enclave->nr_mem_regions++;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 988 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 989
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 990 kfree(phys_contig_mem_regions);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 991
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 992 return 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 993
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 994 put_pages:
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 995 for (i = 0; i < ne_mem_region->nr_pages; i++)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 996 put_page(ne_mem_region->pages[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 997 free_mem_region:
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 998 kfree(phys_contig_mem_regions);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 999 kfree(ne_mem_region->pages);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1000 kfree(ne_mem_region);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1001
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1002 return rc;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1003 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1004
:::::: The code at line 935 was first introduced by commit
:::::: 7dc9d4309fdb7773df13a17e203c16966676f21a nitro_enclaves: Add logic for setting an enclave memory region
:::::: TO: Andra Paraschiv <andraprs@amazon.com>
:::::: CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 37298 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* drivers/virt/nitro_enclaves/ne_misc_dev.c:935 ne_set_user_memory_region_ioctl() warn: should - mem_map) + (0)) << 12' be a 64 bit
@ 2020-12-27 18:25 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2020-12-27 18:25 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 15714 bytes --]
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Andra Paraschiv <andraprs@amazon.com>
CC: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
CC: Alexander Graf <graf@amazon.com>
Hi Andra,
First bad commit (maybe != root cause):
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: f838f8d2b694cf9d524dc4423e9dd2db13892f3f
commit: 0f5c7b7484394e26afc07c063290fb43c4ba42c7 nitro_enclaves: Add Makefile for the Nitro Enclaves driver
date: 3 months ago
:::::: branch date: 25 hours ago
:::::: commit date: 3 months ago
config: i386-randconfig-m021-20201227 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
drivers/virt/nitro_enclaves/ne_misc_dev.c:935 ne_set_user_memory_region_ioctl() warn: should '(((phys_contig_mem_regions[i]) - mem_map) + (0)) << 12' be a 64 bit type?
Old smatch warnings:
drivers/virt/nitro_enclaves/ne_misc_dev.c:967 ne_set_user_memory_region_ioctl() warn: should '(((phys_contig_mem_regions[i]) - mem_map) + (0)) << 12' be a 64 bit type?
vim +935 drivers/virt/nitro_enclaves/ne_misc_dev.c
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 826
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 827 /**
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 828 * ne_set_user_memory_region_ioctl() - Add user space memory region to the slot
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 829 * associated with the current enclave.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 830 * @ne_enclave : Private data associated with the current enclave.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 831 * @mem_region : User space memory region to be associated with the given slot.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 832 *
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 833 * Context: Process context. This function is called with the ne_enclave mutex held.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 834 * Return:
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 835 * * 0 on success.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 836 * * Negative return value on failure.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 837 */
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 838 static int ne_set_user_memory_region_ioctl(struct ne_enclave *ne_enclave,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 839 struct ne_user_memory_region mem_region)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 840 {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 841 long gup_rc = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 842 unsigned long i = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 843 unsigned long max_nr_pages = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 844 unsigned long memory_size = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 845 struct ne_mem_region *ne_mem_region = NULL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 846 unsigned long nr_phys_contig_mem_regions = 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 847 struct pci_dev *pdev = ne_devs.ne_pci_dev->pdev;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 848 struct page **phys_contig_mem_regions = NULL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 849 int rc = -EINVAL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 850
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 851 rc = ne_sanity_check_user_mem_region(ne_enclave, mem_region);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 852 if (rc < 0)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 853 return rc;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 854
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 855 ne_mem_region = kzalloc(sizeof(*ne_mem_region), GFP_KERNEL);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 856 if (!ne_mem_region)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 857 return -ENOMEM;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 858
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 859 max_nr_pages = mem_region.memory_size / NE_MIN_MEM_REGION_SIZE;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 860
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 861 ne_mem_region->pages = kcalloc(max_nr_pages, sizeof(*ne_mem_region->pages),
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 862 GFP_KERNEL);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 863 if (!ne_mem_region->pages) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 864 rc = -ENOMEM;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 865
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 866 goto free_mem_region;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 867 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 868
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 869 phys_contig_mem_regions = kcalloc(max_nr_pages, sizeof(*phys_contig_mem_regions),
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 870 GFP_KERNEL);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 871 if (!phys_contig_mem_regions) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 872 rc = -ENOMEM;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 873
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 874 goto free_mem_region;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 875 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 876
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 877 do {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 878 i = ne_mem_region->nr_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 879
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 880 if (i == max_nr_pages) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 881 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 882 "Reached max nr of pages in the pages data struct\n");
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 883
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 884 rc = -ENOMEM;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 885
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 886 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 887 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 888
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 889 gup_rc = get_user_pages(mem_region.userspace_addr + memory_size, 1, FOLL_GET,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 890 ne_mem_region->pages + i, NULL);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 891 if (gup_rc < 0) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 892 rc = gup_rc;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 893
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 894 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 895 "Error in get user pages [rc=%d]\n", rc);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 896
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 897 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 898 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 899
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 900 rc = ne_sanity_check_user_mem_region_page(ne_enclave, ne_mem_region->pages[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 901 if (rc < 0)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 902 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 903
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 904 /*
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 905 * TODO: Update once handled non-contiguous memory regions
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 906 * received from user space or contiguous physical memory regions
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 907 * larger than 2 MiB e.g. 8 MiB.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 908 */
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 909 phys_contig_mem_regions[i] = ne_mem_region->pages[i];
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 910
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 911 memory_size += page_size(ne_mem_region->pages[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 912
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 913 ne_mem_region->nr_pages++;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 914 } while (memory_size < mem_region.memory_size);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 915
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 916 /*
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 917 * TODO: Update once handled non-contiguous memory regions received
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 918 * from user space or contiguous physical memory regions larger than
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 919 * 2 MiB e.g. 8 MiB.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 920 */
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 921 nr_phys_contig_mem_regions = ne_mem_region->nr_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 922
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 923 if ((ne_enclave->nr_mem_regions + nr_phys_contig_mem_regions) >
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 924 ne_enclave->max_mem_regions) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 925 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 926 "Reached max memory regions %lld\n",
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 927 ne_enclave->max_mem_regions);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 928
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 929 rc = -NE_ERR_MEM_MAX_REGIONS;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 930
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 931 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 932 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 933
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 934 for (i = 0; i < nr_phys_contig_mem_regions; i++) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 @935 u64 phys_region_addr = page_to_phys(phys_contig_mem_regions[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 936 u64 phys_region_size = page_size(phys_contig_mem_regions[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 937
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 938 if (phys_region_size & (NE_MIN_MEM_REGION_SIZE - 1)) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 939 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 940 "Physical mem region size is not multiple of 2 MiB\n");
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 941
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 942 rc = -EINVAL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 943
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 944 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 945 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 946
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 947 if (!IS_ALIGNED(phys_region_addr, NE_MIN_MEM_REGION_SIZE)) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 948 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 949 "Physical mem region address is not 2 MiB aligned\n");
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 950
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 951 rc = -EINVAL;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 952
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 953 goto put_pages;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 954 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 955 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 956
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 957 ne_mem_region->memory_size = mem_region.memory_size;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 958 ne_mem_region->userspace_addr = mem_region.userspace_addr;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 959
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 960 list_add(&ne_mem_region->mem_region_list_entry, &ne_enclave->mem_regions_list);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 961
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 962 for (i = 0; i < nr_phys_contig_mem_regions; i++) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 963 struct ne_pci_dev_cmd_reply cmd_reply = {};
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 964 struct slot_add_mem_req slot_add_mem_req = {};
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 965
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 966 slot_add_mem_req.slot_uid = ne_enclave->slot_uid;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 967 slot_add_mem_req.paddr = page_to_phys(phys_contig_mem_regions[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 968 slot_add_mem_req.size = page_size(phys_contig_mem_regions[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 969
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 970 rc = ne_do_request(pdev, SLOT_ADD_MEM,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 971 &slot_add_mem_req, sizeof(slot_add_mem_req),
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 972 &cmd_reply, sizeof(cmd_reply));
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 973 if (rc < 0) {
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 974 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 975 "Error in slot add mem [rc=%d]\n", rc);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 976
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 977 kfree(phys_contig_mem_regions);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 978
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 979 /*
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 980 * Exit here without put pages as memory regions may
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 981 * already been added.
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 982 */
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 983 return rc;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 984 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 985
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 986 ne_enclave->mem_size += slot_add_mem_req.size;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 987 ne_enclave->nr_mem_regions++;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 988 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 989
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 990 kfree(phys_contig_mem_regions);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 991
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 992 return 0;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 993
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 994 put_pages:
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 995 for (i = 0; i < ne_mem_region->nr_pages; i++)
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 996 put_page(ne_mem_region->pages[i]);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 997 free_mem_region:
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 998 kfree(phys_contig_mem_regions);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 999 kfree(ne_mem_region->pages);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1000 kfree(ne_mem_region);
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1001
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1002 return rc;
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1003 }
7dc9d4309fdb777 Andra Paraschiv 2020-09-21 1004
:::::: The code at line 935 was first introduced by commit
:::::: 7dc9d4309fdb7773df13a17e203c16966676f21a nitro_enclaves: Add logic for setting an enclave memory region
:::::: TO: Andra Paraschiv <andraprs@amazon.com>
:::::: CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30005 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* drivers/virt/nitro_enclaves/ne_misc_dev.c:935 ne_set_user_memory_region_ioctl() warn: should - mem_map) + (0)) << 12' be a 64 bit
@ 2020-11-16 11:45 kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2020-11-16 11:45 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 15533 bytes --]
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Andra Paraschiv <andraprs@amazon.com>
CC: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
CC: Alexander Graf <graf@amazon.com>
Hi Andra,
First bad commit (maybe != root cause):
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 09162bc32c880a791c6c0668ce0745cf7958f576
commit: 0f5c7b7484394e26afc07c063290fb43c4ba42c7 nitro_enclaves: Add Makefile for the Nitro Enclaves driver
date: 8 weeks ago
:::::: branch date: 11 hours ago
:::::: commit date: 8 weeks ago
config: i386-randconfig-m021-20201116 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
drivers/virt/nitro_enclaves/ne_misc_dev.c:935 ne_set_user_memory_region_ioctl() warn: should '(((phys_contig_mem_regions[i]) - mem_map) + (0)) << 12' be a 64 bit type?
Old smatch warnings:
drivers/virt/nitro_enclaves/ne_misc_dev.c:967 ne_set_user_memory_region_ioctl() warn: should '(((phys_contig_mem_regions[i]) - mem_map) + (0)) << 12' be a 64 bit type?
vim +935 drivers/virt/nitro_enclaves/ne_misc_dev.c
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 826
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 827 /**
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 828 * ne_set_user_memory_region_ioctl() - Add user space memory region to the slot
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 829 * associated with the current enclave.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 830 * @ne_enclave : Private data associated with the current enclave.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 831 * @mem_region : User space memory region to be associated with the given slot.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 832 *
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 833 * Context: Process context. This function is called with the ne_enclave mutex held.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 834 * Return:
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 835 * * 0 on success.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 836 * * Negative return value on failure.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 837 */
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 838 static int ne_set_user_memory_region_ioctl(struct ne_enclave *ne_enclave,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 839 struct ne_user_memory_region mem_region)
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 840 {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 841 long gup_rc = 0;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 842 unsigned long i = 0;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 843 unsigned long max_nr_pages = 0;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 844 unsigned long memory_size = 0;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 845 struct ne_mem_region *ne_mem_region = NULL;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 846 unsigned long nr_phys_contig_mem_regions = 0;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 847 struct pci_dev *pdev = ne_devs.ne_pci_dev->pdev;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 848 struct page **phys_contig_mem_regions = NULL;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 849 int rc = -EINVAL;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 850
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 851 rc = ne_sanity_check_user_mem_region(ne_enclave, mem_region);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 852 if (rc < 0)
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 853 return rc;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 854
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 855 ne_mem_region = kzalloc(sizeof(*ne_mem_region), GFP_KERNEL);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 856 if (!ne_mem_region)
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 857 return -ENOMEM;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 858
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 859 max_nr_pages = mem_region.memory_size / NE_MIN_MEM_REGION_SIZE;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 860
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 861 ne_mem_region->pages = kcalloc(max_nr_pages, sizeof(*ne_mem_region->pages),
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 862 GFP_KERNEL);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 863 if (!ne_mem_region->pages) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 864 rc = -ENOMEM;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 865
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 866 goto free_mem_region;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 867 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 868
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 869 phys_contig_mem_regions = kcalloc(max_nr_pages, sizeof(*phys_contig_mem_regions),
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 870 GFP_KERNEL);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 871 if (!phys_contig_mem_regions) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 872 rc = -ENOMEM;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 873
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 874 goto free_mem_region;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 875 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 876
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 877 do {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 878 i = ne_mem_region->nr_pages;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 879
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 880 if (i == max_nr_pages) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 881 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 882 "Reached max nr of pages in the pages data struct\n");
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 883
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 884 rc = -ENOMEM;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 885
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 886 goto put_pages;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 887 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 888
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 889 gup_rc = get_user_pages(mem_region.userspace_addr + memory_size, 1, FOLL_GET,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 890 ne_mem_region->pages + i, NULL);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 891 if (gup_rc < 0) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 892 rc = gup_rc;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 893
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 894 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 895 "Error in get user pages [rc=%d]\n", rc);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 896
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 897 goto put_pages;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 898 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 899
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 900 rc = ne_sanity_check_user_mem_region_page(ne_enclave, ne_mem_region->pages[i]);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 901 if (rc < 0)
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 902 goto put_pages;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 903
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 904 /*
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 905 * TODO: Update once handled non-contiguous memory regions
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 906 * received from user space or contiguous physical memory regions
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 907 * larger than 2 MiB e.g. 8 MiB.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 908 */
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 909 phys_contig_mem_regions[i] = ne_mem_region->pages[i];
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 910
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 911 memory_size += page_size(ne_mem_region->pages[i]);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 912
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 913 ne_mem_region->nr_pages++;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 914 } while (memory_size < mem_region.memory_size);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 915
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 916 /*
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 917 * TODO: Update once handled non-contiguous memory regions received
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 918 * from user space or contiguous physical memory regions larger than
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 919 * 2 MiB e.g. 8 MiB.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 920 */
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 921 nr_phys_contig_mem_regions = ne_mem_region->nr_pages;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 922
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 923 if ((ne_enclave->nr_mem_regions + nr_phys_contig_mem_regions) >
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 924 ne_enclave->max_mem_regions) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 925 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 926 "Reached max memory regions %lld\n",
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 927 ne_enclave->max_mem_regions);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 928
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 929 rc = -NE_ERR_MEM_MAX_REGIONS;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 930
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 931 goto put_pages;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 932 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 933
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 934 for (i = 0; i < nr_phys_contig_mem_regions; i++) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 @935 u64 phys_region_addr = page_to_phys(phys_contig_mem_regions[i]);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 936 u64 phys_region_size = page_size(phys_contig_mem_regions[i]);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 937
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 938 if (phys_region_size & (NE_MIN_MEM_REGION_SIZE - 1)) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 939 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 940 "Physical mem region size is not multiple of 2 MiB\n");
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 941
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 942 rc = -EINVAL;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 943
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 944 goto put_pages;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 945 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 946
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 947 if (!IS_ALIGNED(phys_region_addr, NE_MIN_MEM_REGION_SIZE)) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 948 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 949 "Physical mem region address is not 2 MiB aligned\n");
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 950
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 951 rc = -EINVAL;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 952
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 953 goto put_pages;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 954 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 955 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 956
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 957 ne_mem_region->memory_size = mem_region.memory_size;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 958 ne_mem_region->userspace_addr = mem_region.userspace_addr;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 959
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 960 list_add(&ne_mem_region->mem_region_list_entry, &ne_enclave->mem_regions_list);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 961
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 962 for (i = 0; i < nr_phys_contig_mem_regions; i++) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 963 struct ne_pci_dev_cmd_reply cmd_reply = {};
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 964 struct slot_add_mem_req slot_add_mem_req = {};
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 965
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 966 slot_add_mem_req.slot_uid = ne_enclave->slot_uid;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 967 slot_add_mem_req.paddr = page_to_phys(phys_contig_mem_regions[i]);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 968 slot_add_mem_req.size = page_size(phys_contig_mem_regions[i]);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 969
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 970 rc = ne_do_request(pdev, SLOT_ADD_MEM,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 971 &slot_add_mem_req, sizeof(slot_add_mem_req),
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 972 &cmd_reply, sizeof(cmd_reply));
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 973 if (rc < 0) {
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 974 dev_err_ratelimited(ne_misc_dev.this_device,
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 975 "Error in slot add mem [rc=%d]\n", rc);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 976
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 977 kfree(phys_contig_mem_regions);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 978
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 979 /*
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 980 * Exit here without put pages as memory regions may
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 981 * already been added.
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 982 */
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 983 return rc;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 984 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 985
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 986 ne_enclave->mem_size += slot_add_mem_req.size;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 987 ne_enclave->nr_mem_regions++;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 988 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 989
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 990 kfree(phys_contig_mem_regions);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 991
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 992 return 0;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 993
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 994 put_pages:
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 995 for (i = 0; i < ne_mem_region->nr_pages; i++)
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 996 put_page(ne_mem_region->pages[i]);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 997 free_mem_region:
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 998 kfree(phys_contig_mem_regions);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 999 kfree(ne_mem_region->pages);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 1000 kfree(ne_mem_region);
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 1001
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 1002 return rc;
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 1003 }
7dc9d4309fdb77 Andra Paraschiv 2020-09-21 1004
:::::: The code at line 935 was first introduced by commit
:::::: 7dc9d4309fdb7773df13a17e203c16966676f21a nitro_enclaves: Add logic for setting an enclave memory region
:::::: TO: Andra Paraschiv <andraprs@amazon.com>
:::::: CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 36696 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-12-27 18:25 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-28 9:57 drivers/virt/nitro_enclaves/ne_misc_dev.c:935 ne_set_user_memory_region_ioctl() warn: should - mem_map) + (0)) << 12' be a 64 bit kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2020-12-27 18:25 kernel test robot
2020-11-16 11:45 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.