18da2a883SGabriele Monaco // SPDX-License-Identifier: GPL-2.0 28da2a883SGabriele Monaco #include <linux/kernel.h> 38da2a883SGabriele Monaco #include <linux/rv.h> 48da2a883SGabriele Monaco #include <rv/kunit.h> 58da2a883SGabriele Monaco #include <trace/events/sched.h> 68da2a883SGabriele Monaco #include "nomiss_kunit.h" 78da2a883SGabriele Monaco 88da2a883SGabriele Monaco #if IS_REACHABLE(CONFIG_RV_MON_NOMISS) 98da2a883SGabriele Monaco 108da2a883SGabriele Monaco static void rv_test_nomiss(struct kunit *test) 118da2a883SGabriele Monaco { 128da2a883SGabriele Monaco struct task_struct *target = rv_kunit_alloc_mock_task(test); 138da2a883SGabriele Monaco struct task_struct *other = rv_kunit_alloc_mock_task(test); 148da2a883SGabriele Monaco struct rv_kunit_ctx *ctx = test->priv; 158da2a883SGabriele Monaco 168da2a883SGabriele Monaco prepare_test(test, &rv_nomiss_ops.mon); 178da2a883SGabriele Monaco 188da2a883SGabriele Monaco target->pid = 99; 198da2a883SGabriele Monaco target->policy = SCHED_DEADLINE; 208da2a883SGabriele Monaco target->dl.runtime = 10000; 218da2a883SGabriele Monaco target->dl.dl_deadline = 20000; 228da2a883SGabriele Monaco 238da2a883SGabriele Monaco rv_nomiss_ops.handle_newtask(NULL, target, 0); 248da2a883SGabriele Monaco 258da2a883SGabriele Monaco /* Task gets preempted and can't terminate before deadline */ 268da2a883SGabriele Monaco rv_nomiss_ops.handle_sched_switch(NULL, 0, other, target, TASK_RUNNING); 278da2a883SGabriele Monaco rv_nomiss_ops.handle_dl_replenish(NULL, &target->dl, 0, DL_TASK); 288da2a883SGabriele Monaco udelay(10); 298da2a883SGabriele Monaco rv_nomiss_ops.handle_sched_switch(NULL, 0, target, other, TASK_RUNNING); 308da2a883SGabriele Monaco RV_KUNIT_EXPECT_REACTION_HERE(test, ctx) { 31*78509511SGabriele Monaco udelay(15 + div_u64(*rv_nomiss_ops.deadline_thresh, 1000)); 328da2a883SGabriele Monaco rv_nomiss_ops.handle_sched_switch(NULL, 0, other, target, TASK_RUNNING); 338da2a883SGabriele Monaco } 348da2a883SGabriele Monaco } 358da2a883SGabriele Monaco 368da2a883SGabriele Monaco #else 378da2a883SGabriele Monaco #define rv_test_nomiss rv_test_stub 388da2a883SGabriele Monaco #endif 39