diff --git a/patch_code/0002-tools-add-a-tool-to-calculate-the-idle-rate.patch b/patch_code/0002-tools-add-a-tool-to-calculate-the-idle-rate.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2f4a9d4abc9e0764ba0ddf5a6acedff01b8198ac
--- /dev/null
+++ b/patch_code/0002-tools-add-a-tool-to-calculate-the-idle-rate.patch
@@ -0,0 +1,135 @@
+From 81e54eea0978d8824f53a70037e93ab34258001c Mon Sep 17 00:00:00 2001
+From: Hongyu Li <543306408@qq.com>
+Date: Thu, 30 Sep 2021 20:26:56 +0800
+Subject: [PATCH openEuler-21.09 2/2] tools: add a tool to calculate the idle rate
+
+openEuler inclusion
+category: bugfix
+bugzilla: https://gitee.com/openeuler/kernel/issues/I4CIJQ
+CVE: NA
+
+----------------------------------------------------------------------
+
+
+This tool can help calculate the CPU idle rate in higher precision.
+
+Signed-off-by: Hongyu Li <543306408@qq.com>
+---
+ tools/accounting/Makefile   |  2 +-
+ tools/accounting/idle_cal.c | 91 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 92 insertions(+), 1 deletion(-)
+ create mode 100644 tools/accounting/idle_cal.c
+
+diff --git a/tools/accounting/Makefile b/tools/accounting/Makefile
+index 03687f19cbb1..d14151e28173 100644
+--- a/tools/accounting/Makefile
++++ b/tools/accounting/Makefile
+@@ -2,7 +2,7 @@
+ CC := $(CROSS_COMPILE)gcc
+ CFLAGS := -I../../usr/include
+ 
+-PROGS := getdelays
++PROGS := getdelays idle_cal
+ 
+ all: $(PROGS)
+ 
+diff --git a/tools/accounting/idle_cal.c b/tools/accounting/idle_cal.c
+new file mode 100644
+index 000000000000..397b0fc1c69c
+--- /dev/null
++++ b/tools/accounting/idle_cal.c
+@@ -0,0 +1,91 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ *  idle_cal.c
++ *
++ *  Copyright (C) 2007
++ *
++ *  cpu idle time accouting
++ */
++
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <fcntl.h>
++#include <string.h>
++#include <unistd.h>
++#include <time.h>
++#include <limits.h>
++#include <sys/time.h>
++
++#define CPUS 4
++#define BUFFSIZE 4096
++#define HZ 100
++#define FILE_NAME "/proc/stat2"
++
++struct cpu_info {
++	char name[BUFFSIZE];
++	long long value[1];
++};
++
++int main(void)
++{
++	char buf[BUFFSIZE];
++	struct cpu_info cpus[CPUS+1];
++	struct cpu_info cpus_2[CPUS+1];
++	long long sub;
++	double value;
++
++	FILE *fp = fopen(FILE_NAME, "r");
++	int i = 0;
++	struct timeval start, end;
++
++
++	while (i < CPUS+1) {
++		int n = fscanf(fp, "%s %lld\n", cpus[i].name, &cpus[i].value[0]);
++
++		if (n < 0) {
++			printf("wrong");
++			return -1;
++		}
++		i += 1;
++	}
++
++	for (int i = 0; i < CPUS+1; i++)
++		printf("%s %lld\n", cpus[i].name, cpus[i].value[0]);
++	gettimeofday(&start, NULL);
++	fflush(fp);
++	fclose(fp);
++	i = 0;
++
++	sleep(2);
++
++	FILE *fp_2 = fopen(FILE_NAME, "r");
++
++	while (i < CPUS+1) {
++		int n = fscanf(fp_2, "%s %lld\n", cpus_2[i].name, &cpus_2[i].value[0]);
++
++		if (n < 0) {
++			printf("wrong");
++			return -1;
++		}
++		i += 1;
++	}
++
++	for (int i = 0; i < CPUS+1; i++)
++		printf("%s %lld\n", cpus_2[i].name, cpus_2[i].value[0]);
++	gettimeofday(&end, NULL);
++	fclose(fp_2);
++
++	sub =  end.tv_sec-start.tv_sec;
++	value = sub*1000000.0+end.tv_usec-start.tv_usec;
++
++	printf("CPU idle rate %f\n", 1000000/HZ*(cpus_2[0].value[0]-cpus[0].value[0])/value);
++
++	for (int i = 1; i < CPUS+1; i++) {
++		printf("CPU%d idle rate %f\n", i-1, 1000000/HZ
++				*(cpus_2[i].value[0]-cpus[i].value[0])/value);
++	}
++
++	return 0;
++}
++
+-- 
+2.17.1
+