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 <jkacur@redhat.com>
This commit is contained in:
John Kacur 2021-07-23 15:29:37 -04:00
parent f9afb08aae
commit 6aa7c32eae
3 changed files with 352 additions and 1 deletions

View File

@ -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 <jkacur@redhat.com> - 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 <jkacur@redhat.com> - 2.1-1
- Update to latest upstream rt-tests-2.1
Resolves: rhbz#1890563

View File

@ -0,0 +1,217 @@
From 84c45a66bf077be31c9e0cf85b72896798966826 Mon Sep 17 00:00:00 2001
From: John Kacur <jkacur@redhat.com>
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 <jkacur@redhat.com>
---
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

View File

@ -0,0 +1,125 @@
From de3cdf92834bc600d5806f959e8d78d48f7f9775 Mon Sep 17 00:00:00 2001
From: John Kacur <jkacur@redhat.com>
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 <jkacur@redhat.com>
---
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