From 6aa7c32eaee2593d29e6b31bafe83f0168baa88a Mon Sep 17 00:00:00 2001 From: John Kacur Date: Fri, 23 Jul 2021 15:29:37 -0400 Subject: [PATCH] sched_deadline: Changes for HRTICK - Take into account the rename of the sched_features file for HRTICK - Use HRTICK_DL if available Resolves: rhbz#1973083 Signed-off-by: John Kacur --- realtime-tests.spec | 11 +- ...ommodate-new-location-of-HRTICK-file.patch | 217 ++++++++++++++++++ ...e-HRTICK_DL-for-sched_deadline-tests.patch | 125 ++++++++++ 3 files changed, 352 insertions(+), 1 deletion(-) create mode 100644 sched_deadline-Accommodate-new-location-of-HRTICK-file.patch create mode 100644 sched_deadline-Use-HRTICK_DL-for-sched_deadline-tests.patch diff --git a/realtime-tests.spec b/realtime-tests.spec index 916f156..39b8e4d 100644 --- a/realtime-tests.spec +++ b/realtime-tests.spec @@ -6,7 +6,7 @@ Name: realtime-tests # Numa argument to make: NUMA=1 # Version: 2.1 -Release: 1%{?dist} +Release: 2%{?dist} License: GPLv2 URL: https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git Source0: https://www.kernel.org/pub/linux/utils/rt-tests/rt-tests-%{version}.tar.xz @@ -20,6 +20,8 @@ Requires: bash Requires: bc #Patches +Patch1: sched_deadline-Accommodate-new-location-of-HRTICK-file.patch +Patch2: sched_deadline-Use-HRTICK_DL-for-sched_deadline-tests.patch %description realtime-tests is a set of programs that test and measure various components of @@ -28,6 +30,8 @@ latency. It also tests the functioning of priority-inheritance mutexes. %prep %setup -q -n rt-tests-%{version} +%patch1 -p1 +%patch2 -p1 %build %set_build_flags @@ -78,6 +82,11 @@ latency. It also tests the functioning of priority-inheritance mutexes. %{_mandir}/man8/determine_maximum_mpps.8.* %changelog +* Fri Jul 23 2021 John Kacur - 2.1-2 +- Take into account the rename of the sched_features file for HRTICK +- Use HRTICK_DL if available +Resolves: rhbz#1973083 + * Wed Jun 30 2021 john Kacur - 2.1-1 - Update to latest upstream rt-tests-2.1 Resolves: rhbz#1890563 diff --git a/sched_deadline-Accommodate-new-location-of-HRTICK-file.patch b/sched_deadline-Accommodate-new-location-of-HRTICK-file.patch new file mode 100644 index 0000000..9006d26 --- /dev/null +++ b/sched_deadline-Accommodate-new-location-of-HRTICK-file.patch @@ -0,0 +1,217 @@ +From 84c45a66bf077be31c9e0cf85b72896798966826 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Thu, 22 Jul 2021 16:30:13 -0400 +Subject: [PATCH 1/2] sched_deadline: Accommodate new location of HRTICK file + in kernel + +Newer kernels rename /sys/kernel/debug/sched_features to +/sys/kernel/debug/sched/features + +Modify sched_deadline tests to look for the new file and if that fails +look for the old file name + +These functions are based on ones in stalld, and stalld itself has +functions based on the sched_deadline programs in rt-tests + +Signed-off-by: John Kacur +--- + src/sched_deadline/cyclicdeadline.c | 65 ++++++++++++++++++++++------- + src/sched_deadline/deadline_test.c | 61 +++++++++++++++++++++------ + 2 files changed, 100 insertions(+), 26 deletions(-) + +diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c +index 8447424273ee..4a38ec2274c9 100644 +--- a/src/sched_deadline/cyclicdeadline.c ++++ b/src/sched_deadline/cyclicdeadline.c +@@ -230,12 +230,53 @@ found: + mark_fd = open(files, O_WRONLY); + } + ++/* ++ * Return true if file exists ++ */ ++static int check_file_exists(char *path) ++{ ++ int ret; ++ struct stat st; ++ ++ ret = !stat(path, &st); ++ ++ return ret; ++ ++} ++ ++/* ++ * Return 0 on success ++ */ ++ ++static int fill_sched_features(char *path) ++{ ++ int ret; ++ const char *debugfs; ++ ++ debugfs = find_debugfs(); ++ if (strlen(debugfs) == 0) ++ return -1; ++ ++ snprintf(path, MAX_PATH, "%s/sched/features", debugfs); ++ ret = check_file_exists(path); ++ if (ret) ++ return 0; ++ ++ snprintf(path, MAX_PATH, "%s/sched_features", debugfs); ++ ret = check_file_exists(path); ++ if (ret) ++ return 0; ++ ++ memset(path, 0, MAX_PATH); ++ ++ return ret; ++ ++} ++ + static int setup_hr_tick(void) + { +- const char *debugfs = find_debugfs(); +- char files[strlen(debugfs) + strlen("/sched_features") + 1]; ++ char path[MAX_PATH]; + char buf[500]; +- struct stat st; + static int set = 0; + char *p; + int ret; +@@ -244,27 +285,23 @@ static int setup_hr_tick(void) + + if (set) + return 1; +- + set = 1; + +- if (strlen(debugfs) == 0) +- return 0; +- +- sprintf(files, "%s/sched_features", debugfs); +- ret = stat(files, &st); +- if (ret < 0) ++ ret = fill_sched_features(path); ++ if (ret) + return 0; + +- fd = open(files, O_RDWR); +- perror(files); +- if (fd < 0) ++ fd = open(path, O_RDWR); ++ if (fd < 0) { ++ perror(path); + return 0; ++ } + + len = sizeof(buf); + + ret = read(fd, buf, len); + if (ret < 0) { +- perror(files); ++ perror(path); + close(fd); + return 0; + } +diff --git a/src/sched_deadline/deadline_test.c b/src/sched_deadline/deadline_test.c +index 395c2370f69a..c1e890319895 100644 +--- a/src/sched_deadline/deadline_test.c ++++ b/src/sched_deadline/deadline_test.c +@@ -368,6 +368,49 @@ found: + mark_fd = open(files, O_WRONLY); + } + ++/* ++ * Return true if file exists ++ */ ++static int check_file_exists(char *path) ++{ ++ int ret; ++ struct stat st; ++ ++ ret = !stat(path, &st); ++ ++ return ret; ++ ++} ++ ++/* ++ * Return 0 on success ++ */ ++ ++static int fill_sched_features(char *path) ++{ ++ int ret; ++ const char *debugfs; ++ ++ debugfs = find_debugfs(); ++ if (strlen(debugfs) == 0) ++ return -1; ++ ++ snprintf(path, MAX_PATH, "%s/sched/features", debugfs); ++ ret = check_file_exists(path); ++ if (ret) ++ return 0; ++ ++ snprintf(path, MAX_PATH, "%s/sched_features", debugfs); ++ ret = check_file_exists(path); ++ if (ret) ++ return 0; ++ ++ memset(path, 0, MAX_PATH); ++ ++ return ret; ++ ++} ++ + /** + * setup_hr_tick - Enable the HRTICK in sched_features (if available) + * +@@ -381,10 +424,8 @@ found: + */ + static int setup_hr_tick(void) + { +- const char *debugfs = find_debugfs(); +- char files[strlen(debugfs) + strlen("/sched_features") + 1]; ++ char path[MAX_PATH]; + char buf[500]; +- struct stat st; + static int set = 0; + char *p; + int ret; +@@ -396,17 +437,13 @@ static int setup_hr_tick(void) + + set = 1; + +- if (strlen(debugfs) == 0) +- return 0; +- +- sprintf(files, "%s/sched_features", debugfs); +- ret = stat(files, &st); +- if (ret < 0) ++ ret = fill_sched_features(path); ++ if (ret) + return 0; + +- fd = open(files, O_RDWR); ++ fd = open(path, O_RDWR); + if (fd < 0) { +- perror(files); ++ perror(path); + return 0; + } + +@@ -414,7 +451,7 @@ static int setup_hr_tick(void) + + ret = read(fd, buf, len); + if (ret < 0) { +- perror(files); ++ perror(path); + close(fd); + return 0; + } +-- +2.31.1 + diff --git a/sched_deadline-Use-HRTICK_DL-for-sched_deadline-tests.patch b/sched_deadline-Use-HRTICK_DL-for-sched_deadline-tests.patch new file mode 100644 index 0000000..a520672 --- /dev/null +++ b/sched_deadline-Use-HRTICK_DL-for-sched_deadline-tests.patch @@ -0,0 +1,125 @@ +From de3cdf92834bc600d5806f959e8d78d48f7f9775 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Fri, 23 Jul 2021 14:52:43 -0400 +Subject: [PATCH 2/2] sched_deadline: Use HRTICK_DL for sched_deadline tests + +If the HRTICK_DL feature is available, use it for the sched_deadline +tests, otherwise fall back to HRTICK + +This code is based on changes in stalld - which in turn was based on +these sched_deadline tests + +Signed-off-by: John Kacur +--- + src/sched_deadline/cyclicdeadline.c | 27 ++++++++++++++++++++++----- + src/sched_deadline/deadline_test.c | 28 +++++++++++++++++++++++----- + 2 files changed, 45 insertions(+), 10 deletions(-) + +diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c +index 4a38ec2274c9..4860a40f5e6b 100644 +--- a/src/sched_deadline/cyclicdeadline.c ++++ b/src/sched_deadline/cyclicdeadline.c +@@ -278,6 +278,7 @@ static int setup_hr_tick(void) + char path[MAX_PATH]; + char buf[500]; + static int set = 0; ++ int hrtick_dl = 0; + char *p; + int ret; + int len; +@@ -311,18 +312,34 @@ static int setup_hr_tick(void) + + ret = 1; + +- p = strstr(buf, "HRTICK"); +- if (p + 3 >= buf) { ++ p = strstr(buf, "HRTICK_DL"); ++ if (p && p - 3 >= buf) { ++ hrtick_dl = 1; + p -= 3; +- if (strncmp(p, "NO_HRTICK", 9) == 0) { +- ret = write(fd, "HRTICK", 6); +- if (ret != 6) ++ if (strncmp(p, "NO_HRTICK_DL", 12) == 0) { ++ ret = write(fd, "HRTICK_DL", 9); ++ if (ret != 9) + ret = 0; + else + ret = 1; + } + } + ++ /* Backwards compatibility for kernel that only have HRTICK */ ++ if (!hrtick_dl) { ++ p = strstr(buf, "HRTICK"); ++ if (p && p - 3 >= buf) { ++ p -=3; ++ if (strncmp(p, "NO_HRTICK", 9) == 0) { ++ ret = write(fd, "HRTICK", 6); ++ if (ret != 6) ++ ret = 0; ++ else ++ ret = 1; ++ } ++ } ++ } ++ + close(fd); + return ret; + } +diff --git a/src/sched_deadline/deadline_test.c b/src/sched_deadline/deadline_test.c +index c1e890319895..a48c231c1281 100644 +--- a/src/sched_deadline/deadline_test.c ++++ b/src/sched_deadline/deadline_test.c +@@ -427,6 +427,7 @@ static int setup_hr_tick(void) + char path[MAX_PATH]; + char buf[500]; + static int set = 0; ++ int hrtick_dl = 0; + char *p; + int ret; + int len; +@@ -461,18 +462,35 @@ static int setup_hr_tick(void) + + ret = 1; + +- p = strstr(buf, "HRTICK"); +- if (p + 3 >= buf) { ++ p = strstr(buf, "HRTICK_DL"); ++ if (p && p - 3 >= buf) { ++ hrtick_dl = 1; + p -= 3; +- if (strncmp(p, "NO_HRTICK", 9) == 0) { +- ret = write(fd, "HRTICK", 6); +- if (ret != 6) ++ if (strncmp(p, "NO_HRTICK_DL", 12) == 0) { ++ ret = write(fd, "HRTICK_DL", 9); ++ if (ret != 9) + ret = 0; + else + ret = 1; + } + } + ++ /* Backwards compatibility for kernel that only have HRTICK */ ++ if (!hrtick_dl) { ++ p = strstr(buf, "HRTICK"); ++ if (p && p - 3 >= buf) { ++ p -=3; ++ if (strncmp(p, "NO_HRTICK", 9) == 0) { ++ ret = write(fd, "HRTICK", 6); ++ if (ret != 6) ++ ret = 0; ++ else ++ ret = 1; ++ } ++ } ++ } ++ ++ + close(fd); + return ret; + } +-- +2.31.1 +