On 08/12/2014 11:17 AM, David Gibson wrote: > On Thu, Jul 31, 2014 at 07:34:06PM +1000, Alexey Kardashevskiy wrote: >> The existing KVM_CREATE_SPAPR_TCE ioctl only support 4G windows max. >> We are going to add huge DMA windows support so this will create small >> window and unexpectedly fail later. > > I'm not entirely clear on what you're saying here. Are you saying > that the kernel interface silently truncates a window > 4G, rather > than failing? > > If so, that's a kernel bug which should be addressed - obviously we'd > still need this as a workaround for older kernels, but it should be > treated as a workaround, not as the real fix.
This is an RFC patchset and I have a KVM_CREATE_SPAPR_TCE_64 patch for kernel but since we are still thinking whether to allocate these tables in the userspace or not, I have not posted it. >> This disables KVM_CREATE_SPAPR_TCE for windows bigger that 4GB. Since >> those windows are normally mapped at the boot time, there will be no >> performance impact. >> >> Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> >> --- >> hw/ppc/spapr_iommu.c | 6 +++--- >> 1 file changed, 3 insertions(+), 3 deletions(-) >> >> diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c >> index f6e32a4..36f5d27 100644 >> --- a/hw/ppc/spapr_iommu.c >> +++ b/hw/ppc/spapr_iommu.c >> @@ -113,11 +113,11 @@ static MemoryRegionIOMMUOps spapr_iommu_ops = { >> static int spapr_tce_table_realize(DeviceState *dev) >> { >> sPAPRTCETable *tcet = SPAPR_TCE_TABLE(dev); >> + uint64_t window_size = tcet->nb_table << tcet->page_shift; >> >> - if (kvm_enabled()) { >> + if (kvm_enabled() && !(window_size >> 32)) { >> tcet->table = kvmppc_create_spapr_tce(tcet->liobn, >> - tcet->nb_table << >> - tcet->page_shift, >> + window_size, >> &tcet->fd, >> tcet->vfio_accel); >> } > -- Alexey