All of lore.kernel.org
 help / color / mirror / Atom feed
* 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.