xref: /xnu-10063.141.1/tests/sched_enabled_policy.c (revision d8b80295118ef25ac3a784134bcf95cd8e88109f)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <sys/sysctl.h>
6 
7 #include <darwintest.h>
8 #include "test_utils.h"
9 
10 T_GLOBAL_META(T_META_NAMESPACE("xnu.scheduler"),
11     T_META_RADAR_COMPONENT_NAME("xnu"),
12     T_META_RADAR_COMPONENT_VERSION("scheduler"));
13 
14 static void
get_sched_policy_name(char * policy_name,size_t policy_name_len)15 get_sched_policy_name(char *policy_name, size_t policy_name_len)
16 {
17 	int ret;
18 	ret = sysctlbyname("kern.sched", policy_name, &policy_name_len, NULL, 0);
19 	T_QUIET; T_ASSERT_EQ(ret, 0, "sysctlbyname kern.sched");
20 }
21 
22 static void
get_device_name(char * device_name,size_t device_name_len)23 get_device_name(char *device_name, size_t device_name_len)
24 {
25 	int ret;
26 	ret = sysctlbyname("hw.target", device_name, &device_name_len, NULL, 0);
27 	T_QUIET; T_ASSERT_EQ(ret, 0, "sysctlbyname hw.target");
28 }
29 
30 static void
get_kern_version(char * kern_version,size_t kern_version_len)31 get_kern_version(char *kern_version, size_t kern_version_len)
32 {
33 	int ret;
34 	ret = sysctlbyname("kern.version", kern_version, &kern_version_len, NULL, 0);
35 	T_QUIET; T_ASSERT_EQ(ret, 0, "sysctlbyname kern.version");
36 }
37 
38 static bool
platform_is_arm64(void)39 platform_is_arm64(void)
40 {
41 	int ret;
42 	int is_arm64 = 0;
43 	size_t is_arm64_size = sizeof(is_arm64);
44 	ret = sysctlbyname("hw.optional.arm64", &is_arm64, &is_arm64_size, NULL, 0);
45 	return ret == 0 && is_arm64;
46 }
47 
48 static bool
platform_is_amp(void)49 platform_is_amp(void)
50 {
51 	int ret;
52 	int num_perf_levels = 0;
53 	ret = sysctlbyname("hw.nperflevels", &num_perf_levels, &(size_t){ sizeof(num_perf_levels) }, NULL, 0);
54 	T_QUIET; T_ASSERT_EQ(ret, 0, "sysctlbyname hw.nperflevels");
55 	bool is_amp = num_perf_levels > 1;
56 	T_LOG("Platform is %s", is_amp ? "asymmetric (AMP)" : "symmetric (SMP)");
57 	return is_amp;
58 }
59 
60 
61 T_DECL(enabled_policy, "Verify that the expected scheduler policy is running", XNU_T_META_SOC_SPECIFIC)
62 {
63 	size_t policy_name_len = 256;
64 	char policy_name[policy_name_len];
65 	get_sched_policy_name(policy_name, policy_name_len);
66 	T_LOG("Current scheduler policy: %s", policy_name);
67 
68 	size_t device_name_len = 256;
69 	char device_name[device_name_len];
70 	get_device_name(device_name, device_name_len);
71 	T_LOG("Current device: %s", device_name);
72 
73 	size_t kern_version_len = 256;
74 	char kern_version[kern_version_len];
75 	get_kern_version(kern_version, kern_version_len);
76 	T_LOG("Kernel version: %s", kern_version);
77 
78 	if (!platform_is_arm64()) {
79 		T_SKIP("Skipping test on non-arm64 platform");
80 	}
81 	if (strstr(device_name, "DEV") != NULL) {
82 		T_SKIP("Skipping test on DEV hardware");
83 	}
84 	if (strstr(device_name, "SIM") != NULL) {
85 		T_SKIP("Skipping test on simulator");
86 	}
87 
88 	if (!platform_is_amp()) {
89 		T_ASSERT_EQ_STR(policy_name, "clutch", "SMP platform should be running the Clutch scheduler");
90 		T_END;
91 	}
92 
93 
94 	T_ASSERT_EQ_STR(policy_name, "edge", "Non-exempt AMP platform should be running the Edge scheduler");
95 }
96