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…
Reference in New Issue
Block a user