*/
        svm_ir_list_del(irqfd);
 
-       /**
-        * Here, we setup with legacy mode in the following cases:
-        * 1. When cannot target interrupt to a specific vcpu.
-        * 2. Unsetting posted interrupt.
-        * 3. APIC virtualization is disabled for the vcpu.
-        * 4. IRQ has incompatible delivery mode (SMI, INIT, etc)
-        */
-       if (vcpu && kvm_vcpu_apicv_active(vcpu)) {
+       if (vcpu) {
                /*
-                * Try to enable guest_mode in IRTE.
+                * Try to enable guest_mode in IRTE, unless AVIC is inhibited,
+                * in which case configure the IRTE for legacy mode, but track
+                * the IRTE metadata so that it can be converted to guest mode
+                * if AVIC is enabled/uninhibited in the future.
                 */
                struct amd_iommu_pi_data pi_data = {
                        .ga_tag = AVIC_GATAG(to_kvm_svm(kvm)->avic_vm_id,
                                             vcpu->vcpu_id),
-                       .is_guest_mode = true,
+                       .is_guest_mode = kvm_vcpu_apicv_active(vcpu),
                        .vapic_addr = avic_get_backing_page_address(to_svm(vcpu)),
                        .vector = vector,
                };
 
                ir_data->ga_root_ptr = (pi_data->vapic_addr >> 12);
                ir_data->ga_vector = pi_data->vector;
                ir_data->ga_tag = pi_data->ga_tag;
-               ret = amd_iommu_activate_guest_mode(ir_data, pi_data->cpu);
+               if (pi_data->is_guest_mode)
+                       ret = amd_iommu_activate_guest_mode(ir_data, pi_data->cpu);
+               else
+                       ret = amd_iommu_deactivate_guest_mode(ir_data);
        } else {
                ret = amd_iommu_deactivate_guest_mode(ir_data);
        }