|
| 1 | +From 505a15593e6d4101fb42a800992d79abd0664816 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Nikita Kalyazin <kalyazin@amazon.com> |
| 3 | +Date: Mon, 9 Feb 2026 16:35:56 +0000 |
| 4 | +Subject: [PATCH] Revert "KVM: Avoid synchronize_srcu() in |
| 5 | + kvm_io_bus_register_dev()" |
| 6 | + |
| 7 | +This reverts commit 7d9a0273c45962e9a6bc06f3b87eef7c431c1853. |
| 8 | + |
| 9 | +The commit introduced a KVM_CREATE_VCPU regression where the first call |
| 10 | +was taking ~20 ms. |
| 11 | + |
| 12 | +Signed-off-by: Nikita Kalyazin <kalyazin@amazon.com> |
| 13 | +--- |
| 14 | + include/linux/kvm_host.h | 1 - |
| 15 | + virt/kvm/kvm_main.c | 11 ++--------- |
| 16 | + 2 files changed, 2 insertions(+), 10 deletions(-) |
| 17 | + |
| 18 | +diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h |
| 19 | +index 4e8b94243ac4..5f0fa6908ee3 100644 |
| 20 | +--- a/include/linux/kvm_host.h |
| 21 | ++++ b/include/linux/kvm_host.h |
| 22 | +@@ -208,7 +208,6 @@ struct kvm_io_range { |
| 23 | + struct kvm_io_bus { |
| 24 | + int dev_count; |
| 25 | + int ioeventfd_count; |
| 26 | +- struct rcu_head rcu; |
| 27 | + struct kvm_io_range range[]; |
| 28 | + }; |
| 29 | + |
| 30 | +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
| 31 | +index a634e8f59ccc..3190b4fdf2e4 100644 |
| 32 | +--- a/virt/kvm/kvm_main.c |
| 33 | ++++ b/virt/kvm/kvm_main.c |
| 34 | +@@ -1323,7 +1323,6 @@ static void kvm_destroy_vm(struct kvm *kvm) |
| 35 | + kvm_free_memslots(kvm, &kvm->__memslots[i][1]); |
| 36 | + } |
| 37 | + cleanup_srcu_struct(&kvm->irq_srcu); |
| 38 | +- srcu_barrier(&kvm->srcu); |
| 39 | + cleanup_srcu_struct(&kvm->srcu); |
| 40 | + #ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES |
| 41 | + xa_destroy(&kvm->mem_attr_array); |
| 42 | +@@ -5982,13 +5981,6 @@ int kvm_io_bus_read(struct kvm_vcpu *vcpu, enum kvm_bus bus_idx, gpa_t addr, |
| 43 | + } |
| 44 | + EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_io_bus_read); |
| 45 | + |
| 46 | +-static void __free_bus(struct rcu_head *rcu) |
| 47 | +-{ |
| 48 | +- struct kvm_io_bus *bus = container_of(rcu, struct kvm_io_bus, rcu); |
| 49 | +- |
| 50 | +- kfree(bus); |
| 51 | +-} |
| 52 | +- |
| 53 | + int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, |
| 54 | + int len, struct kvm_io_device *dev) |
| 55 | + { |
| 56 | +@@ -6027,7 +6019,8 @@ int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, |
| 57 | + memcpy(new_bus->range + i + 1, bus->range + i, |
| 58 | + (bus->dev_count - i) * sizeof(struct kvm_io_range)); |
| 59 | + rcu_assign_pointer(kvm->buses[bus_idx], new_bus); |
| 60 | +- call_srcu(&kvm->srcu, &bus->rcu, __free_bus); |
| 61 | ++ synchronize_srcu_expedited(&kvm->srcu); |
| 62 | ++ kfree(bus); |
| 63 | + |
| 64 | + return 0; |
| 65 | + } |
| 66 | +-- |
| 67 | +2.50.1 |
| 68 | + |
0 commit comments