Skip to content

Commit 32c706a

Browse files
kalyazinzulinx86
authored andcommitted
chore(linux_patches): revert the srcu optimisation
We observed that it introduced a regression to the first call to KVM_CREATE_VCPU of ~20 ms in both booted and restored VMs. We are reverting the patch until we find a solution upstream. Signed-off-by: Nikita Kalyazin <kalyazin@amazon.com>
1 parent 5ab6949 commit 32c706a

1 file changed

Lines changed: 68 additions & 0 deletions

File tree

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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

Comments
 (0)