88 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Dhrystone benchmark test module4 *5 * Copyright (C) 2022 Glider bv6 */7 8#include "dhry.h"9 10#include <linux/kernel.h>11#include <linux/module.h>12#include <linux/moduleparam.h>13#include <linux/smp.h>14 15#define DHRY_VAX 175716 17static int dhry_run_set(const char *val, const struct kernel_param *kp);18static const struct kernel_param_ops run_ops = {19 .flags = KERNEL_PARAM_OPS_FL_NOARG,20 .set = dhry_run_set,21};22static bool dhry_run;23module_param_cb(run, &run_ops, &dhry_run, 0200);24MODULE_PARM_DESC(run, "Run the test (default: false)");25 26static int iterations = -1;27module_param(iterations, int, 0644);28MODULE_PARM_DESC(iterations,29 "Number of iterations through the benchmark (default: auto)");30 31static void dhry_benchmark(void)32{33 unsigned int cpu = get_cpu();34 int i, n;35 36 if (iterations > 0) {37 n = dhry(iterations);38 goto report;39 }40 41 for (i = DHRY_VAX; i > 0; i <<= 1) {42 n = dhry(i);43 if (n != -EAGAIN)44 break;45 }46 47report:48 put_cpu();49 if (n >= 0)50 pr_info("CPU%u: Dhrystones per Second: %d (%d DMIPS)\n", cpu,51 n, n / DHRY_VAX);52 else if (n == -EAGAIN)53 pr_err("Please increase the number of iterations\n");54 else55 pr_err("Dhrystone benchmark failed error %pe\n", ERR_PTR(n));56}57 58static int dhry_run_set(const char *val, const struct kernel_param *kp)59{60 int ret;61 62 if (val) {63 ret = param_set_bool(val, kp);64 if (ret)65 return ret;66 } else {67 dhry_run = true;68 }69 70 if (dhry_run && system_state == SYSTEM_RUNNING)71 dhry_benchmark();72 73 return 0;74}75 76static int __init dhry_init(void)77{78 if (dhry_run)79 dhry_benchmark();80 81 return 0;82}83module_init(dhry_init);84 85MODULE_AUTHOR("Geert Uytterhoeven <geert+renesas@glider.be>");86MODULE_DESCRIPTION("Dhrystone benchmark test module");87MODULE_LICENSE("GPL");88