CC: kbuild-all(a)lists.01.org CC: linux-kernel(a)vger.kernel.org TO: Andra Paraschiv CC: "Greg Kroah-Hartman" CC: Alexander Graf 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 Reported-by: Dan Carpenter 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 :::::: CC: Greg Kroah-Hartman --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org