# git rev-parse -q --verify 11f5acce2fa43b015a8120fa7620fa4efd0a2952^{commit} 11f5acce2fa43b015a8120fa7620fa4efd0a2952 already have revision, skipping fetch # git checkout -q -f -B kisskb 11f5acce2fa43b015a8120fa7620fa4efd0a2952 # git clean -qxdf # < git log -1 # commit 11f5acce2fa43b015a8120fa7620fa4efd0a2952 # Author: Alexey Kardashevskiy # Date: Wed Feb 13 14:38:18 2019 +1100 # # powerpc/powernv/ioda: Fix locked_vm counting for memory used by IOMMU tables # # We store 2 multilevel tables in iommu_table - one for the hardware and # one with the corresponding userspace addresses. Before allocating # the tables, the iommu_table_group_ops::get_table_size() hook returns # the combined size of the two and VFIO SPAPR TCE IOMMU driver adjusts # the locked_vm counter correctly. When the table is actually allocated, # the amount of allocated memory is stored in iommu_table::it_allocated_size # and used to decrement the locked_vm counter when we release the memory # used by the table; .get_table_size() and .create_table() calculate it # independently but the result is expected to be the same. # # However the allocator does not add the userspace table size to # .it_allocated_size so when we destroy the table because of VFIO PCI # unplug (i.e. VFIO container is gone but the userspace keeps running), # we decrement locked_vm by just a half of size of memory we are # releasing. # # To make things worse, since we enabled on-demand allocation of # indirect levels, it_allocated_size contains only the amount of memory # actually allocated at the table creation time which can just be a # fraction. It is not a problem with incrementing locked_vm (as # get_table_size() value is used) but it is with decrementing. # # As the result, we leak locked_vm and may not be able to allocate more # IOMMU tables after few iterations of hotplug/unplug. # # This sets it_allocated_size in the pnv_pci_ioda2_ops::create_table() # hook to what pnv_pci_ioda2_get_table_size() returns so from now on we # have a single place which calculates the maximum memory a table can # occupy. The original meaning of it_allocated_size is somewhat lost now # though. # # We do not ditch it_allocated_size whatsoever here and we do not call # get_table_size() from vfio_iommu_spapr_tce.c when decrementing # locked_vm as we may have multiple IOMMU groups per container and even # though they all are supposed to have the same get_table_size() # implementation, there is a small chance for failure or confusion. # # Fixes: 090bad39b237 ("powerpc/powernv: Add indirect levels to it_userspace") # Signed-off-by: Alexey Kardashevskiy # Reviewed-by: David Gibson # Signed-off-by: Michael Ellerman # < /opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux-gcc --version # < /opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux-ld --version # < git log --format=%s --max-count=1 11f5acce2fa43b015a8120fa7620fa4efd0a2952 # < make -s -j 10 ARCH=powerpc O=/kisskb/build/powerpc-next_44x_akebono_defconfig_powerpc-gcc4.6 CROSS_COMPILE=/opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux- 44x/akebono_defconfig # make -s -j 10 ARCH=powerpc O=/kisskb/build/powerpc-next_44x_akebono_defconfig_powerpc-gcc4.6 CROSS_COMPILE=/opt/cross/kisskb/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux- /kisskb/src/fs/proc/inode.c: In function 'proc_reg_open': /kisskb/src/include/linux/list.h:65:12: warning: 'pdeo' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/proc/inode.c:339:21: note: 'pdeo' was declared here /kisskb/src/drivers/base/regmap/regmap.c: In function 'regmap_raw_read': /kisskb/src/drivers/base/regmap/regmap.c:2594:6: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/base/regmap/regmap.c: In function '_regmap_raw_write': /kisskb/src/drivers/base/regmap/regmap.c:1855:6: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/kernel/printk/printk.c: In function 'devkmsg_sysctl_set_loglvl': /kisskb/src/kernel/printk/printk.c:186:16: warning: 'old' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/kernel/rcu/srcutree.c: In function 'init_srcu_struct_fields': /kisskb/src/kernel/rcu/srcutree.c:152:32: warning: 'levelspread[]' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/kernel/rcu/srcutree.c:100:6: note: 'levelspread[]' was declared here /kisskb/src/kernel/trace/trace_dynevent.c: In function 'create_dyn_event': /kisskb/src/kernel/trace/trace_dynevent.c:89:5: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/i2c/i2c-core-base.c: In function 'i2c_generic_scl_recovery': /kisskb/src/drivers/i2c/i2c-core-base.c:235:5: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/tty/serial/8250/8250_core.c: In function 'univ8250_release_irq': /kisskb/src/drivers/tty/serial/8250/8250_core.c:247:18: warning: 'i' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/tty/serial/8250/8250_core.c:227:19: note: 'i' was declared here /kisskb/src/arch/powerpc/boot/dts/akebono.dts:251.28-289.5: Warning (pci_bridge): /plb/pciex@10100000000: node name is not "pci" or "pcie" /kisskb/src/arch/powerpc/boot/dts/akebono.dts:291.28-329.5: Warning (pci_bridge): /plb/pciex@20100000000: node name is not "pci" or "pcie" /kisskb/src/arch/powerpc/boot/dts/akebono.dts:331.28-369.5: Warning (pci_bridge): /plb/pciex@18100000000: node name is not "pci" or "pcie" /kisskb/src/arch/powerpc/boot/dts/akebono.dts:371.28-409.5: Warning (pci_bridge): /plb/pciex@28100000000: node name is not "pci" or "pcie" arch/powerpc/boot/dts/akebono.dtb: Warning (pci_device_bus_num): Failed prerequisite 'pci_bridge' Completed OK # rm -rf /kisskb/build/powerpc-next_44x_akebono_defconfig_powerpc-gcc4.6 # Build took: 0:00:59.426723