ke/timer: make DPC parameter explicit

This commit is contained in:
Loïc Grégoire
2026-08-01 22:43:32 -04:00
parent 00d69c4a18
commit 02d2fb5144
9 changed files with 28 additions and 12 deletions
+10 -2
View File
@@ -111,13 +111,21 @@ fn dispatch_queue(cpu: u32) void {
}
if (sched_cpu.start_timer) {
ke.timer.set(&sched_cpu.resched_timer, std.time.ns_per_ms * config.sched_timeslice, &sched_cpu.resched_dpc);
ke.timer.set(
&sched_cpu.resched_timer,
std.time.ns_per_ms * config.sched_timeslice,
.{ .dpc = &sched_cpu.resched_dpc },
);
}
if (sched_cpu.preemption_reason == .HigherPriority) {
// Reload the quantum for the new thread.
ke.timer.cancel(&sched_cpu.resched_timer);
ke.timer.set(&sched_cpu.resched_timer, std.time.ns_per_ms * config.sched_timeslice, &sched_cpu.resched_dpc);
ke.timer.set(
&sched_cpu.resched_timer,
std.time.ns_per_ms * config.sched_timeslice,
.{ .dpc = &sched_cpu.resched_dpc },
);
}
sched_cpu.start_timer = false;
+6 -2
View File
@@ -683,7 +683,11 @@ comptime {
/// Called on CPU 0 to initialize load balancing mechanisms.
pub fn late_init() linksection(r.init) void {
balance_timer.init();
ke.timer.set(&balance_timer, balance_interval * std.time.ns_per_ms, &balance_dpc);
ke.timer.set(
&balance_timer,
balance_interval * std.time.ns_per_ms,
.{ .dpc = &balance_dpc },
);
}
fn calendar_queue_increment(cpu: *PerCpu) void {
@@ -1451,5 +1455,5 @@ fn balance(_: *ke.Dpc, _: ?*anyopaque) void {
const offset = lcg.next() % balance_interval;
const ms = (balance_interval) + offset;
ke.timer.set(&balance_timer, ms * std.time.ns_per_ms, &balance_dpc);
ke.timer.set(&balance_timer, ms * std.time.ns_per_ms, .{ .dpc = &balance_dpc });
}
+6 -2
View File
@@ -58,9 +58,13 @@ const percpu = ke.CpuLocal(PerCpu, .{
.dpc = .init(handle_expiry),
});
const Options = struct {
dpc: ?*ke.Dpc = null,
};
/// Start a timer with an expiration time.
/// A DPC that will be enqueued upon expiration can be passed.
pub fn set(timer: *Timer, time: r.Nanoseconds, dpc: ?*ke.Dpc) void {
pub fn set(timer: *Timer, time: r.Nanoseconds, opts: Options) void {
const ipl = timer.hdr.lock.acquire();
defer timer.hdr.lock.release(ipl);
@@ -78,7 +82,7 @@ pub fn set(timer: *Timer, time: r.Nanoseconds, dpc: ?*ke.Dpc) void {
timer.deadline = ke.time.read_time() + time;
timer.cpu = cpu;
timer.dpc = dpc;
timer.dpc = opts.dpc;
timer.hdr.signaled = 0;
cpu.timers.insert(&timer.node);