scheduling: Create a secondary sandbox scheduling domain

This updates the kernel configs to setup two domains instead of one,
and also defines a bare-bones domain scheduler that simply round-
robins through the domains.

Bug: 238811077
Change-Id: Ibb49f10265c38dc26235fc246f6147b306055bcb
GitOrigin-RevId: 6b17211d8866bec9207f78dc61c4840c6da9537d
This commit is contained in:
June Tate-Gans 2022-07-20 16:34:10 -05:00 committed by Sam Leffler
parent ce1543c466
commit be8c32c874
7 changed files with 47 additions and 2 deletions

View File

@ -18,6 +18,7 @@ use kata_memory_interface::ObjDesc;
use kata_memory_interface::ObjDescBundle; use kata_memory_interface::ObjDescBundle;
use kata_os_common::copyregion::CopyRegion; use kata_os_common::copyregion::CopyRegion;
use kata_os_common::cspace_slot::CSpaceSlot; use kata_os_common::cspace_slot::CSpaceSlot;
use kata_os_common::scheduling::Domain;
use kata_os_common::sel4_sys; use kata_os_common::sel4_sys;
use kata_proc_interface::Bundle; use kata_proc_interface::Bundle;
use kata_proc_interface::BundleImage; use kata_proc_interface::BundleImage;
@ -174,7 +175,7 @@ pub struct seL4BundleImpl {
cap_tcb: CSpaceSlot, cap_tcb: CSpaceSlot,
affinity: seL4_Word, // CPU affinity affinity: seL4_Word, // CPU affinity
domain: seL4_Word, // Scheduling domain domain: Domain, // Scheduling domain
tcb_name: String, tcb_name: String,
tcb_max_priority: seL4_Word, tcb_max_priority: seL4_Word,
@ -292,7 +293,7 @@ impl seL4BundleImpl {
first_page: first_vaddr / PAGE_SIZE, first_page: first_vaddr / PAGE_SIZE,
affinity: 0, // CPU 0 affinity: 0, // CPU 0
domain: 0, // XXX share scheduling domain with system services for now domain: Domain::AppSandbox,
tcb_name: bundle.app_id.clone(), tcb_name: bundle.app_id.clone(),
tcb_max_priority: 254, // TODO(sleffler): guess tcb_max_priority: 254, // TODO(sleffler): guess

View File

@ -16,5 +16,6 @@ cspace-slot = { path = "src/cspace-slot" }
logger = { path = "src/logger" } logger = { path = "src/logger" }
model = { path = "src/model" } model = { path = "src/model" }
panic = { path = "src/panic" } panic = { path = "src/panic" }
scheduling = { path = "src/scheduling" }
sel4-sys = { path = "src/sel4-sys" } sel4-sys = { path = "src/sel4-sys" }
slot-allocator = { path = "src/slot-allocator" } slot-allocator = { path = "src/slot-allocator" }

View File

@ -11,5 +11,6 @@ pub extern crate cspace_slot;
pub extern crate logger; pub extern crate logger;
pub extern crate model; pub extern crate model;
pub extern crate panic; pub extern crate panic;
pub extern crate scheduling;
pub extern crate sel4_sys; pub extern crate sel4_sys;
pub extern crate slot_allocator; pub extern crate slot_allocator;

View File

@ -0,0 +1,3 @@
[package]
name = "scheduling"
version = "0.1.0"

View File

@ -0,0 +1,14 @@
//! Kata OS seL4 scheduling primitives
#![no_std]
/// Scheduling domains configured for seL4 TCBs.
///
/// Currently we have this setup as a pair of domains, one for the system
/// components and another for the third party application sandbox.
///
#[derive(Debug, Eq, PartialEq, Copy, Clone)]
pub enum Domain {
System = 0,
AppSandbox,
}

View File

@ -13,3 +13,6 @@ set(LibUtilsDefaultZfLogLevel 5 CACHE STRING "seL4 internal logging level (0-5).
set(SIMULATION ON CACHE BOOL "Whether to build simulate script") set(SIMULATION ON CACHE BOOL "Whether to build simulate script")
set(RELEASE OFF CACHE BOOL "Performance optimized build") set(RELEASE OFF CACHE BOOL "Performance optimized build")
set(UseRiscVBBL OFF CACHE BOOL "Whether to use bbl") set(UseRiscVBBL OFF CACHE BOOL "Whether to use bbl")
set(KernelNumDomains 2 CACHE STRING "How many scheduling domains to build for")
set(KernelDomainSchedule "${CMAKE_CURRENT_LIST_DIR}/kernel/round_robin_domain.c" CACHE INTERNAL "Domain scheduler algorithm")

View File

@ -0,0 +1,22 @@
#include <model/statedata.h>
#include <object/structures.h>
/* Dual-domain schedule for Kata to isolate third party applications from system
* applications.
*
* Note that this doesn't actually implement the schedule -- that's hardwired in
* seL4's kernel source. See also kata/kernel/src/kernel/thread.c, in the
* nextDomain function around line 302 and the timerTick function around 630.
*
* Effectively this is a round-robin scheduler, so half of the CPU time is given
* to system applications, while third party applications are allocated the
* other half. Note that even if there's nothing to run in the third-party
* application domain, the scheduler will schedule an idle thread to ensure that
* domain gets it's allocated share of time.
*/
const dschedule_t ksDomSchedule[] = {
{.domain = 0, .length = 1}, // System domain
{.domain = 1, .length = 1}, // Third party application domain
};
const word_t ksDomScheduleLength = sizeof(ksDomSchedule) / sizeof(dschedule_t);