diff mbox series

selftests/sched: add basic test for psi

Message ID 20241022122158.2136-1-quic_pintu@quicinc.com (mailing list archive)
State New
Headers show
Series selftests/sched: add basic test for psi | expand

Commit Message

Pintu Kumar Oct. 22, 2024, 12:21 p.m. UTC
There is a psi module that exists under kernel/sched/psi.
Add a basic test to test the psi.
This test just add the basic support to check cpu/memory/io interface.
Further test will be added on top of this.

Signed-off-by: Pintu Kumar <quic_pintu@quicinc.com>
---
 MAINTAINERS                              |  2 +
 tools/testing/selftests/sched/.gitignore |  1 +
 tools/testing/selftests/sched/Makefile   |  4 +-
 tools/testing/selftests/sched/config     |  1 +
 tools/testing/selftests/sched/psi_test.c | 85 ++++++++++++++++++++++++
 tools/testing/selftests/sched/run_psi.sh | 36 ++++++++++
 6 files changed, 127 insertions(+), 2 deletions(-)
 create mode 100644 tools/testing/selftests/sched/psi_test.c
 create mode 100755 tools/testing/selftests/sched/run_psi.sh

Comments

Johannes Weiner Oct. 22, 2024, 2:05 p.m. UTC | #1
On Tue, Oct 22, 2024 at 05:51:58PM +0530, Pintu Kumar wrote:
> There is a psi module that exists under kernel/sched/psi.
> Add a basic test to test the psi.

I'm not sure this is a valuable use of test cycles. The mere existence
and basic format of the files is very unlikely to be buggy, and such a
bug wouldn't hide for very long either.

> @@ -18548,10 +18548,12 @@ F:	include/uapi/linux/pps.h
>  PRESSURE STALL INFORMATION (PSI)
>  M:	Johannes Weiner <hannes@cmpxchg.org>
>  M:	Suren Baghdasaryan <surenb@google.com>
> +M:	Pintu Kumar <quic_pintu@quicinc.com>

$ git log --oneline --author='Pintu Kumar' kernel/sched/psi.c | wc -l
0

Really? ;)

>  R:	Peter Ziljstra <peterz@infradead.org>
>  S:	Maintained
>  F:	include/linux/psi*
>  F:	kernel/sched/psi.c
> +F:	tools/testing/selftests/sched/psi_test.c
>  
>  PRINTK
>  M:	Petr Mladek <pmladek@suse.com>
Pintu Agarwal Oct. 22, 2024, 6:23 p.m. UTC | #2
Hi Johannes,

On Tue, 22 Oct 2024 at 19:36, Johannes Weiner <hannes@cmpxchg.org> wrote:
>
> On Tue, Oct 22, 2024 at 05:51:58PM +0530, Pintu Kumar wrote:
> > There is a psi module that exists under kernel/sched/psi.
> > Add a basic test to test the psi.
>
> I'm not sure this is a valuable use of test cycles. The mere existence
> and basic format of the files is very unlikely to be buggy, and such a
> bug wouldn't hide for very long either.
>
Yes, I agree this is just a basic version to prepare for the test framework.
Once the framework is available more tests can be added, such as trigger poll.
If you have any other suggestions for the test please let me know.

> > @@ -18548,10 +18548,12 @@ F:  include/uapi/linux/pps.h
> >  PRESSURE STALL INFORMATION (PSI)
> >  M:   Johannes Weiner <hannes@cmpxchg.org>
> >  M:   Suren Baghdasaryan <surenb@google.com>
> > +M:   Pintu Kumar <quic_pintu@quicinc.com>
>
> $ git log --oneline --author='Pintu Kumar' kernel/sched/psi.c | wc -l
> 0
>
> Really? ;)
>
oh sorry.
This maintainer was added for tools/testing/sefttests/sched/psi_test
after referring to existing once.
Otherwise, checkpatch was giving below warning:

WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#51:
new file mode 100644
total: 0 errors, 1 warnings, 134 lines checked

Please let me know what is the correct way.

Thanks,
Pintu
diff mbox series

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index 84a73e90cfe8..d84ff9ca36a9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -18548,10 +18548,12 @@  F:	include/uapi/linux/pps.h
 PRESSURE STALL INFORMATION (PSI)
 M:	Johannes Weiner <hannes@cmpxchg.org>
 M:	Suren Baghdasaryan <surenb@google.com>
+M:	Pintu Kumar <quic_pintu@quicinc.com>
 R:	Peter Ziljstra <peterz@infradead.org>
 S:	Maintained
 F:	include/linux/psi*
 F:	kernel/sched/psi.c
+F:	tools/testing/selftests/sched/psi_test.c
 
 PRINTK
 M:	Petr Mladek <pmladek@suse.com>
diff --git a/tools/testing/selftests/sched/.gitignore b/tools/testing/selftests/sched/.gitignore
index 6996d4654d92..2b15c11b93e6 100644
--- a/tools/testing/selftests/sched/.gitignore
+++ b/tools/testing/selftests/sched/.gitignore
@@ -1 +1,2 @@ 
 cs_prctl_test
+psi_test
diff --git a/tools/testing/selftests/sched/Makefile b/tools/testing/selftests/sched/Makefile
index 099ee9213557..795f6613eb2c 100644
--- a/tools/testing/selftests/sched/Makefile
+++ b/tools/testing/selftests/sched/Makefile
@@ -8,7 +8,7 @@  CFLAGS += -O2 -Wall -g -I./ $(KHDR_INCLUDES) -Wl,-rpath=./ \
 	  $(CLANG_FLAGS)
 LDLIBS += -lpthread
 
-TEST_GEN_FILES := cs_prctl_test
-TEST_PROGS := cs_prctl_test
+TEST_GEN_FILES := cs_prctl_test psi_test
+TEST_PROGS := cs_prctl_test run_psi.sh
 
 include ../lib.mk
diff --git a/tools/testing/selftests/sched/config b/tools/testing/selftests/sched/config
index e8b09aa7c0c4..287cccd434fd 100644
--- a/tools/testing/selftests/sched/config
+++ b/tools/testing/selftests/sched/config
@@ -1 +1,2 @@ 
 CONFIG_SCHED_DEBUG=y
+CONFIG_PSI=y
diff --git a/tools/testing/selftests/sched/psi_test.c b/tools/testing/selftests/sched/psi_test.c
new file mode 100644
index 000000000000..eeba138d2b39
--- /dev/null
+++ b/tools/testing/selftests/sched/psi_test.c
@@ -0,0 +1,85 @@ 
+// SPDX-License-Identifier: GPL-2.0
+
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+
+
+struct load_avg {
+	float avg10;
+	float avg60;
+	float avg300;
+	unsigned long long total;
+};
+
+struct pressure {
+	struct load_avg some;
+	struct load_avg full;
+};
+
+
+int psi_get_data_from_proc_pressure(const char *path, struct pressure *p)
+{
+	FILE *fp;
+	int rc = -1;
+	int ret = 0;
+
+	if (path == NULL || p == NULL)
+		return -1;
+
+	fp = fopen(path, "r");
+	if (fp == NULL)
+		return -1;
+
+	while (!feof(fp)) {
+		rc = fscanf(fp, "some avg10=%f avg60=%f avg300=%f total=%llu\n",
+			&p->some.avg10, &p->some.avg60, &p->some.avg300, &p->some.total);
+		if (rc < 1) {
+			ret = -1;
+			break;
+		}
+
+		/* Note: In some cases (cpu) full may not exists */
+		rc = fscanf(fp, "full avg10=%f avg60=%f avg300=%f total=%llu\n",
+			&p->full.avg10, &p->full.avg60, &p->full.avg300, &p->full.total);
+		/* We don't care about full case. This is needed to avoid warnings */
+		rc = 0;
+	}
+
+	fclose(fp);
+
+	return ret;
+}
+
+int main(int argc, char *argv[])
+{
+	int ret;
+	struct pressure rs = {0,};
+	char path[32];
+
+	if (argc < 2) {
+		fprintf(stderr, "usage: %s <path>\n", argv[0]);
+		return -1;
+	}
+
+	memset(&rs, 0, sizeof(rs));
+	printf("Pressure data: %s\n", argv[1]);
+	snprintf(path, sizeof(path)-1, "/proc/pressure/%s", argv[1]);
+
+	ret = psi_get_data_from_proc_pressure(path, &rs);
+	if (ret < 0) {
+		printf("PSI <%s>: FAIL\n", argv[1]);
+		return -1;
+	}
+	printf("Some Avg10   = %5.2f\n", rs.some.avg10);
+	printf("Some Avg60   = %5.2f\n", rs.some.avg60);
+	printf("Some Avg300  = %5.2f\n", rs.some.avg300);
+	printf("Some Total  = %llu\n", rs.some.total);
+	printf("Full Avg10  = %5.2f\n", rs.full.avg10);
+	printf("Full Avg60  = %5.2f\n", rs.full.avg60);
+	printf("Full Avg300 = %5.2f\n", rs.full.avg300);
+	printf("Full Total  = %llu\n", rs.full.total);
+
+
+	return 0;
+}
diff --git a/tools/testing/selftests/sched/run_psi.sh b/tools/testing/selftests/sched/run_psi.sh
new file mode 100755
index 000000000000..d0b1c7ae3736
--- /dev/null
+++ b/tools/testing/selftests/sched/run_psi.sh
@@ -0,0 +1,36 @@ 
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
+# Just one node check is enough to detect psi
+if [ ! -e /proc/pressure/cpu ]; then
+	echo "PSI not present..."
+	exit $ksft_skip
+fi
+
+echo ""
+./psi_test cpu
+if [ $? -ne 0 ]; then
+	echo "CPU - [FAIL]"
+else
+	echo "CPU - [PASS]"
+fi
+
+echo ""
+./psi_test memory
+if [ $? -ne 0 ]; then
+	echo "MEMORY - [FAIL]"
+else
+	echo "MEMORY - [PASS]"
+fi
+
+echo ""
+./psi_test io
+if [ $? -ne 0 ]; then
+	echo "IO - [FAIL]"
+else
+	echo "IO - [PASS]"
+fi