IOMMU Fixes for Linux v5.9-rc5

Two fixes for the AMD IOMMU driver:
 
 	- Fix a potential NULL-ptr dereference found by smatch
 
 	- Fix interrupt remapping when a device is assigned to a guest
 	  and AVIC is enabled.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEr9jSbILcajRFYWYyK/BELZcBGuMFAl9kyyMACgkQK/BELZcB
 GuP7DxAAwAI1KbHUQCJC7pbxpl6w/oTZ/AZeKP2v+2ULuMsZEUPyBEM9GsHi1caV
 7KJI95LqHm+2kky2pHvNZn5EblfjX7SBdbaLcoCaYpRl17FctE/cJJCTYp+dHR3q
 TaTFiMUhLTx4mgTNBJ5SynAVM6kPV3sPT4x5Kz8OowufmYZFxI9c4zx76vVl5gjT
 WD/2R23wADMYbFqW90Ct3ltSUWmyn0iimv7gRe/Zh2dtjYmDqjMMHlfMj1HAONXk
 /KyRywKbnSLFbaFCR4jtSVqtrodAQUoqAzg8jqcfmOL9t/k0N9tteJW0gDAGD7Uu
 evjl+zciR9Me7uJQv1xXE1+8kyyDZV5WMlRTR3ChWWdsPDvyd5TR9aMt1PP2Mn/0
 AxAGkIvCgmKb3SpM4AI3BtvXo/+NhZs+s07k4UAVQibkXPE82GhyPktyleSrEQiL
 qnOmo9i/1q53P1Pv8UI5PQovtATvRPq5SzUgAN3wi9n8RtiEmnJ7v9R3NGcdvMwy
 LV+X9sVSjmYt3cOfGBA0sJJjrlgDQsYM3P7kmidL8I5lzZ9TzFIcDkAf1t1oSmQI
 cCY4BR8kjenn6OmxABrnLc9cpr3QV3BcqOcoin0BkaBaY3KNUOgbsQHaLbxUBiQv
 kT05susDwN0u81ERBOcpzw08xFZsRJ6omGQ4ygvO+N9fHcpaHVs=
 =1jaf
 -----END PGP SIGNATURE-----

Merge tag 'iommu-fixes-v5.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu

Pull iommu fixes from Joerg Roedel:
 "Two fixes for the AMD IOMMU driver:

   - Fix a potential NULL-ptr dereference found by smatch

   - Fix interrupt remapping when a device is assigned to a guest and
     AVIC is enabled"

* tag 'iommu-fixes-v5.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
  iommu/amd: Restore IRTE.RemapEn bit for amd_iommu_activate_guest_mode
  iommu/amd: Fix potential @entry null deref
This commit is contained in:
Linus Torvalds 2020-09-18 11:20:34 -07:00
commit 1fd79656f7

View File

@ -3840,14 +3840,18 @@ int amd_iommu_activate_guest_mode(void *data)
{
struct amd_ir_data *ir_data = (struct amd_ir_data *)data;
struct irte_ga *entry = (struct irte_ga *) ir_data->entry;
u64 valid;
if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) ||
!entry || entry->lo.fields_vapic.guest_mode)
return 0;
valid = entry->lo.fields_vapic.valid;
entry->lo.val = 0;
entry->hi.val = 0;
entry->lo.fields_vapic.valid = valid;
entry->lo.fields_vapic.guest_mode = 1;
entry->lo.fields_vapic.ga_log_intr = 1;
entry->hi.fields.ga_root_ptr = ir_data->ga_root_ptr;
@ -3864,12 +3868,14 @@ int amd_iommu_deactivate_guest_mode(void *data)
struct amd_ir_data *ir_data = (struct amd_ir_data *)data;
struct irte_ga *entry = (struct irte_ga *) ir_data->entry;
struct irq_cfg *cfg = ir_data->cfg;
u64 valid = entry->lo.fields_remap.valid;
u64 valid;
if (!AMD_IOMMU_GUEST_IR_VAPIC(amd_iommu_guest_ir) ||
!entry || !entry->lo.fields_vapic.guest_mode)
return 0;
valid = entry->lo.fields_remap.valid;
entry->lo.val = 0;
entry->hi.val = 0;