cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

qos-test.c (3450B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright 2019 NXP
      4 */
      5#include <kunit/test.h>
      6#include <linux/pm_qos.h>
      7
      8/* Basic test for aggregating two "min" requests */
      9static void freq_qos_test_min(struct kunit *test)
     10{
     11	struct freq_constraints	qos;
     12	struct freq_qos_request	req1, req2;
     13	int ret;
     14
     15	freq_constraints_init(&qos);
     16	memset(&req1, 0, sizeof(req1));
     17	memset(&req2, 0, sizeof(req2));
     18
     19	ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MIN, 1000);
     20	KUNIT_EXPECT_EQ(test, ret, 1);
     21	ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MIN, 2000);
     22	KUNIT_EXPECT_EQ(test, ret, 1);
     23
     24	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
     25
     26	ret = freq_qos_remove_request(&req2);
     27	KUNIT_EXPECT_EQ(test, ret, 1);
     28	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
     29
     30	ret = freq_qos_remove_request(&req1);
     31	KUNIT_EXPECT_EQ(test, ret, 1);
     32	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
     33			FREQ_QOS_MIN_DEFAULT_VALUE);
     34}
     35
     36/* Test that requests for MAX_DEFAULT_VALUE have no effect */
     37static void freq_qos_test_maxdef(struct kunit *test)
     38{
     39	struct freq_constraints	qos;
     40	struct freq_qos_request	req1, req2;
     41	int ret;
     42
     43	freq_constraints_init(&qos);
     44	memset(&req1, 0, sizeof(req1));
     45	memset(&req2, 0, sizeof(req2));
     46	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX),
     47			FREQ_QOS_MAX_DEFAULT_VALUE);
     48
     49	ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MAX,
     50			FREQ_QOS_MAX_DEFAULT_VALUE);
     51	KUNIT_EXPECT_EQ(test, ret, 0);
     52	ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MAX,
     53			FREQ_QOS_MAX_DEFAULT_VALUE);
     54	KUNIT_EXPECT_EQ(test, ret, 0);
     55
     56	/* Add max 1000 */
     57	ret = freq_qos_update_request(&req1, 1000);
     58	KUNIT_EXPECT_EQ(test, ret, 1);
     59	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
     60
     61	/* Add max 2000, no impact */
     62	ret = freq_qos_update_request(&req2, 2000);
     63	KUNIT_EXPECT_EQ(test, ret, 0);
     64	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
     65
     66	/* Remove max 1000, new max 2000 */
     67	ret = freq_qos_remove_request(&req1);
     68	KUNIT_EXPECT_EQ(test, ret, 1);
     69	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 2000);
     70}
     71
     72/*
     73 * Test that a freq_qos_request can be added again after removal
     74 *
     75 * This issue was solved by commit 05ff1ba412fd ("PM: QoS: Invalidate frequency
     76 * QoS requests after removal")
     77 */
     78static void freq_qos_test_readd(struct kunit *test)
     79{
     80	struct freq_constraints	qos;
     81	struct freq_qos_request	req;
     82	int ret;
     83
     84	freq_constraints_init(&qos);
     85	memset(&req, 0, sizeof(req));
     86	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
     87			FREQ_QOS_MIN_DEFAULT_VALUE);
     88
     89	/* Add */
     90	ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 1000);
     91	KUNIT_EXPECT_EQ(test, ret, 1);
     92	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
     93
     94	/* Remove */
     95	ret = freq_qos_remove_request(&req);
     96	KUNIT_EXPECT_EQ(test, ret, 1);
     97	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
     98			FREQ_QOS_MIN_DEFAULT_VALUE);
     99
    100	/* Add again */
    101	ret = freq_qos_add_request(&qos, &req, FREQ_QOS_MIN, 2000);
    102	KUNIT_EXPECT_EQ(test, ret, 1);
    103	KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
    104}
    105
    106static struct kunit_case pm_qos_test_cases[] = {
    107	KUNIT_CASE(freq_qos_test_min),
    108	KUNIT_CASE(freq_qos_test_maxdef),
    109	KUNIT_CASE(freq_qos_test_readd),
    110	{},
    111};
    112
    113static struct kunit_suite pm_qos_test_module = {
    114	.name = "qos-kunit-test",
    115	.test_cases = pm_qos_test_cases,
    116};
    117kunit_test_suites(&pm_qos_test_module);