@samitouri / QOSamiQemu / commits / 815f0e916b

kvm/i8254: refactor pit initialization into a helper

The initialization code will be used again by VM file descriptor change notifier callback in a subsequent change. So refactor common code into a new helper function. Signed-off-by: Ani Sinha <anisinha@redhat.com> Link: https://lore.kernel.org/r/20260225035000.385950-25-anisinha@redhat.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Ani Sinha committed Feb 25, 2026 at 09:19 UTC 815f0e916b059ee195c96d6df926bdd1d627afe0
1 file changed +38 -30
hw/i386/kvm/i8254.c
+38 -30
@@ -60,6 +60,43 @@ struct KVMPITClass {
60 DeviceRealize parent_realize;
61 };
62
63 +static void do_pit_initialize(KVMPITState *s, Error **errp)
64 +{
65 + struct kvm_pit_config config = {
66 + .flags = 0,
67 + };
68 + int ret;
69 +
70 + ret = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT2, &config);
71 + if (ret < 0) {
72 + error_setg(errp, "Create kernel PIC irqchip failed: %s",
73 + strerror(-ret));
74 + return;
75 + }
76 + switch (s->lost_tick_policy) {
77 + case LOST_TICK_POLICY_DELAY:
78 + break; /* enabled by default */
79 + case LOST_TICK_POLICY_DISCARD:
80 + if (kvm_check_extension(kvm_state, KVM_CAP_REINJECT_CONTROL)) {
81 + struct kvm_reinject_control control = { .pit_reinject = 0 };
82 +
83 + ret = kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control);
84 + if (ret < 0) {
85 + error_setg(errp,
86 + "Can't disable in-kernel PIT reinjection: %s",
87 + strerror(-ret));
88 + return;
89 + }
90 + }
91 + break;
92 + default:
93 + error_setg(errp, "Lost tick policy not supported.");
94 + return;
95 + }
96 +
97 + return;
98 +}
99 +
100 static void kvm_pit_update_clock_offset(KVMPITState *s)
101 {
102 int64_t offset, clock_offset;
@@ -241,42 +278,13 @@ static void kvm_pit_realizefn(DeviceState *dev, Error **errp)
278 PITCommonState *pit = PIT_COMMON(dev);
279 KVMPITClass *kpc = KVM_PIT_GET_CLASS(dev);
280 KVMPITState *s = KVM_PIT(pit);
244 - struct kvm_pit_config config = {
245 - .flags = 0,
246 - };
247 - int ret;
281
282 if (!kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2) ||
283 !kvm_check_extension(kvm_state, KVM_CAP_PIT2)) {
284 error_setg(errp, "In-kernel PIT not available");
285 }
286
254 - ret = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT2, &config);
255 - if (ret < 0) {
256 - error_setg(errp, "Create kernel PIC irqchip failed: %s",
257 - strerror(-ret));
258 - return;
259 - }
260 - switch (s->lost_tick_policy) {
261 - case LOST_TICK_POLICY_DELAY:
262 - break; /* enabled by default */
263 - case LOST_TICK_POLICY_DISCARD:
264 - if (kvm_check_extension(kvm_state, KVM_CAP_REINJECT_CONTROL)) {
265 - struct kvm_reinject_control control = { .pit_reinject = 0 };
266 -
267 - ret = kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control);
268 - if (ret < 0) {
269 - error_setg(errp,
270 - "Can't disable in-kernel PIT reinjection: %s",
271 - strerror(-ret));
272 - return;
273 - }
274 - }
275 - break;
276 - default:
277 - error_setg(errp, "Lost tick policy not supported.");
278 - return;
279 - }
287 + do_pit_initialize(s, errp);
288
289 memory_region_init_io(&pit->ioports, OBJECT(dev), NULL, NULL, "kvm-pit", 4);
290