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