liyujie
2025-08-28 b3810562527858a3b3d98ffa6e9c9c5b0f4a9a8e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env python3
''' This Python script interprets various sched stats values.
    Validates cpu consolidation for given sched_mc_power_saving value
'''
 
import os
import sys
import time
from optparse import OptionParser
from pm_sched_mc import *
 
__author__ = "Poornima Nayak <mpnayak@linux.vnet.ibm.com>"
 
class Usage(Exception):
    def __init__(self, msg):
        self.msg = msg
 
def main(argv=None):
    if argv is None:
        argv = sys.argv
 
    usage = "-w"
    parser = OptionParser(usage)
    parser.add_option("-v", "--variation_test", dest="vary_mc_smt",
        default=False, action="store_true", help="Vary sched_mc & sched_smt. \
            -c and -t inputs are initial value of sched_mc & sched_smt")
    parser.add_option("-c", "--mc_value", dest="mc_value",
        default=0, help="Sched mc power saving value 0/1/2")
    parser.add_option("-t", "--smt_value", dest="smt_value",
        default=0, help="Sched smt power saving value 0/1/2")
    parser.add_option("-w", "--workload", dest="work_ld",
        default="ebizzy", help="Workload can be ebizzy/kernbench")
    parser.add_option("-s", "--stress", dest="stress",
        default="partial", help="Load on system is full/partial [i.e 50%]/thread")
    parser.add_option("-p", "--performance", dest="perf_test",
        default=False, action="store_true", help="Enable performance test")
    (options, args) = parser.parse_args()
 
    try:
        count_num_cpu()
        count_num_sockets()
        if is_hyper_threaded():
            generate_sibling_list()
 
        # User should set option -v to test cpu consolidation
        # resets when sched_mc &(/) sched_smt is disabled when
        # workload is already running in the system
 
        if options.vary_mc_smt:
 
            # Since same code is used for testing package consolidation and core
            # consolidation is_multi_socket & is_hyper_threaded check is done
            if is_multi_socket() and is_multi_core() and options.mc_value:
                set_sched_mc_power(options.mc_value)
 
            if is_hyper_threaded() and options.smt_value:
                set_sched_smt_power(options.smt_value)
 
            #Generate arguments for trigger workload, run workload in background
            map_cpuid_pkgid()
            background="yes"
            duration=360
            pinned="no"
            if int(options.mc_value) < 2 and int(options.smt_value) < 2:
                trigger_ebizzy (options.smt_value, "partial", duration, background, pinned)
                work_ld="ebizzy"
                #Wait for 120 seconds and then validate cpu consolidation works
                #When sched_mc & sched_smt is set
                import time
                time.sleep(120)
            else:
                #Wait for 120 seconds and then validate cpu consolidation works
                #When sched_mc & sched_smt is set
                trigger_kernbench (options.smt_value, "partial", background, pinned, "no")
                work_ld="kernbench"
                import time
                time.sleep(300)
 
            generate_report()
            status = validate_cpu_consolidation("partial", work_ld, options.mc_value, options.smt_value)
            if status == 0:
                print("INFO: Consolidation worked sched_smt &(/) sched_mc is set")
                #Disable sched_smt & sched_mc interface values
                if options.vary_mc_smt and options.mc_value > 0:
                    set_sched_mc_power(0)
                    mc_value = options.mc_value
                else:
                    mc_value = 0
                if options.vary_mc_smt and options.smt_value > 0 and is_hyper_threaded():
                    set_sched_smt_power(0)
                    smt_value = options.smt_value
                else:
                    smt_value = 0
 
                if work_ld == "kernbench":
                    time.sleep(240)
                else:
                    time.sleep(120)
 
                generate_report()
                status = validate_cpu_consolidation("partial", work_ld, mc_value, smt_value)
                if background == "yes":
                    stop_wkld(work_ld)
                #CPU consolidation should fail as sched_mc &(/) sched_smt is disabled
                if status == 1:
                    return(0)
                else:
                    return(1)
            else:
                print("INFO: CPU consolidation failed when sched_mc &(/) \
sched_smt was enabled. This is pre-requisite to proceed")
                return(status)
        else:
            #The else part of the code validates behaviour of sched_mc
            # and sched_smt set to 0, 1 & 2
            if is_multi_socket():
                set_sched_mc_power(options.mc_value)
            if is_hyper_threaded():
                set_sched_smt_power(options.smt_value)
            map_cpuid_pkgid()
            print("INFO: Created table mapping cpu to package")
            background="no"
            duration=60
            pinned ="no"
 
            if options.perf_test:
                perf_test="yes"
            else:
                perf_test="no"
 
            trigger_workld( options.smt_value, options.work_ld, options.stress, duration, background, pinned, perf_test)
            generate_report()
            status = validate_cpu_consolidation(options.stress, options.work_ld,options.mc_value, options.smt_value)
            reset_schedmc()
            if is_hyper_threaded():
                reset_schedsmt()
            return(status)
    except Exception as details:
        print("INFO: CPU consolidation failed", details)
        return(1)
 
if __name__ == "__main__":
    sys.exit(main())