---
# System prepended metadata

title: SMP Support - Test Plan
tags: [' synchronization', ' smp', unikraft]

---

---
title: "SMP Support - Test Plan"
tags: unikraft, smp, synchronization
teams:
- smp
---

# SMP Support - Test Plan

## Types of Test Scenarios

- Check functionality (e.g. unit tests, integration tests, positive / negative testing).
- Do benchmarking. Baseline values are needed to have data to compare to.
- Add test cases if there are regressions.
- Use 1, 2 or more CPU cores for the testing setup.
- Check different architectures:
    - x86_64
    - Arm64
- Check different platforms:
    - KVM
    - linuxu
    - Xen

## Libraries and Tools Used for Testing

- [uktest](https://github.com/unikraft/unikraft/tree/staging/lib/uktest)
- [Unikraft support scripts](https://github.com/unikraft/unikraft/tree/staging/support/scripts)

## SMP-safe Unikraft Core

- ["Syncronization primitives" PR](https://github.com/unikraft/unikraft/pull/476):
    - spinlock
    - mutex
    - semaphore
    - reader-writer lock
    - Note (@Sairaj): "Currently, we are using a global timer, which can only wake up Bootstrap CPU. In the SMP environment we should use the timer provided by the LAPIC. Because of this we cannot use deadline-based waking up on the SMP system."
    - https://github.com/sairajkodilkar/unikraft/tree/sched-sync
- [Unikraft internal libraries](https://github.com/unikraft/unikraft/tree/staging/lib)
    - posix libraries (TODO: specify which libraries)
    - ukalloc
    - ukallocbbuddy
        - ["lib/ukalloc: Synchronize the bbuddy allocator" PR](https://github.com/unikraft/unikraft/pull/801)
        - ["A Non-blocking Buddy System for Scalable Memory Allocation on Multi-core Machines" Article](https://arxiv.org/pdf/1804.03436.pdf)
        - ["SMP-safe memory allocation" doc](https://hackmd.io/@unikraft/HJStgQ1W3)
    - ukdebug
    - uksched
    - uktest
    - ukvmem
    - vfscore
- [Unikraft platform components](https://github.com/unikraft/unikraft/tree/staging/plat)
    - common/paging
    - drivers/virtio
        - ["driver/virtio-net: Make virtio-net SMP safe" PR](https://github.com/unikraft/unikraft/pull/759)
- Global variables to be set to per-cpu variables
    - ["Add per-lcpu variable definition" PR](https://github.com/unikraft/unikraft/pull/784)
        - `__uk_sched_thread_current` from https://github.com/unikraft/unikraft/blob/staging/lib/uksched/sched.c
        - `vmem_active_vas` from https://github.com/unikraft/unikraft/blob/staging/lib/ukvmem/vmem.c
        - `pg_active_pt` from https://github.com/unikraft/unikraft/blob/staging/plat/common/paging.c

## SMP-safe Memory Allocation

- [Unikraft memory allocators](https://github.com/search?q=topic%3Aallocator+org%3Aunikraft&type=Repositories):
    - [TLSF](https://github.com/unikraft/lib-tlsf)
    - [Mimalloc](https://github.com/unikraft/lib-mimalloc)
    - [tinyalloc](https://github.com/unikraft/lib-tinyalloc)

## ISR-safe Code

## References

-  SMP GitHub project: https://github.com/orgs/unikraft/projects/21
-  https://hackmd.io/@unikraft/HyNdSyAki#SMP-safe-Unikraft-Core
-  https://hackmd.io/@unikraft/HyNdSyAki#SMP-safe-Memory-Allocation
-  https://hackmd.io/@unikraft/HyNdSyAki#ISR-Safe-Code
-  https://unikraft.org/blog/2022-06-27-unikraft-synchronization/
-  https://unikraft.org/blog/2022-07-19-unikraft-synchronization/
-  https://unikraft.org/blog/2022-08-21-unikraft-ioapic/