IOMMU Fixes for Linux v4.13-rc6

Another fix, this time in common IOMMU sysfs code

	- In the conversion from the old iommu sysfs-code to the
	  iommu_device_register interface, I missed to update the
	  release path for the struct device associated with an IOMMU.
	  It freed the 'struct device', which was a pointer before, but
	  is now embedded in another struct. Freeing from the middle of
	  allocated memory had all kinds of nasty side effects when an
	  IOMMU was unplugged. Unfortunatly nobody unplugged and IOMMU
	  until now, so this was not discovered earlier.  The fix is to
	  make the 'struct device' a pointer again.
iommu: Fix wrong freeing of iommu_device->dev

The struct iommu_device has a 'struct device' embedded into
it, not as a pointer, but the whole struct. In the
conversion of the iommu drivers to use struct iommu_device
it was forgotten that the relase function for that struct
device simply calls kfree() on the pointer.

This frees memory that was never allocated and causes memory
corruption.

To fix this issue, use a pointer to struct device instead of
embedding the whole struct. This needs some updates in the
iommu sysfs code as well as the Intel VT-d and AMD IOMMU
driver.

Reported-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Fixes: 39ab9555c241 ('iommu: Add sysfs bindings for struct iommu_device')
Cc: stable@vger.kernel.org # >= v4.11
Signed-off-by: Joerg Roedel <jroedel@suse.de>
4 files changed