vfio, spapr: Fix levels calculation
The existing tries to round up the number of pages but @pages is always calculated as the rounded up value minus one which makes ctz64() always return 0 and have create.levels always set 1. This removes wrong "-1" and allows having more than 1 levels. This becomes handy for >128GB guests with standard 64K pages as this requires blocks with zone order 9 and the popular limit of CONFIG_FORCE_MAX_ZONEORDER=9 means that only blocks up to order 8 are allowed. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
		
							parent
							
								
									9ba255365e
								
							
						
					
					
						commit
						e100161b69
					
				| @ -163,7 +163,7 @@ int vfio_spapr_create_window(VFIOContainer *container, | ||||
|      */ | ||||
|     entries = create.window_size >> create.page_shift; | ||||
|     pages = MAX((entries * sizeof(uint64_t)) / getpagesize(), 1); | ||||
|     pages = MAX(pow2ceil(pages) - 1, 1); /* Round up */ | ||||
|     pages = MAX(pow2ceil(pages), 1); /* Round up */ | ||||
|     create.levels = ctz64(pages) / 6 + 1; | ||||
| 
 | ||||
|     ret = ioctl(container->fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alexey Kardashevskiy
						Alexey Kardashevskiy