genode/base/run/mp_server.run
Norman Feske 5fe29e8e4a Express affinities via Cartesian coordinates
This patch introduces new types for expressing CPU affinities. Instead
of dealing with physical CPU numbers, affinities are expressed as
rectangles in a grid of virtual CPU nodes. This clears the way to
conveniently assign sets of adjacent CPUs to subsystems, each of them
managing their respective viewport of the coordinate space.

By using 2D Cartesian coordinates, the locality of CPU nodes can be
modeled for different topologies such as SMP (simple Nx1 grid), grids of
NUMA nodes, or ring topologies.
2013-08-13 17:08:24 +02:00

80 lines
2.5 KiB
Plaintext

#
# \brief Test to start and call RPC entrypoint on all available CPUs
# \author Norman Feske
# \author Alexander Boettcher
#
if {[have_spec platform_pbxa9] || (![have_spec nova] && ![have_spec foc])} {
puts "Platform is unsupported."
exit 0
}
build "core init test/mp_server"
create_boot_directory
install_config {
<config>
<parent-provides>
<service name="LOG"/>
<service name="CPU"/>
<service name="RM"/>
<service name="CAP"/>
</parent-provides>
<default-route>
<any-service> <parent/> </any-service>
</default-route>
<start name="test-server-mp">
<resource name="RAM" quantum="10M"/>
</start>
</config>
}
build_boot_image "core init test-server-mp"
if {[is_qemu_available]} {
set want_cpus 2
append qemu_args " -nographic -m 64 -smp $want_cpus,cores=$want_cpus "
}
# run the test
run_genode_until {\[init -\> test-server-mp\] done.*\n} 60
set cpus [regexp -inline {Detected [0-9x]+ CPU[ s]\.} $output]
set cpus [regexp -all -inline {[0-9]+} $cpus]
set cpus [expr [lindex $cpus 0] * [lindex $cpus 1]]
if {[is_qemu_available]} {
if {$want_cpus != $cpus} {
puts "CPU count is not as expected: $want_cpus != $cpus"
exit 1;
}
}
# pay only attention to the output of init and its children
grep_output {^\[init }
unify_output {transfer cap [a-f0-9]+} "transfer cap UNIFIED"
unify_output {yes - idx [a-f0-9]+} "yes - idx UNIFIED"
unify_output {\- received cap [a-f0-9]+} "- received cap UNIFIED"
compare_output_to {
[init -> test-server-mp] --- test-mp_server started ---
[init -> test-server-mp] Detected 2x1 CPUs.
[init -> test-server-mp] call server on CPU 0
[init -> test-server-mp] function test_untyped: got value 0
[init -> test-server-mp] call server on CPU 1
[init -> test-server-mp] function test_untyped: got value 1
[init -> test-server-mp] call server on CPU 0 - transfer cap UNIFIED
[init -> test-server-mp] function test_cap: capability is valid ? yes - idx UNIFIED
[init -> test-server-mp] call server on CPU 1 - transfer cap UNIFIED
[init -> test-server-mp] function test_cap: capability is valid ? yes - idx UNIFIED
[init -> test-server-mp] call server on CPU 0 - transfer cap UNIFIED
[init -> test-server-mp] function test_cap_reply: capability is valid ? yes - idx UNIFIED
[init -> test-server-mp] got from server on CPU 0 - received cap UNIFIED
[init -> test-server-mp] call server on CPU 1 - transfer cap UNIFIED
[init -> test-server-mp] function test_cap_reply: capability is valid ? yes - idx UNIFIED
[init -> test-server-mp] got from server on CPU 1 - received cap UNIFIED
[init -> test-server-mp] done
}