aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Turner <pjt@google.com>2012-03-14 07:39:04 -0700
committerPaul Turner <pjt@google.com>2012-03-14 20:42:33 -0700
commit8bd3d3206b40d3c42d11b036d9ad39091087bb19 (patch)
tree86154df4e79b3466b2c87e745a1821acae9011b1
parent17adf0e133d14a57681dfb09b53dbce238a68ecd (diff)
downloadlinsched-alpha.tar.gz
linsched: initial simulator code and testslinsched-alpha
Adds tools/linsched/... This includes: - The simulator code. - Stubs for scheduler:LinSched interaction - Test cases and validation tools. TODO: This commit needs to be broken down at a finer granularity, Signed-off-by: Paul Turner <pjt@google.com>
-rw-r--r--tools/linsched/Makefile22
-rw-r--r--tools/linsched/Makefile.inc109
-rw-r--r--tools/linsched/README60
-rw-r--r--tools/linsched/hrtimer.c256
-rw-r--r--tools/linsched/include/generated/autoconf.h252
-rw-r--r--tools/linsched/include/generated/bounds.h13
-rw-r--r--tools/linsched/include/linux_sched_headers.h26
-rw-r--r--tools/linsched/lib/sort.h208
-rw-r--r--tools/linsched/linsched.c100
-rw-r--r--tools/linsched/linsched.h408
-rw-r--r--tools/linsched/linsched.lds23
-rw-r--r--tools/linsched/linsched_rand.c326
-rw-r--r--tools/linsched/linsched_rand.h67
-rw-r--r--tools/linsched/linsched_sim.c406
-rw-r--r--tools/linsched/linsched_sim.h55
-rw-r--r--tools/linsched/linux_linsched.c789
-rw-r--r--tools/linsched/linux_linsched.h35
-rw-r--r--tools/linsched/load_balance_score.c359
-rw-r--r--tools/linsched/load_balance_score.h11
-rw-r--r--tools/linsched/nohz.h10
-rw-r--r--tools/linsched/nohz_tracking.c116
-rw-r--r--tools/linsched/nohz_tracking.h8
-rw-r--r--tools/linsched/numa.c142
-rw-r--r--tools/linsched/sanity_check.c115
-rw-r--r--tools/linsched/sanity_check.h6
-rw-r--r--tools/linsched/stubs.c257
-rw-r--r--tools/linsched/stubs/sched.c198
-rw-r--r--tools/linsched/test_lib.c226
-rw-r--r--tools/linsched/test_lib.h73
-rw-r--r--tools/linsched/tests/Makefile40
-rw-r--r--tools/linsched/tests/Makefile.mcarlo-sims27
-rw-r--r--tools/linsched/tests/basic_tests.c328
-rw-r--r--tools/linsched/tests/batch_balance_test.c78
-rwxr-xr-xtools/linsched/tests/diff-mcarlo-500144
-rw-r--r--tools/linsched/tests/fractional_cpu_test.c151
-rw-r--r--tools/linsched/tests/fractional_cpu_test_rnd_dist.c302
-rw-r--r--tools/linsched/tests/linsched.c72
-rw-r--r--tools/linsched/tests/linsched_rand_test.c250
-rw-r--r--tools/linsched/tests/linsched_rnd_dist.c60
-rw-r--r--tools/linsched/tests/mcarlo-sim-file12
-rw-r--r--tools/linsched/tests/mcarlo-sim.c120
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-16
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-105
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1003
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1013
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1024
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1034
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1046
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1055
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1065
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1073
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1084
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1095
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-116
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1106
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1116
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1125
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1135
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1145
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1154
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1166
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1174
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1185
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1196
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-125
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1204
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1216
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1226
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1236
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1244
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1255
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1265
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1275
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1284
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1296
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-134
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1303
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1314
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1325
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1336
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1343
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1356
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1365
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1373
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1384
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1393
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-143
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1405
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1415
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1423
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1434
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1443
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1454
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1466
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1476
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1483
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1493
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-154
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1506
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1515
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1526
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1534
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1546
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1554
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1566
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1573
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1586
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1596
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-165
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1604
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1614
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1624
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1636
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1645
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1655
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1665
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1675
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1686
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1696
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-174
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1706
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1713
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1726
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1734
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1744
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1754
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1765
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1773
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1786
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1796
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-186
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1805
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1813
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1826
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1833
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1843
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1854
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1864
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1875
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1885
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1896
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-194
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1906
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1914
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1923
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1936
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1946
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1956
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1963
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1976
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1984
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-1995
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-25
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-203
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2004
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2015
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2024
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2033
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2046
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2053
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2063
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2074
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2084
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2094
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-215
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2103
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2113
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2123
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2135
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2145
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2155
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2163
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2174
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2184
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2194
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-223
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2206
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2213
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2226
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2236
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2243
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2255
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2266
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2276
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2284
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2293
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-235
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2304
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2314
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2323
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2334
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2346
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2354
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2365
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2375
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2383
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2394
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-245
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2405
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2414
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2425
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2435
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2444
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2455
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2464
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2474
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2484
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2496
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-254
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2504
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2515
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2524
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2534
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2543
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2555
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2565
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2576
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2584
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2595
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-266
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2603
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2616
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2623
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2634
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2645
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2654
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2663
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2674
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2683
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2695
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-273
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2704
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2715
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2725
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2733
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2744
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2753
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2763
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2775
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2785
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2796
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-283
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2805
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2813
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2825
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2833
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2844
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2853
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2866
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2873
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2886
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2895
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-295
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2904
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2916
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2924
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2936
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2945
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2954
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2965
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2975
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2985
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-2994
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-36
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-305
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3005
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3015
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3023
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3035
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3044
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3056
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3066
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3076
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3086
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3094
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-315
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3104
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3115
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3123
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3134
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3144
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3156
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3165
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3173
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3184
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3193
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-324
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3205
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3216
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3225
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3235
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3245
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3253
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3266
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3276
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3286
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3293
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-333
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3306
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3314
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3323
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3336
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3344
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3354
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3366
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3373
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3384
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3394
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-345
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3404
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3414
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3425
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3434
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3446
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3454
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3465
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3473
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3484
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3493
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-354
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3503
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3516
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3526
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3534
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3543
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3554
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3563
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3574
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3585
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3596
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-365
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3603
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3613
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3624
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3634
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3646
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3656
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3665
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3673
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3684
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3693
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-375
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3703
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3715
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3723
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3733
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3744
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3754
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3764
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3776
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3783
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3793
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-386
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3804
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3816
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3826
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3833
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3845
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3856
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3864
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3876
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3886
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3896
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-394
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3905
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3916
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3925
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3936
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3944
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3956
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3965
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3976
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3986
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-3993
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-46
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-405
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4006
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4015
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4023
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4036
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4044
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4053
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4063
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4074
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4083
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4093
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-414
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4103
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4115
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4126
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4133
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4145
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4154
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4165
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4173
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4183
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4193
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-425
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4205
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4213
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4226
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4235
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4244
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4253
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4264
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4276
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4283
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4295
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-434
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4305
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4314
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4323
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4336
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4344
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4353
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4365
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4376
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4383
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4393
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-445
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4406
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4416
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4425
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4435
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4443
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4453
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4465
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4475
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4486
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4495
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-456
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4505
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4514
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4526
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4536
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4543
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4556
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4565
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4575
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4586
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4595
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-466
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4604
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4616
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4624
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4633
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4646
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4654
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4665
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4676
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4686
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4696
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-474
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4703
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4716
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4724
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4736
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4746
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4756
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4765
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4774
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4785
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4793
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-484
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4804
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4814
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4824
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4833
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4844
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4855
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4864
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4874
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4885
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4894
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-495
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4905
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4915
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4925
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4936
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4945
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4956
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4966
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4974
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4985
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-4995
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-53
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-506
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-5006
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-513
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-523
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-535
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-543
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-553
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-565
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-575
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-585
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-595
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-64
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-603
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-616
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-623
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-634
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-643
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-654
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-665
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-675
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-685
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-695
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-73
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-703
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-715
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-723
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-736
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-744
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-754
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-763
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-774
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-784
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-794
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-83
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-806
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-816
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-826
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-835
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-844
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-856
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-864
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-873
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-883
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-896
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-96
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-904
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-916
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-926
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-934
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-943
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-955
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-963
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-975
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-983
-rw-r--r--tools/linsched/tests/mcarlo-sims/sim-994
-rw-r--r--tools/linsched/tests/perf_replay.c49
-rwxr-xr-xtools/linsched/tests/run_tests.sh28
-rwxr-xr-xtools/linsched/tests/run_unit_tests.sh75
-rw-r--r--tools/linsched/validation/Makefile18
-rw-r--r--tools/linsched/validation/trace-imbalance.c327
-rw-r--r--tools/linsched/validation/unix-mcarlo-sim-init.sh45
-rw-r--r--tools/linsched/validation/unix-mcarlo-sim-monitor.sh71
-rw-r--r--tools/linsched/validation/unix-mcarlo-sim.c298
549 files changed, 9435 insertions, 0 deletions
diff --git a/tools/linsched/Makefile b/tools/linsched/Makefile
new file mode 100644
index 00000000000000..4266323ed83a6e
--- /dev/null
+++ b/tools/linsched/Makefile
@@ -0,0 +1,22 @@
+LINUXDIR = ./../..
+LINSCHED_DIR=${LINUXDIR}/tools/linsched
+include Makefile.inc
+
+TEST_LIB = test_lib.o
+
+.PHONY: run_all_tests all
+.DEFAULT_GOAL := all
+
+all: ${TEST_LIB} ${OBJ_FILES}
+ $(MAKE) $(MFLAGS) --directory=tests all
+ $(MAKE) $(MFLAGS) --directory=validation all
+
+run_unit_tests: all
+ $(MAKE) $(MFLAGS) --directory=tests run_unit_tests
+
+run_all_tests: all
+ $(MAKE) $(MFLAGS) --directory=tests run_all_tests
+
+clean:
+ rm -f ${TESTS} ${OBJ_FILES} ${DEPS} ${GEN_HDR}
+ $(MAKE) $(MFLAGS) --directory=tests clean
diff --git a/tools/linsched/Makefile.inc b/tools/linsched/Makefile.inc
new file mode 100644
index 00000000000000..441f7e3029abf9
--- /dev/null
+++ b/tools/linsched/Makefile.inc
@@ -0,0 +1,109 @@
+CC = ${CROSS_COMPILE}gcc
+
+CFLAGS = -g -O2 -m64 -D__KERNEL__ -D__LINSCHED__ -Wall -Wundef -Wstrict-prototypes \
+ -Werror-implicit-function-declaration -fno-common \
+ -I${LINSCHED_DIR}/include -I${LINUXDIR}/include \
+ -I${LINUXDIR}/arch/linsched/include -I${LINSCHED_DIR}/ \
+ -include ${LINSCHED_DIR}/include/generated/autoconf.h \
+ -Wno-pointer-sign -include ${LINUXDIR}/include/linux/kconfig.h
+
+# Don't use system headers (such as /usr/include/asm) for the kernel
+CFLAGS_LINUX = $(CFLAGS) -nostdinc -isystem $(shell $(CC) -print-file-name=include) \
+ -include ${LINSCHED_DIR}/linux_linsched.h \
+ -Wno-unused -Wno-strict-aliasing
+
+LFLAGS = -lm
+
+LINSCHED_OBJS = ${LINSCHED_DIR}/linux_linsched.o \
+ ${LINSCHED_DIR}/numa.o \
+ ${LINSCHED_DIR}/hrtimer.o \
+ ${LINSCHED_DIR}/stubs.o \
+ ${LINSCHED_DIR}/test_lib.o \
+ ${LINSCHED_DIR}/linsched.o \
+ ${LINSCHED_DIR}/load_balance_score.o \
+ ${LINSCHED_DIR}/sanity_check.o \
+ ${LINSCHED_DIR}/nohz_tracking.o \
+ ${LINSCHED_DIR}/linsched_rand.o \
+ ${LINSCHED_DIR}/linsched_sim.o \
+ ${LINSCHED_DIR}/stubs/sched.o
+
+LINUX_OBJS = ${LINUXDIR}/kernel/notifier.o \
+ ${LINUXDIR}/kernel/timer.o \
+ ${LINUXDIR}/kernel/time/clockevents.o \
+ ${LINUXDIR}/kernel/sched/clock.o \
+ ${LINUXDIR}/kernel/sched/core.o \
+ ${LINUXDIR}/kernel/sched/cpupri.o \
+ ${LINUXDIR}/kernel/sched/debug.o \
+ ${LINUXDIR}/kernel/sched/idle_task.o \
+ ${LINUXDIR}/kernel/sched/fair.o \
+ ${LINUXDIR}/kernel/sched/rt.o \
+ ${LINUXDIR}/kernel/sched/stats.o \
+ ${LINUXDIR}/kernel/sched/stop_task.o \
+ ${LINUXDIR}/kernel/fork.o \
+ ${LINUXDIR}/arch/linsched/kernel/init_task.o \
+ ${LINUXDIR}/kernel/exit.o ${LINUXDIR}/kernel/time.o \
+ ${LINUXDIR}/kernel/cpu.o \
+ ${LINUXDIR}/kernel/rwsem.o \
+ ${LINUXDIR}/kernel/mutex.o \
+ ${LINUXDIR}/kernel/hrtimer.o \
+ ${LINUXDIR}/kernel/pid.o \
+ ${LINUXDIR}/kernel/posix-cpu-timers.o \
+ ${LINUXDIR}/kernel/spinlock.o \
+ ${LINUXDIR}/kernel/time/timekeeping.o \
+ ${LINUXDIR}/kernel/time/ntp.o \
+ ${LINUXDIR}/kernel/time/jiffies.o \
+ ${LINUXDIR}/kernel/time/tick-common.o \
+ ${LINUXDIR}/kernel/time/tick-oneshot.o \
+ ${LINUXDIR}/kernel/time/tick-sched.o \
+ ${LINUXDIR}/kernel/time/tick-broadcast.o \
+ ${LINUXDIR}/kernel/wait.o \
+ ${LINUXDIR}/arch/linsched/init.o \
+ ${LINUXDIR}/arch/linsched/kernel/process.o \
+ ${LINUXDIR}/arch/linsched/kernel/smp.o \
+ ${LINUXDIR}/arch/linsched/kernel/pid.o \
+ ${LINUXDIR}/arch/linsched/kernel/mm.o \
+ ${LINUXDIR}/arch/linsched/kernel/io.o \
+ ${LINUXDIR}/arch/linsched/kernel/fs.o \
+ ${LINUXDIR}/arch/linsched/kernel/rcu.o \
+ ${LINUXDIR}/arch/linsched/kernel/irq.o \
+ ${LINUXDIR}/arch/linsched/kernel/version.o \
+ ${LINUXDIR}/arch/linsched/kernel/percpu.o \
+ ${LINUXDIR}/arch/linsched/kernel/lock.o \
+ ${LINUXDIR}/arch/linsched/kernel/cred.o \
+ ${LINUXDIR}/arch/linsched/kernel/cgroup.o \
+ ${LINUXDIR}/arch/linsched/kernel/misc.o \
+ ${LINUXDIR}/lib/rbtree.o ${LINUXDIR}/lib/div64.o \
+ ${LINUXDIR}/lib/cpumask.o ${LINUXDIR}/lib/bitmap.o \
+ ${LINUXDIR}/lib/list_debug.o \
+ ${LINUXDIR}/lib/find_next_bit.o \
+ ${LINUXDIR}/lib/hweight.o ${LINUXDIR}/lib/reciprocal_div.o \
+ ${LINUXDIR}/lib/plist.o \
+ ${LINUXDIR}/lib/ctype.o ${LINUXDIR}/lib/string.o \
+ ${LINUXDIR}/lib/hexdump.o ${LINUXDIR}/lib/percpu_counter.o \
+ ${LINUXDIR}/lib/timerqueue.o \
+ ${LINUXDIR}/lib/find_last_bit.o \
+ ${LINUXDIR}/lib/flex_array.o \
+ ${LINUXDIR}/lib/rwsem-spinlock.o \
+ ${LINUXDIR}/lib/kstrtox.o
+
+LD_PERCPU = ${LD} -r -T ${LINSCHED_DIR}/linsched.lds
+
+OBJ_FILES = ${LINSCHED_OBJS} ${LINUX_OBJS}
+DEPS := ${OBJ_FILES:.o=.d}
+-include ${DEPS}
+
+TIME_HDR=${LINUXDIR}/kernel/timeconst.h
+${TIME_HDR}: ${LINUXDIR}/kernel/timeconst.pl
+ @echo "(Generating timeconst.h)"
+ @perl ${LINUXDIR}/kernel/timeconst.pl 1000 > $@
+
+${LINUX_OBJS}: %.o: %.c ${TIME_HDR}
+ @echo "CC KERNEL $<"
+ @${CC} -o $@ ${CFLAGS_LINUX} -c $< -MMD
+
+%.o: %.c
+ @echo "CC SIM $<"
+ @${CC} ${CFLAGS} -o $@ -c $< -MMD
+
+
+
diff --git a/tools/linsched/README b/tools/linsched/README
new file mode 100644
index 00000000000000..eb104481ccd5d6
--- /dev/null
+++ b/tools/linsched/README
@@ -0,0 +1,60 @@
+WHAT IS LINSCHED?
+
+ LinSched is a user-space program that hosts the Linux scheduling subsystem.
+ Its purpose is to provide a tool for observing and modifying the behavior
+ of the Linux scheduler. This makes it a valuable tool in prototyping new
+ Linux scheduling policies, in a way that may be easier (or otherwise less
+ painful or time-consuming) to many developers when compared to working with
+ real hardware. Due to the high degree of code sharing between LinSched and
+ the Linux scheduler, porting LinSched code to Linux is reasonably
+ straightforward. LinSched may be especially useful to those who are new to
+ Linux scheduler development.
+
+WHAT ARE SOME TYPICAL USES OF LINSCHED?
+
+ In addition to bringing all the advantages of userspace development and
+ debugging to the scheduler code, Linsched also serves as a testing tool
+ to validate the correctness of the scheduler. Linsched has the notion of
+ hardware topologies which allows the user to create arbitrary hardware
+ models and runs simulations of scheduler behavior on them. This allows
+ for development of scheduler code without having access to specific types
+ of hardware.
+
+HOW DO I BUILD/RUN LINSCHED TESTS?
+
+ Simply running make in the linsched subdirectory should build the code
+ (ensure that you are using gcc v4.4+). To run tests use:
+
+ make run_all_tests
+
+ which validates some basic kernel functionality on a bunch of hardware
+ models.
+
+WHAT LINUX KERNEL FEATURES ARE MODELED IN LINSCHED?
+
+ The following kernel features are supported for simulation:
+ -- Group scheduling
+ -- Ability to specify arbitrary sleep/wakeup patterns for tasks
+ -- High resolution timers
+ -- Tickless scheduler (no hz)
+ -- sched domain support for all levels
+
+ The above features can be used to generate very accurate simulations
+ that mimic real world workloads.
+
+HOW DO I ADD NEW HARDWARE TOPOLOGIES?
+
+ See linsched/linux_linsched.h for examples on how hardware topologies
+ are defined. Select the required topology when you run your tests. See
+ linsched/basic_tests.c for examples.
+
+WHAT ARE SOME OF THE LIMITATIONS?
+
+ Linsched does not verify locking in the scheduler code since its
+ execution is single threaded. Lock contention and other SMP artifacts
+ are also not captured in the simulation. Consequently performance
+ impacts due to these are not covered.
+
+
+
+
diff --git a/tools/linsched/hrtimer.c b/tools/linsched/hrtimer.c
new file mode 100644
index 00000000000000..26be1d8c5954b1
--- /dev/null
+++ b/tools/linsched/hrtimer.c
@@ -0,0 +1,256 @@
+/* LinSched -- The Linux Scheduler Simulator
+ * Copyright (C) 2008 John M. Calandrino
+ * E-mail: jmc@cs.unc.edu
+ *
+ * This file contains Linux variables and functions that have been "defined
+ * away" or exist here in a modified form to avoid including an entire Linux
+ * source file that might otherwise lead to a "cascade" of dependency issues.
+ * It also includes certain LinSched variables to which some Linux functions
+ * and definitions now map.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "linsched.h"
+#include <linux/tick.h>
+#include <linux/interrupt.h>
+
+#include "load_balance_score.h"
+#include "nohz_tracking.h"
+#include "sanity_check.h"
+
+static int linsched_hrt_set_next_event(unsigned long evt,
+ struct clock_event_device *d);
+static void linsched_hrt_set_mode(enum clock_event_mode mode,
+ struct clock_event_device *d);
+static void linsched_hrt_broadcast(const struct cpumask *mask);
+static cycle_t linsched_source_read(struct clocksource *cs);
+
+/* Some assumptions fail if we stay at time 0 during setup, so just dodge it */
+u64 current_time = 100;
+static u64 next_event[NR_CPUS];
+static struct clock_event_device linsched_hrt[NR_CPUS];
+
+static struct clock_event_device linsched_hrt_base = {
+ .name = "linsched-events",
+ .features = CLOCK_EVT_FEAT_ONESHOT,
+ .max_delta_ns = 1000000000L,
+ .min_delta_ns = 5000,
+ .mult = 1,
+ .shift = 0,
+ .rating = 100,
+ .irq = -1,
+ .cpumask = NULL,
+ .set_next_event = linsched_hrt_set_next_event,
+ .set_mode = linsched_hrt_set_mode,
+ .broadcast = linsched_hrt_broadcast
+};
+
+/* We need a clocksource other than jiffies in order to run
+ * HIGH_RES_TIMERS, so replace the default. jiffies will then be
+ * updated by kernel/time/tick-common.c and
+ * kernel/time/tick-sched.c */
+static struct clocksource linsched_hrt_source = {
+ .name = "linsched-clocksource",
+ .rating = 100,
+ .mask = (cycle_t) -1,
+ .mult = 1,
+ .shift = 0,
+ .flags = CLOCK_SOURCE_VALID_FOR_HRES | CLOCK_SOURCE_IS_CONTINUOUS,
+ .read = linsched_source_read,
+};
+
+void linsched_init_hrtimer(void)
+{
+ long i;
+
+ for (i = 0; i < nr_cpu_ids; i++) {
+ struct clock_event_device *dev = &linsched_hrt[i];
+ memcpy(dev, &linsched_hrt_base,
+ sizeof(struct clock_event_device));
+ dev->cpumask = cpumask_of(i);
+
+ next_event[i] = KTIME_MAX;
+
+ linsched_change_cpu(i);
+ clockevents_register_device(dev);
+ }
+ /* Normally this would be called when looking through
+ * clocksources, but we're not using the entire clocksource
+ * infrastructure at the moment */
+ tick_clock_notify();
+ for (i = 0; i < nr_cpu_ids; i++) {
+ linsched_change_cpu(i);
+ hrtimer_run_pending();
+ }
+ linsched_change_cpu(0);
+}
+
+void linsched_current_handler(void)
+{
+ struct task_struct *old;
+
+ do {
+ struct task_data *td = task_thread_info(current)->td;
+ old = current;
+
+ if (td && td->handle_task) {
+ td->handle_task(current, td->data);
+ }
+ /* we keep calling handle_task so that tasks
+ * can have smaller than clock gran runtimes if they want */
+ linsched_check_resched();
+ } while (current != old);
+
+ /* we should always be done by this point */
+ BUG_ON(need_resched());
+}
+
+extern cpumask_t linsched_cpu_softirq_raised;
+void process_all_softirqs(void)
+{
+ int cpu, old_cpu = smp_processor_id();
+
+ if (cpumask_empty(&linsched_cpu_softirq_raised))
+ return;
+
+ while (!cpumask_empty(&linsched_cpu_softirq_raised)) {
+ cpu = cpumask_first(&linsched_cpu_softirq_raised);
+ linsched_change_cpu(cpu);
+ do_softirq();
+
+ /* we may have pulled something over that wants to run */
+ linsched_current_handler();
+ }
+
+ BUG_ON(irqs_disabled());
+ linsched_change_cpu(old_cpu);
+}
+
+DECLARE_PER_CPU(struct tick_sched, tick_cpu_sched);
+void linsched_check_idle_cpu(void)
+{
+ int cpu = smp_processor_id();
+ struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
+
+ if (ts->inidle && !idle_cpu(cpu)) {
+ tick_nohz_idle_exit();
+ }
+}
+
+/* Run a simulation for some number of ticks. Each tick,
+ * scheduling and load balancing decisions are made. Obviously, we
+ * could create tasks, change priorities, etc., at certain ticks
+ * if we desired, rather than just running a simple simulation.
+ * (Tasks can also be removed by having them exit.)
+ */
+void linsched_run_sim(int sim_ticks)
+{
+ /*
+ * We bias initial_jiffies ahead by one since we will not schedule away
+ * from idle until the first event (specifically, the first timer
+ * tick).
+ */
+ u64 initial_jiffies = jiffies;
+ cpumask_t runnable;
+ int i;
+
+ for_each_online_cpu(i) {
+ linsched_change_cpu(i);
+ linsched_current_handler();
+ }
+
+ simulation_started = true;
+ while (current_time < KTIME_MAX
+ && jiffies < initial_jiffies + sim_ticks) {
+ u64 evt = KTIME_MAX;
+ /* find the next event */
+ for (i = 0; i < nr_cpu_ids; i++) {
+ if (next_event[i] < evt) {
+ evt = next_event[i];
+ cpumask_clear(&runnable);
+ }
+ if (next_event[i] == evt) {
+ cpumask_set_cpu(i, &runnable);
+ }
+ }
+ current_time = evt;
+ int active_cpu = 0;
+
+ compute_lb_info();
+
+ /* It might be useful to randomize the ordering here, although
+ * it should be rare that there will actually be two active
+ * cpus at once as the tick code offsets the main scheduler
+ * ticks for each cpu */
+ for_each_cpu(active_cpu, &runnable) {
+ next_event[active_cpu] = KTIME_MAX;
+ linsched_change_cpu(active_cpu);
+ local_irq_disable();
+ irq_enter();
+ linsched_hrt[active_cpu].event_handler(&linsched_hrt
+ [active_cpu]);
+ irq_exit();
+ local_irq_enable();
+ /* a handler should never leave this state changed */
+ BUG_ON(smp_processor_id() != active_cpu);
+
+ process_all_softirqs();
+ linsched_rcu_invoke();
+
+ BUG_ON(irqs_disabled());
+ if (idle_cpu(active_cpu) && !need_resched()) {
+ tick_nohz_idle_enter();
+ } else {
+ linsched_current_handler();
+ }
+
+ track_nohz_residency(active_cpu);
+ run_sanity_check();
+ }
+ }
+}
+
+struct clocksource *__init __weak clocksource_default_clock(void)
+{
+ return &linsched_hrt_source;
+}
+
+static int linsched_hrt_set_next_event(unsigned long evt,
+ struct clock_event_device *d)
+{
+ next_event[d - linsched_hrt] =
+ ktime_to_ns(ktime_add_safe
+ (ns_to_ktime(current_time), ns_to_ktime(evt)));
+ return 0;
+}
+
+static void linsched_hrt_set_mode(enum clock_event_mode mode,
+ struct clock_event_device *d)
+{
+}
+
+static void linsched_hrt_broadcast(const struct cpumask *mask)
+{
+}
+
+static cycle_t linsched_source_read(struct clocksource *cs)
+{
+ return current_time;
+}
+
+u64 sched_clock(void)
+{
+ return current_time;
+}
diff --git a/tools/linsched/include/generated/autoconf.h b/tools/linsched/include/generated/autoconf.h
new file mode 100644
index 00000000000000..488405b828d2b6
--- /dev/null
+++ b/tools/linsched/include/generated/autoconf.h
@@ -0,0 +1,252 @@
+/*
+ * Automatically generated C config: don't edit
+ * Linux kernel version: 2.6.34
+ * Thu Aug 11 17:14:24 2011
+ */
+#define AUTOCONF_INCLUDED
+#define CONFIG_DEFAULT_HOSTNAME "LinSched"
+#define CONFIG_FRAME_WARN 2048
+#define CONFIG_COMPAT_BRK 1
+#define CONFIG_DEFAULT_SECURITY_DAC 1
+#define CONFIG_POSIX_MQUEUE_SYSCTL 1
+#define CONFIG_PROC_KCORE 1
+#define CONFIG_XTERM_CHAN 1
+#define CONFIG_UML_NET_MCAST 1
+#define CONFIG_TIMERFD 1
+#define CONFIG_ENABLE_MUST_CHECK 1
+#define CONFIG_EVENTFD 1
+#define CONFIG_X86_CPU 1
+#define CONFIG_UML_RANDOM 1
+#define CONFIG_LD_SCRIPT_DYN 1
+#define CONFIG_X86_TSC 1
+#define CONFIG_SMP 1
+#define CONFIG_UML_X86 1
+#define CONFIG_RCU_FANOUT 64
+#define CONFIG_BLK_DEV 1
+#define CONFIG_CRYPTO_AES_MODULE 1
+#define CONFIG_MODULES 1
+#define CONFIG_PHYS_ADDR_T_64BIT 1
+#define CONFIG_CPU_SUP_INTEL 1
+#define CONFIG_EXT2_FS 1
+#define CONFIG_EXT3_FS 1
+#define CONFIG_DNOTIFY 1
+#define CONFIG_UML_NET_SLIRP 1
+#define CONFIG_CRYPTO_ALGAPI2_MODULE 1
+#define CONFIG_DEFCONFIG_LIST "arch/$ARCH/defconfig"
+#define CONFIG_SLAB 1
+#define CONFIG_INOTIFY 1
+#define CONFIG_HOTPLUG 1
+#define CONFIG_CRYPTO_RNG_MODULE 1
+#define CONFIG_LOCALVERSION_AUTO 1
+#define CONFIG_SLHC_MODULE 1
+/* CONFIG_PROC_FS is not defined */
+#define CONFIG_SCHED_DEBUG 1
+#define CONFIG_INET 1
+#define CONFIG_RT_MUTEXES 1
+#define CONFIG_DEBUG_MEMORY_INIT 1
+#define CONFIG_WLAN 1
+#define CONFIG_TCP_CONG_CUBIC 1
+#define CONFIG_X86_L1_CACHE_SHIFT 6
+#define CONFIG_UML_NET 1
+#define CONFIG_CC_OPTIMIZE_FOR_SIZE 1
+#define CONFIG_PROC_PAGE_MONITOR 1
+#define CONFIG_SLIP_MODULE 1
+#define CONFIG_IOSCHED_CFQ 1
+#define CONFIG_PAGEFLAGS_EXTENDED 1
+#define CONFIG_GENERIC_BUG 1
+#define CONFIG_SWAP 1
+#define CONFIG_CRC32 1
+#define CONFIG_XFRM 1
+#define CONFIG_DEFAULT_CFQ 1
+#define CONFIG_EXTRA_FIRMWARE ""
+#define CONFIG_CRYPTO_ANSI_CPRNG_MODULE 1
+#define CONFIG_UNIX 1
+#define CONFIG_STDERR_CONSOLE 1
+#define CONFIG_X86_XADD 1
+#define CONFIG_UML_NET_DAEMON 1
+#define CONFIG_SIGNALFD 1
+#define CONFIG_UID16 1
+#define CONFIG_64BIT 1
+#define CONFIG_BLK_DEV_NBD_MODULE 1
+#define CONFIG_IKCONFIG 1
+#define CONFIG_BINFMT_MISC_MODULE 1
+#define CONFIG_IP_FIB_HASH 1
+#define CONFIG_DEFAULT_MMAP_MIN_ADDR 4096
+#define CONFIG_ANON_INODES 1
+#define CONFIG_GENERIC_FIND_LAST_BIT 1
+#define CONFIG_SLABINFO 1
+#define CONFIG_NLS_DEFAULT "iso8859-1"
+#define CONFIG_BLK_DEV_UBD 1
+#define CONFIG_SPLIT_PTLOCK_CPUS 4
+#define CONFIG_VM_EVENT_COUNTERS 1
+#define CONFIG_CRYPTO_RNG2_MODULE 1
+#define CONFIG_CON_CHAN "xterm"
+#define CONFIG_GENERIC_FIND_NEXT_BIT 1
+#define CONFIG_X86_CMOV 1
+#define CONFIG_REISERFS_FS 1
+#define CONFIG_SYSCTL_SYSCALL 1
+#define CONFIG_X86_INTERNODE_CACHE_SHIFT 6
+#define CONFIG_ELF_CORE 1
+#define CONFIG_MCONSOLE 1
+#define CONFIG_MAGIC_SYSRQ 1
+#define CONFIG_DEFAULT_IOSCHED "cfq"
+#define CONFIG_LEGACY_PTYS 1
+#define CONFIG_UNIX98_PTYS 1
+#define CONFIG_X86_USE_PPRO_CHECKSUM 1
+#define CONFIG_SOUND_OSS_CORE 1
+#define CONFIG_SSL_CHAN "pts"
+#define CONFIG_BLOCK 1
+#define CONFIG_GENERIC_CLOCKEVENTS_BUILD 1
+#define CONFIG_GENERIC_CLOCKEVENTS_BROADCAST 1
+#define CONFIG_GENERIC_HWEIGHT 1
+#define CONFIG_IRQ_RELEASE_METHOD 1
+#define CONFIG_QUOTACTL 1
+#define CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE 0
+#define CONFIG_ENABLE_WARN_DEPRECATED 1
+#define CONFIG_WIRELESS 1
+#define CONFIG_UML_NET_TUNTAP 1
+#define CONFIG_KALLSYMS 1
+#define CONFIG_CPU_SUP_AMD 1
+#define CONFIG_SCSI_MOD 1
+#define CONFIG_KERNEL_STACK_ORDER 1
+#define CONFIG_FSNOTIFY 1
+#define CONFIG_SYSVIPC_SYSCTL 1
+#define CONFIG_FIRMWARE_IN_KERNEL 1
+#define CONFIG_NO_IOMEM 1
+#define CONFIG_PROC_SYSCTL 1
+#define CONFIG_PTY_CHAN 1
+#define CONFIG_TREE_RCU 1
+#define CONFIG_TTY_CHAN 1
+#define CONFIG_SHMEM 1
+#define CONFIG_X86_INTEL_USERCOPY 1
+#define CONFIG_INET_XFRM_MODE_TRANSPORT 1
+#define CONFIG_EPOLL 1
+#define CONFIG_UEVENT_HELPER_PATH "/sbin/hotplug"
+#define CONFIG_INET_XFRM_MODE_TUNNEL 1
+#define CONFIG_FILE_LOCKING 1
+#define CONFIG_BLK_DEV_COW_COMMON 1
+#define CONFIG_DEBUG_KERNEL 1
+#define CONFIG_SOUND_MODULE 1
+#define CONFIG_QUOTA 1
+#define CONFIG_TMPFS 1
+#define CONFIG_GENERIC_TIME 1
+#define CONFIG_DUMMY_MODULE 1
+#define CONFIG_FUTEX 1
+#define CONFIG_EXPERIMENTAL 1
+#define CONFIG_VIRT_TO_BUS 1
+#define CONFIG_LOCALVERSION ""
+#define CONFIG_INIT_ENV_ARG_LIMIT 128
+#define CONFIG_IOSCHED_DEADLINE 1
+#define CONFIG_SYSFS 1
+#define CONFIG_IOSCHED_NOOP 1
+#define CONFIG_HIGH_RES_TIMERS 1
+#define CONFIG_GENERIC_CLOCKEVENTS 1
+#define CONFIG_NO_HZ 1
+#define CONFIG_LOCKDEP_SUPPORT 1
+#define CONFIG_MSDOS_PARTITION 1
+#define CONFIG_GENERIC_FIND_FIRST_BIT 1
+#define CONFIG_HZ 1000
+#define CONFIG_INET_DIAG 1
+#define CONFIG_X86_MINIMUM_CPU_FAMILY 3
+#define CONFIG_TICK_ONESHOT 1
+#define CONFIG_BASE_FULL 1
+#define CONFIG_PREVENT_FIRMWARE_BUILD 1
+#define CONFIG_HOSTAUDIO_MODULE 1
+#define CONFIG_BLK_DEV_LOOP_MODULE 1
+#define CONFIG_CPU_SUP_CENTAUR 1
+#define CONFIG_GENERIC_CALIBRATE_DELAY 1
+#define CONFIG_FW_LOADER 1
+#define CONFIG_NULL_CHAN 1
+#define CONFIG_ISO9660_FS_MODULE 1
+#define CONFIG_PACKET 1
+#define CONFIG_DEBUG_BUGVERBOSE 1
+#define CONFIG_X86_WP_WORKS_OK 1
+#define CONFIG_3_LEVEL_PGTABLES 1
+#define CONFIG_PORT_CHAN 1
+#define CONFIG_INOTIFY_USER 1
+#define CONFIG_POSIX_MQUEUE 1
+#define CONFIG_JOLIET 1
+#define CONFIG_SELECT_MEMORY_MODEL 1
+#define CONFIG_RCU_CPU_STALL_DETECTOR 1
+#define CONFIG_AUTOFS_FS_MODULE 1
+#define CONFIG_UML_NET_SLIP 1
+#define CONFIG_INET_XFRM_MODE_BEET 1
+#define CONFIG_JBD 1
+#define CONFIG_MK8 1
+#define CONFIG_DEFAULT_TCP_CONG "cubic"
+#define CONFIG_BSD_PROCESS_ACCT 1
+#define CONFIG_NLATTR 1
+#define CONFIG_UML_SOUND_MODULE 1
+#define CONFIG_HOSTFS 1
+#define CONFIG_PRINTK 1
+#define CONFIG_AIO 1
+#define CONFIG_DETECT_HUNG_TASK 1
+#define CONFIG_DEFAULT_SECURITY ""
+#define CONFIG_IKCONFIG_PROC 1
+#define CONFIG_BUG 1
+#define CONFIG_CRYPTO_HW 1
+#define CONFIG_NAMESPACES 1
+#define CONFIG_NETWORK_FILESYSTEMS 1
+#define CONFIG_CRYPTO 1
+/* CONFIG_SYSCTL is not defined */
+#define CONFIG_MISC_FILESYSTEMS 1
+#define CONFIG_ZONE_DMA_FLAG 0
+#define CONFIG_RWSEM_XCHGADD_ALGORITHM 1
+#define CONFIG_RWSEM_GENERIC_SPINLOCK 1
+#define CONFIG_NET 1
+#define CONFIG_MODULE_UNLOAD 1
+#define CONFIG_STANDALONE 1
+#define CONFIG_KALLSYMS_EXTRA_PASS 1
+#define CONFIG_NETDEVICES 1
+#define CONFIG_INET_TCP_DIAG 1
+#define CONFIG_FRAME_POINTER 1
+#define CONFIG_PRINT_QUOTA_WARNING 1
+#define CONFIG_NLS 1
+#define CONFIG_CRYPTO_ALGAPI_MODULE 1
+#define CONFIG_UML 1
+#define CONFIG_UML_NET_ETHERTAP 1
+#define CONFIG_PPP_MODULE 1
+#define CONFIG_DEBUG_INFO 1
+#define CONFIG_SSL 1
+#define CONFIG_BASE_SMALL 0
+#define CONFIG_STDIO_CONSOLE 1
+#define CONFIG_BINFMT_ELF 1
+#define CONFIG_TUN_MODULE 1
+#define CONFIG_CON_ZERO_CHAN "fd:0,fd:1"
+#define CONFIG_LEGACY_PTY_COUNT 32
+#define CONFIG_BITREVERSE 1
+#define CONFIG_LOG_BUF_SHIFT 14
+#define CONFIG_AUTOFS4_FS_MODULE 1
+#define CONFIG_CGROUPS 1
+#define CONFIG_CGROUP_SCHED 1
+#define CONFIG_CGROUP_CPUACCT 1
+#define CONFIG_FAIR_GROUP_SCHED 1
+#define CONFIG_SCHEDSTATS 1
+#define CONFIG_X86 1
+#define CONFIG_X86_CPUID 1
+#define CONFIG_X86_64 1
+#define CONFIG_X86_64_SMP 1
+/* CONFIG_TRACE_IRQFLAGS_SUPPORT is not set */
+#define CONFIG_HAVE_UNSTABLE_SCHED_CLOCK 1
+#define CONFIG_ARCH_HAS_CACHE_LINE_SIZE 1
+#define CONFIG_NODES_SHIFT 9
+#define CONFIG_NR_CPUS 32
+#define CONFIG_RT_MUTEXES 1
+#define CONFIG_PREEMPT_NONE 1
+#define CONFIG_DEBUG_PREEMPT 1
+#define CONFIG_DEBUG_LIST 1
+/*#define CONFIG_SPARSEMEM 1*/
+#define CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER 1
+#define CONFIG_SPARSEMEM_EXTREME 1
+#define CONFIG_SPARSEMEM_MANUAL 1
+#define CONFIG_SPARSEMEM_VMEMMAP 1
+#define CONFIG_SPARSEMEM_VMEMMAP_ENABLE 1
+#define CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK 1
+#define CONFIG_SCHED_SMT 1
+#define CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK 1
+#define CONFIG_SCHED_MC 1
+#define CONFIG_NUMA 1
+#define CONFIG_HOTPLUG_CPU 1
+#define CONFIG_STOP_MACHINE 1
+#define __enabled_CONFIG_IPV6 0
+#define __enabled_CONFIG_IPV6_MODULE 0
diff --git a/tools/linsched/include/generated/bounds.h b/tools/linsched/include/generated/bounds.h
new file mode 100644
index 00000000000000..fb07f92c9c5567
--- /dev/null
+++ b/tools/linsched/include/generated/bounds.h
@@ -0,0 +1,13 @@
+#ifndef __LINUX_BOUNDS_H__
+#define __LINUX_BOUNDS_H__
+/*
+ * DO NOT MODIFY.
+ *
+ * This file was generated by Kbuild
+ *
+ */
+
+#define NR_PAGEFLAGS 22 /* __NR_PAGEFLAGS # */
+#define MAX_NR_ZONES 4 /* __MAX_NR_ZONES # */
+
+#endif
diff --git a/tools/linsched/include/linux_sched_headers.h b/tools/linsched/include/linux_sched_headers.h
new file mode 100644
index 00000000000000..2a164416cfac32
--- /dev/null
+++ b/tools/linsched/include/linux_sched_headers.h
@@ -0,0 +1,26 @@
+#ifndef __LINSCHED_LINUX_SCHED_HEADERS_H
+#define __LINSCHED_LINUX_SCHED_HEADERS_H
+
+#ifdef _LINUX_SCHED_H
+#error linux_sched_headers.h must be included before sched.h
+#endif
+
+#define __sigset_t_defined
+#define __defined_schedparam
+#define __dev_t_defined
+#define __timer_t_defined
+#define __loff_t_defined
+#define __blkcnt_t_defined
+#define __int8_t_defined
+#define __need_schedparam
+#define _SYS_TYPES_H
+#define _SCHED_H
+#define _TIME_H
+#include "../kernel/sched/sched.h"
+#include <linux/cgroup.h>
+#include <linux/sched.h>
+#include <linux/stop_machine.h>
+#include "nohz.h"
+#undef abs
+
+#endif /* __LINSCHED_LINUX_SCHED_HEADERS_H */
diff --git a/tools/linsched/lib/sort.h b/tools/linsched/lib/sort.h
new file mode 100644
index 00000000000000..6662434f895272
--- /dev/null
+++ b/tools/linsched/lib/sort.h
@@ -0,0 +1,208 @@
+#ifndef LINSCHED_LIB_SORT
+#define LINSCHED_LIB_SORT
+
+#include <string.h>
+
+/* Quicksort implementation from glibc, adapted into a
+ * type-specialized version optimized for reasonably small structs.
+ * This cuts about 1/3 of the time off of load balance scoring over qsort(3).
+ */
+
+/* The next 4 #defines implement a very fast in-line stack abstraction. */
+/* The stack needs log (total_elements) entries (we could even subtract
+ log(MAX_THRESH)). Since total_elements has type size_t, we get as
+ upper bound for log (total_elements):
+ bits per byte (CHAR_BIT) * sizeof(size_t). */
+#define QSORT_STACK_SIZE (8 * sizeof(size_t))
+#define QSORT_PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
+#define QSORT_POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi)))
+#define QSORT_STACK_NOT_EMPTY (stack < top)
+
+
+/* Order size using quicksort. This implementation incorporates
+ four optimizations discussed in Sedgewick:
+
+ 1. Non-recursive, using an explicit stack of pointer that store the
+ next array partition to sort. To save time, this maximum amount
+ of space required to store an array of SIZE_MAX is allocated on the
+ stack. Assuming a 32-bit (64 bit) integer for size_t, this needs
+ only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
+ Pretty cheap, actually.
+
+ 2. Chose the pivot element using a median-of-three decision tree.
+ This reduces the probability of selecting a bad pivot value and
+ eliminates certain extraneous comparisons.
+
+ 3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
+ insertion sort to order the MAX_THRESH items within each partition.
+ This is a big win, since insertion sort is faster for small, mostly
+ sorted array segments.
+
+ 4. The larger of the two sub-partitions is always pushed onto the
+ stack first, with the algorithm then concentrating on the
+ smaller partition. This *guarantees* no more than log (total_elems)
+ stack size is needed (actually O(1) in this case)! */
+
+
+/* Defines a function qsort_<name> that compares using the given function */
+#define define_specialized_qsort(name, type, compare) \
+ static inline void _qsort_swap##name(type *a, type *b) \
+ { \
+ type temp = *a; \
+ *a = *b; \
+ *b = temp; \
+ } \
+ void qsort_##name(type *base_ptr, size_t total_elems) \
+ { \
+ static const int MAX_THRESH = 4; \
+ typedef struct { \
+ void *lo; \
+ void *hi; \
+ } stack_node; \
+ \
+ \
+ if (total_elems == 0) \
+ /* Avoid lossage with unsigned arithmetic below. */ \
+ return; \
+ \
+ if (total_elems > MAX_THRESH) \
+ { \
+ type *lo = base_ptr; \
+ type *hi = &lo[total_elems - 1]; \
+ stack_node stack[QSORT_STACK_SIZE]; \
+ stack_node *top = stack + 1; \
+ \
+ while (QSORT_STACK_NOT_EMPTY) \
+ { \
+ type *left_ptr; \
+ type *right_ptr; \
+ \
+ /* Select median value from among LO, MID, and HI. Rearrange \
+ LO and HI so the three values are sorted. This lowers the \
+ probability of picking a pathological pivot value and \
+ skips a comparison for both the LEFT_PTR and RIGHT_PTR in \
+ the while loops. */ \
+ \
+ type *mid = lo + ((hi - lo) >> 1); \
+ \
+ if (compare(mid, lo) < 0) \
+ _qsort_swap##name (mid, lo); \
+ if (compare (hi, mid) < 0) \
+ _qsort_swap##name (mid, hi); \
+ else \
+ goto jump_over; \
+ if (compare ((void *) mid, (void *) lo) < 0) \
+ _qsort_swap##name (mid, lo); \
+ jump_over:; \
+ \
+ left_ptr = lo + 1; \
+ right_ptr = hi - 1; \
+ \
+ /* Here's the famous ``collapse the walls'' section of quicksort. \
+ Gotta like those tight inner loops! They are the main reason \
+ that this algorithm runs much faster than others. */ \
+ do \
+ { \
+ while (compare (left_ptr, mid) < 0) \
+ left_ptr ++; \
+ \
+ while (compare (mid, right_ptr) < 0) \
+ right_ptr --; \
+ \
+ if (left_ptr < right_ptr) \
+ { \
+ _qsort_swap##name (left_ptr, right_ptr); \
+ if (mid == left_ptr) \
+ mid = right_ptr; \
+ else if (mid == right_ptr) \
+ mid = left_ptr; \
+ left_ptr ++; \
+ right_ptr --; \
+ } \
+ else if (left_ptr == right_ptr) \
+ { \
+ left_ptr ++; \
+ right_ptr --; \
+ break; \
+ } \
+ } \
+ while (left_ptr <= right_ptr); \
+ \
+ /* Set up pointers for next iteration. First determine whether \
+ left and right partitions are below the threshold size. If so, \
+ ignore one or both. Otherwise, push the larger partition's \
+ bounds on the stack and continue sorting the smaller one. */ \
+ \
+ if ((right_ptr - lo) <= MAX_THRESH) \
+ { \
+ if ((hi - left_ptr) <= MAX_THRESH) \
+ /* Ignore both small partitions. */ \
+ QSORT_POP (lo, hi); \
+ else \
+ /* Ignore small left partition. */ \
+ lo = left_ptr; \
+ } \
+ else if ((hi - left_ptr) <= MAX_THRESH) \
+ /* Ignore small right partition. */ \
+ hi = right_ptr; \
+ else if ((right_ptr - lo) > (hi - left_ptr)) \
+ { \
+ /* Push larger left partition indices. */ \
+ QSORT_PUSH (lo, right_ptr); \
+ lo = left_ptr; \
+ } \
+ else \
+ { \
+ /* Push larger right partition indices. */ \
+ QSORT_PUSH (left_ptr, hi); \
+ hi = right_ptr; \
+ } \
+ } \
+ } \
+ \
+ /* Once the BASE_PTR array is partially sorted by quicksort the rest \
+ is completely sorted using insertion sort, since this is efficient \
+ for partitions below MAX_THRESH size. BASE_PTR points to the beginning \
+ of the array to sort, and END_PTR points at the very last element in \
+ the array (*not* one beyond it!). */ \
+ \
+ { \
+ type *const end_ptr = &base_ptr[(total_elems - 1)]; \
+ type *tmp_ptr = base_ptr; \
+ type *thresh = min(end_ptr, base_ptr + MAX_THRESH); \
+ type *run_ptr; \
+ \
+ /* Find smallest element in first threshold and place it at the \
+ array's beginning. This is the smallest array element, \
+ and the operation speeds up insertion sort's inner loop. */ \
+ \
+ for (run_ptr = tmp_ptr + 1; run_ptr <= thresh; run_ptr ++) \
+ if (compare (run_ptr, tmp_ptr) < 0) \
+ tmp_ptr = run_ptr; \
+ \
+ if (tmp_ptr != base_ptr) \
+ _qsort_swap##name (tmp_ptr, base_ptr); \
+ \
+ /* Insertion sort, running from left-hand-side up to right-hand-side. */ \
+ \
+ run_ptr = base_ptr + 1; \
+ while ((run_ptr += 1) <= end_ptr) \
+ { \
+ tmp_ptr = run_ptr - 1; \
+ while (compare(run_ptr, tmp_ptr) < 0) \
+ tmp_ptr --; \
+ \
+ tmp_ptr ++; \
+ if (tmp_ptr != run_ptr) \
+ { \
+ type temp = *run_ptr; \
+ \
+ memmove(tmp_ptr + 1, tmp_ptr, sizeof(type) * (run_ptr - tmp_ptr)); \
+ *tmp_ptr = temp; \
+ } \
+ } \
+ } \
+ }
+
+
+#endif
diff --git a/tools/linsched/linsched.c b/tools/linsched/linsched.c
new file mode 100644
index 00000000000000..095a2622203b48
--- /dev/null
+++ b/tools/linsched/linsched.c
@@ -0,0 +1,100 @@
+#include "linsched.h"
+#include "nohz_tracking.h"
+#include "load_balance_score.h"
+
+#include <stdio.h>
+#include <getopt.h>
+#include <stdlib.h>
+
+struct linsched_global_options linsched_global_options = {0};
+
+static void print_global_usage(void)
+{
+ printf("Global options:\n");
+ printf("\t\t --help_global_options: show this help\n");
+ printf("\t\t --print_task_stats: print task runtime stats\n");
+ printf("\t\t --print_cgroup_stats: print cgroup runtime stats\n");
+ printf("\t\t --print_nohz_stats: print nohz residency information\n");
+ printf("\t\t --print_average_imbalance: print average balance stats\n");
+ printf("\t\t --dump_imbalance: print imbalance every step\n");
+ printf("\t\t --dump_full_balance: print full load balance info"
+ "every step\n");
+ printf("\n");
+ exit(1);
+}
+
+void linsched_process_global_options(int *argc, char **argv)
+{
+ int idx = -2, c, i;
+ struct linsched_global_options *opt = &linsched_global_options;
+
+ struct option long_options[] = {
+ {"help_global_options", no_argument, NULL, 'V' },
+ {"print_nohz_stats", no_argument, &opt->print_nohz, 1},
+ {"print_task_stats", no_argument, &opt->print_tasks, 1},
+ {"print_cgroup_stats", no_argument, &opt->print_cgroups, 1},
+ {"print_average_imbalance", no_argument, &opt->print_avg_imb, 1},
+ {"print_sched_stats", no_argument, &opt->print_sched_stats, 1},
+ {"dump_imbalance", no_argument, &opt->dump_imbalance, 1},
+ {"dump_full_balance", no_argument, &opt->dump_full_balance, 1},
+ {0, 0, 0, 0}
+ };
+
+ opterr = 0;
+ while (1) {
+ c = getopt_long(*argc, argv, "-", long_options, &idx);
+ if (c == 'V') {
+ print_global_usage();
+ } else if (c == 0) {
+ /*
+ * pull opt out of args so that it doesn't confuse
+ * other handlers or cause false negatives (e.g.
+ * invalid argument).
+ */
+ for (i = --optind; i < *argc; i++)
+ argv[i] = argv[i+1];
+ (*argc)--;
+ } else if (c == -1)
+ break;
+ }
+
+ /* reset optind/opterr so that any other optarg handlers just 'work' */
+ optind = 1;
+ opterr = 1;
+}
+
+static void stat_header(const char *stat_name) {
+ printf("------ %s\n", stat_name);
+}
+
+int linsched_test_main(int argc, char **argv);
+
+int main(int argc, char **argv)
+{
+ int ret;
+
+ linsched_process_global_options(&argc, argv);
+
+ ret = linsched_test_main(argc, argv);
+
+ if (linsched_global_options.print_tasks) {
+ stat_header("task runtime");
+ linsched_print_task_stats();
+ }
+ if (linsched_global_options.print_cgroups) {
+ stat_header("group runtime");
+ linsched_print_group_stats();
+ }
+ if (linsched_global_options.print_sched_stats) {
+ stat_header("sched stats");
+ linsched_show_schedstat();
+ }
+ if (linsched_global_options.print_nohz) {
+ stat_header("nohz residency");
+ print_nohz_residency();
+ }
+ if (linsched_global_options.print_avg_imb) {
+ printf("average imbalance: %f\n", get_average_imbalance());
+ }
+ return ret;
+}
diff --git a/tools/linsched/linsched.h b/tools/linsched/linsched.h
new file mode 100644
index 00000000000000..89da71c086e0ab
--- /dev/null
+++ b/tools/linsched/linsched.h
@@ -0,0 +1,408 @@
+/* LinSched -- The Linux Scheduler Simulator
+ * Copyright (C) 2008 John M. Calandrino
+ * E-mail: jmc@cs.unc.edu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef LINSCHED_H
+#define LINSCHED_H
+
+#include "linux_sched_headers.h"
+
+/* Linsched definitions and declarations. */
+#define LINSCHED_RAND_SEED 123456
+#define LINSCHED_MAX_TASKS 10000
+#define LINSCHED_MAX_GROUPS 100
+#define LINSCHED_DEFAULT_NR_CPUS 4
+
+/* have we started the simulation */
+extern bool simulation_started;
+
+extern struct cgroup *root_cgroup;
+
+extern struct task_struct *__linsched_tasks[LINSCHED_MAX_TASKS];
+extern struct task_struct *stop_tasks[NR_CPUS];
+
+struct linsched_cgroup {
+ struct cgroup cg;
+ void *temp;
+};
+
+extern struct linsched_cgroup __linsched_cgroups[LINSCHED_MAX_GROUPS];
+
+extern u64 current_time;
+
+struct task_data {
+ void *data;
+ void (*init_task) (struct task_struct *, void *data);
+ void (*handle_task) (struct task_struct *, void *data);
+};
+
+struct stop_task {
+ cpu_stop_fn_t fxn;
+ void *arg;
+
+ struct task_struct *p;
+ struct hrtimer timer;
+};
+
+struct sleep_run_data {
+ struct hrtimer timer;
+ struct task_struct *p;
+ u64 last_start;
+};
+
+struct sleep_run_task {
+ struct sleep_run_data sr_data;
+ unsigned int busy; /* ms to run */
+ unsigned int sleep; /* ms to sleep */
+};
+
+/* A generic data placeholder for tasks modelled using random dists.
+ */
+struct rnd_dist_task {
+ struct sleep_run_data sr_data;
+ unsigned int busy;
+ unsigned int sleep;
+ struct rand_dist *sleep_rdist, *busy_rdist;
+};
+
+struct perf_task {
+ struct sleep_run_data sr_data;
+ unsigned int busy; /* ms to run */
+ unsigned int sleep; /* ms to sleep */
+ char *filename; /* pid.rlog file */
+ void *fp; /* fp to pid.rlog file */
+};
+
+enum linsched_perf_event_type {
+ RUN,
+ SLEEP,
+ IOWAIT,
+};
+
+struct linsched_perf_event {
+ enum linsched_perf_event_type type;
+ unsigned long duration;
+};
+
+/* Used to specify the topology of the system. Not specifying a
+ * topology gives a flat topology of LINSCHED_DEFAULT_NR_CPUS CPUs,
+ * each with one core and no SMT */
+struct linsched_topology {
+ /* map from logical cpu to containing NUMA node */
+ int node_map[NR_CPUS];
+ /* map to containing physical CPU package */
+ int coregroup_map[NR_CPUS];
+ /* map from SMT logical cpu to containing core */
+ int core_map[NR_CPUS];
+ /* map from [node][node] to distance between them */
+ int node_distances[MAX_NUMNODES][MAX_NUMNODES];
+ int nr_cpus;
+};
+
+enum topologies {
+ UNIPROCESSOR,
+ DUAL_CPU,
+ DUAL_CPU_MC,
+ QUAD_CPU,
+ QUAD_CPU_MC,
+ QUAD_CPU_DUAL_SOCKET,
+ QUAD_CPU_QUAD_SOCKET,
+ HEX_CPU_DUAL_SOCKET_SMT,
+ MAX_TOPOLOGIES
+};
+
+#define TOPO_UNIPROCESSOR \
+ { \
+ .nr_cpus = 1, \
+ .core_map = { \
+ [0] = 0, \
+ }, \
+ .coregroup_map = { \
+ [0] = 0, \
+ }, \
+ .node_map = { \
+ [0] = 0, \
+ }, \
+ .node_distances = { \
+ { 10 }, \
+ }, \
+ }
+
+#define TOPO_DUAL_CPU \
+ { \
+ .nr_cpus = 2, \
+ .core_map = { \
+ [0] = 0, \
+ [1] = 1, \
+ }, \
+ .coregroup_map = { \
+ [0] = 0, \
+ [1] = 1, \
+ }, \
+ .node_map = { \
+ [0 ... 1] = 0, \
+ }, \
+ .node_distances = { \
+ { 10 }, \
+ }, \
+ }
+
+#define TOPO_DUAL_CPU_MC \
+ { \
+ .nr_cpus = 2, \
+ .core_map = { \
+ [0] = 0, \
+ [1] = 1, \
+ }, \
+ .coregroup_map = { \
+ [0 ... 1] = 0, \
+ }, \
+ .node_map = { \
+ [0 ... 1] = 0, \
+ }, \
+ .node_distances = { \
+ { 10 }, \
+ }, \
+ }
+
+#define TOPO_QUAD_CPU \
+ { \
+ .nr_cpus = 4, \
+ .core_map = { \
+ 0, 1, 2, 3, \
+ }, \
+ .coregroup_map = { \
+ 0, 1, 2, 3, \
+ }, \
+ .node_map = { \
+ [0 ... 3] = 0, \
+ }, \
+ .node_distances = { \
+ { 10 }, \
+ }, \
+ }
+
+#define TOPO_QUAD_CPU_MC \
+ { \
+ .nr_cpus = 4, \
+ .core_map = { \
+ 0, 1, 2, 3, \
+ }, \
+ .coregroup_map = { \
+ [0 ... 1] = 0, \
+ [2 ... 3] = 1, \
+ }, \
+ .node_map = { \
+ [0 ... 3] = 0, \
+ }, \
+ .node_distances = { \
+ { 10 }, \
+ }, \
+ }
+
+#define TOPO_QUAD_CPU_DUAL_SOCKET \
+ { \
+ .nr_cpus = 8, \
+ .core_map = { \
+ 0, 1, 2, 3, \
+ 4, 5, 6, 7, \
+ }, \
+ .coregroup_map = { \
+ [0] = 0, \
+ [1] = 1, \
+ [2] = 2, \
+ [3] = 3, \
+ [4] = 0, \
+ [5] = 1, \
+ [6] = 2, \
+ [7] = 3, \
+ }, \
+ .node_map = { \
+ [0 ... 7] = 0, \
+ }, \
+ .node_distances = { \
+ { 10 }, \
+ }, \
+ }
+
+#define TOPO_QUAD_CPU_QUAD_SOCKET \
+ { \
+ .nr_cpus = 16, \
+ .core_map = { \
+ 0, 1, 2, 3, \
+ 4, 5, 6, 7, \
+ 8, 9, 10, 11, \
+ 12, 13, 14, 15, \
+ }, \
+ .coregroup_map = { \
+ [0 ... 3] = 0, \
+ [4 ... 7] = 1, \
+ [8 ... 11] = 2, \
+ [12 ... 15] = 3, \
+ }, \
+ .node_map = { \
+ [0 ... 3] = 0, \
+ [4 ... 7] = 1, \
+ [8 ... 11] = 2, \
+ [12 ... 15] = 3, \
+ }, \
+ .node_distances = { \
+ { 10, 20, 20, 30 }, \
+ { 20, 20, 10, 20 }, \
+ { 20, 10, 20, 20 }, \
+ { 30, 20, 20, 10 }, \
+ }, \
+ }
+
+#define TOPO_HEX_CPU_DUAL_SOCKET_SMT \
+ { \
+ .nr_cpus = 24, \
+ .core_map = { \
+ [0] = 0, \
+ [1] = 1, \
+ [2] = 2, \
+ [3] = 3, \
+ [4] = 4, \
+ [5] = 5, \
+ [6] = 6, \
+ [7] = 7, \
+ [8] = 8, \
+ [9] = 9, \
+ [10] = 10, \
+ [11] = 11, \
+ [12] = 0, \
+ [13] = 1, \
+ [14] = 2, \
+ [15] = 3, \
+ [16] = 4, \
+ [17] = 5, \
+ [18] = 6, \
+ [19] = 7, \
+ [20] = 8, \
+ [21] = 9, \
+ [22] = 10, \
+ [23] = 11, \
+ }, \
+ .coregroup_map = { \
+ [0 ... 5] = 0, \
+ [6 ... 11] = 1, \
+ [12 ... 17] = 0, \
+ [18 ... 23] = 1, \
+ }, \
+ .node_map = { \
+ [0 ... 5] = 0, \
+ [6 ... 11] = 1, \
+ [12 ... 17] = 0, \
+ [18 ... 23] = 1, \
+ }, \
+ .node_distances = { \
+ { 10, 20 }, \
+ { 20, 10 }, \
+ }, \
+ }
+
+struct linsched_global_options {
+ int print_nohz;
+ int print_tasks;
+ int print_cgroups;
+ int print_avg_imb;
+ int print_sched_stats;
+ int dump_imbalance;
+ int dump_full_balance;
+};
+extern struct linsched_global_options linsched_global_options;
+
+/* Declarations of system initialization (or "boot") function. */
+asmlinkage void __init start_kernel(void);
+
+/* Scheduler "system calls" that are used during task creation. */
+asmlinkage long sys_sched_setscheduler(pid_t pid, int policy,
+ struct sched_param __user *param);
+asmlinkage long sys_nice(int increment);
+
+/* sched.c functions */
+struct task_group *cgroup_tg(struct cgroup *cgrp);
+struct cpuacct *cgroup_ca(struct cgroup *cgrp);
+struct cpuacct *task_ca(struct task_struct *tsk);
+struct task_group *task_group(struct task_struct *p);
+
+/* cgroup functions */
+const char *cgroup_name(struct cgroup *cgrp);
+struct cgroup *linsched_create_cgroup(struct cgroup *parent, char *path);
+struct task_group *cgroup_tg(struct cgroup *cgrp); /* from sched.c */
+struct cpuacct *cgroup_ca(struct cgroup *cgrp); /* from sched.c */
+struct cpuacct *task_ca(struct task_struct *tsk); /* from sched.c */
+
+static inline struct linsched_cgroup *linsched_cgroup(struct cgroup *cg) {
+ return container_of(cg, struct linsched_cgroup, cg);
+}
+
+static inline struct linsched_cgroup *linsched_tg(struct task_group *tg) {
+ return container_of(tg->css.cgroup, struct linsched_cgroup, cg);
+}
+
+/* linsched functions */
+
+struct task_struct *linsched_get_task(int task_id);
+struct task_data *linsched_create_sleep_run(int sleep, int busy);
+struct task_struct *linsched_create_batch_task(struct task_data *, int niceval);
+struct task_struct *linsched_create_RTfifo_task(struct task_data *, int prio);
+struct task_struct *linsched_create_RTrr_task(struct task_data *, int prio);
+struct task_struct *linsched_create_normal_task(struct task_data *td, int niceval);
+
+struct task_struct *linsched_raw_copy_process(void);
+int linsched_show_schedstat(void);
+void linsched_change_cpu(int cpu);
+void linsched_trigger_cpu(int cpu);
+void linsched_check_resched(void);
+void linsched_init_cpus(struct linsched_topology *topo);
+void linsched_init_hrtimer(void);
+void linsched_init(struct linsched_topology *topo);
+void linsched_default_callback(void);
+void linsched_announce_callback(void);
+void linsched_exit_callback(void);
+void linsched_disable_migrations(void);
+void linsched_enable_migrations(void);
+int linsched_force_migration(struct task_struct *task, int dest_cpu, int migr);
+int linsched_create_task_group(int parent);
+int linsched_add_task_to_group(struct task_struct *p, struct cgroup *cgrp);
+void linsched_set_task_group_shares(int groupid, unsigned long shares);
+void linsched_yield(void);
+void linsched_random_init(int seed);
+unsigned long linsched_random(void);
+void linsched_run_sim(int sim_ticks);
+void linsched_sched_debug_show(void);
+void linsched_print_task_stats(void);
+void linsched_print_group_stats(void);
+
+void linsched_print_cpuacct_stats(int cpuacct_group_id);
+void linsched_runtime_timer(struct task_struct *t, u64 runtime, void (*fn)(struct task_data *));
+void linsched_idled_set(int cpu, long idle_time, long busy_time);
+struct task_data *linsched_create_rnd_dist_sleep_run(struct rand_dist *sleep_rdist,
+ struct rand_dist *busy_rdist);
+u64 getticks(void);
+int linsched_create_perf_tasks(char *dirpath);
+
+void linsched_set_printk_level(int level);
+
+void linsched_rcu_invoke(void);
+
+void linsched_online_cpu(int cpu);
+void linsched_offline_cpu(int cpu);
+
+#endif /* LINSCHED_H */
diff --git a/tools/linsched/linsched.lds b/tools/linsched/linsched.lds
new file mode 100644
index 00000000000000..3eb83217ff5169
--- /dev/null
+++ b/tools/linsched/linsched.lds
@@ -0,0 +1,23 @@
+SECTIONS {
+
+/*
+ * For use with ld -r, will put the .data..percpu* sections into .data
+ * with start/end symbols created for a second linking run with the normal
+ * linker script
+ */
+
+jiffies = jiffies_64;
+
+.data : {
+ . = ALIGN(16);
+ __per_cpu_start_info = .;
+ *(.data..percpuinfo)
+ __per_cpu_end_info = .;
+ *(.data..percpuarrays)
+ __per_cpu_start = .;
+ *(.data..percpu)
+ __per_cpu_end = .;
+}
+
+
+}
diff --git a/tools/linsched/linsched_rand.c b/tools/linsched/linsched_rand.c
new file mode 100644
index 00000000000000..75c4d3e99020c4
--- /dev/null
+++ b/tools/linsched/linsched_rand.c
@@ -0,0 +1,326 @@
+/* Copyright 2011 Google Inc. All Rights Reserved.
+ * Author: asr@google.com (Abhishek Srivastava)
+ */
+
+#include "linsched_rand.h"
+#include <math.h>
+#include <stdlib.h>
+
+/* seed the linsched_rand()
+ * XORing with MASK to allow seed to be 0 */
+int *linsched_init_rand(const unsigned int seed)
+{
+ unsigned int *state = malloc(sizeof(unsigned int));
+ *state = seed ^ MASK;
+ return state;
+}
+
+/* destroy() required after init() */
+void linsched_destroy_rand(unsigned int *state)
+{
+ if (state)
+ free(state);
+}
+
+/* * Lehmer random number generator (ref. Knuth (AoCP) )
+ * * call linsched_srand() before calling linsched_rand()
+ * * n = 2147483647 (Mersenne Prime)
+ * * g = 16807 */
+double linsched_rand(unsigned int *const state)
+{
+ unsigned int rand = (16807 * (*state)) % 2147483647;
+ *state = rand;
+ return rand / (double) 2147483647;
+}
+
+/* return a random number from [low, high)
+ * low and high must be positive
+ * rand_state must be initialized by linsched_init_rand() */
+double linsched_rand_range(double low, double high,
+ unsigned int *rand_state)
+{
+ double rval = linsched_rand(rand_state);
+ return low + rval * (high - low);
+}
+
+/* generates a gaussian deviate with given parameters
+ * (ref GSL's gsl_ran_gaussian) */
+double linsched_gen_gaussian_dist(struct rand_dist *rdist)
+{
+
+ int mu = ((struct gaussian_dist *) rdist->dist)->mu;
+ int sigma = ((struct gaussian_dist *) rdist->dist)->sigma;
+ unsigned int *rand_state =
+ ((struct gaussian_dist *) rdist->dist)->rand_state;
+
+ double x, y, r2;
+
+ do {
+ x = -1 + 2 * linsched_rand(rand_state);
+ y = -1 + 2 * linsched_rand(rand_state);
+
+ r2 = x * x + y * y;
+ } while (r2 > 1.0 || r2 == 0);
+
+ return mu + sigma * y * sqrt(-2.0 * log(r2) / r2);
+}
+
+/* takes the log of gamma(xx)
+ * (ref. Numerical Recipies in C : Pg 214 */
+double gammaln(const double xx)
+{
+ double x, y, tmp, ser;
+ static double cof[6] =
+ { 76.18009172947146, -86.50532032941677, 24.01409824083091,
+ -1.231739572450155, 0.1208650973866170e-2,
+ -0.5395239384953e-5
+ };
+ int j;
+
+ y = x = xx;
+ tmp = x + 5.5;
+ tmp -= (x + 0.5) * log(tmp);
+ ser = 1.000000000190015;
+
+ for (j = 0; j <= 5; j++)
+ ser += cof[j] / ++y;
+ return -tmp + log(2.5066282746310005 * ser / x);
+
+}
+
+/* generates a poisson distribution given mean mu
+ * (ref. Numerical Recipies in C : Pg 294 */
+double linsched_gen_poisson_dist(struct rand_dist *rdist)
+{
+ int mu = ((struct poisson_dist *) rdist->dist)->mu;
+ unsigned int *rand_state =
+ ((struct poisson_dist *) rdist->dist)->rand_state;
+
+ double sq = 0.0, alxm = 0.0, g = 0.0, oldm = (-1.0);
+ double em, t, y;
+
+ if (mu < 12.0) {
+ if (mu != oldm) {
+ oldm = mu;
+ g = exp(-mu);
+ }
+ em = -1;
+ t = 1.0;
+ do {
+ ++em;
+ t *= linsched_rand(rand_state);
+ } while (t > g);
+
+ } else {
+ if (mu != oldm) {
+ oldm = mu;
+ sq = sqrt(2.0 * mu);
+ alxm = log(mu);
+ g = mu * alxm - gammaln(mu + 1.0);
+ }
+ do {
+ do {
+ y = tan(M_PI * linsched_rand(rand_state));
+ em = sq * y + mu;
+ } while (em < 0.0);
+ em = floor(em);
+ t = 0.9 * (1.0 + y * y) * exp(em * alxm -
+ gammaln(em + 1.0)
+ - g);
+ } while (linsched_rand(rand_state) > t);
+ }
+ return em;
+}
+
+/* generates an exponential distribution given mean mu
+ * (ref. Numerical Recipies in C : Pg 287 */
+double linsched_gen_exp_dist(struct rand_dist *rdist)
+{
+ double edev;
+ double mu = ((struct exp_dist *) rdist->dist)->mu;
+
+ unsigned int *rand_state =
+ ((struct exp_dist *) rdist->dist)->rand_state;
+
+ do {
+ edev = linsched_rand(rand_state);
+ } while (edev == 0.0);
+
+ return -mu * log(edev);
+}
+
+/* generates lognormal deviates using a std gaussian N(0,1)
+ * ref. wikipedia (http://en.wikipedia.org/wiki/Log-normal_distribution) */
+double linsched_gen_lognormal_dist(struct rand_dist *rdist)
+{
+ double lndev, gaussdev;
+ struct lognormal_dist *ldist = ((struct lognormal_dist *) rdist->dist);
+ double meanlog = ldist->meanlog;
+ double sdlog = ldist->sdlog;
+ struct rand_dist *gdist = ((struct rand_dist *) ldist->std_gauss_dist);
+
+ gaussdev = linsched_gen_gaussian_dist(gdist);
+ lndev = exp(meanlog + gaussdev * sdlog);
+ return lndev;
+}
+
+struct rand_dist *linsched_init_gaussian(const int mu, const int sigma,
+ const int seed)
+{
+ struct rand_dist *rdist = malloc(sizeof(struct rand_dist));
+ struct gaussian_dist *gdist = malloc(sizeof(struct gaussian_dist));
+
+ gdist->mu = mu;
+ gdist->sigma = sigma;
+ gdist->rand_state = linsched_init_rand(seed);
+ rdist->type = GAUSSIAN;
+ rdist->gen_fn = linsched_gen_gaussian_dist;
+ rdist->dist = gdist;
+ return rdist;
+}
+
+void linsched_destroy_gaussian(struct rand_dist *rdist)
+{
+ unsigned int *rand_state =
+ ((struct gaussian_dist *) rdist->dist)->rand_state;
+
+ if (rdist) {
+ if (rdist->dist) {
+ linsched_destroy_rand(rand_state);
+ free(rdist->dist);
+ }
+ free(rdist);
+ }
+}
+
+struct rand_dist *linsched_init_poisson(const int mu, const int seed)
+{
+ struct rand_dist *rdist = malloc(sizeof(struct rand_dist));
+ struct poisson_dist *pdist = malloc(sizeof(struct poisson_dist));
+
+ pdist->mu = mu;
+ pdist->rand_state = linsched_init_rand(seed);
+ rdist->type = POISSON;
+ rdist->gen_fn = linsched_gen_poisson_dist;
+ rdist->dist = pdist;
+ return rdist;
+}
+
+void linsched_destroy_poisson(struct rand_dist *rdist)
+{
+
+ unsigned int *rand_state =
+ ((struct poisson_dist *) rdist->dist)->rand_state;
+
+ if (rdist) {
+ if (rdist->dist) {
+ linsched_destroy_rand(rand_state);
+ free(rdist->dist);
+ }
+ free(rdist);
+ }
+}
+
+struct rand_dist *linsched_init_exponential(const double mu, const int seed)
+{
+ struct rand_dist *rdist = malloc(sizeof(struct rand_dist));
+ struct exp_dist *edist = malloc(sizeof(struct exp_dist));
+
+ edist->mu = mu;
+ edist->rand_state = linsched_init_rand(seed);
+ rdist->type = EXPONENTIAL;
+ rdist->gen_fn = linsched_gen_exp_dist;
+ rdist->dist = edist;
+ return rdist;
+}
+
+void linsched_destroy_exponential(struct rand_dist *rdist)
+{
+ unsigned int *rand_state;
+
+ if (rdist) {
+ if (rdist->dist) {
+ rand_state =
+ ((struct exp_dist *) rdist->dist)->rand_state;
+ linsched_destroy_rand(rand_state);
+ free(rdist->dist);
+ }
+ free(rdist);
+ }
+}
+
+struct rand_dist *linsched_init_lognormal(const double meanlog,
+ const double sdlog, const int seed)
+{
+ struct rand_dist *rdist = malloc(sizeof(struct rand_dist));
+ struct lognormal_dist *ldist = malloc(sizeof(struct lognormal_dist));
+
+ ldist->meanlog = meanlog;
+ ldist->sdlog = sdlog;
+ ldist->std_gauss_dist = linsched_init_gaussian(0, 1, seed);
+ rdist->type = LOGNORMAL;
+ rdist->gen_fn = linsched_gen_lognormal_dist;
+ rdist->dist = ldist;
+ return rdist;
+}
+
+void linsched_destroy_lognormal(struct rand_dist *rdist)
+{
+ struct lognormal_dist *ldist = ((struct lognormal_dist *) rdist->dist);
+ struct rand_dist *gdist = ((struct rand_dist *) ldist->std_gauss_dist);
+
+ if (rdist) {
+ if (rdist->dist) {
+ linsched_destroy_gaussian(gdist);
+ free(ldist);
+ }
+ free(rdist);
+ }
+
+}
+
+void linsched_destroy_dist(struct rand_dist *rdist)
+{
+ switch (rdist->type) {
+ case GAUSSIAN:
+ linsched_destroy_gaussian(rdist);
+ break;
+ case POISSON:
+ linsched_destroy_poisson(rdist);
+ break;
+ case EXPONENTIAL:
+ linsched_destroy_exponential(rdist);
+ break;
+ case LOGNORMAL:
+ linsched_destroy_lognormal(rdist);
+ break;
+ }
+}
+
+struct rand_dist *linsched_copy_dist(const struct rand_dist *rdist,
+ unsigned int *rand_state)
+{
+ linsched_rand(rand_state);
+ switch (rdist->type) {
+ case GAUSSIAN: {
+ struct gaussian_dist *dist = rdist->dist;
+ return linsched_init_gaussian(dist->mu, dist->sigma,
+ *rand_state);
+ }
+ case POISSON: {
+ struct poisson_dist *dist = rdist->dist;
+ return linsched_init_poisson(dist->mu, *rand_state);
+ }
+ case EXPONENTIAL: {
+ struct exp_dist *dist = rdist->dist;
+ return linsched_init_exponential(dist->mu, *rand_state);
+ }
+ case LOGNORMAL: {
+ struct lognormal_dist *dist = rdist->dist;
+ return linsched_init_lognormal(dist->meanlog, dist->sdlog,
+ *rand_state);
+ }
+ default:
+ return NULL;
+ }
+}
diff --git a/tools/linsched/linsched_rand.h b/tools/linsched/linsched_rand.h
new file mode 100644
index 00000000000000..577ba6299850e9
--- /dev/null
+++ b/tools/linsched/linsched_rand.h
@@ -0,0 +1,67 @@
+/* Copyright 2011 Google Inc. All Rights Reserved.
+ Author: asr@google.com (Abhishek Srivastava) */
+
+#ifndef __LINSCHED_RAND_H
+#define __LINSCHED_RAND_H
+
+#define MASK 123456789
+
+enum RND_TYPE {
+ GAUSSIAN,
+ POISSON,
+ EXPONENTIAL,
+ LOGNORMAL,
+ MAX_RND_TYPE = LOGNORMAL,
+};
+
+struct rand_dist {
+ enum RND_TYPE type;
+ void *dist;
+ double (*gen_fn) (struct rand_dist * pdist);
+};
+
+struct gaussian_dist {
+ int mu, sigma;
+ unsigned int *rand_state;
+};
+
+struct poisson_dist {
+ int mu;
+ unsigned int *rand_state;
+};
+
+struct exp_dist {
+ int mu;
+ unsigned int *rand_state;
+};
+
+struct lognormal_dist {
+ double meanlog, sdlog;
+ struct rand_dist *std_gauss_dist;
+};
+
+int *linsched_init_rand(const unsigned int seed);
+void linsched_destroy_rand(unsigned int *state);
+double linsched_rand(unsigned int *const state);
+double linsched_rand_range(double low, double high,
+ unsigned int *const rand_state);
+double linsched_gen_gaussian_dist(struct rand_dist *rdist);
+double gammaln(const double xx);
+double linsched_gen_poisson_dist(struct rand_dist *rdist);
+double linsched_gen_exp_dist(struct rand_dist *rdist);
+double linsched_gen_lognormal_dist(struct rand_dist *rdist);
+struct rand_dist *linsched_copy_dist(const struct rand_dist *rdist,
+ unsigned int *rand_state);
+struct rand_dist *linsched_init_gaussian(const int mu, const int sigma,
+ const int seed);
+void linsched_destroy_gaussian(struct rand_dist *rdist);
+struct rand_dist *linsched_init_poisson(const int mu, const int seed);
+void linsched_destroy_poisson(struct rand_dist *rdist);
+struct rand_dist *linsched_init_exponential(const double mu, const int seed);
+void linsched_destroy_exponential(struct rand_dist *rdist);
+struct rand_dist *linsched_init_lognormal(const double meanlog,
+ const double sdlog, const int seed);
+void linsched_destroy_lognormal(struct rand_dist *rdist);
+void linsched_destroy_dist(struct rand_dist *rdist);
+
+#endif /* __LINSCHED_RAND_H */
diff --git a/tools/linsched/linsched_sim.c b/tools/linsched/linsched_sim.c
new file mode 100644
index 00000000000000..17f213ebf48c88
--- /dev/null
+++ b/tools/linsched/linsched_sim.c
@@ -0,0 +1,406 @@
+#include "linsched.h"
+#include "linsched_rand.h"
+#include "linsched_sim.h"
+#include "load_balance_score.h"
+#include <stdio.h>
+#include <malloc.h>
+#include <assert.h>
+
+/* picks a random dist type */
+enum RND_TYPE pick_random_dist_type(unsigned int *rand_state)
+{
+ enum RND_TYPE type = linsched_rand_range(0, MAX_RND_TYPE,
+ rand_state);
+ return type;
+}
+
+/* returns a gaussian dist with random parameters */
+struct rand_dist *pick_gaussian_dist(unsigned int *rand_state)
+{
+ struct rand_dist *rdist;
+ double mean = linsched_rand_range(MIN_GAUSSIAN_DIST_MEAN,
+ MAX_GAUSSIAN_DIST_MEAN,
+ rand_state);
+ double sd = linsched_rand_range(MIN_GAUSSIAN_DIST_SD,
+ MAX_GAUSSIAN_DIST_SD,
+ rand_state);
+
+ rdist = linsched_init_gaussian(mean, sd, *rand_state);
+ return rdist;
+}
+
+/* returns a poisson dist with random parameters */
+struct rand_dist *pick_poisson_dist(unsigned int *rand_state)
+{
+ struct rand_dist *rdist;
+ double mean = linsched_rand_range(MIN_POISSON_DIST_MEAN,
+ MAX_POISSON_DIST_MEAN,
+ rand_state);
+
+ rdist = linsched_init_poisson(mean, *rand_state);
+ return rdist;
+}
+
+
+/* returns a exponential dist with random parameters */
+struct rand_dist *pick_exponential_dist(unsigned int *rand_state)
+{
+ struct rand_dist *rdist;
+ double mean = linsched_rand_range(MIN_EXPONENTIAL_DIST_MEAN,
+ MAX_EXPONENTIAL_DIST_MEAN,
+ rand_state);
+
+ rdist = linsched_init_exponential(mean, *rand_state);
+ return rdist;
+}
+
+/* returns a lognormal dist with random parameters */
+struct rand_dist *pick_lognormal_dist(unsigned int *rand_state)
+{
+ struct rand_dist *rdist;
+ double meanlog = linsched_rand_range(MIN_LOGNORMAL_DIST_MEANLOG,
+ MAX_LOGNORMAL_DIST_MEANLOG,
+ rand_state);
+ double sdlog = linsched_rand_range(MIN_LOGNORMAL_DIST_SDLOG,
+ MAX_LOGNORMAL_DIST_SDLOG,
+ rand_state);
+
+ rdist = linsched_init_lognormal(meanlog, sdlog, *rand_state);
+ return rdist;
+}
+
+/* use LOGNORMAL. */
+struct rand_dist *pick_random_run_dist(unsigned int *rand_state)
+{
+ return pick_lognormal_dist(rand_state);
+}
+
+/* use either EXPONENTIAL or LOGNORMAL */
+struct rand_dist *pick_random_sleep_dist(unsigned int *rand_state)
+{
+ enum RND_TYPE type = pick_random_dist_type(rand_state);
+
+ while (type != EXPONENTIAL && type != LOGNORMAL)
+ type = pick_random_dist_type(rand_state);
+ if (type == EXPONENTIAL)
+ return pick_exponential_dist(rand_state);
+ else
+ return pick_lognormal_dist(rand_state);
+}
+
+int pick_n_tasks(unsigned int *rand_state)
+{
+ int n_tasks = linsched_rand_range(MIN_N_TASKS,
+ MAX_N_TASKS, rand_state);
+ return n_tasks;
+}
+
+/* creates a task group (with the specified shares) and a random
+ * number of tasks having random run / sleep distributions. If
+ * sleep_type and busy_type are specified, the tasks will have
+ * distributions of those types, if they are MAX_RND_TYPE then they
+ * are picked randomly */
+struct linsched_tg_sim *linsched_create_tg_sim(int shares,
+ struct rand_dist *sleep_dist,
+ struct rand_dist *busy_dist,
+ unsigned int *rand_state,
+ struct cgroup *cgroup,
+ const struct cpumask *cpus)
+{
+ int i;
+ int n_tasks = pick_n_tasks(rand_state);
+ struct linsched_tg_sim *tgsim = malloc(sizeof(struct linsched_tg_sim));
+
+ assert(tgsim);
+ if (cgroup)
+ tgsim->cg = cgroup;
+ else
+ tgsim->cg = linsched_create_cgroup(root_cgroup, NULL);
+
+ sched_group_set_shares(cgroup_tg(tgsim->cg), shares);
+ tgsim->n_tasks = n_tasks;
+ tgsim->tasks = malloc(sizeof(struct task_struct*) * n_tasks);
+ assert(tgsim->tasks);
+
+ for (i = 0; i < n_tasks; i++) {
+ struct task_data *td;
+
+ if (!sleep_dist)
+ sleep_dist = pick_random_sleep_dist(rand_state);
+ else
+ sleep_dist = linsched_copy_dist(sleep_dist, rand_state);
+ if (!busy_dist)
+ busy_dist = pick_random_run_dist(rand_state);
+ else
+ busy_dist = linsched_copy_dist(busy_dist, rand_state);
+
+ td = linsched_create_rnd_dist_sleep_run(sleep_dist, busy_dist);
+ tgsim->tasks[i] = linsched_create_normal_task(td, 0);
+ set_cpus_allowed_ptr(tgsim->tasks[i], cpus);
+ linsched_add_task_to_group(tgsim->tasks[i], tgsim->cg);
+ }
+
+ return tgsim;
+}
+
+void linsched_free_task_td(struct task_struct *p)
+{
+ struct task_data *td = task_thread_info(p)->td;
+ if (!td)
+ return;
+
+ if (td->data) {
+ struct rnd_dist_task *d = td->data;
+ linsched_destroy_dist(d->busy_rdist);
+ linsched_destroy_dist(d->sleep_rdist);
+ free(d);
+ }
+ free(td);
+}
+
+void linsched_destroy_tg_sim(struct linsched_tg_sim *tgsim)
+{
+ int i;
+
+ if (!tgsim)
+ return;
+
+ assert(tgsim->tasks);
+ for (i=0;i < tgsim->n_tasks;i++)
+ linsched_free_task_td(tgsim->tasks[i]);
+ free(tgsim->tasks);
+ free(tgsim);
+}
+
+static char *remove_prefix(char *s, char *prefix)
+{
+ size_t len = strlen(prefix);
+ if (strncmp(s, prefix, len))
+ return NULL;
+ return s + len;
+}
+
+static enum RND_TYPE parse_type(char **line_ptr)
+{
+ int i;
+ const static struct {
+ char *name;
+ enum RND_TYPE type;
+ } types[] = { { "GAUSSIAN ", GAUSSIAN },
+ { "POISSON ", POISSON },
+ { "EXPONENTIAL ", EXPONENTIAL },
+ { "LOGNORMAL ", LOGNORMAL }};
+
+ for(i = 0; i < sizeof(types)/sizeof(types[0]); i++) {
+ char *rest = remove_prefix(*line_ptr, types[i].name);
+ if (rest) {
+ *line_ptr = rest;
+ return types[i].type;
+ }
+ }
+ return MAX_RND_TYPE;
+}
+
+/* returns true if successful */
+static int parse_double(char **line_ptr, double *val)
+{
+ int len;
+ char *line = *line_ptr;
+ if (sscanf(line, "%lf%n", val, &len) >= 1 &&
+ line[len] == ' ') {
+ *line_ptr += len + 1;
+ return 1;
+ }
+ return 0;
+}
+
+static struct rand_dist *parse_distribution(char **line_ptr, unsigned int *rand_state)
+{
+ enum RND_TYPE type = parse_type(line_ptr);
+ double arg1, arg2;
+ char *line = *line_ptr;
+
+ /* make sure we don't initialize everything with the same seed */
+ linsched_rand(rand_state);
+ switch(type) {
+ case GAUSSIAN:
+ if (parse_double(&line, &arg1) && parse_double(&line, &arg2)) {
+ *line_ptr = line;
+ return linsched_init_gaussian(arg1, arg2, *rand_state);
+ }
+ return pick_gaussian_dist(rand_state);
+ case POISSON:
+ if (parse_double(&line, &arg1)) {
+ *line_ptr = line;
+ return linsched_init_poisson(arg1, *rand_state);
+ }
+ return pick_poisson_dist(rand_state);
+ case EXPONENTIAL:
+ if (parse_double(&line, &arg1)) {
+ *line_ptr = line;
+ return linsched_init_exponential(arg1, *rand_state);
+ }
+ return pick_exponential_dist(rand_state);
+ case LOGNORMAL:
+ if (parse_double(&line, &arg1) && parse_double(&line, &arg2)) {
+ *line_ptr = line;
+ return linsched_init_lognormal(arg1, arg2, *rand_state);
+ }
+ return pick_lognormal_dist(rand_state);
+ default:
+ return NULL;
+ }
+}
+
+static struct cgroup *parse_fixed_cgroup(char **line_ptr)
+{
+ struct cgroup *res = NULL;
+ char *rest;
+
+ if ((rest = remove_prefix(*line_ptr, "ROOT "))) {
+ res = root_cgroup;
+ } else if ((rest = remove_prefix(*line_ptr, "ONE_GROUP "))) {
+ res = linsched_create_cgroup(root_cgroup, "all_tasks");
+ }
+ if (rest)
+ *line_ptr = rest;
+ return res;
+}
+
+/* creates a linsched_sim object based on a shares file.
+ * The structure of tg-shares file is specified as:
+ * [ROOT |ONE_GROUP ]<N_TASK_GROUPS>
+ * [sleep dist ][run dist ]<SHARES_OF_TG1>
+ * [sleep dist ][run dist ]<SHARES_OF_TG2>
+ * .......
+ * .......
+ * [sleep dist ][run dist ]<SHARES_OF_TGN>
+ * Where a distribution is one of GUASSIAN, POISSON etc, with optional
+ * parameters
+ */
+struct linsched_sim *linsched_create_sim(char *tg_file, const struct cpumask *cpus,
+ unsigned int *rand_state)
+{
+ FILE *tg_filp;
+ char line[256];
+ long shares;
+ int n_tsk_grps;
+ int i = 0;
+ struct linsched_sim *lsim = malloc(sizeof(struct linsched_sim));
+ struct linsched_tg_sim **tg_sim_arr = NULL;
+ struct cgroup *group = NULL;
+
+ if ((tg_filp = fopen(tg_file, "r")) != NULL) {
+ if (fgets(line, sizeof(line), tg_filp)) {
+ char *parsed_line = line;
+ group = parse_fixed_cgroup(&parsed_line);
+ n_tsk_grps = simple_strtoul(parsed_line, NULL, 0);
+ if (n_tsk_grps)
+ tg_sim_arr = malloc(n_tsk_grps *
+ sizeof(struct linsched_tg_sim *));
+ }
+ if (!tg_sim_arr)
+ return NULL;
+ while (fgets(line, sizeof(line), tg_filp) && i < n_tsk_grps) {
+ struct rand_dist *sleep_dist, *run_dist;
+ char *parsed_line = line;
+
+ sleep_dist = parse_distribution(&parsed_line, rand_state);
+ run_dist = parse_distribution(&parsed_line, rand_state);
+ shares = simple_strtoul(parsed_line, NULL, 0);
+ tg_sim_arr[i++] =
+ linsched_create_tg_sim(shares, sleep_dist,
+ run_dist, rand_state,
+ group, cpus);
+ }
+ lsim->n_task_grps = n_tsk_grps;
+ lsim->tg_sim_arr = tg_sim_arr;
+ fclose(tg_filp);
+ return lsim;
+ }
+ return NULL;
+}
+
+void linsched_destroy_sim(struct linsched_sim *lsim)
+{
+ int i;
+
+ if (!lsim)
+ return;
+
+
+ if (lsim->tg_sim_arr) {
+ for (i = 0; i < lsim->n_task_grps; i++)
+ if (lsim->tg_sim_arr[i])
+ linsched_destroy_tg_sim(lsim->tg_sim_arr[i]);
+ free(lsim->tg_sim_arr);
+ }
+ free(lsim);
+}
+
+void print_dist_params(struct rand_dist *rdist)
+{
+ enum RND_TYPE type = rdist->type;
+ struct lognormal_dist *ldist;
+ struct gaussian_dist *gdist;
+ struct poisson_dist *pdist;
+ struct exp_dist *edist;
+
+ switch (type) {
+ case LOGNORMAL:
+ ldist = rdist->dist;
+
+ fprintf(stdout, "LOGNORMAL: meanlog = %f, sdlog = %f",
+ ldist->meanlog, ldist->sdlog);
+ break;
+ case GAUSSIAN:
+ gdist = rdist->dist;
+ fprintf(stdout, "GAUSSIAN: mean = %d, sd = %d",
+ gdist->mu, gdist->sigma);
+ break;
+ case POISSON:
+ pdist = rdist->dist;
+ fprintf(stdout, "POISSON: mean = %d", pdist->mu);
+ break;
+ case EXPONENTIAL:
+ edist = rdist->dist;
+ fprintf(stdout, "EXPONENTIAL: mean = %d", edist->mu);
+ break;
+ }
+}
+
+
+void print_task_params(struct task_struct *p, struct cgroup *cgrp)
+{
+ struct task_data *td = task_thread_info(p)->td;
+ struct rnd_dist_task *rd = td->data;
+ int id = task_thread_info(rd->sr_data.p)->id;
+ char buf[128];
+
+ cgroup_path(cgrp, buf, 128);
+ fprintf(stdout, "\nCGroup = %s, Task Id = %d ", buf, id);
+ fprintf(stdout, "sleep_dist: ");
+ print_dist_params(rd->sleep_rdist);
+ fprintf(stdout, "\nCGroup = %s, Task Id = %d ", buf, id);
+ fprintf(stdout, "busy_dist : ");
+ print_dist_params(rd->busy_rdist);
+}
+
+void print_report(struct linsched_sim *lsim)
+{
+ int i, j;
+ struct linsched_tg_sim *tgsim;
+
+ linsched_print_task_stats();
+ linsched_print_group_stats();
+
+ /* for each task in each task_group, print its run / sleep params */
+
+ for (i = 0; i < lsim->n_task_grps; i++) {
+ tgsim = lsim->tg_sim_arr[i];
+
+ for (j = 0; j < tgsim->n_tasks; j++)
+ print_task_params(tgsim->tasks[j], tgsim->cg);
+ }
+ fprintf(stdout, "\n");
+}
diff --git a/tools/linsched/linsched_sim.h b/tools/linsched/linsched_sim.h
new file mode 100644
index 00000000000000..3a3c0e307c639c
--- /dev/null
+++ b/tools/linsched/linsched_sim.h
@@ -0,0 +1,55 @@
+/* Copyright 2011 Google Inc. All Rights Reserved.
+ Author: asr@google.com (Abhishek Srivastava) */
+
+#ifndef __LINSCHED_SIM_H
+#define __LINSCHED_SIM_H
+
+#include "linsched.h"
+
+#define MIN_N_TASKS 10
+#define MAX_N_TASKS 20
+
+#define MIN_GAUSSIAN_DIST_MEAN 600000
+#define MAX_GAUSSIAN_DIST_MEAN 800000
+#define MIN_GAUSSIAN_DIST_SD 880000
+#define MAX_GAUSSIAN_DIST_SD 900000
+
+#define MIN_POISSON_DIST_MEAN 600000
+#define MAX_POISSON_DIST_MEAN 800000
+
+#define MIN_EXPONENTIAL_DIST_MEAN 600000
+#define MAX_EXPONENTIAL_DIST_MEAN 700000
+
+#define MIN_LOGNORMAL_DIST_MEANLOG 11
+#define MAX_LOGNORMAL_DIST_MEANLOG 14
+#define MIN_LOGNORMAL_DIST_SDLOG 1
+#define MAX_LOGNORMAL_DIST_SDLOG 4
+
+#define TOPO_ARGO "argo"
+#define TOPO_IKARIA "ikaria"
+
+struct linsched_tg_sim {
+ int n_tasks;
+ struct cgroup *cg;
+ struct task_struct **tasks;
+};
+
+struct linsched_sim {
+ int n_task_grps;
+ struct linsched_tg_sim **tg_sim_arr;
+};
+
+struct linsched_tg_sim *linsched_create_tg_sim(int shares,
+ struct rand_dist *sleep_dist,
+ struct rand_dist *busy_dist,
+ unsigned int *rand_state,
+ struct cgroup *group,
+ const struct cpumask *cpus);
+struct linsched_sim *linsched_create_sim(char *tg_file, const struct cpumask *cpus,
+ unsigned int *rand_state);
+void linsched_destroy_rnd_sim_task(struct task_struct *p);
+void linsched_destroy_tg_sim(struct linsched_tg_sim *tgsim);
+void linsched_destroy_sim(struct linsched_sim *lsim);
+void print_report(struct linsched_sim *lsim);
+
+#endif /* __LINSCHED_SIM_H */
diff --git a/tools/linsched/linux_linsched.c b/tools/linsched/linux_linsched.c
new file mode 100644
index 00000000000000..ca07a73e31059a
--- /dev/null
+++ b/tools/linsched/linux_linsched.c
@@ -0,0 +1,789 @@
+/* LinSched -- The Linux Scheduler Simulator
+ * Copyright (C) 2008 John M. Calandrino
+ * E-mail: jmc@cs.unc.edu
+ *
+ * This file contains Linux variables and functions that have been "defined
+ * away" or exist here in a modified form to avoid including an entire Linux
+ * source file that might otherwise lead to a "cascade" of dependency issues.
+ * It also includes certain LinSched variables to which some Linux functions
+ * and definitions now map.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, ofalse
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "linsched.h"
+
+#include <stdlib.h>
+
+#include <linux/tick.h>
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/percpu_counter.h>
+#include <linux/err.h>
+#include <linux/dcache.h>
+#include <string.h>
+#include <malloc.h>
+#include <errno.h>
+#include <dirent.h>
+#include <assert.h>
+
+#include "linsched_rand.h"
+#include "load_balance_score.h"
+
+/* linsched variables and functions */
+
+/* delaying simulation until run_sim() prevents initial fork balancing. */
+bool simulation_started = true;
+
+struct task_struct *__linsched_tasks[LINSCHED_MAX_TASKS];
+int curr_task_id;
+
+struct linsched_cgroup __linsched_cgroups[LINSCHED_MAX_GROUPS];
+int num_cgroups = 1, num_tasks = 1;
+extern int max_threads;
+int oops_in_progress;
+
+asmlinkage void __init start_kernel(void);
+struct page linsched_page;
+enum system_states system_state;
+char __lock_text_start[] = ".", __lock_text_end[] = ".";
+struct cgroup *root_cgroup = &__linsched_cgroups[0].cg;
+
+void linsched_init_root_cgroup(struct cgroup *root)
+{
+ char *root_path = "/";
+
+ root->dentry = malloc(sizeof(struct dentry));
+ root->dentry->d_name.name = strdup(root_path);
+ root->dentry->d_name.len = strlen(root_path);
+
+ root_cgroup->subsys[cpuacct_subsys_id] = cpuacct_subsys.create(NULL,
+ root_cgroup);
+}
+
+void init_stop_tasks(void);
+
+void linsched_init(struct linsched_topology *topo)
+{
+ curr_task_id = 1;
+ linsched_init_cpus(topo);
+
+ /* Change context to "boot" cpu and boot kernel. */
+ linsched_change_cpu(0);
+
+ sched_clock_stable = 1;
+
+ /*TODO: set an appropriate limit*/
+ max_threads = INT_MAX;
+
+ system_state = SYSTEM_BOOTING;
+ start_kernel();
+ system_state = SYSTEM_RUNNING;
+
+ linsched_init_root_cgroup(root_cgroup);
+ linsched_init_hrtimer();
+
+ init_lb_info();
+ init_stop_tasks();
+}
+
+void linsched_default_callback(void)
+{
+}
+
+void linsched_exit_callback(void)
+{
+ do_exit(0);
+}
+
+struct cfs_rq;
+void linsched_announce_callback(void)
+{
+ printf("CPU %d / t = %u: Task 0x%d scheduled, Runtime %llu\n",
+ smp_processor_id(), (unsigned int)jiffies,
+ task_thread_info(current)->id,
+ current->se.sum_exec_runtime);
+}
+
+void linsched_disable_migrations(void)
+{
+ int i;
+
+ for (i = 1; i < num_tasks; i++)
+ set_cpus_allowed(__linsched_tasks[i],
+ cpumask_of_cpu(task_cpu(__linsched_tasks[i])));
+}
+
+void linsched_enable_migrations(void)
+{
+ int i;
+
+ for (i = 1; i < num_tasks; i++)
+ set_cpus_allowed(__linsched_tasks[i], CPU_MASK_ALL);
+}
+
+/* Force a migration of task to the dest_cpu.
+ * If migr is set, allow migrations after the forced migration... otherwise,
+ * do not allow them. (We need to disable migrations so that the forced
+ * migration takes place correctly.)
+ * Returns old cpu of task.
+ */
+int linsched_force_migration(struct task_struct *task, int dest_cpu, int migr)
+{
+ int old_cpu = task_cpu(task);
+
+ linsched_disable_migrations();
+ set_cpus_allowed(task, cpumask_of_cpu(dest_cpu));
+ linsched_change_cpu(old_cpu);
+ schedule();
+ linsched_change_cpu(dest_cpu);
+ schedule();
+ scheduler_ipi();
+ if (migr)
+ linsched_enable_migrations();
+
+ return old_cpu;
+}
+
+/* Return the task in position task_id in the task array.
+ * No error checking, so be careful!
+ */
+struct task_struct *linsched_get_task(int task_id)
+{
+ return __linsched_tasks[task_id];
+}
+
+static struct task_struct *linsched_fork(struct task_data *td, int enqueue_start)
+{
+ struct task_struct *p;
+
+ //p = linsched_raw_copy_process();
+ p = find_task_by_vpid(do_fork(0, 0, NULL, 0, NULL, NULL));
+
+ task_thread_info(p)->td = td;
+ /*
+ * This is fine *only* because we don't care about mm
+ * TODO: Might have to fix this assumption
+ */
+ p->mm = &init_mm;
+ p->active_mm = &init_mm;
+
+ if (!enqueue_start) {
+ struct rq *rq = cpu_rq(task_cpu(p));
+
+ raw_spin_lock_irq(&rq->lock);
+ deactivate_task(rq, p, DEQUEUE_SLEEP);
+ p->on_rq = 0;
+ raw_spin_unlock_irq(&rq->lock);
+ }
+
+ return p;
+}
+
+static struct task_struct *__linsched_create_task(struct task_data *td)
+{
+ struct task_struct *newtask = linsched_fork(td, true);
+
+ if (td->init_task)
+ td->init_task(newtask, td->data);
+
+ /* allow task to run on any cpu. */
+ set_cpus_allowed(newtask, CPU_MASK_ALL);
+
+ linsched_check_resched();
+
+ return newtask;
+}
+
+extern void linsched_check_idle_cpu(void);
+void linsched_check_resched(void)
+{
+ if (!simulation_started)
+ return;
+
+ while (need_resched()) {
+ /*
+ * Check if we need to exit nohz mode.
+ */
+ linsched_check_idle_cpu();
+ schedule();
+ }
+}
+
+void __linsched_set_task_id(struct task_struct *p, int id)
+{
+ task_thread_info(p)->id = id;
+ sprintf(p->comm, "%d", id);
+}
+
+const char *cgroup_name(struct cgroup *cgrp)
+{
+ return cgrp->dentry->d_name.name;
+}
+
+struct cgroup *linsched_create_cgroup(struct cgroup *parent, char *path)
+{
+ struct cgroup *child;
+ int id = num_cgroups++;
+ char buf[64];
+ child = &__linsched_cgroups[id].cg;
+
+ assert(num_cgroups < LINSCHED_MAX_GROUPS);
+ /* we have to set up the parent pointer before creating sub-systems */
+ child->parent = parent;
+ child->subsys[cpu_cgroup_subsys_id] = cpu_cgroup_subsys.create(NULL,
+ child);
+ child->subsys[cpu_cgroup_subsys_id]->cgroup = child;
+ child->subsys[cpuacct_subsys_id] = cpuacct_subsys.create(NULL,
+ child);
+ child->subsys[cpuacct_subsys_id]->cgroup = child;
+
+ if (!path) {
+ sprintf(buf, "cg%d", id);
+ path = buf;
+ }
+
+ child->dentry = malloc(sizeof(struct dentry));
+ child->dentry->d_name.name = strdup(path);
+ child->dentry->d_name.len = strlen(path);
+
+ return child;
+}
+
+int linsched_add_task_to_group(struct task_struct *p, struct cgroup *cgrp)
+{
+ struct task_group *tg = cgroup_tg(cgrp);
+ struct cpuacct *ca = cgroup_ca(cgrp);
+
+ p->cgroups->subsys[cpu_cgroup_subsys_id] = &tg->css;
+ p->cgroups->subsys[cpuacct_subsys_id] = &ca->css;
+ sched_move_task(p);
+
+ return 0;
+}
+
+u64 task_exec_time(struct task_struct *p)
+{
+ return p->se.sum_exec_runtime;
+}
+
+u64 group_exec_time(struct task_group *tg)
+{
+ int i;
+ u64 total = 0;
+
+ /* this depends on schedstats, but works for the root cgroup */
+ for_each_possible_cpu(i)
+ total += tg->cfs_rq[i]->exec_clock;
+
+ return total;
+}
+
+int show_schedstat(struct seq_file *seq, void *v);
+
+int linsched_show_schedstat(void)
+{
+ return show_schedstat(NULL, NULL);
+}
+
+void linsched_print_task_stats(void)
+{
+ int i;
+ long total_time = 0;
+ for (i = 1; i < num_tasks; i++) {
+ struct task_struct *task = __linsched_tasks[i];
+ printf
+ ("Task id = %d (%d), exec_time = %llu, run_delay = %llu, pcount = %lu\n",
+ task_pid_nr(task), i, task_exec_time(task), task->sched_info.run_delay,
+ task->sched_info.pcount);
+
+ total_time += task_exec_time(task);
+ }
+ printf("Total exec_time = %ld\n", total_time);
+}
+
+/* We could have used the cpuacct cgroup for this, but a lot of the code
+ * would have to be compiled out leading to a bunch of #ifdefs all over
+ * the place. The simple function below is all we need.
+ */
+void linsched_print_group_stats(void)
+{
+ char buf[128];
+ int i;
+ for (i = 0; i < num_cgroups; i++) {
+ struct cgroup *cgrp = &__linsched_cgroups[i].cg;
+ cgroup_path(cgrp, buf, 128);
+ printf("CGroup = %s (%d), exec_time = %llu\n",
+ buf, i, group_exec_time(cgroup_tg(cgrp)));
+ }
+}
+
+/* Create a normal task with the specified callback and
+ * nice value of niceval, which determines its priority.
+ */
+struct task_struct *linsched_create_normal_task(struct task_data *td, int niceval)
+{
+ struct sched_param params = {};
+ struct task_struct *p;
+ int id = num_tasks++;
+
+ assert(id < LINSCHED_MAX_TASKS);
+
+ /* Create "normal" task and set its nice value. */
+ p = __linsched_tasks[id] = __linsched_create_task(td);
+ __linsched_set_task_id(p, id);
+
+ params.sched_priority = 0;
+ sched_setscheduler(p, SCHED_NORMAL, &params);
+ set_user_nice(p, niceval);
+
+ assert(current->cgroups->subsys[0]);
+ assert(p->cgroups->subsys[0]);
+ return p;
+}
+
+/* Create a batch task with the specified callback and
+ * nice value of niceval, which determines its priority.
+ */
+struct task_struct *linsched_create_batch_task(struct task_data *td, int niceval)
+{
+ struct sched_param params = { };
+ int id = num_tasks++;
+ struct task_struct *p;
+
+ assert(id < LINSCHED_MAX_TASKS);
+
+ /* Create "batch" task and set its nice value. */
+ p = __linsched_tasks[id] = __linsched_create_task(td);
+ __linsched_set_task_id(p, id);
+
+ params.sched_priority = 0;
+ sched_setscheduler(p, SCHED_BATCH, &params);
+ set_user_nice(p, niceval);
+
+ return p;
+}
+
+/* Create a FIFO real-time task with the specified callback and priority. */
+struct task_struct *linsched_create_RTfifo_task(struct task_data *td, int prio)
+{
+ struct sched_param params = { };
+ int id = num_tasks++;
+ struct task_struct *p;
+
+ assert(id < LINSCHED_MAX_TASKS);
+
+ /* Create FIFO real-time task and set its priority. */
+ p = __linsched_tasks[id] = __linsched_create_task(td);
+ __linsched_set_task_id(p, id);
+
+ params.sched_priority = prio;
+ sched_setscheduler(p, SCHED_FIFO, &params);
+
+ return p;
+}
+
+/* Create a RR real-time task with the specified callback and priority. */
+struct task_struct *linsched_create_RTrr_task(struct task_data *td, int prio)
+{
+ struct sched_param params = { };
+ int id = num_tasks++;
+ struct task_struct *p;
+
+ assert(id < LINSCHED_MAX_TASKS);
+
+ /* Create RR real-time task and set its priority. */
+ p = __linsched_tasks[id] = __linsched_create_task(td);
+
+ params.sched_priority = prio;
+ sched_setscheduler(p, SCHED_RR, &params);
+
+ return p;
+}
+
+void linsched_yield(void)
+{
+ /* If the current task is not the idle task, yield. */
+ if (current != idle_task(smp_processor_id()))
+ yield();
+}
+
+u64 getticks(void)
+{
+ u64 a, d;
+ asm volatile("lfence; rdtsc" : "=a" (a), "=d" (d));
+
+ return (a | (d << 32));
+}
+
+u64 rq_clock_delta(struct task_struct *p);
+/* The standard task_data for a task which runs the busy/sleep setup */
+static enum hrtimer_restart wake_task(struct hrtimer *timer)
+{
+ struct sleep_run_data *d =
+ container_of(timer, struct sleep_run_data, timer);
+ wake_up_process(d->p);
+ return HRTIMER_NORESTART;
+}
+
+static void sleep_run_init(struct sleep_run_data *d)
+{
+ d->last_start = 0;
+ hrtimer_init(&d->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+ d->timer.function = wake_task;
+}
+
+static void sleep_run_start(struct task_struct *p, void *data)
+{
+ struct sleep_run_data *d = data;
+ d->p = p;
+}
+
+/* Go to sleep in the given state and schedule a wakeup in ns nanoseconds */
+static void sleep_run_sleep_for(struct sleep_run_data *d, int state, u64 ns)
+{
+ hrtimer_set_expires(&d->timer, ns_to_ktime(ns));
+ hrtimer_start_expires(&d->timer, HRTIMER_MODE_REL);
+
+ if(d->p) {
+ d->p->state = state;
+ schedule();
+ }
+}
+
+/* Start or continue a run for ns nanoseconds. Tries to schedule a
+ * timer to end the run at the exact correct time. Returns true when
+ * the run has been finished. */
+static int sleep_run_run_for(struct sleep_run_data *d, u64 ns)
+{
+ struct task_struct *p = d->p;
+ /*
+ * start at time 1 so that we can reserve 0 for "just started
+ * this run"
+ */
+ s64 delta = 0, runtime = 1;
+
+ if(p) {
+ runtime += task_exec_time(p);
+ if(p->on_rq) {
+ /* this isn't quite the "right" clock, but is the best
+ * we can do without calling into the scheduler to
+ * update rq->clock_task (which should be the same
+ * anyway in linsched land) */
+ runtime += current_time - p->se.exec_start;
+ }
+ }
+
+ if (!d->last_start) {
+ d->last_start = runtime;
+ } else {
+ delta = runtime - d->last_start;
+ }
+
+ if (delta >= ns) {
+ d->last_start = 0;
+ return 1;
+ }
+
+ hrtimer_set_expires(&d->timer, ns_to_ktime(ns - delta));
+ hrtimer_start_expires(&d->timer, HRTIMER_MODE_REL);
+ return 0;
+}
+
+/* @fp: valid ptr to rlog file
+ * extracts the next event from the rlog file*/
+struct linsched_perf_event perf_get_next_event(FILE *fp)
+{
+ struct linsched_perf_event pe = {};
+ char *delim = ",";
+ char *event_type = NULL, *duration = NULL;
+ char line[256];
+
+ if (fp && !feof(fp)) {
+ if (fgets(line, sizeof(line), fp)) {
+ strtok(line, delim);
+ event_type = strtok(NULL, delim);
+ strtok(NULL, delim);
+ duration = strtok(NULL, delim);
+ }
+ if (event_type && duration) {
+ pe.duration = simple_strtol(duration, NULL, 0);
+ if (!strcasecmp("R", event_type))
+ pe.type = RUN;
+ else if (!strcasecmp("S", event_type))
+ pe.type = SLEEP;
+ else
+ pe.type = IOWAIT;
+ }
+ }
+ return pe;
+}
+
+static void sleep_run_handle(struct task_struct *p, void *data)
+{
+ struct sleep_run_task *d = data;
+ if (sleep_run_run_for(&d->sr_data, d->busy * NSEC_PER_MSEC)) {
+ if(d->sleep) {
+ sleep_run_sleep_for(&d->sr_data, TASK_INTERRUPTIBLE,
+ d->sleep * NSEC_PER_MSEC);
+ } else {
+ sleep_run_run_for(&d->sr_data, d->busy * NSEC_PER_MSEC
+ );
+ }
+ }
+}
+
+struct task_data *linsched_create_sleep_run(int sleep, int busy)
+{
+ struct task_data *td = malloc(sizeof(struct task_data));
+ struct sleep_run_task *d = malloc(sizeof(struct sleep_run_task));
+ d->sleep = sleep;
+ d->busy = busy;
+ sleep_run_init(&d->sr_data);
+ td->data = d;
+ td->init_task = sleep_run_start;
+ td->handle_task = sleep_run_handle;
+ return td;
+}
+
+void rcu_note_context_switch(int cpu) {}
+
+struct task_struct *find_task_by_vpid(pid_t vnr);
+/*struct task_struct *find_task_by_vpid(pid_t vnr)
+{
+ struct task_struct *p;
+
+ if (vnr >= LINSCHED_MAX_TASKS)
+ return NULL;
+
+ p = __linsched_tasks[vnr];
+ BUG_ON(p->pid != vnr);
+
+ return p;
+}*/
+
+/* get the next sleep / busy values from the appropriate distribution */
+static void rnd_dist_sleep_run_handle(struct task_struct *p, void *data)
+{
+ struct rnd_dist_task *d = data;
+ struct rand_dist *sdist = d->sleep_rdist;
+ struct rand_dist *bdist = d->busy_rdist;
+
+ if (sleep_run_run_for(&d->sr_data, d->busy)) {
+ d->sleep = sdist->gen_fn(sdist);
+ d->busy = bdist->gen_fn(bdist);
+
+ /* in case sleep is 0, we should not lose our task */
+ if (!d->sleep)
+ d->sleep = 1;
+ sleep_run_sleep_for(&d->sr_data, TASK_INTERRUPTIBLE, d->sleep);
+ }
+}
+
+struct task_data *linsched_create_rnd_dist_sleep_run(struct rand_dist
+ *sleep_rdist, struct rand_dist
+ *busy_rdist)
+{
+ struct task_data *td = malloc(sizeof(struct task_data));
+ struct rnd_dist_task *d = malloc(sizeof(struct rnd_dist_task));
+
+ d->sleep_rdist = sleep_rdist;
+ d->busy_rdist = busy_rdist;
+
+ d->sleep = sleep_rdist->gen_fn(sleep_rdist);
+ d->busy = busy_rdist->gen_fn(busy_rdist);
+ sleep_run_init(&d->sr_data);
+
+ td->data = d;
+ td->init_task = sleep_run_start;
+ td->handle_task = rnd_dist_sleep_run_handle;
+ return td;
+}
+
+static void perf_task_handle(struct task_struct *p, void *data)
+{
+ struct perf_task *d = data;
+ if (sleep_run_run_for(&d->sr_data, d->busy)) {
+ struct linsched_perf_event pe = perf_get_next_event(d->fp);
+ if (pe.duration) {
+ if (pe.type == RUN) {
+ d->busy = pe.duration;
+ d->sleep = 0;
+ sleep_run_run_for(&d->sr_data, d->busy);
+ } else {
+ d->sleep = pe.duration;
+ d->busy = 0;
+ }
+ } else {
+ /* didn't find an event, sleep */
+ d->sleep = UINT_MAX;
+ d->busy = 0;
+ }
+ if (d->sleep) {
+ int state;
+ if (pe.type == SLEEP)
+ state = TASK_INTERRUPTIBLE; /* sleep */
+ else
+ state = TASK_UNINTERRUPTIBLE; /* iowait */
+ sleep_run_sleep_for(&d->sr_data, state, d->sleep);
+ }
+ }
+}
+
+struct task_data *linsched_create_perf_task(char *filename)
+{
+ struct task_data *td = malloc(sizeof(struct task_data));
+ struct perf_task *d = malloc(sizeof(struct perf_task));
+
+ memset(d, 0, sizeof(*d));
+ sleep_run_init(&d->sr_data);
+
+ d->fp = fopen(filename, "r");
+ if (d->fp) {
+ d->filename = filename;
+ perf_task_handle(NULL, d);
+ } else {
+ fprintf(stderr, "\nopening %s failed. Error : %s",
+ filename, strerror(errno));
+ free(td);
+ free(d);
+ return NULL;
+ }
+
+ td->data = d;
+ td->init_task = sleep_run_start;
+ td->handle_task = perf_task_handle;
+ return td;
+}
+
+/* creates perf tasks for rlogs in directory
+ * @_dirpath: path to directory
+ * returns 0 on success, negative on failure
+ */
+int linsched_create_perf_tasks(char *_dirpath)
+{
+ DIR *dir;
+ struct dirent *de;
+ struct task_data *td;
+ char *dirpath = malloc(strlen(_dirpath) + 1);
+ char *filepath = malloc(strlen(dirpath) + NAME_MAX);
+
+ strcpy(dirpath, _dirpath);
+
+ /* check if directory name appended with '/' */
+ if (_dirpath[strlen(_dirpath) - 1] != '/')
+ strcat(dirpath, "/");
+
+ dir = opendir(dirpath);
+
+ if (dir) {
+ while ((de = readdir(dir))) {
+ filepath = strcpy(filepath, dirpath);
+ strcat(filepath, de->d_name);
+ if (strstr(de->d_name, ".rlog")) {
+ td = linsched_create_perf_task(filepath);
+ if (td)
+ linsched_create_normal_task(td, 0);
+ }
+ }
+ closedir(dir);
+ } else {
+ fprintf(stderr, "\nopening %s directory failed.", dirpath);
+ return -1;
+ }
+
+ free(filepath);
+ free(dirpath);
+ return 0;
+}
+
+struct task_struct *stop_tasks[NR_CPUS];
+
+static void stop_task_handle(struct task_struct *p, void *data)
+{
+ struct stop_task *stop_task = data;
+
+ if (stop_task->fxn)
+ stop_task->fxn(stop_task->arg);
+ else
+ BUG();
+
+ stop_task->fxn = NULL;
+ p->state = TASK_INTERRUPTIBLE;
+ schedule();
+}
+
+void sched_set_stop_task(int cpu, struct task_struct *stop);
+
+static enum hrtimer_restart wake_stop(struct hrtimer *timer)
+{
+ struct stop_task *d = container_of(timer, struct stop_task, timer);
+ wake_up_process(d->p);
+ return HRTIMER_NORESTART;
+}
+
+struct task_struct *linsched_create_stop_task(int cpu)
+{
+ struct task_struct *p;
+ struct task_data *td = malloc(sizeof(struct task_data));
+ struct stop_task *d = malloc(sizeof(struct stop_task));
+ cpumask_t mask;
+
+ memset(d, 0, sizeof(struct stop_task));
+ td->data = d;
+ td->handle_task = stop_task_handle;
+ hrtimer_init(&d->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+ p = linsched_fork(td, false);
+ d->timer.function = wake_stop;
+ d->p = p;
+ cpumask_clear(&mask);
+ cpumask_set_cpu(cpu, &mask);
+ set_cpus_allowed(p, mask);
+ sched_set_stop_task(cpu, p);
+ set_task_cpu(p, cpu);
+ p->state = TASK_INTERRUPTIBLE;
+
+ return p;
+}
+
+void init_stop_tasks(void)
+{
+ int cpu;
+
+ for_each_possible_cpu(cpu)
+ stop_tasks[cpu] = linsched_create_stop_task(cpu);
+}
+
+unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
+{
+ return strtoul(cp, endp, base);
+}
+
+long simple_strtol(const char *cp, char **endp, unsigned int base)
+{
+ return strtol(cp, endp, base);
+}
+
+int scnprintf(char *buf, size_t size, const char *fmt, ...)
+{
+ va_list args;
+ int i;
+
+ va_start(args, fmt);
+ i = vsnprintf(buf, size, fmt, args);
+ va_end(args);
+
+ return i;
+}
diff --git a/tools/linsched/linux_linsched.h b/tools/linsched/linux_linsched.h
new file mode 100644
index 00000000000000..ed39a54d838e3e
--- /dev/null
+++ b/tools/linsched/linux_linsched.h
@@ -0,0 +1,35 @@
+/* LinSched -- The Linux Scheduler Simulator
+ * Copyright (C) 2008 John M. Calandrino
+ * E-mail: jmc@cs.unc.edu
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef LINUX_LINSCHED_H
+#define LINUX_LINSCHED_H
+
+/* Additional functions provided to kernel-land */
+#include <linux/kernel.h>
+
+void linsched_change_cpu(int cpu);
+void *malloc(size_t size);
+void free(void *p);
+
+#define linsched_alloc_thread_info(tsk) ((struct thread_info *) \
+ malloc(sizeof(struct thread_info) + 1))
+#define linsched_alloc_task_struct() ((struct task_struct *) \
+ malloc(sizeof(struct task_struct) + 1))
+
+#endif /* LINUX_LINSCHED_H */
diff --git a/tools/linsched/load_balance_score.c b/tools/linsched/load_balance_score.c
new file mode 100644
index 00000000000000..918208fb594131
--- /dev/null
+++ b/tools/linsched/load_balance_score.c
@@ -0,0 +1,359 @@
+/* Load balance scoring */
+
+#include "test_lib.h"
+#include "load_balance_score.h"
+#include "lib/sort.h"
+#include <stdio.h>
+#include <malloc.h>
+#include <math.h>
+
+/* stdlib.h conflicts with linux/sched.h unfortunately */
+void qsort(void *base, size_t nmemb, size_t size,
+ int(*compar)(const void *, const void *));
+
+struct lb_group {
+ struct task_group *tg;
+ double h_weight;
+ double total_load;
+};
+struct lb_task {
+ struct task_struct *p;
+ int cpus_allowed;
+ double h_weight;
+};
+
+struct lb_cpu {
+ int id;
+ double load;
+};
+
+typedef uintptr_t hash_t;
+
+struct hash_bucket {
+ hash_t key;
+ double value;
+};
+
+#define HASH_TABLE_SIZE 1023
+static struct hash_bucket hash_table[HASH_TABLE_SIZE];
+
+static struct lb_task lb_tasks[LINSCHED_MAX_TASKS];
+static struct lb_group lb_groups[LINSCHED_MAX_GROUPS];
+static int n_lb_tasks;
+static int n_lb_groups;
+
+static u64 last_time;
+static u64 start_time;
+
+static double total_imbalance;
+
+static int cpu_load_compare(const struct lb_cpu *a, const struct lb_cpu *b);
+static int task_compare(const struct lb_task *a, const struct lb_task *b);
+define_specialized_qsort(tasks, struct lb_task, task_compare);
+define_specialized_qsort(cpus, struct lb_cpu, cpu_load_compare);
+
+static void split_h_weight(struct lb_group *parent)
+{
+ struct task_group *ptg = parent->tg;
+ struct task_group *tg;
+ double mult = parent->h_weight / parent->total_load;
+
+ list_for_each_entry(tg, &ptg->children, siblings) {
+ struct lb_group *g = linsched_tg(tg)->temp;
+ if (g) {
+ g->h_weight = tg->shares * mult;
+ split_h_weight(g);
+ }
+ }
+}
+
+static void compute_lb_h_weight(void)
+{
+ int i;
+
+ for(i = 0; i < n_lb_tasks; i++) {
+ struct task_struct *p = lb_tasks[i].p;
+ struct lb_group *g = linsched_tg(task_group(p))->temp;
+ g->total_load += p->se.load.weight;
+ }
+
+ for(i = 0; i < n_lb_groups; i++) {
+ struct task_group *tg = lb_groups[i].tg;
+ struct lb_group *g;
+ if (!tg->parent)
+ continue;
+ g = linsched_tg(tg->parent)->temp;
+ g->total_load += tg->shares;
+ }
+
+ lb_groups[0].h_weight = 1024;
+
+ split_h_weight(&lb_groups[0]);
+
+ for(i = 0; i < n_lb_tasks; i++) {
+ struct task_struct *p = lb_tasks[i].p;
+ struct lb_group *g = linsched_tg(task_group(p))->temp;
+ double mult = g->h_weight / g->total_load;
+ lb_tasks[i].h_weight = p->se.load.weight * mult;
+ }
+}
+
+
+#define num_compare(a, b) ((a) < (b) ? -1 : ((a) > (b) ? 1 : 0))
+
+static int cpu_load_compare(const struct lb_cpu *a, const struct lb_cpu *b)
+{
+ return num_compare(a->load, b->load);
+}
+
+/* sort lb_task by increasing cpus_allowed, decreasing weight */
+static int task_compare(const struct lb_task *a, const struct lb_task *b)
+{
+ int res;
+ res = num_compare(a->cpus_allowed, b->cpus_allowed);
+ if (!res)
+ res = -num_compare(a->h_weight, b->h_weight);
+ return res;
+}
+
+static void simple_greedy_balance(struct lb_cpu *cpus, int nr_cpus)
+{
+ int i;
+
+ qsort_tasks(lb_tasks, n_lb_tasks);
+
+ for(i = 0; i < n_lb_tasks; i++) {
+ struct lb_cpu *j, *end;
+ for(j = cpus; j < cpus + nr_cpus; j++) {
+ if(cpumask_test_cpu(j->id,
+ &lb_tasks[i].p->cpus_allowed))
+ break;
+ }
+ j->load += lb_tasks[i].h_weight;
+
+ /* sort it into place */
+ end = &cpus[nr_cpus - 1];
+ for(; j < end && j->load > (j + 1)->load; j++) {
+ struct lb_cpu temp = *j;
+ *j = *(j + 1);
+ *(j + 1) = temp;
+ }
+ }
+}
+
+static void actual_balance(struct lb_cpu *cpus, int nr_cpus)
+{
+ int i, cpu;
+ struct lb_cpu *cpu_map[NR_CPUS]; /* in case the online set is not 0-n */
+
+ for(i = 0; i < nr_cpus; i++) {
+ cpu_map[cpus[i].id] = &cpus[i];
+ }
+ for(i = 0; i < n_lb_tasks; i++) {
+ cpu = task_cpu(lb_tasks[i].p);
+ cpu_map[cpu]->load += lb_tasks[i].h_weight;
+ }
+ qsort_cpus(cpus, nr_cpus);
+}
+
+void init_lb_info(void)
+{
+ start_time = 0;
+ total_imbalance = 0;
+}
+
+hash_t mixhash(hash_t hash, uintptr_t value) {
+ /* better hash functions could be used here, but this is
+ * empirically good enough and is noticeably faster */
+ return hash * 29 + value;
+}
+
+static hash_t setup_lb_info(void)
+{
+ int i, out, cpu;
+ struct task_struct *p;
+ extern int num_tasks, num_cgroups; /* defined in linux_linsched.c */
+ hash_t hash = 0;
+
+ out = 0;
+ for(i = 1; i < num_tasks; i++) {
+ int j;
+ p = __linsched_tasks[i];
+ if (!p->se.on_rq)
+ continue;
+ lb_tasks[out].p = p;
+ lb_tasks[out].cpus_allowed = cpumask_weight(&p->cpus_allowed);
+
+ hash = mixhash(hash, (uintptr_t)p);
+ hash = mixhash(hash, (uintptr_t)p->se.cfs_rq);
+ hash = mixhash(hash, p->se.load.weight);
+
+ /* hash in cpus_allowed */
+ for (j = 0; j < BITS_TO_LONGS(NR_CPUS); j++) {
+ hash = mixhash(hash, cpumask_bits(&p->cpus_allowed)[j]);
+ }
+
+ out++;
+ }
+ n_lb_tasks = out;
+ out = 0;
+ for(i = 0; i < num_cgroups; i++) {
+ struct task_group *tg = cgroup_tg(&__linsched_cgroups[i].cg);
+ int on_rq = 0;
+ if (!tg)
+ continue;
+ if (tg != &root_task_group) {
+ for_each_online_cpu(cpu) {
+ if (tg->se[cpu]->on_rq) {
+ on_rq = 1;
+ break;
+ }
+ }
+ if (!on_rq) {
+ linsched_tg(tg)->temp = NULL;
+ continue;
+ }
+ }
+ lb_groups[out].tg = tg;
+ lb_groups[out].total_load = 0;
+ linsched_tg(tg)->temp = &lb_groups[out];
+ hash = mixhash(hash, (uintptr_t)tg);
+ hash = mixhash(hash, tg->shares);
+ out++;
+ }
+ n_lb_groups = out;
+ return hash;
+}
+
+static double compute_imbalance(void)
+{
+ int cpu, i = 0;
+ int nr_cpus = num_online_cpus();
+ static struct lb_cpu greedy_cpus[NR_CPUS];
+ static struct lb_cpu actual_cpus[NR_CPUS];
+ double imbalance = 0;
+
+ compute_lb_h_weight();
+
+ for_each_online_cpu(cpu) {
+ greedy_cpus[i].load = 0;
+ greedy_cpus[i].id = cpu;
+ actual_cpus[i].load = 0;
+ actual_cpus[i].id = cpu;
+ i++;
+ }
+ simple_greedy_balance(greedy_cpus, nr_cpus);
+ actual_balance(actual_cpus, nr_cpus);
+ if (actual_cpus[nr_cpus - 1].load - actual_cpus[0].load <
+ greedy_cpus[nr_cpus - 1].load - greedy_cpus[0].load) {
+ return NAN;
+ }
+
+ for(i = 0; i < nr_cpus; i++) {
+ double delta = greedy_cpus[i].load - actual_cpus[i].load;
+ imbalance += delta * delta;
+ }
+ return imbalance;
+}
+
+void compute_lb_info(void)
+{
+ double imbalance;
+ u64 old_time = last_time;
+ hash_t hash_key;
+
+ last_time = current_time;
+ if (!start_time) {
+ start_time = current_time;
+ return;
+ }
+
+ hash_key = setup_lb_info();
+
+ struct hash_bucket *b = &hash_table[hash_key % HASH_TABLE_SIZE];
+ if (b->key == hash_key) {
+ imbalance = b->value;
+ } else {
+ imbalance = compute_imbalance();
+
+ b->key = hash_key;
+ b->value = imbalance;
+ }
+
+ if (isnan(imbalance)) {
+ printf("actual balance is better than greedy balance at %llu\n", current_time);
+ return;
+ }
+
+ total_imbalance += imbalance * (current_time - old_time);
+
+ if (linsched_global_options.dump_imbalance) {
+ printf("imbalance at %llu: %f\n",
+ current_time, imbalance);
+ }
+ if (linsched_global_options.dump_full_balance) {
+ dump_lb_info(stdout);
+ }
+}
+
+double get_average_imbalance(void)
+{
+ return total_imbalance / (current_time - start_time);
+}
+
+void dump_lb_info(FILE *out)
+{
+ int i;
+ int cpu;
+ char path[128];
+
+ fprintf(out, "at %llu\n", current_time);
+ for(i = 0; i < LINSCHED_MAX_TASKS; i++) {
+ struct task_struct *p = __linsched_tasks[i];
+ char mask[128];
+ if (!p)
+ continue;
+
+ cgroup_path(task_group(p)->css.cgroup, path, sizeof(path));
+ cpumask_scnprintf(mask, sizeof(mask), &p->cpus_allowed);
+ fprintf(out, "task %d in %s w %lu cpu %d mask %s on_rq %d\n", i,
+ path, p->se.load.weight, task_cpu(p),
+ mask, p->se.on_rq);
+ }
+ for(i = 0; i < LINSCHED_MAX_GROUPS; i++) {
+ struct cgroup *cgroup = &__linsched_cgroups[i].cg;
+ struct task_group *tg = cgroup_tg(cgroup);
+ if (!tg)
+ continue;
+ cgroup_path(cgroup, path, sizeof(path));
+
+ fprintf(out, "group %s w %lu", path, tg->shares);
+
+ if (tg->parent) {
+ fprintf(out, " percpu:");
+ for_each_online_cpu(cpu) {
+ fprintf(out, " %lu", tg->se[cpu]->load.weight);
+ }
+ }
+ fprintf(out, "\n");
+
+ }
+
+ for_each_online_cpu(cpu) {
+ struct rb_node *cur;
+ struct cfs_rq *cfs = root_task_group.cfs_rq[cpu];
+ fprintf(out, "cpu %d %lu/%lu entities:", cpu, cfs->load.weight, cfs->nr_running);
+
+ if (cfs->curr)
+ fprintf(out, " %lu", cfs->curr->load.weight);
+
+ cur = cfs->rb_leftmost;
+ while(cur) {
+ fprintf(out, " %lu", rb_entry(cur, struct sched_entity, run_node)->load.weight);
+ cur = rb_next(cur);
+ }
+ fprintf(out, "\n");
+
+ }
+ fprintf(out, "\n");
+}
diff --git a/tools/linsched/load_balance_score.h b/tools/linsched/load_balance_score.h
new file mode 100644
index 00000000000000..ea64bbbfa5e025
--- /dev/null
+++ b/tools/linsched/load_balance_score.h
@@ -0,0 +1,11 @@
+#ifndef LOAD_BALANCE_SCORE_H
+#define LOAD_BALANCE_SCORE_H
+
+#include <stdio.h>
+
+void init_lb_info(void);
+void compute_lb_info(void);
+double get_average_imbalance(void);
+void dump_lb_info(FILE *out);
+
+#endif
diff --git a/tools/linsched/nohz.h b/tools/linsched/nohz.h
new file mode 100644
index 00000000000000..cbef5bf78822f9
--- /dev/null
+++ b/tools/linsched/nohz.h
@@ -0,0 +1,10 @@
+#ifndef __LINSCHED_HEADER_NOHZ
+#define __LINSCHED_HEADER_NOHZ
+
+struct nohz {
+ cpumask_var_t idle_cpus_mask;
+ atomic_t nr_cpus;
+ unsigned long next_balance;
+};
+
+#endif
diff --git a/tools/linsched/nohz_tracking.c b/tools/linsched/nohz_tracking.c
new file mode 100644
index 00000000000000..9dc83f398bd3e1
--- /dev/null
+++ b/tools/linsched/nohz_tracking.c
@@ -0,0 +1,116 @@
+/* Tracking cpu nohz residency */
+
+#include "linsched.h"
+#include <stdio.h>
+
+#define MAX_DOMAINS 10
+
+struct nohz_data {
+ u64 nohz_time;
+ u64 last_change;
+ int num_nohz_cpus;
+};
+
+/*
+ * nohz_data[cpu][0] is the data for the individual cpu, and then it
+ * goes up the sched_domain tree for 1..
+ */
+static struct nohz_data nohz_data[NR_CPUS][MAX_DOMAINS];
+struct nohz;
+extern struct nohz nohz;
+
+static void do_track_nohz_sd_residency(int cpu, int level, int nr_cpus,
+ int cpu_delta)
+{
+ struct nohz_data *data = &nohz_data[cpu][level];
+ BUG_ON(level >= MAX_DOMAINS);
+
+ if (data->num_nohz_cpus == nr_cpus) {
+ data->nohz_time += current_time - data->last_change;
+ }
+ data->last_change = current_time;
+ data->num_nohz_cpus += cpu_delta;
+}
+
+void track_nohz_residency(int cpu)
+{
+ struct sched_domain *sd;
+ int cpu_delta;
+ int nohz_active = !cpu_online(cpu) ||
+ !!cpumask_test_cpu(cpu, nohz.idle_cpus_mask);
+ int i = 1;
+
+ cpu_delta = nohz_active - nohz_data[cpu][0].num_nohz_cpus;
+ do_track_nohz_sd_residency(cpu, 0, 1, cpu_delta);
+
+ for_each_domain(cpu, sd) {
+ do_track_nohz_sd_residency(cpumask_first(sched_domain_span(sd)),
+ i, sd->span_weight, cpu_delta);
+ i++;
+ }
+}
+
+static void print_cpu(int cpu)
+{
+ int i;
+ struct sched_domain *sd;
+
+ track_nohz_residency(cpu);
+ printf("cpu%3d: %7.4f%% ", cpu, nohz_data[cpu][0].nohz_time * 100.0 / current_time);
+ i = 1;
+ for_each_domain(cpu, sd) {
+ if (cpu != cpumask_first(sched_domain_span(sd)))
+ break;
+ printf("%7.4f%% ",
+ nohz_data[cpu][i].nohz_time * 100.0 / current_time);
+ i++;
+ }
+ printf("\n");
+}
+
+void print_nohz_residency(void)
+{
+ struct cpumask to_print;
+ struct sched_domain *sd;
+ int cpu;
+
+ printf("Time spent with tick disabled over %llu ms:\n",
+ current_time / NSEC_PER_MSEC);
+ cpumask_copy(&to_print, cpu_possible_mask);
+ cpu = cpumask_first(&to_print);
+
+ /* headings */
+ printf("%7s ", "level:");
+ for_each_domain(cpu, sd) {
+ printf("%8s ", sd->name);
+ }
+ printf("%8s ", "SYSTEM");
+ printf("\n");
+
+ /* print the nohz info in sched_domain hierarchy order */
+ while(cpu < nr_cpu_ids) {
+ print_cpu(cpu);
+ cpumask_clear_cpu(cpu, &to_print);
+
+ if (nr_cpu_ids == 1)
+ break;
+
+ sd = cpu_rq(cpu)->sd;
+ while(sd) {
+ cpu = cpumask_first_and(sched_domain_span(sd),
+ &to_print);
+ if (cpu < nr_cpu_ids)
+ break;
+ sd = sd->parent;
+ }
+ }
+
+ if (!cpumask_empty(&to_print)) {
+ printf("currently offline cpus:\n");
+ while(!cpumask_empty(&to_print)) {
+ cpu = cpumask_first(&to_print);
+ print_cpu(cpu);
+ cpumask_clear_cpu(cpu, &to_print);
+ }
+ }
+}
diff --git a/tools/linsched/nohz_tracking.h b/tools/linsched/nohz_tracking.h
new file mode 100644
index 00000000000000..d4df7426816a90
--- /dev/null
+++ b/tools/linsched/nohz_tracking.h
@@ -0,0 +1,8 @@
+#ifndef NOHZ_TRACKING_H
+#define NOHZ_TRACKING_H
+
+/* called for each cpu, for each tick */
+void track_nohz_residency(int cpu);
+void print_nohz_residency(void);
+
+#endif
diff --git a/tools/linsched/numa.c b/tools/linsched/numa.c
new file mode 100644
index 00000000000000..255ff51e2f7144
--- /dev/null
+++ b/tools/linsched/numa.c
@@ -0,0 +1,142 @@
+/* LinSched -- The Linux Scheduler Simulator
+ * Copyright (C) 2008 John M. Calandrino
+ * E-mail: jmc@cs.unc.edu
+ *
+ * This file contains Linux variables and functions that have been "defined
+ * away" or exist here in a modified form to avoid including an entire Linux
+ * source file that might otherwise lead to a "cascade" of dependency issues.
+ * It also includes certain LinSched variables to which some Linux functions
+ * and definitions now map.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <linux/gfp.h>
+#include <linux/hrtimer.h>
+
+#include "linsched.h"
+
+int nr_node_ids;
+int nr_cpu_ids;
+int cpu_to_node_map[NR_CPUS];
+cpumask_var_t node_to_cpumask_map[MAX_NUMNODES];
+static int cpu_to_coregroup_map[NR_CPUS];
+static cpumask_var_t cpu_coregroup_masks[NR_CPUS];
+static int cpu_to_core_map[NR_CPUS];
+cpumask_var_t cpu_core_masks[NR_CPUS];
+static int node_distances[MAX_NUMNODES][MAX_NUMNODES];
+int smp_num_siblings = 1;
+
+static struct hrtimer trigger_timer[NR_CPUS];
+
+void linsched_init_cpus(struct linsched_topology *topo)
+{
+ int i;
+
+ for (i = 0; i < NR_CPUS; i++) {
+ zalloc_cpumask_var(&node_to_cpumask_map[i], GFP_KERNEL);
+ zalloc_cpumask_var(&cpu_coregroup_masks[i], GFP_KERNEL);
+ zalloc_cpumask_var(&cpu_core_masks[i], GFP_KERNEL);
+ }
+
+ if (topo) {
+ memcpy(cpu_to_node_map, topo->node_map, sizeof(topo->node_map));
+ memcpy(cpu_to_coregroup_map, topo->coregroup_map,
+ sizeof(topo->coregroup_map));
+ memcpy(cpu_to_core_map, topo->core_map, sizeof(topo->core_map));
+ memcpy(node_distances, topo->node_distances,
+ sizeof(topo->node_distances));
+
+ nr_cpu_ids = topo->nr_cpus;
+ } else {
+ for (i = 0; i < LINSCHED_DEFAULT_NR_CPUS; i++) {
+ cpu_to_core_map[i] = i;
+ cpu_to_coregroup_map[i] = i;
+ }
+ /* all cpus go in node 0 */
+ nr_cpu_ids = LINSCHED_DEFAULT_NR_CPUS;
+ }
+
+ for (i = 0; i < nr_cpu_ids; i++) {
+ cpumask_set_cpu(i, node_to_cpumask_map[cpu_to_node_map[i]]);
+ cpumask_set_cpu(i,
+ cpu_coregroup_masks[cpu_to_coregroup_map[i]]);
+ cpumask_set_cpu(i, cpu_core_masks[cpu_to_core_map[i]]);
+ set_cpu_present(i, true);
+ set_cpu_possible(i, true);
+ }
+ nr_node_ids = cpu_to_node_map[nr_cpu_ids - 1] + 1;
+ smp_num_siblings = cpumask_weight(cpu_core_masks[0]);
+}
+
+const struct cpumask *cpu_coregroup_mask(int cpu)
+{
+ return cpu_coregroup_masks[cpu_to_coregroup_map[cpu]];
+}
+
+const struct cpumask *get_cpu_core_mask(int cpu)
+{
+ return cpu_core_masks[cpu_to_core_map[cpu]];
+}
+
+static enum hrtimer_restart cpu_triggered(struct hrtimer *t)
+{
+ scheduler_ipi();
+ return HRTIMER_NORESTART;
+}
+
+void linsched_trigger_cpu(int cpu)
+{
+ int curr_cpu = smp_processor_id();
+ linsched_change_cpu(cpu);
+ if (!hrtimer_active(&trigger_timer[cpu])) {
+ hrtimer_init(&trigger_timer[cpu], CLOCK_MONOTONIC,
+ HRTIMER_MODE_REL);
+ hrtimer_set_expires(&trigger_timer[cpu], ktime_set(0, 1));
+ trigger_timer[cpu].function = cpu_triggered;
+ hrtimer_start(&trigger_timer[cpu], ktime_set(0, 1),
+ HRTIMER_MODE_REL);
+ }
+ /*
+ * Call the scheduler ipi when queueing up tasks on the wakelist
+ */
+ scheduler_ipi();
+ linsched_change_cpu(curr_cpu);
+}
+
+int __node_distance(int a, int b)
+{
+ return node_distances[a][b];
+}
+
+void __init smp_init(void)
+{
+ unsigned int cpu;
+
+ for_each_present_cpu(cpu) {
+ if (!cpu_online(cpu))
+ cpu_up(cpu);
+ }
+}
+
+void linsched_offline_cpu(int cpu)
+{
+ cpu_down(cpu);
+}
+
+void linsched_online_cpu(int cpu)
+{
+ cpu_up(cpu);
+}
diff --git a/tools/linsched/sanity_check.c b/tools/linsched/sanity_check.c
new file mode 100644
index 00000000000000..7ef04899358fe0
--- /dev/null
+++ b/tools/linsched/sanity_check.c
@@ -0,0 +1,115 @@
+
+#include "linsched.h"
+#include "sanity_check.h"
+
+static unsigned long check_cfs_rq(struct cfs_rq *cfs_rq);
+
+static unsigned long check_cfs_se(struct sched_entity *se, struct cfs_rq *cfs_rq)
+{
+ BUG_ON(se->cfs_rq != cfs_rq);
+ BUG_ON(!se->on_rq);
+
+ if (se->my_q) {
+ unsigned long tasks = check_cfs_rq(se->my_q);
+ BUG_ON(!tasks);
+ return tasks;
+ } else {
+ struct task_struct *p = container_of(se, struct task_struct, se);
+ BUG_ON(cpu_rq(task_cpu(p)) != cfs_rq->rq);
+ BUG_ON(task_cpu(p) != debug_smp_processor_id());
+ }
+ return 1;
+}
+
+static unsigned long check_cfs_rq(struct cfs_rq *cfs_rq)
+{
+ unsigned long h_nr_running = 0;
+ unsigned long nr_running = 0;
+ u64 last_vruntime = 0;
+ unsigned long load = 0;
+ struct rb_node *node, *first;
+
+ if (cfs_rq->curr) {
+ h_nr_running += check_cfs_se(cfs_rq->curr, cfs_rq);
+ nr_running++;
+ load += cfs_rq->curr->load.weight;
+ }
+
+ first = cfs_rq->rb_leftmost;
+ BUG_ON(first != rb_first(&cfs_rq->tasks_timeline));
+
+ for(node = first; node; node = rb_next(node)) {
+ struct sched_entity *se;
+ se = rb_entry(node, struct sched_entity, run_node);
+
+ BUG_ON(node != first &&
+ (s64)(se->vruntime - last_vruntime) < 0);
+ last_vruntime = se->vruntime;
+ load += se->load.weight;
+
+ h_nr_running += check_cfs_se(se, cfs_rq);
+ nr_running++;
+ }
+ BUG_ON(load != cfs_rq->load.weight);
+ BUG_ON(nr_running != cfs_rq->nr_running);
+
+ return h_nr_running;
+}
+
+static unsigned long check_rt_rq(struct rt_rq *rt_rq);
+
+static unsigned long check_rt_se(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq)
+{
+#ifdef CONFIG_RT_GROUP_SCHED
+ BUG_ON(rt_se->parent != rt_rq);
+ if (rt_se->my_q) {
+ unsigned long tasks = check_rt_rq(rt_se->my_q);;
+ BUG_ON(!tasks);
+ return tasks;
+ }
+#endif
+ return 1;
+}
+
+static unsigned long check_rt_rq(struct rt_rq *rt_rq)
+{
+ unsigned long nr_running = 0;
+ unsigned long h_nr_running = 0;
+ struct rt_prio_array *array = &rt_rq->active;
+ int idx = -1;
+
+ while((idx = find_next_bit(array->bitmap, MAX_RT_PRIO, idx+1) <
+ MAX_RT_PRIO)) {
+ struct sched_rt_entity *rt_se;
+ list_for_each_entry(rt_se, &array->queue[idx], run_list) {
+ h_nr_running += check_rt_se(rt_se, rt_rq);
+ nr_running++;
+ }
+ }
+
+ BUG_ON(rt_rq->rt_nr_running != nr_running);
+ return h_nr_running;
+}
+
+static void check_rq(struct rq *rq)
+{
+ unsigned long nr_running = 0;
+ /* by sched_class, in order */
+ if (rq->stop->on_rq) /* stop_sched_class */
+ nr_running++;
+ nr_running += check_rt_rq(&rq->rt); /* rt_sched_class */
+ nr_running += check_cfs_rq(&rq->cfs); /* fair_sched_class */
+
+ /* idle doesn't contribute to nr_running, so it isn't here */
+ BUG_ON(nr_running != rq->nr_running);
+}
+
+void run_sanity_check(void)
+{
+ /*
+ * only bother checking one cpu at a time, any other cpus
+ * affected by the current tick will get checked whenever they
+ * run, which will likely be soon enough
+ */
+ check_rq(cpu_rq(debug_smp_processor_id()));
+}
diff --git a/tools/linsched/sanity_check.h b/tools/linsched/sanity_check.h
new file mode 100644
index 00000000000000..59b7e5c354cbfb
--- /dev/null
+++ b/tools/linsched/sanity_check.h
@@ -0,0 +1,6 @@
+#ifndef SANITY_CHECK_H
+#define SANITY_CHECK_H
+
+void run_sanity_check(void);
+
+#endif
diff --git a/tools/linsched/stubs.c b/tools/linsched/stubs.c
new file mode 100644
index 00000000000000..50680ea19e9092
--- /dev/null
+++ b/tools/linsched/stubs.c
@@ -0,0 +1,257 @@
+/* LinSched -- The Linux Scheduler Simulator
+ * Copyright (C) 2008 John M. Calandrino
+ * E-mail: jmc@cs.unc.edu
+ *
+ * This file contains Linux variables and functions that have been "defined
+ * away" or exist here in a modified form to avoid including an entire Linux
+ * source file that might otherwise lead to a "cascade" of dependency issues.
+ * It also includes certain LinSched variables to which some Linux functions
+ * and definitions now map.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <linux/gfp.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/init.h>
+#include <linux/init_task.h>
+#include <linux/fs.h>
+#include <linux/mqueue.h>
+#include <linux/personality.h>
+#include <linux/fdtable.h>
+#include <linux/fs_struct.h>
+
+#include <asm/uaccess.h>
+#include <asm/pgtable.h>
+
+#include <malloc.h>
+void abort(void);
+
+int __linsched_curr_cpu = 0;
+struct group_info init_groups = {.usage = ATOMIC_INIT(2) };
+
+DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task;
+
+struct user_namespace init_user_ns = {
+ .kref = {
+ .refcount = ATOMIC_INIT(3),
+ },
+ .creator = &root_user,
+};
+
+struct percpu_counter vm_committed_as;
+
+/* needs correct initialization depending on core speeds */
+unsigned int cpu_khz;
+struct task_struct *kthreadd_task;
+
+struct nsproxy init_nsproxy;
+struct user_struct root_user;
+struct exec_domain default_exec_domain;
+struct fs_struct init_fs;
+struct files_struct init_files;
+
+static int printk_level = 5; /* only show KERN_NOTICE and up */
+
+int tsk_fork_get_node(struct task_struct *tsk)
+{
+ return numa_node_id();
+}
+
+void timerfd_clock_was_set(void) {}
+
+long do_no_restart_syscall(struct restart_block *param)
+{
+ return -EINTR;
+}
+
+int security_task_setnice(struct task_struct *p, int nice)
+{
+ return 0;
+}
+
+int __printk_ratelimit(const char *func)
+{
+ return 0;
+}
+
+void enter_idle(void)
+{
+}
+
+void __exit_idle(void)
+{
+}
+
+void exit_idle(void)
+{
+}
+
+void linsched_set_printk_level(int level)
+{
+ printk_level = level;
+}
+
+asmlinkage int printk(const char *fmt, ...)
+{
+ va_list args;
+ int log_level = 5; /* default to KERN_NOTICE */
+
+ /* very basic log_prefix handling */
+ if (fmt[0] == '<' && (fmt[1] >= '0' && fmt[1] <= '9') &&
+ fmt[2] == '>') {
+ log_level = fmt[1] - '0';
+ }
+ if (log_level > printk_level)
+ return 0;
+
+ va_start(args, fmt);
+ vprintf(fmt, args);
+ va_end(args);
+
+ return 0;
+}
+
+void panic(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ vprintf(fmt, args);
+ va_end(args);
+ puts("");
+ abort();
+}
+
+void dump_stack(void)
+{
+}
+
+struct sighand_struct *__lock_task_sighand(struct task_struct *tsk,
+ unsigned long *flags)
+{
+ return tsk->sighand;
+}
+
+void linsched_change_cpu(int cpu)
+{
+ __linsched_curr_cpu = cpu;
+}
+
+unsigned int debug_smp_processor_id(void)
+{
+ return __linsched_curr_cpu;
+}
+
+bool capable(int cap)
+{
+ return 1;
+}
+
+/* These functions do not copy to and from user space anymore, so
+ * they are just memory copy functions now.
+ */
+__must_check unsigned long
+_copy_from_user(void *to, const void __user * from, unsigned n)
+{
+ memcpy(to, from, n);
+ return 0;
+}
+
+__must_check unsigned long
+_copy_to_user(void __user *to, const void *from, unsigned n)
+{
+ memcpy(to, from, n);
+ return 0;
+}
+
+void copy_from_user_overflow(void)
+{
+}
+
+void user_disable_single_step(struct task_struct *child)
+{
+}
+
+void warn_slowpath_null(const char *file, int line)
+{
+ printf("WARNING: at %s:%d\n", file, line);
+}
+
+void warn_slowpath_fmt(const char *file, int line, const char *fmt, ...)
+{
+ va_list list;
+ warn_slowpath_null(file, line);
+ va_start(list, fmt);
+ vprintf(fmt, list);
+ va_end(list);
+ puts("");
+}
+
+struct dentry *debugfs_create_file(const char *name, mode_t mode,
+ struct dentry *parent, void *data,
+ const struct file_operations *fops)
+{
+ return NULL;
+}
+
+ssize_t seq_read(struct file *file, char *buf, size_t size, loff_t *ppos)
+{
+ return 0;
+}
+
+loff_t seq_lseek(struct file *file, loff_t offset, int origin)
+{
+ return 0;
+}
+
+int single_release(struct inode *inode, struct file *file)
+{
+ return 0;
+}
+
+int seq_printf(struct seq_file *m, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ vprintf(fmt, args);
+ va_end(args);
+
+ return 0;
+}
+
+int seq_puts(struct seq_file *m, const char *s)
+{
+ puts(s);
+
+ return 0;
+}
+
+int single_open(struct file *file, int (*show)(struct seq_file *, void *),
+ void *data)
+{
+ return 0;
+}
+
+void kprobe_flush_task(struct task_struct *tk)
+{
+}
+
+void print_modules(void)
+{
+}
diff --git a/tools/linsched/stubs/sched.c b/tools/linsched/stubs/sched.c
new file mode 100644
index 00000000000000..a957f905bb9f6d
--- /dev/null
+++ b/tools/linsched/stubs/sched.c
@@ -0,0 +1,198 @@
+#include "linsched.h"
+#include <assert.h>
+
+/* for in_sched_functions() */
+char __sched_text_start[1];
+char __sched_text_end[1];
+
+static struct rcu_head *rcu_head;
+static struct rcu_head **rcu_curtail = &rcu_head;
+/* 'rcu' */
+void call_rcu_sched(struct rcu_head *head, void (*func)(struct rcu_head *rcu))
+{
+ head->func = func;
+ head->next = NULL;
+
+ *rcu_curtail = head;
+ rcu_curtail = &head->next;
+}
+
+void linsched_rcu_invoke(void)
+{
+ while(rcu_head) {
+ struct rcu_head *next = rcu_head->next;
+ rcu_head->func(rcu_head);
+ rcu_head = next;
+ }
+}
+
+/* kernel/workqueue.c */
+void wq_worker_waking_up(struct task_struct *task, unsigned int cpu) {}
+
+struct task_struct *wq_worker_sleeping(struct task_struct *task,
+ unsigned int cpu)
+{
+ /* should be unused */
+ assert(0);
+
+ return NULL;
+}
+
+/* posix-timers.c */
+int __group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
+{
+ /* should be unused */
+ assert(0);
+
+ return 0;
+}
+
+struct k_itimer;
+int posix_timer_event(struct k_itimer *timr, int si_private)
+{
+ /* should be unused */
+ assert(0);
+
+ return 0;
+}
+
+struct k_clock;
+void posix_timers_register_clock(const clockid_t clock_id,
+ struct k_clock *new_clock)
+{
+ /* should be unused */
+ assert(0);
+}
+
+/* kernel/smp.c */
+void __smp_call_function_single(int cpu, struct call_single_data *data,
+ int wait)
+{
+ int this_cpu = smp_processor_id();
+ unsigned long flags;
+
+ if (cpu != this_cpu)
+ linsched_change_cpu(cpu);
+
+ local_irq_save(flags);
+ data->func(data->info);
+ local_irq_restore(flags);
+
+ if (cpu != this_cpu)
+ linsched_change_cpu(this_cpu);
+}
+
+
+void wake_up_stop_task(int cpu, cpu_stop_fn_t fxn, void *data);
+
+/* kernel/stop_machine.c */
+void linsched_current_handler(void);
+
+int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fxn, void *arg)
+{
+ struct task_struct *stop = stop_tasks[cpu];
+ int this_cpu = smp_processor_id(), ret;
+
+ linsched_change_cpu(cpu);
+ wake_up_process(stop);
+ /* switch to stop */
+ schedule();
+ BUG_ON(current != stop);
+ ret = fxn(arg);
+ /* switch back */
+ stop->state = TASK_INTERRUPTIBLE;
+ schedule();
+
+ /* let whoever followed the stop task re-program (if needed) */
+ linsched_current_handler();
+ BUG_ON(current == stop);
+ linsched_change_cpu(this_cpu);
+
+ return ret;
+}
+
+void stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fxn, void *arg,
+ struct cpu_stop_work *work_buf)
+{
+ struct task_struct *stop = stop_tasks[cpu];
+ struct stop_task *stop_task = task_thread_info(stop)->td->data;
+ int this_cpu = smp_processor_id();
+
+ /*
+ * catch a data race on simultaneous calls to stop_one_cpu_nowait, if
+ * this ends up happening we'd need to support a proper queue here.
+ */
+ BUG_ON(stop_task->fxn);
+ stop_task->fxn = fxn;
+ stop_task->arg = arg;
+
+ /*
+ * in the nowait case we actually go through a schedule to make sure
+ * that our cpu has a change to drop its rq->locks since they may be
+ * needed.
+ */
+ linsched_change_cpu(cpu);
+ hrtimer_set_expires(&stop_task->timer, ns_to_ktime(1));
+ hrtimer_start_expires(&stop_task->timer, HRTIMER_MODE_REL);
+ linsched_change_cpu(this_cpu);
+}
+
+int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
+{
+ /* technically we should bounce every cpu, but don't bother */
+ return stop_one_cpu(cpumask_first(cpus), fn, data);
+}
+
+int stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
+{
+ int ret;
+
+ /* No CPUs can come up or down during this. */
+ get_online_cpus();
+ ret = __stop_machine(fn, data, cpus);
+ put_online_cpus();
+ return ret;
+}
+
+/* the below are unfortunately currently static so we re-define them */
+__attribute__((weak)) struct task_group *cgroup_tg(struct cgroup *cgrp)
+{
+ return container_of(cgroup_subsys_state(cgrp, cpu_cgroup_subsys_id),
+ struct task_group, css);
+}
+
+void __sched preempt_schedule(void)
+{
+};
+
+void fire_sched_out_preempt_notifiers(struct task_struct *curr,
+ struct task_struct *next)
+{
+}
+
+void fire_sched_in_preempt_notifiers(struct task_struct *curr)
+{
+}
+
+int security_task_getscheduler(struct task_struct *p,
+ int policy, struct sched_param *lp)
+{
+ return 0;
+}
+
+int security_task_setscheduler(struct task_struct *p,
+ int policy, struct sched_param *lp)
+{
+ return 0;
+}
+
+int cap_task_setnice(struct task_struct *p, int nice)
+{
+ return 1;
+}
+
+int cap_task_setscheduler(struct task_struct *p, int policy,
+ struct sched_param *lp)
+{
+ return 1;
+}
diff --git a/tools/linsched/test_lib.c b/tools/linsched/test_lib.c
new file mode 100644
index 00000000000000..032d2b0310e171
--- /dev/null
+++ b/tools/linsched/test_lib.c
@@ -0,0 +1,226 @@
+/* Test library for the Linux Scheduler Simulator
+ *
+ * Basic assertions about tasks, ability to expect test failures.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "linsched.h"
+#include "test_lib.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+static long test_duration;
+static const char *test_name;
+
+/* Set to:
+ 0 if we expect the next test to pass
+ 1 if we expect the next test to fail
+ -1 if we are in the middle of an aggregate test which we expect to fail
+*/
+int __expect_failure;
+/* The number of expected failures which have occurred */
+static int expected_failures;
+
+#define NSEC(ms) ((ms) * (u64)NSEC_PER_MSEC)
+
+/* check that max(0, expect - delta) <= v <= expect + delta */
+int check_delta(u64 v, u64 expect, u64 delta)
+{
+ if (delta < expect) {
+ if (v + delta < expect) {
+ return 0;
+ }
+ }
+ return v <= expect + delta;
+}
+
+/* Given the pass/failure status of the most recent test, return true
+ * if this is a reason to print a message and abort */
+int check_unexpected(int condition)
+{
+ if (__expect_failure == -1) {
+ if (condition) {
+ expected_failures++;
+ }
+ return 0;
+ }
+ if (__expect_failure) {
+ if (condition) {
+ expected_failures++;
+ __expect_failure = 0;
+ }
+ return !condition;
+ } else {
+ return condition;
+ }
+}
+
+struct task_struct *create_task(unsigned long mask, int sleep, int run)
+{
+ struct cpumask affinity;
+ struct task_struct *p;
+
+ cpumask_clear(&affinity);
+ memcpy(&affinity, &mask, sizeof(mask));
+ p = linsched_create_normal_task(linsched_create_sleep_run(sleep, run),
+ 0);
+ set_cpus_allowed(p, affinity);
+
+ return p;
+}
+
+void create_tasks(unsigned int count, unsigned long mask, int sleep, int run)
+{
+ unsigned int i;
+ for (i = 0; i < count; i++) {
+ create_task(mask, sleep, run);
+ }
+}
+
+void expect_task_all(int pid, u64 runtime, u64 runtime_d,
+ u64 wait, u64 wait_d, unsigned int pcount,
+ unsigned int pcount_d)
+{
+ struct task_struct *t = __linsched_tasks[pid];
+ if (check_unexpected
+ (!check_delta
+ (t->se.sum_exec_runtime, NSEC(runtime), NSEC(runtime_d))
+ || !check_delta(t->sched_info.run_delay, NSEC(wait), NSEC(wait_d))
+ || !check_delta(t->sched_info.pcount, pcount, pcount_d))) {
+ if (__expect_failure) {
+ puts("Unexpected success:");
+ }
+ printf("expected process %d to have:\n", pid);
+ printf("runtime: %llu ms +- %llu ms\n", runtime, runtime_d);
+ printf("run_delay: %llu ms +- %llu ms\n", wait, wait_d);
+ printf("pcount: %d +- %d\n", pcount, pcount_d);
+ puts("-----------------");
+ linsched_print_task_stats();
+ exit(1);
+ }
+}
+
+void expect_tasks_all(int lowpid, int highpid, u64 runtime, u64 runtime_d,
+ u64 wait, u64 wait_d, unsigned int pcount,
+ unsigned int pcount_d)
+{
+ int i;
+ int prev_fails = expected_failures;
+ if (__expect_failure) {
+ __expect_failure = -1;
+ }
+ for (i = lowpid; i <= highpid; i++) {
+ expect_task_all(i, runtime, runtime_d, wait, wait_d, pcount,
+ pcount_d);
+ }
+ if (__expect_failure) {
+ if (expected_failures == prev_fails) {
+ puts("Unexpected success:");
+ printf("expected processes %d-%d to have:\n", lowpid,
+ highpid);
+ printf("runtime: %llu ms +- %llu ms\n", runtime,
+ runtime_d);
+ printf("run_delay: %llu ms +- %llu ms\n", wait, wait_d);
+ printf("pcount: %d +- %d\n", pcount, pcount_d);
+ puts("-----------------");
+ linsched_print_task_stats();
+ exit(1);
+ }
+ expected_failures = prev_fails + 1;
+ __expect_failure = 0;
+ }
+}
+
+void validate_results(int *expected_results)
+{
+ expect_tasks_all(expected_results[0], expected_results[1],
+ expected_results[2], expected_results[3],
+ expected_results[4], expected_results[5],
+ expected_results[6], expected_results[7]);
+}
+
+void set_test_duration(long ticks)
+{
+ test_duration = ticks;
+}
+
+void set_test_name(const char *name)
+{
+ test_name = name;
+}
+
+void __expect(const char *file, int line, const char *function,
+ const char *cond, int succeeded)
+{
+ if (check_unexpected(!succeeded)) {
+ if (__expect_failure) {
+ puts("Unexpected success:");
+ }
+ printf("%s:%d: %s Check `%s'\n", file, line, function, cond);
+ exit(1);
+ }
+}
+
+struct linsched_topology linsched_topo_db[MAX_TOPOLOGIES] = {
+ TOPO_UNIPROCESSOR,
+ TOPO_DUAL_CPU,
+ TOPO_DUAL_CPU_MC,
+ TOPO_QUAD_CPU,
+ TOPO_QUAD_CPU_MC,
+ TOPO_QUAD_CPU_DUAL_SOCKET,
+ TOPO_QUAD_CPU_QUAD_SOCKET,
+ TOPO_HEX_CPU_DUAL_SOCKET_SMT
+};
+
+int parse_topology(char *arg)
+{
+ if (!strcmp(arg, "uniprocessor"))
+ return UNIPROCESSOR;
+ else if (!strcmp(arg, "dual_cpu"))
+ return DUAL_CPU;
+ else if (!strcmp(arg, "dual_cpu_mc"))
+ return DUAL_CPU_MC;
+ else if (!strcmp(arg, "quad_cpu"))
+ return QUAD_CPU;
+ else if (!strcmp(arg, "quad_cpu_mc"))
+ return QUAD_CPU_MC;
+ else if (!strcmp(arg, "quad_cpu_dual_socket"))
+ return QUAD_CPU_DUAL_SOCKET;
+ else if (!strcmp(arg, "quad_cpu_quad_socket"))
+ return QUAD_CPU_QUAD_SOCKET;
+ else if (!strcmp(arg, "hex_cpu_dual_socket_smt"))
+ return HEX_CPU_DUAL_SOCKET_SMT;
+ return UNIPROCESSOR;
+}
+
+__attribute__ ((weak))
+void test_main(int argc, char **argv)
+{
+ puts("implement test_main or main");
+ exit(1);
+}
+
+__attribute__ ((weak))
+int linsched_test_main(int argc, char **argv)
+{
+ test_name = argv[0];
+ test_main(argc, argv);
+ if (expected_failures) {
+ printf("test %s had %d expected failures\n", test_name,
+ expected_failures);
+ }
+ return 0;
+}
diff --git a/tools/linsched/test_lib.h b/tools/linsched/test_lib.h
new file mode 100644
index 00000000000000..eff4ee5a8e16d4
--- /dev/null
+++ b/tools/linsched/test_lib.h
@@ -0,0 +1,73 @@
+/* Test library for the Linux Scheduler Simulator
+ *
+ * Basic assertions about tasks, ability to expect test failures.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef TEST_LIB_H
+
+#include "linsched.h"
+
+/* Creates a sleep/run task on the given cpus. Returns the new task. */
+struct task_struct *create_task(unsigned long mask, int sleep, int run);
+/* Creates count sleep/run tasks on the given cpus. */
+void create_tasks(unsigned int count, unsigned long mask, int sleep, int run);
+
+/* Require that the given condition be true. Equivalent to assert()
+ * except that this plays nicely with expect_failure() */
+#define expect(cond) __expect(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, (cond));
+
+/* Expect that the next call to expect() or one of the wrapping
+ * functions will fail (presumably due to a not-yet-fixed bug).
+ *
+ * Expected failures will not stop execution and will be reported at
+ * exit. Unexpected successes are treated like a normal failure.
+ */
+#define expect_failure() (__expect_failure = 1)
+
+/* Expect that the task given by pid has runtime within runtime +-
+ * runtime_d, and the equivalent for wait and pcount. */
+void expect_task_all(int pid, u64 runtime, u64 runtime_d,
+ u64 wait, u64 wait_d, unsigned int pcount,
+ unsigned int pcount_d);
+
+/* expect_task_all for all tasks from lowpid up to and including
+ * highpid. Using this with expect_failure means that at least one
+ * task should fail */
+void expect_tasks_all(int lowpid, int highpid, u64 runtime, u64 runtime_d,
+ u64 wait, u64 wait_d, unsigned int pcount,
+ unsigned int pcount_d);
+
+#define MAX_RESULTS 8
+void validate_results(int *expected_results);
+/* Set information about the currently running test. Default test name is argv[0] */
+void set_test_duration(long ticks);
+void set_test_name(const char *name);
+
+/* Implemented by user. Using this instead of test_main ensures that
+ * warnings are printed in the case of expected failures */
+void test_main(int argc, char **argv);
+
+extern struct linsched_topology linsched_topo_db[MAX_TOPOLOGIES];
+
+int parse_topology(char *arg);
+
+
+extern int __expect_failure;
+void __expect(const char *file, int line, const char *function,
+ const char *cond, int succeeded);
+
+#endif
diff --git a/tools/linsched/tests/Makefile b/tools/linsched/tests/Makefile
new file mode 100644
index 00000000000000..91bb8eb5c071f8
--- /dev/null
+++ b/tools/linsched/tests/Makefile
@@ -0,0 +1,40 @@
+LINUXDIR = ./../../..
+LINSCHED_DIR=${LINUXDIR}/tools/linsched
+
+include ../Makefile.inc
+
+RAND_TEST_TYPES = rand gaussian poisson
+
+UNIT_TESTS = linsched_rand_test
+
+PERFORMANCE_TESTS = linsched basic_tests batch_balance_test \
+ linsched_rnd_dist mcarlo-sim
+
+TESTS = ${UNIT_TESTS} ${PERFORMANCE_TESTS} fractional_cpu_test \
+ fractional_cpu_test_rnd_dist perf_replay
+
+.DEFAULT_GOAL := all
+.PHONY: run_all_tests all
+
+all: ${TESTS}
+
+run_unit_tests: ${UNIT_TESTS}
+ ( ulimit -s 8192; ./run_unit_tests.sh ${RAND_TEST_TYPES} )
+
+run_all_tests: ${PERFORMANCE_TESTS}
+# make seems to remove stack size ulimits for no apparent reason,
+# and stack overflow due to recursion is a plausible bug
+ ( ulimit -s 8192; ./run_tests.sh $^ )
+
+TEST_DEPS := ${TESTS:%=%.d}
+-include ${TEST_DEPS}
+
+.SECONDEXPANSION:
+${TESTS}: ${OBJ_FILES} $$@.o
+ @echo CC TEST $@
+ @${LD_PERCPU} -o $@.percpu $^
+ @${CC} ${LFLAGS} -o $@ $@.percpu -MMD
+ @rm $@.percpu
+
+clean:
+ rm -f ${TESTS} ${TEST_DEPS} *.o
diff --git a/tools/linsched/tests/Makefile.mcarlo-sims b/tools/linsched/tests/Makefile.mcarlo-sims
new file mode 100644
index 00000000000000..712b33467af440
--- /dev/null
+++ b/tools/linsched/tests/Makefile.mcarlo-sims
@@ -0,0 +1,27 @@
+# This is designed to be able to run from any directory, using either
+# the current directory's mcarlo-sim program or the normal one if that
+# does not exist. All output goes into ./$(topology)-results/*
+#
+# This allows multiple copies of this test to easily be run at once.
+base := $(dir $(lastword $(MAKEFILE_LIST)))mcarlo-sims
+
+sims := $(addprefix sim-,$(shell seq 1 500))
+
+exec := $(or $(wildcard mcarlo-sim) $(base)/mcarlo-sim)
+
+topologies := uniprocessor dual_cpu dual_cpu_mc quad_cpu quad_cpu_mc \
+ quad_cpu_dual_socket quad_cpu_quad_socket hex_cpu_dual_socket_smt
+
+cur_topo = $(firstword $*)
+cur_sim = $(lastword $*)
+
+run_all_tests: $(foreach topo,$(topologies),\
+ $(foreach sim,$(sims),run_one_test_$(topo)\ $(sim)))
+
+
+run_one_test_%:
+ @mkdir -p $(cur_topo)-results
+ ./mcarlo-sim --print_average_imbalance -t $(cur_topo) -f $(base)/$(cur_sim) \
+ --duration 60000 -s 13074863168640 --print_sched_stats --print_cgroup_stats --print_nohz_stats | \
+ sed -n -e '2,/^$$/p' -e '/^--/,/^$$/p' > \
+ $(cur_topo)-results/$(cur_sim)
diff --git a/tools/linsched/tests/basic_tests.c b/tools/linsched/tests/basic_tests.c
new file mode 100644
index 00000000000000..08b83ea161fc1e
--- /dev/null
+++ b/tools/linsched/tests/basic_tests.c
@@ -0,0 +1,328 @@
+/* Basic test suite for the Linux Scheduler Simulator
+ *
+ * A basic set of automated tests for linsched. The most important
+ * metric here is probably runtime, both run_delay and pcount are
+ * (even) more susceptible to small changes in timing that would not
+ * matter on a real machine.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "test_lib.h"
+#include <strings.h>
+#include <stdio.h>
+#include <error.h>
+
+/* one minute */
+#define TEST_TICKS 60000
+
+int *initialize_expectations(int *results, int result1, int result2,
+ int result3, int result4, int result5,
+ int result6, int result7, int result8) {
+ results[0] = result1;
+ results[1] = result2;
+ results[2] = result3;
+ results[3] = result4;
+ results[4] = result5;
+ results[5] = result6;
+ results[6] = result7;
+ results[7] = result8;
+ return results;
+}
+
+extern void exit(int status);
+
+/* ensure that we get a task running on each cpu without overhead */
+void test_trivial_bal(int argc, char **argv)
+{
+ int count, mask;
+ struct linsched_topology topo;
+ int expected_results[MAX_RESULTS];
+ int type = parse_topology(argv[2]);
+
+ topo = linsched_topo_db[type];
+ count = topo.nr_cpus;
+ mask = (1 << count) - 1;
+
+ linsched_init(&topo);
+ create_tasks(count, mask, 0, 100);
+ linsched_run_sim(TEST_TICKS);
+
+ validate_results(initialize_expectations((int *)expected_results,
+ 1, count, TEST_TICKS, 1, 0, 1, 1, 0));
+
+}
+
+/* make sure that we can run > nr_cpus sleep/run tasks which require
+ * <= nr_cpus actual runtime without too much overhead */
+void test_basic_bal1(int argc, char **argv)
+{
+ int count, mask;
+ struct linsched_topology topo;
+ int type = parse_topology(argv[2]);
+ int expected_results[MAX_RESULTS];
+
+ topo = linsched_topo_db[type];
+
+ switch (type) {
+ case UNIPROCESSOR:
+ count = topo.nr_cpus + 1;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 26080, 10, 20880, 10, 6520, 10);
+ break;
+ case DUAL_CPU:
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 27274, 100, 19000, 1000, 4090, 10);
+ break;
+ case DUAL_CPU_MC:
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 27274, 100, 19000, 1000, 4090, 10);
+ break;
+ case QUAD_CPU:
+ count = topo.nr_cpus + 4;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 30000, 1, 15000, 1000, 3000, 1);
+ break;
+ case QUAD_CPU_MC:
+ count = topo.nr_cpus + 4;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 30000, 1, 15000, 1000, 3000, 1);
+ break;
+ case QUAD_CPU_DUAL_SOCKET:
+ count = topo.nr_cpus + 4;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 36000, 1000, 6000, 700, 2600, 200);
+ /* Poor select_idle_sibling + vruntime interaction? */
+ expect_failure();
+ break;
+ case QUAD_CPU_QUAD_SOCKET:
+ count = topo.nr_cpus + 4;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 40000, 600, 3000, 3000, 2000, 150);
+ break;
+ case HEX_CPU_DUAL_SOCKET_SMT:
+ count = topo.nr_cpus + 6;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 39200, 1000, 1000, 300, 2520, 100);
+ break;
+ default:
+ error(-1, 0, "unknown topology\n");
+
+ }
+
+ linsched_init(&topo);
+ create_tasks(count, mask, 10, 20);
+ linsched_run_sim(TEST_TICKS);
+
+ validate_results((int *)expected_results);
+}
+
+/* Similar to the previous test, but require smaller overhead with
+ * longer busy/sleep intervals */
+void test_basic_bal2(int argc, char **argv)
+{
+ int count, mask;
+ struct linsched_topology topo;
+ int type = parse_topology(argv[2]);
+ int expected_results[MAX_RESULTS];
+
+ topo = linsched_topo_db[type];
+
+ switch (type) {
+ case UNIPROCESSOR:
+ count = topo.nr_cpus + 1;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 24200, 100, 23700, 100, 6050, 10);
+ break;
+ case DUAL_CPU:
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 24200, 200, 23700, 300, 3510, 10);
+ break;
+ case DUAL_CPU_MC:
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 24200, 200, 23700, 300, 3510, 10);
+ break;
+ case QUAD_CPU:
+ count = topo.nr_cpus + 4;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 24510, 200, 23300, 300, 2450, 10);
+ break;
+ case QUAD_CPU_MC:
+ count = topo.nr_cpus + 4;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 24510, 200, 23300, 300, 2450, 10);
+ break;
+ case QUAD_CPU_DUAL_SOCKET:
+ count = topo.nr_cpus + 4;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 38350, 1000, 2400, 500, 450, 100);
+ break;
+ case QUAD_CPU_QUAD_SOCKET:
+ count = topo.nr_cpus + 4;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 39000, 500, 1200, 200, 380, 80);
+ break;
+ case HEX_CPU_DUAL_SOCKET_SMT:
+ count = topo.nr_cpus + 6;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results,
+ 1, count, 39000, 600, 1300, 500, 385, 65);
+ break;
+ default:
+ error(-1, 0, "unknown topology\n");
+ }
+
+ linsched_init(&topo);
+ create_tasks(count, mask, 100, 200);
+ linsched_run_sim(TEST_TICKS);
+
+ validate_results((int *)expected_results);
+}
+
+/* Similar to basic_bal1, but make sure we can also have high-usage
+ * cpu-locked tasks without making problems overall */
+void test_bal1(int argc, char **argv)
+{
+ int count, mask;
+ struct linsched_topology topo;
+ int type = parse_topology(argv[2]);
+ int expected_results1[MAX_RESULTS];
+ int expected_results2[MAX_RESULTS];
+
+ topo = linsched_topo_db[type];
+
+ switch (type) {
+ case QUAD_CPU:
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results1,
+ 1, 6, 28500, 600, 17000, 1000, 1800, 100);
+ initialize_expectations((int *)expected_results2,
+ 7, 8, 32500, 600, 19000, 500, 2000, 100);
+ break;
+ case QUAD_CPU_MC:
+ /* XXX: Which property is making this looser than QUAD_CPU? */
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results1,
+ 1, 6, 29000, 1000, 16500, 2000, 1800, 200);
+ initialize_expectations((int *)expected_results2,
+ 7, 8, 32500, 800, 19000, 1400, 2050, 150);
+ break;
+ case QUAD_CPU_DUAL_SOCKET:
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results1,
+ 1, 10, 37300, 500, 4000, 500, 600, 50);
+ initialize_expectations((int *)expected_results2,
+ 11, 12, 43000, 500, 6000, 500, 700, 50);
+ break;
+ case QUAD_CPU_QUAD_SOCKET:
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results1,
+ 1, 18, 39000, 500, 2500, 2000, 350, 70);
+ initialize_expectations((int *)expected_results2,
+ 19, 20, 46750, 250, 1300, 200, 330, 100);
+ break;
+ case HEX_CPU_DUAL_SOCKET_SMT:
+ count = topo.nr_cpus + 2;
+ mask = (1 << topo.nr_cpus) - 1;
+ initialize_expectations((int *)expected_results1,
+ 1, 26, 39200, 500, 1000, 500, 350, 50);
+ initialize_expectations((int *)expected_results2,
+ 27, 28, 46000, 2500, 2200, 100, 430, 10);
+ break;
+ default:
+ error(-1, 0, "unknown topology\n");
+ }
+
+ linsched_init(&topo);
+ create_tasks(count, mask, 100, 200);
+ create_tasks(2, 0x3, 50, 200);
+ linsched_run_sim(TEST_TICKS);
+
+ validate_results((int *)expected_results1);
+ validate_results((int *)expected_results2);
+}
+
+void test_list(int argc, char **argv);
+
+struct test {
+ char *name;
+ void (*fn)(int, char**);
+};
+
+struct test tests[] = {
+#define TEST(x) { #x, test_##x }
+ TEST(trivial_bal),
+ TEST(basic_bal1),
+ TEST(basic_bal2),
+ TEST(bal1),
+ TEST(list),
+};
+
+void test_list(int argc, char **argv)
+{
+ int i;
+ for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) {
+ if (tests[i].fn != test_list)
+ puts(tests[i].name);
+ }
+}
+
+void usage(char **argv)
+{
+ fprintf(stderr, "Usage: %s <test name> <topo>|list\n", argv[0]);
+ exit(1);
+}
+
+void linsched_test_main(int argc, char **argv)
+{
+ int i;
+ if (argc < 2) {
+ usage(argv);
+ }
+
+ set_test_duration(TEST_TICKS);
+ set_test_name(argv[1]);
+
+ for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) {
+ if (!strcmp(argv[1], tests[i].name)) {
+ tests[i].fn(argc, argv);
+ return;
+ }
+ }
+ usage(argv);
+}
diff --git a/tools/linsched/tests/batch_balance_test.c b/tools/linsched/tests/batch_balance_test.c
new file mode 100644
index 00000000000000..1dc49a02659d33
--- /dev/null
+++ b/tools/linsched/tests/batch_balance_test.c
@@ -0,0 +1,78 @@
+/* Test for fixes to b/2236106 for the Linux Scheduler Simulator
+ *
+ * Make sure that /batch tasks get load balanced properly; when they
+ * don't you get b/2236106. Define "properly" as within 80% of
+ * perfectly fair, and 95% total utilization.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "linsched.h"
+#include "test_lib.h"
+#include <strings.h>
+#include <stdio.h>
+
+#define INTERVAL_MSEC 60000
+#define PROTAG_SHARES (64000/16)
+#define NBATCH 16
+#define TOTAL_CPUTIME ((INTERVAL_MSEC * (u64)NSEC_PER_MSEC) * 16)
+
+#define NLS 3
+
+void linsched_test_main(int argc, char **argv)
+{
+ struct linsched_topology topo = TOPO_QUAD_CPU_QUAD_SOCKET;
+ int i;
+ u64 total = 0;
+ linsched_init(&topo);
+ struct cgroup *batch, *protag;
+
+ batch = linsched_create_cgroup(root_cgroup, "batch");
+ sched_group_set_shares(cgroup_tg(batch), 2);
+
+ protag = linsched_create_cgroup(root_cgroup, "protag");
+ sched_group_set_shares(cgroup_tg(protag), PROTAG_SHARES);
+
+
+ for (i = 0; i < NLS; i++) {
+ struct task_struct *p = create_task(0xffff, 0, 100);
+ linsched_add_task_to_group(p, protag);
+ }
+
+ /* we create 40 batch task groups, each with .4 cores worth of
+ * shares and 1 100% running task in each group */
+ for (i = 0; i < NBATCH; i++) {
+ struct task_struct *p = create_task(0xffff, 0, 100);
+ linsched_add_task_to_group(p, batch);
+ /* force them all to get balanced off /after/
+ * being in the batch group */
+ set_cpus_allowed(p, *cpumask_of(0));
+ set_cpus_allowed(p, *cpu_online_mask);
+ }
+
+ linsched_run_sim(INTERVAL_MSEC);
+
+ for (i = 0; i < NBATCH + NLS; i++)
+ total += __linsched_tasks[i+1]->se.sum_exec_runtime;
+
+ expect_failure();
+ /* this test isn't quite so much of a requirement -
+ * utilization is more important than fairness here */
+ expect_tasks_all(1, NBATCH, TOTAL_CPUTIME / NBATCH * 8/10,
+ TOTAL_CPUTIME / NBATCH * 2/10, 0, ~0ULL, 0, ~0);
+
+ expect_failure();
+ expect(total >= TOTAL_CPUTIME * 95/100);
+}
diff --git a/tools/linsched/tests/diff-mcarlo-500 b/tools/linsched/tests/diff-mcarlo-500
new file mode 100755
index 00000000000000..5e177b100ee932
--- /dev/null
+++ b/tools/linsched/tests/diff-mcarlo-500
@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+import os
+from optparse import OptionParser
+
+def score_basic(filename):
+ f = file(filename)
+ for line in f:
+ if line.startswith("average imbalance"):
+ split = line.split()
+ if len(split) > 3:
+ return [float(split[2]), float(split[3])]
+ return [float(split[2]), 0]
+
+def score_total_lb(filename):
+ f = file(filename)
+ for line in f:
+ if line.startswith("domain"):
+ line = line.split()
+ #lb_count for each idle
+ #does not count active load balance
+ return sum([float(line[x]) for x in [2,10,18]])
+ return 0
+
+def score_total_runtime(filename):
+ f = file(filename)
+ for line in f:
+ if line.startswith("CGroup = / "):
+ return float(line.split()[-1])
+
+def score_sub_runtime(filename):
+ f = file(filename)
+ l = []
+ inSection = False
+ for line in f:
+ if line.startswith("------ group runtime"):
+ inSection = True
+ if inSection and line.startswith("CGroup = /"):
+ l += [float(line.split()[-1])]
+ if l == []:
+ return None
+ return l
+
+def delta_basic(old, new):
+ return new - old
+
+def delta_percent(old, new):
+ return 100.0 * (new - old) / new
+
+def delta_min_percent(old, new):
+ div = min(new, old)
+ if div != 0:
+ return 100.0 * (new - old) / div
+ else:
+ return None
+
+SCORE_FN = score_basic
+DELTA_FN = delta_basic
+
+
+def sim_delta_list(sim1, sim2, topo):
+ l = [(None, "")] * 500
+ for i in xrange(1,500):
+ f = "sim-%d" % i
+ old = new = None
+ try:
+ old = SCORE_FN(os.path.join(sim1, topo, f))
+ new = SCORE_FN(os.path.join(sim2, topo, f))
+ except IOError:
+ pass
+ if old and new:
+ if isinstance(old, list) and isinstance(old, list):
+ d = map(DELTA_FN, old, new)
+ else:
+ d = DELTA_FN(old, new)
+ l[i] = (d, f)
+ return l
+
+def format_delta(dlist):
+ if not isinstance(dlist, list):
+ dlist = [dlist]
+ out = ""
+ for d in dlist:
+ out += " %5.4f" % d
+ return out
+
+def dump_sim_deltas(sim1, sim2, topo):
+ for (d, f) in sim_delta_list(sim1, sim2, topo):
+ if d != None:
+ print f, format_delta(d)
+
+def avg_topo_deltas(sim1, sim2, topo):
+ sum = 0
+ count = 0
+ for (d, f) in sim_delta_list(sim1, sim2, topo):
+ if d != None:
+ if isinstance(d, list):
+ d = d[0]
+ sum += d
+ count += 1
+ if count > 0:
+ return sum / count
+ else:
+ return None
+
+def avg_all_topos(sim1, sim2):
+ l = os.listdir(sim1)
+ l.sort()
+ for topo in l:
+ if topo.endswith("-results"):
+ print topo + " " + str(avg_topo_deltas(sim1, sim2, topo))
+
+
+parser = OptionParser("usage: %prog [options] <old> <new> command <command args>")
+parser.add_option("-s", "--score", dest="score",
+ help="scoring function for a single run (basic, div_load)")
+parser.add_option("-d", "--delta", dest="delta",
+ help="difference function between runs (basic, percent, min_percent)")
+parser.epilog = """Valid commands:
+dump <topology> - print all the deltas for the given topology
+avg_topo <topology> - prints the average delta
+avg_results - prints the average delta for all topologies
+"""
+
+def format(f):
+ return parser.epilog
+parser.format_epilog = format
+
+(options, args) = parser.parse_args()
+if options.score != None:
+ m = {'basic' : score_basic, 'total_lb' : score_total_lb,
+ 'total_runtime' : score_total_runtime,
+ 'sub_runtime' : score_sub_runtime}
+ SCORE_FN=m[options.score]
+if options.delta != None:
+ m = {'basic' : delta_basic, 'percent' : delta_percent,
+ 'min_percent' : delta_min_percent}
+ DELTA_FN=m[options.delta]
+
+if args[2] == "dump":
+ dump_sim_deltas(args[0], args[1], args[3])
+elif args[2] == "avg_topo":
+ print avg_topo_deltas(args[0], args[1], args[3])
+elif args[2] == "avg_results":
+ avg_all_topos(args[0], args[1])
diff --git a/tools/linsched/tests/fractional_cpu_test.c b/tools/linsched/tests/fractional_cpu_test.c
new file mode 100644
index 00000000000000..32b0f5da78d90d
--- /dev/null
+++ b/tools/linsched/tests/fractional_cpu_test.c
@@ -0,0 +1,151 @@
+/* Fractional CPU test for the Linux Scheduler Simulator
+ *
+ * A fractional CPU test that starts of two groups of tasks (a protagonist
+ * and an antagonist) with varying CPU share allocations. The net effect
+ * of the CPU alloction by the scheduler is measured by the amount of run
+ * time alloted to each group at the end of the simulation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "linsched.h"
+#include <strings.h>
+#include <getopt.h>
+#include <stdio.h>
+
+
+static int verbose_flag;
+
+void print_usage(char *cmd)
+{
+ printf("Usage: %s --pthread p --athread a --pshares m --ashares c"
+ " --busy b --sleep s --duration\n", cmd);
+ printf("\t\t --pthread[-p]: Number of protagonist threads\n");
+ printf("\t\t --athread[-a]: Number of antagonist threads\n");
+ printf("\t\t --pshares[-m]: Shares value for protagonist\n");
+ printf("\t\t --ashares[-c]: Shares value for antagonist\n");
+ printf("\t\t --busy[-b]: busy time for threads in ms\n");
+ printf("\t\t --sleep[-s]: sleep time for threads in ms\n");
+ printf("\t\t --duration[-l]: number of ticks (ms) to "
+ "run the simulation - default (60000)\n");
+}
+
+int linsched_test_main(int argc, char **argv)
+{
+ int i, c;
+ struct task_struct *t;
+ struct cgroup *protag, *antag;
+ unsigned long pthreads = 0, athreads = 0;
+ unsigned long pshares = 0, ashares = 0;
+ unsigned long busy = 0, sleep = 0;
+ unsigned long duration = 60000;
+
+ while (1) {
+ static struct option long_options[] = {
+ {"verbose", no_argument, &verbose_flag, 1},
+ {"brief", no_argument, &verbose_flag, 0},
+ {"pthreads", required_argument, 0, 'p'},
+ {"athreads", required_argument, 0, 'a'},
+ {"pshares", required_argument, 0, 'm'},
+ {"ashares", required_argument, 0, 'c'},
+ {"busy", required_argument, 0, 'b'},
+ {"sleep", required_argument, 0, 's'},
+ {"duration", required_argument, 0, 'l'},
+ {0, 0, 0, 0}
+ };
+ /* getopt_long stores the option index here. */
+ int option_index = 0;
+
+ c = getopt_long(argc, argv, "p:a:m:c:b:s:l",
+ long_options, &option_index);
+
+ /* Detect the end of the options. */
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 0:
+ break;
+
+ case 'p':
+ pthreads = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'a':
+ athreads = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'm':
+ pshares = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'c':
+ ashares = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'b':
+ busy = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 's':
+ sleep = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'l':
+ duration = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case '?':
+ /* getopt_long already printed an error message. */
+ break;
+ }
+ }
+
+ if (!pthreads || !athreads || !pshares || !ashares || !busy || !sleep) {
+ print_usage(argv[0]);
+ return 1;
+ }
+
+ /* Initialize linsched. */
+ linsched_init(NULL);
+
+ protag = linsched_create_cgroup(root_cgroup, "protag");
+ sched_group_set_shares(cgroup_tg(protag), pshares);
+
+ /* Create protagonist */
+ for (i = 0; i < pthreads; i++) {
+ t = linsched_create_normal_task(linsched_create_sleep_run
+ (sleep, busy), 0);
+ linsched_add_task_to_group(t, protag);
+ }
+
+ /* Create antagonist */
+ antag = linsched_create_cgroup(root_cgroup, "antag");
+ sched_group_set_shares(cgroup_tg(antag), ashares);
+ for (i = 0; i < athreads; i++) {
+ t = linsched_create_normal_task(linsched_create_sleep_run
+ (sleep, busy), 0);
+ linsched_add_task_to_group(t, antag);
+ }
+
+ /* Run simulation to completion. */
+ linsched_run_sim(duration);
+
+ /* we always want these */
+ linsched_global_options.print_tasks = 1;
+ linsched_global_options.print_cgroups = 1;
+
+ return 0;
+}
diff --git a/tools/linsched/tests/fractional_cpu_test_rnd_dist.c b/tools/linsched/tests/fractional_cpu_test_rnd_dist.c
new file mode 100644
index 00000000000000..9223fad9427e69
--- /dev/null
+++ b/tools/linsched/tests/fractional_cpu_test_rnd_dist.c
@@ -0,0 +1,302 @@
+/* Copyright 2011 Google Inc. All Rights Reserved.
+ * Author: asr@google.com (Abhishek Srivastava)
+ *
+ * Fractional CPU test using tasks following normal
+ * and poisson sleep / run time distributions.
+ *
+ */
+
+#include "linsched.h"
+#include "linsched_rand.h"
+#include <strings.h>
+#include <getopt.h>
+#include <stdio.h>
+#include <error.h>
+
+static int verbose_flag;
+
+void print_usage(char *cmd)
+{
+ printf("Usage: %s --pthread p --athread a --pshares m --ashares c"
+ " --busy b --sleep s --duration\n", cmd);
+ printf("\t\t --pthread[-p]: Number of protagonist threads\n");
+ printf("\t\t --athread[-a]: Number of antagonist threads\n");
+ printf("\t\t --pshares[-m]: Shares value for protagonist\n");
+ printf("\t\t --ashares[-c]: Shares value for antagonist\n");
+ printf("\t\t --p_busy_mu[-b]: busy mu for protagonists\n");
+ printf("\t\t --p_sleep_mu[-s]: sleep mu for protagonists\n");
+ printf("\t\t --p_busy_sigma[-g]: busy sigma for protagonists\n");
+ printf("\t\t --p_sleep_sigma[-h]: sleep sigma for protagonists\n");
+ printf("\t\t --a_busy_mu[-j]: busy mu for antagonists\n");
+ printf("\t\t --a_sleep_mu[-k]: sleep mu for antagonists\n");
+ printf("\t\t --a_busy_sigma[-z]: busy sigma for antagonists\n");
+ printf("\t\t --a_sleep_sigma[-d]: sleep sigma for antagonists\n");
+ printf("\t\t --prot_rnd_type[-t]: protagonist rnd dist type\n");
+ printf("\t\t --anta_rnd_type[-y]: antagonist rnd dist type\n");
+ printf("\t\t --duration[-l]: number of ticks (ms) to "
+ "run the simulation - default (60000)\n");
+ printf("\t\t rnd distribution type : \n");
+ printf("\t\t\t 1. busy = gaussian, sleep = gaussian\n");
+ printf("\t\t\t 2. busy = poisson, sleep = gaussian\n");
+ printf("\t\t\t 3. busy = gaussian, sleep = poisson\n");
+ printf("\t\t\t 4. busy = poisson, sleep = poisson\n");
+ printf("\t\t all sleep / busy times to be specified in ms\n");
+
+}
+
+int linsched_test_main(int argc, char **argv)
+{
+ int i, c;
+ struct task_struct *t;
+ struct cgroup *protag, *antag;
+ unsigned long pthreads = 0, athreads = 0;
+ unsigned long pshares = 0, ashares = 0;
+ unsigned long duration = 60000;
+ unsigned int p_sleep_mu = 0, p_busy_mu = 0, p_sleep_sigma =
+ 0, p_busy_sigma = 0;
+ unsigned int a_sleep_mu = 0, a_busy_mu = 0, a_sleep_sigma =
+ 0, a_busy_sigma = 0;
+ unsigned int seed = getticks();
+ struct rand_dist *busy_distA, *sleep_distA;
+ struct rand_dist *busy_distP, *sleep_distP;
+ enum RND_TYPE sleepA_type = -1, busyA_type = -1, sleepP_type = -1, busyP_type = -1;
+
+ while (1) {
+ static struct option long_options[] = {
+ {"verbose", no_argument, &verbose_flag, 1},
+ {"brief", no_argument, &verbose_flag, 0},
+ {"pthreads", required_argument, 0, 'p'},
+ {"athreads", required_argument, 0, 'a'},
+ {"pshares", required_argument, 0, 'm'},
+ {"ashares", required_argument, 0, 'c'},
+ {"p_busy_mu", required_argument, 0, 'b'},
+ {"p_sleep_mu", required_argument, 0, 's'},
+ {"p_busy_sigma", required_argument, 0, 'g'},
+ {"p_sleep_sigma", required_argument, 0, 'h'},
+ {"a_busy_mu", required_argument, 0, 'j'},
+ {"a_sleep_mu", required_argument, 0, 'k'},
+ {"a_busy_sigma", required_argument, 0, 'z'},
+ {"a_sleep_sigma", required_argument, 0, 'd'},
+ {"prot_rnd_type", required_argument, 0, 't'},
+ {"anta_rnd_type", required_argument, 0, 'y'},
+ {"duration", required_argument, 0, 'l'},
+ {0, 0, 0, 0}
+ };
+ /* getopt_long stores the option index here. */
+ int option_index = 0;
+
+ c = getopt_long(argc, argv,
+ "p:a:m:c:b:s:g:h:j:k:z:d:t:y:l",
+ long_options, &option_index);
+
+ /* Detect the end of the options. */
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 0:
+ break;
+
+ case 'p':
+ pthreads = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'a':
+ athreads = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'm':
+ pshares = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'c':
+ ashares = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'b':
+ p_busy_mu = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 's':
+ p_sleep_mu = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'g':
+ p_busy_sigma = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'h':
+ p_sleep_sigma = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'j':
+ a_busy_mu = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'k':
+ a_sleep_mu = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'z':
+ a_busy_sigma = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 'd':
+ a_sleep_sigma = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case 't':
+ i = simple_strtol(optarg, NULL, 0);
+ switch (i) {
+ case 1:
+ sleepP_type = GAUSSIAN;
+ busyP_type = GAUSSIAN;
+ break;
+ case 2:
+ sleepP_type = GAUSSIAN;
+ busyP_type = POISSON;
+ break;
+ case 3:
+ sleepP_type = POISSON;
+ busyP_type = GAUSSIAN;
+ break;
+ case 4:
+ sleepP_type = POISSON;
+ busyP_type = POISSON;
+ break;
+ default:
+ /* default to normal dist for both */
+ sleepP_type = GAUSSIAN;
+ busyP_type = GAUSSIAN;
+ break;
+ }
+ break;
+
+ case 'y':
+ i = simple_strtol(optarg, NULL, 0);
+ switch (i) {
+ case 1:
+ sleepA_type = GAUSSIAN;
+ busyA_type = GAUSSIAN;
+ break;
+ case 2:
+ sleepA_type = GAUSSIAN;
+ busyA_type = POISSON;
+ break;
+ case 3:
+ sleepA_type = POISSON;
+ busyA_type = GAUSSIAN;
+ break;
+ case 4:
+ sleepA_type = POISSON;
+ busyA_type = POISSON;
+ break;
+ default:
+ /* default to normal dist for both */
+ sleepA_type = GAUSSIAN;
+ busyA_type = GAUSSIAN;
+ break;
+ }
+ break;
+
+ case 'l':
+ duration = simple_strtol(optarg, NULL, 0);
+ break;
+
+ case '?':
+ /* getopt_long already printed an error message. */
+ break;
+ }
+ }
+
+ if (!pthreads || !athreads || !pshares || !ashares || !p_busy_mu
+ || !p_sleep_mu || !p_busy_sigma || !p_sleep_sigma || !a_busy_mu
+ || !a_sleep_mu || !a_sleep_sigma || !a_busy_sigma) {
+ print_usage(argv[0]);
+ return 1;
+ }
+
+ /* Initialize linsched. */
+ linsched_init(NULL);
+
+ protag = linsched_create_cgroup(root_cgroup, "protag");
+ sched_group_set_shares(cgroup_tg(protag), pshares);
+
+ /* create the distributions */
+ seed = getticks();
+
+ switch (busyP_type) {
+ case GAUSSIAN:
+ busy_distP =
+ linsched_init_gaussian(p_busy_mu, p_busy_sigma, seed);
+ break;
+ case POISSON:
+ busy_distP = linsched_init_poisson(p_busy_mu, seed);
+ break;
+ default:
+ error(1, 0, "unrecognized distribution: %d\n", busyP_type);
+ }
+ switch (sleepP_type) {
+ case GAUSSIAN:
+ sleep_distP =
+ linsched_init_gaussian(p_sleep_mu, p_sleep_sigma,
+ seed);
+ break;
+ case POISSON:
+ sleep_distP = linsched_init_poisson(p_sleep_mu, seed);
+ break;
+ default:
+ error(1, 0, "unrecognized distribution: %d\n", sleepP_type);
+ }
+
+ switch (busyA_type) {
+ case GAUSSIAN:
+ busy_distA =
+ linsched_init_gaussian(a_busy_mu, a_busy_sigma, seed);
+ break;
+ case POISSON:
+ busy_distA = linsched_init_poisson(a_busy_mu, seed);
+ break;
+ default:
+ error(1, 0, "unrecognized distribution: %d\n", busyA_type);
+ }
+ switch (sleepA_type) {
+ case GAUSSIAN:
+ sleep_distA =
+ linsched_init_gaussian(a_sleep_mu, a_sleep_sigma,
+ seed);
+ break;
+ case POISSON:
+ sleep_distA = linsched_init_poisson(a_sleep_mu, seed);
+ break;
+ default:
+ error(1, 0, "unrecognized distribution: %d\n", sleepA_type);
+ }
+
+ /* Create protagonist */
+ for (i = 0; i < pthreads; i++) {
+ t = linsched_create_normal_task
+ (linsched_create_rnd_dist_sleep_run
+ (sleep_distP, busy_distP), 0);
+ linsched_add_task_to_group(t, protag);
+ }
+
+ /* Create antagonist */
+ antag = linsched_create_cgroup(root_cgroup, "antag");
+ sched_group_set_shares(cgroup_tg(protag), ashares);
+ for (i = 0; i < athreads; i++) {
+ t = linsched_create_normal_task
+ (linsched_create_rnd_dist_sleep_run
+ (sleep_distA, busy_distA), 0);
+ linsched_add_task_to_group(t, antag);
+ }
+
+ /* Run simulation to completion. */
+ linsched_run_sim(duration);
+
+ /* we always want these */
+ linsched_global_options.print_tasks = 1;
+ linsched_global_options.print_cgroups = 1;
+
+ return 0;
+}
diff --git a/tools/linsched/tests/linsched.c b/tools/linsched/tests/linsched.c
new file mode 100644
index 00000000000000..38dad4dabb4904
--- /dev/null
+++ b/tools/linsched/tests/linsched.c
@@ -0,0 +1,72 @@
+/* LinSched -- The Linux Scheduler Simulator
+ * Copyright (C) 2008 John M. Calandrino
+ * E-mail: jmc@cs.unc.edu
+ *
+ * Example scheduling simulation. Tasks are created and then the simulation
+ * is run for some number of ticks.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "linsched.h"
+#include <strings.h>
+
+#define LINSCHED_TICKS 60000
+
+int linsched_test_main(int argc, char **argv)
+{
+ struct task_struct *p;
+ struct cgroup *cgrp;
+
+
+ /* Initialize linsched. */
+ linsched_init(NULL);
+
+ cgrp = linsched_create_cgroup(root_cgroup, "test");
+ sched_group_set_shares(cgroup_tg(cgrp), 2048);
+
+ /* Create some tasks with "callbacks" that should be called
+ * every scheduling decision.
+ */
+ linsched_create_normal_task(linsched_create_sleep_run(8, 2), 0);
+
+ linsched_create_RTrr_task(linsched_create_sleep_run(8, 2), 90);
+ linsched_create_RTfifo_task(linsched_create_sleep_run(8, 2), 55);
+
+ /* create more tasks here... */
+
+ p = linsched_create_normal_task(linsched_create_sleep_run(8, 2), 0);
+ linsched_add_task_to_group(p, cgrp);
+
+ linsched_create_normal_task(linsched_create_sleep_run(8, 2), 0);
+ linsched_create_normal_task(linsched_create_sleep_run(8, 2), 0);
+ linsched_create_normal_task(linsched_create_sleep_run(8, 2), 0);
+ linsched_create_normal_task(linsched_create_sleep_run(8, 2), 0);
+
+ /* Run simulation for 500 ticks. */
+ linsched_run_sim(500);
+
+#if 0
+ /* Force migrations between two CPUs, and allow migrations
+ * afterwards (so load balancing will kick in eventually).
+ */
+ linsched_force_migration(linsched_get_task(2), 0, 1);
+
+#endif
+ /* Run simulation to completion. */
+ linsched_run_sim(LINSCHED_TICKS-500);
+
+ return 0;
+}
diff --git a/tools/linsched/tests/linsched_rand_test.c b/tools/linsched/tests/linsched_rand_test.c
new file mode 100644
index 00000000000000..1d6f97217dacc7
--- /dev/null
+++ b/tools/linsched/tests/linsched_rand_test.c
@@ -0,0 +1,250 @@
+/* Copyright 2011 Google Inc. All Rights Reserved.
+ * Author: asr@google.com (Abhishek Srivastava)
+ *
+ * Tests for the LinSched rand(), gaussian and poisson generators
+ **/
+#include <linux/kernel.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+#include "linsched_rand.h"
+
+double calc_deviation(double avg, double sum_sq, int n)
+{
+ return sqrt((sum_sq / n) - (avg * avg));
+}
+
+/* test the linsched_rand() function
+ * Note : a fair random number generator should have mu close to 0.5
+ * and sd = 0.25
+ * */
+int test_linsched_rand(int argc, char **argv)
+{
+ unsigned int seed =
+ (unsigned int) simple_strtoul(argv[2], NULL, 0);
+ int n = simple_strtoul(argv[3], NULL, 0);
+ int *state = linsched_init_rand(seed);
+ int i;
+ double sum = 0, sum_sq = 0;
+ double val, avg;
+
+ for (i = 0; i < n; i++) {
+ val = linsched_rand(state);
+ sum += val;
+ sum_sq += (val * val);
+ fprintf(stdout, "val = %f\n", val);
+ }
+
+ avg = sum / (double) n;
+
+ fprintf(stdout, "\n AVG(mu) : %f, DEVIATION(sd) = %f\n", avg,
+ calc_deviation(avg, sum_sq, n));
+ linsched_destroy_rand(state);
+ return 0;
+}
+
+/* test the linsched_rand_range() function */
+int test_linsched_rand_range(int argc, char **argv)
+{
+ unsigned int seed =
+ (unsigned int) simple_strtoul(argv[2], NULL, 0);
+ unsigned long low = simple_strtoul(argv[3], NULL, 0);
+ unsigned long high = simple_strtoul(argv[4], NULL, 0);
+ int n = simple_strtoul(argv[5], NULL, 0);
+ unsigned int *state = linsched_init_rand(seed);
+ int i;
+ double sum = 0, sum_sq = 0, avg, val;
+
+ for (i = 0; i < n; i++) {
+ val = linsched_rand_range(low, high, state);
+ sum += val;
+ sum_sq += (val * val);
+ fprintf(stdout, "val = %f\n", val);
+ }
+
+ avg = sum / (double) n;
+
+ fprintf(stdout, "AVG(mu) : %f, DEVIATION(sd) = %f\n", avg,
+ calc_deviation(avg, sum_sq, n));
+ linsched_destroy_rand(state);
+ return 0;
+
+}
+
+/* test the linsched_create_gaussian_dist() function */
+int test_linsched_gaussian(int argc, char **argv)
+{
+ unsigned int seed =
+ (unsigned int) simple_strtoul(argv[2], NULL, 0);
+ int mu = simple_strtoul(argv[3], NULL, 0);
+ int sd = simple_strtoul(argv[4], NULL, 0);
+ int n = simple_strtoul(argv[5], NULL, 0);
+ int i, val;
+ struct rand_dist *rdist = linsched_init_gaussian(mu, sd, seed);
+
+ long sum = 0, sum_sq = 0;
+ double avg;
+
+ for (i = 0; i < n; i++) {
+ val = linsched_gen_gaussian_dist(rdist);
+ sum += val;
+ sum_sq += (val * val);
+ }
+
+ avg = sum / (double) n;
+
+ fprintf(stdout, "\n AVG(mu) : %f, DEVIATION(sd) = %f\n", avg,
+ calc_deviation(avg, sum_sq, n));
+ linsched_destroy_gaussian(rdist);
+ return 0;
+}
+
+/* test the linsched_create_poisson_dist() function */
+int test_linsched_poisson(int argc, char **argv)
+{
+ unsigned int seed =
+ (unsigned int) simple_strtoul(argv[2], NULL, 0);
+ int mu = simple_strtoul(argv[3], NULL, 0);
+ int n = simple_strtoul(argv[4], NULL, 0);
+ int i, val;
+ struct rand_dist *rdist = linsched_init_poisson(mu, seed);
+
+ long sum = 0, sum_sq = 0;
+ double avg;
+
+ for (i = 0; i < n; i++) {
+ val = linsched_gen_poisson_dist(rdist);
+ sum += val;
+ sum_sq += (val * val);
+ }
+
+ avg = sum / (double) n;
+
+ fprintf(stdout, "\n AVG(mu) : %f, DEVIATION(sd) = %f\n", avg,
+ calc_deviation(avg, sum_sq, n));
+ linsched_destroy_poisson(rdist);
+ return 0;
+
+}
+
+/* test the linsched_gen_exp_dist() function */
+int test_linsched_exponential(int argc, char **argv)
+{
+ unsigned int seed =
+ (unsigned int) simple_strtoul(argv[2], NULL, 0);
+ int mu = simple_strtoul(argv[3], NULL, 0);
+ int n = simple_strtoul(argv[4], NULL, 0);
+ struct rand_dist *rdist = linsched_init_exponential(mu, seed);
+ long sum = 0, sum_sq = 0;
+ int i;
+ double avg, val;
+
+ for (i = 0; i < n; i++) {
+ val = linsched_gen_exp_dist(rdist);
+ sum += val;
+ sum_sq += (val * val);
+ }
+
+ avg = sum / (double) n;
+ fprintf(stdout, "\n AVG(mu) : %f, DEVIATION(sd) = %f\n", avg,
+ calc_deviation(avg, sum_sq, n));
+ linsched_destroy_exponential(rdist);
+ return 0;
+
+}
+
+int test_linsched_lognormal(int argc, char **argv)
+{
+ unsigned int seed =
+ (unsigned int) simple_strtoul(argv[2], NULL, 0);
+ int meanlog = simple_strtoul(argv[3], NULL, 0);
+ int sdlog = simple_strtoul(argv[4], NULL, 0);
+ int n = simple_strtoul(argv[5], NULL, 0);
+ int i;
+ double sdlog_sq = pow(sdlog, 2);
+ double exp_mean = exp(meanlog + 0.5 * sdlog_sq);
+ double exp_sd = sqrt((exp(sdlog_sq) - 1) *
+ (exp(2 * meanlog + sdlog_sq)));
+ struct rand_dist *rdist = linsched_init_lognormal(meanlog, sdlog, seed);
+ double avg, val, sum = 0, sum_sq = 0;
+
+ for (i = 0; i < n; i++) {
+ val = linsched_gen_lognormal_dist(rdist);
+ sum += val;
+ sum_sq += (val * val);
+ }
+
+ avg = sum / (double) n;
+ fprintf(stdout, "\nAVG(mu): %f, DEVIATION(sd) = %f\n", avg,
+ calc_deviation(avg, sum_sq, n));
+ fprintf(stdout, "E.AVG: %f, Exp. DEV = %f\n", exp_mean,
+ exp_sd);
+ linsched_destroy_lognormal(rdist);
+ return 0;
+}
+
+void print_usage(char *cmd)
+{
+ printf("\nUsage: %s <TEST_TYPE> [[PARAMETERS]]\n", cmd);
+ printf("\t TEST_TYPE : rand / rand_range / gaussian / poisson / exp /"
+ "lnorm\n");
+ printf("\t PARAMETERS for rand : seed NO_OF_SAMPLES\n");
+ printf("\t PARAMETERS for rand_range : seed <LOW> <HIGH>"
+ " NO_OF_SAMPLES\n");
+ printf
+ ("\t PARAMETERS for gaussian : seed mu sigma NO_OF_SAMPLES\n");
+ printf("\t PARAMETERS for poisson : seed mu NO_OF_SAMPLES\n");
+ printf("\t PARAMETERS for exponential : seed mu NO_OF_SAMPLES\n");
+ printf("\t PARAMETERS for lognormal :"
+ " seed meanlog sdlog NO_OF_SAMPLES\n");
+ printf("EXAMPLE : %s rand 12345 10000\n", cmd);
+ printf("EXAMPLE : %s gaussian 12345 1000 10 10000\n", cmd);
+ printf("EXAMPLE : %s poisson 12345 500 10000\n", cmd);
+ printf("EXAMPLE : %s exp 12345 500 10000\n", cmd);
+ printf("EXAMPLE : %s lnorm 12345 1000 10 10000\n", cmd);
+}
+
+/* testing linsched_rand()
+ * argv[1] : rand
+ * argv[2] : seed for rand()
+ * argv[3] : number of samples
+ * testing linsched_create_gaussian_dist()
+ * argv[1] : gaussian
+ * argv[2] : seed for rand()
+ * argv[3] : mean for gaussian (mu)
+ * argv[4] : sd for gaussian (sd)
+ * argv[5] : number of samples
+ * testing linsched_create_poisson_dist()
+ * argv[1] : poisson
+ * argv[2] : seed for rand()
+ * argv[3] : mean for poisson (mu)
+ * argv[4] : number of samples
+ */
+int linsched_test_main(int argc, char **argv)
+{
+ if (argc == 4 && !strcmp(argv[1], "rand"))
+ test_linsched_rand(argc, argv);
+
+ else if (argc == 6 && !strcmp(argv[1], "rand_range"))
+ test_linsched_rand_range(argc, argv);
+
+ else if (argc == 6 && !strcmp(argv[1], "gaussian"))
+ test_linsched_gaussian(argc, argv);
+
+ else if (argc == 5 && !strcmp(argv[1], "poisson"))
+ test_linsched_poisson(argc, argv);
+
+ else if (argc == 5 && !strcmp(argv[1], "exp"))
+ test_linsched_exponential(argc, argv);
+
+ else if (argc == 6 && !strcmp(argv[1], "lnorm"))
+ test_linsched_lognormal(argc, argv);
+
+ else
+ print_usage(argv[0]);
+
+ return 0;
+}
diff --git a/tools/linsched/tests/linsched_rnd_dist.c b/tools/linsched/tests/linsched_rnd_dist.c
new file mode 100644
index 00000000000000..f5455bf6ad9103
--- /dev/null
+++ b/tools/linsched/tests/linsched_rnd_dist.c
@@ -0,0 +1,60 @@
+#include "linsched.h"
+#include "linsched_rand.h"
+#include <strings.h>
+
+#define LINSCHED_TICKS 60000
+
+int linsched_test_main(int argc, char **argv)
+{
+ struct task_struct *t1, *t2;
+ struct cgroup *g1;
+
+ struct rand_dist *pdist, *gdist;
+ int seed = getticks();
+ int sleep_mu = 400, sleep_sigma = 20;
+ int busy_mu = 100;
+
+ /* Initialize linsched. */
+ linsched_init(NULL);
+
+ /* create a gaussian sleep dist */
+ gdist = linsched_init_gaussian(sleep_mu, sleep_sigma, seed);
+
+ /* create a poisson dist */
+ pdist = linsched_init_poisson(busy_mu, seed);
+
+ t1 = linsched_create_normal_task(
+ linsched_create_rnd_dist_sleep_run(gdist, pdist), 0);
+
+ g1 = linsched_create_cgroup(root_cgroup, "g1");
+ sched_group_set_shares(cgroup_tg(g1), 2048);
+ linsched_add_task_to_group(t1, g1);
+
+ linsched_create_RTrr_task(linsched_create_rnd_dist_sleep_run
+ (pdist, gdist), 0);
+
+ /* create more tasks here... */
+
+ t2 = linsched_create_RTfifo_task(linsched_create_sleep_run
+ (8, 2), 0);
+ linsched_add_task_to_group(t2, g1);
+
+ linsched_create_normal_task(linsched_create_rnd_dist_sleep_run
+ (gdist, gdist), 0);
+
+ /* Run simulation for 500 ticks. */
+ linsched_run_sim(500);
+
+ /* Run simulation to completion. */
+ linsched_run_sim(LINSCHED_TICKS - 500);
+
+ /* we always want these */
+ linsched_global_options.print_tasks = 1;
+ linsched_global_options.print_cgroups = 1;
+
+ /* cleanup */
+ linsched_destroy_gaussian(gdist);
+ linsched_destroy_poisson(pdist);
+
+ return 0;
+}
diff --git a/tools/linsched/tests/mcarlo-sim-file b/tools/linsched/tests/mcarlo-sim-file
new file mode 100644
index 00000000000000..fa405f75ba3dd6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sim-file
@@ -0,0 +1,12 @@
+10
+LOGNORMAL 12.206504 1.705361 LOGNORMAL 13.485623 1.872636 22714
+LOGNORMAL 11.744351 1.313683 EXPONENTIAL 13.485623 21790
+LOGNORMAL 11.627752 3.632489 EXPONENTIAL .485623 17286
+EXPONENTIAL 11.627752 LOGNORMAL 13.295901 2.208139 6406
+LOGNORMAL 11.337185 1.071873 LOGNORMAL 13.504106 3.507101 26490
+GAUSSIAN 659988 883484 EXPONENTIAL 13.504106 13708
+LOGNORMAL 13.832754 1.096362 POISSON 687786 4395
+LOGNORMAL 12.072850 2.394953 GAUSSIAN 788963 891348 20837
+POISSON 615248 LOGNORMAL 12.297182 1.733237 17443
+LOGNORMAL 11.767070 2.151760 LOGNORMAL 11.002263 3.030543 892
+
diff --git a/tools/linsched/tests/mcarlo-sim.c b/tools/linsched/tests/mcarlo-sim.c
new file mode 100644
index 00000000000000..cf56af8da6778d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sim.c
@@ -0,0 +1,120 @@
+/* Monte Carlo simulation of task models for Linsched
+ *
+ * The simulation simulates various combinations of task models within task
+ * groups. Given an architecture, the number of task groups to simulate
+ * and the shares for each task group, the simulation creates random number of
+ * tasks with random run / sleep distributions chosen from the set of available
+ * distributions - lognormal, normal, poisson, exponential. After the simulation,
+ * a report is generated that prints out all the task and group statistics for
+ * each run of the simulation. Presently this simulation does not support
+ * hierarchies of task groups -- just flat task groups.
+ */
+
+#include "linsched.h"
+#include "linsched_rand.h"
+#include "linsched_sim.h"
+#include "test_lib.h"
+#include <string.h>
+#include <getopt.h>
+#include <stdio.h>
+
+void print_usage(char *cmd)
+{
+ printf("Usage: %s -t <topo> -f <SHARES_FILE>"
+ " --duration <SIMDUARATION> [-c <cpus> -m <monitor_cpus>] [-s seed]\n", cmd);
+}
+
+void run_mcarlo_sim(char *stopo, char *tg_file, int simduration,
+ unsigned int seed, struct cpumask *cpus,
+ struct cpumask *monitor_cpus)
+{
+ struct linsched_topology topo = linsched_topo_db[parse_topology(stopo)];
+ struct linsched_sim *lsim;
+ unsigned int *rand_state = linsched_init_rand(seed);
+
+ linsched_init(&topo);
+ lsim = linsched_create_sim(tg_file, cpus, rand_state);
+
+ if (!cpumask_subset(cpu_online_mask, cpus)) {
+ /* split the system into two "cpuset"s with default attrs */
+ cpumask_var_t *doms = alloc_sched_domains(2);
+ cpumask_copy(doms[0], cpus);
+ cpumask_copy(doms[1], monitor_cpus);
+ partition_sched_domains(2, doms, NULL);
+ }
+
+ if (lsim) {
+ linsched_run_sim(simduration);
+ print_report(lsim);
+ linsched_destroy_sim(lsim);
+ } else {
+ fprintf(stderr, "failed to create simulation.\n");
+ print_usage("mcarlo-sim");
+ }
+}
+
+int linsched_test_main(int argc, char **argv)
+{
+ int c, simduration = 0;
+ char tg_file[256] = "", topo[256] = "";
+ unsigned int seed = getticks();
+
+ struct cpumask cpus = CPU_MASK_ALL, monitor_cpus = CPU_MASK_NONE;
+
+ while (1) {
+ static struct option const long_options[] = {
+ {"topo", required_argument, 0, 't'},
+ {"tg_file", required_argument, 0, 'f'},
+ {"duration", required_argument, 0, 'd'},
+ {"cpus", required_argument, 0, 'c'},
+ {"monitor_cpus", required_argument, 0, 'm'},
+ {0, 0, 0, 0}
+ };
+ /* getopt_long stores the option index here. */
+ int option_index = 0;
+
+ c = getopt_long(argc, argv, "t:f:d:s:c:m:",
+ long_options, &option_index);
+
+ /* Detect the end of the options. */
+ if (c == -1)
+ break;
+
+ switch (c) {
+
+ case 't':
+ strcpy(topo, optarg);
+ break;
+
+ case 'f':
+ strcpy(tg_file, optarg);
+ break;
+
+ case 'd':
+ simduration = simple_strtoul(optarg, NULL, 0);
+ break;
+ case 's':
+ seed = simple_strtoul(optarg, NULL, 0);
+ break;
+ case 'c':
+ cpulist_parse(optarg, &cpus);
+ break;
+ case 'm':
+ cpulist_parse(optarg, &monitor_cpus);
+ break;
+ case '?':
+ /* getopt_long already printed an error message. */
+ break;
+ }
+ }
+
+ if (strcmp(topo, "") && strcmp(tg_file, "") && simduration &&
+ !cpumask_intersects(&cpus, &monitor_cpus)) {
+ fprintf(stdout, "\nTOPO = %s, tg_file = %s, duration = %d\n",
+ topo, tg_file, simduration);
+ run_mcarlo_sim(topo, tg_file, simduration, seed, &cpus, &monitor_cpus);
+ } else
+ print_usage(argv[0]);
+
+ return 0;
+}
diff --git a/tools/linsched/tests/mcarlo-sims/sim-1 b/tools/linsched/tests/mcarlo-sims/sim-1
new file mode 100644
index 00000000000000..875377e278bffd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-1
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 12.760146 3.781421 EXPONENTIAL 676757 28668
+LOGNORMAL 13.248985 2.690174 EXPONENTIAL 637274 21072
+LOGNORMAL 11.074219 3.403461 LOGNORMAL 12.315119 3.212118 16903
+LOGNORMAL 11.747014 1.057279 LOGNORMAL 11.446453 1.536071 9543
+LOGNORMAL 11.591404 1.735266 EXPONENTIAL 642209 4120
diff --git a/tools/linsched/tests/mcarlo-sims/sim-10 b/tools/linsched/tests/mcarlo-sims/sim-10
new file mode 100644
index 00000000000000..f4551d2c41fe9e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-10
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.456991 3.645054 EXPONENTIAL 669767 25162
+LOGNORMAL 12.233546 3.200570 EXPONENTIAL 668348 12323
+LOGNORMAL 12.945504 2.081031 LOGNORMAL 13.940316 2.892899 5109
+LOGNORMAL 11.434738 2.635742 LOGNORMAL 11.968636 2.861215 29027
diff --git a/tools/linsched/tests/mcarlo-sims/sim-100 b/tools/linsched/tests/mcarlo-sims/sim-100
new file mode 100644
index 00000000000000..09226998229083
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-100
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.860516 1.694785 EXPONENTIAL 661359 8335
+LOGNORMAL 11.163880 1.325985 LOGNORMAL 11.455832 3.164822 18327
diff --git a/tools/linsched/tests/mcarlo-sims/sim-101 b/tools/linsched/tests/mcarlo-sims/sim-101
new file mode 100644
index 00000000000000..fdc13db41792aa
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-101
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.768651 1.714942 LOGNORMAL 11.984523 2.871052 110
+LOGNORMAL 12.340375 1.681375 LOGNORMAL 13.083714 2.982825 21984
diff --git a/tools/linsched/tests/mcarlo-sims/sim-102 b/tools/linsched/tests/mcarlo-sims/sim-102
new file mode 100644
index 00000000000000..baea1a43326486
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-102
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 13.803441 3.438094 LOGNORMAL 11.442820 3.467710 12588
+LOGNORMAL 11.851976 1.152974 EXPONENTIAL 670127 2374
+LOGNORMAL 11.695568 3.416196 LOGNORMAL 11.767491 3.219652 1379
diff --git a/tools/linsched/tests/mcarlo-sims/sim-103 b/tools/linsched/tests/mcarlo-sims/sim-103
new file mode 100644
index 00000000000000..20c55bc9321e06
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-103
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.614152 1.052771 LOGNORMAL 11.205500 1.842424 17594
+LOGNORMAL 12.946268 2.929198 LOGNORMAL 13.403950 3.180993 25064
+LOGNORMAL 13.402803 1.912581 EXPONENTIAL 612309 31432
diff --git a/tools/linsched/tests/mcarlo-sims/sim-104 b/tools/linsched/tests/mcarlo-sims/sim-104
new file mode 100644
index 00000000000000..7bcfb0ccf7515b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-104
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.624441 1.985032 EXPONENTIAL 612704 27809
+LOGNORMAL 11.593908 1.807926 EXPONENTIAL 633975 3375
+LOGNORMAL 13.938223 3.715983 EXPONENTIAL 654816 17038
+LOGNORMAL 13.529645 3.740762 EXPONENTIAL 699784 14206
+LOGNORMAL 13.514340 1.520328 EXPONENTIAL 643028 21666
diff --git a/tools/linsched/tests/mcarlo-sims/sim-105 b/tools/linsched/tests/mcarlo-sims/sim-105
new file mode 100644
index 00000000000000..326f5a9f68f403
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-105
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.505667 3.737334 EXPONENTIAL 664545 4738
+LOGNORMAL 13.991985 1.292446 LOGNORMAL 13.506638 1.058547 23625
+LOGNORMAL 13.146121 1.849017 EXPONENTIAL 630580 23766
+LOGNORMAL 11.433339 3.131676 EXPONENTIAL 618493 8463
diff --git a/tools/linsched/tests/mcarlo-sims/sim-106 b/tools/linsched/tests/mcarlo-sims/sim-106
new file mode 100644
index 00000000000000..7074600a01a8a7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-106
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.962284 3.102385 EXPONENTIAL 623841 18415
+LOGNORMAL 13.212319 1.443213 LOGNORMAL 13.061678 1.628263 16224
+LOGNORMAL 11.847817 3.265085 EXPONENTIAL 689024 23428
+LOGNORMAL 12.020195 2.409059 EXPONENTIAL 696295 3056
diff --git a/tools/linsched/tests/mcarlo-sims/sim-107 b/tools/linsched/tests/mcarlo-sims/sim-107
new file mode 100644
index 00000000000000..68034016d39d40
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-107
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.982533 1.425853 EXPONENTIAL 639406 27300
+LOGNORMAL 12.959531 3.832968 LOGNORMAL 13.147746 2.159633 22421
diff --git a/tools/linsched/tests/mcarlo-sims/sim-108 b/tools/linsched/tests/mcarlo-sims/sim-108
new file mode 100644
index 00000000000000..1b838a6d45d81e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-108
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.024427 2.542640 EXPONENTIAL 611689 16815
+LOGNORMAL 11.681755 2.257244 LOGNORMAL 13.839954 2.102260 32234
+LOGNORMAL 13.652472 1.102196 LOGNORMAL 13.015959 1.215247 22592
diff --git a/tools/linsched/tests/mcarlo-sims/sim-109 b/tools/linsched/tests/mcarlo-sims/sim-109
new file mode 100644
index 00000000000000..1e251d01213252
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-109
@@ -0,0 +1,5 @@
+ROOT 4
+LOGNORMAL 11.641905 1.491746 LOGNORMAL 12.588533 2.473710 6411
+LOGNORMAL 12.451988 2.569954 LOGNORMAL 11.396861 2.041974 24787
+LOGNORMAL 13.048230 3.606937 EXPONENTIAL 651280 28957
+LOGNORMAL 11.381781 3.587565 LOGNORMAL 13.619206 3.000261 29587
diff --git a/tools/linsched/tests/mcarlo-sims/sim-11 b/tools/linsched/tests/mcarlo-sims/sim-11
new file mode 100644
index 00000000000000..7021d3d352c251
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-11
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.340210 1.906051 EXPONENTIAL 664791 14483
+LOGNORMAL 13.390452 1.321346 LOGNORMAL 13.476040 2.811709 32608
+LOGNORMAL 11.607804 1.354211 LOGNORMAL 12.074300 2.758589 10332
+LOGNORMAL 11.134121 2.170603 EXPONENTIAL 624133 18968
+LOGNORMAL 13.719673 2.539529 LOGNORMAL 12.444111 2.180563 8103
diff --git a/tools/linsched/tests/mcarlo-sims/sim-110 b/tools/linsched/tests/mcarlo-sims/sim-110
new file mode 100644
index 00000000000000..659d83b6c0a93b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-110
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.511723 3.527531 EXPONENTIAL 621896 14815
+LOGNORMAL 13.672368 2.486390 LOGNORMAL 13.083561 3.402729 14471
+LOGNORMAL 12.214337 1.368027 EXPONENTIAL 616995 32180
+LOGNORMAL 13.214985 1.251141 EXPONENTIAL 647782 1423
+LOGNORMAL 13.891006 2.140125 EXPONENTIAL 600922 15603
diff --git a/tools/linsched/tests/mcarlo-sims/sim-111 b/tools/linsched/tests/mcarlo-sims/sim-111
new file mode 100644
index 00000000000000..911b512dabe81d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-111
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.840356 2.870535 LOGNORMAL 12.737805 3.292964 10357
+LOGNORMAL 13.080183 3.643066 LOGNORMAL 13.674205 3.368601 25287
+LOGNORMAL 12.519059 1.817226 LOGNORMAL 13.049587 2.411467 10254
+LOGNORMAL 11.048645 2.569486 LOGNORMAL 13.572421 2.675198 22032
+LOGNORMAL 13.864265 2.700109 LOGNORMAL 12.290415 2.013141 27127
diff --git a/tools/linsched/tests/mcarlo-sims/sim-112 b/tools/linsched/tests/mcarlo-sims/sim-112
new file mode 100644
index 00000000000000..49086d38495242
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-112
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.405112 1.724368 LOGNORMAL 11.607648 1.744297 1222
+LOGNORMAL 13.956755 3.173015 EXPONENTIAL 633128 602
+LOGNORMAL 13.258868 3.794813 LOGNORMAL 13.216905 3.519442 7031
+LOGNORMAL 13.276810 2.341103 LOGNORMAL 13.047150 3.450543 26938
diff --git a/tools/linsched/tests/mcarlo-sims/sim-113 b/tools/linsched/tests/mcarlo-sims/sim-113
new file mode 100644
index 00000000000000..6d8f1519d33687
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-113
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.366775 1.393921 LOGNORMAL 11.114121 2.026439 28714
+LOGNORMAL 13.912093 2.542559 EXPONENTIAL 695525 9361
+LOGNORMAL 13.125930 1.507985 EXPONENTIAL 685742 27401
+LOGNORMAL 11.854921 2.655268 LOGNORMAL 13.748730 1.908422 19943
diff --git a/tools/linsched/tests/mcarlo-sims/sim-114 b/tools/linsched/tests/mcarlo-sims/sim-114
new file mode 100644
index 00000000000000..86bd83240244da
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-114
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 11.293675 1.801021 LOGNORMAL 11.108482 3.251401 8109
+LOGNORMAL 11.697343 3.248046 EXPONENTIAL 659762 20643
+LOGNORMAL 12.391001 3.561329 EXPONENTIAL 692874 7758
+LOGNORMAL 13.473242 3.786132 LOGNORMAL 11.507806 3.692418 17639
diff --git a/tools/linsched/tests/mcarlo-sims/sim-115 b/tools/linsched/tests/mcarlo-sims/sim-115
new file mode 100644
index 00000000000000..839af4a5e59d5c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-115
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.230768 2.519416 EXPONENTIAL 662508 28675
+LOGNORMAL 12.096642 3.260030 LOGNORMAL 12.112604 1.532879 1969
+LOGNORMAL 13.377833 2.242102 EXPONENTIAL 666256 10118
diff --git a/tools/linsched/tests/mcarlo-sims/sim-116 b/tools/linsched/tests/mcarlo-sims/sim-116
new file mode 100644
index 00000000000000..f6ca2b66d3c19d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-116
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.468014 3.915274 EXPONENTIAL 654734 4891
+LOGNORMAL 11.629073 1.821913 EXPONENTIAL 629685 8816
+LOGNORMAL 12.389020 3.260958 EXPONENTIAL 681397 1057
+LOGNORMAL 13.833537 2.263211 LOGNORMAL 12.722701 1.431239 13094
+LOGNORMAL 11.365208 1.057468 EXPONENTIAL 640620 19558
diff --git a/tools/linsched/tests/mcarlo-sims/sim-117 b/tools/linsched/tests/mcarlo-sims/sim-117
new file mode 100644
index 00000000000000..33d01a8206a482
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-117
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.775376 2.750168 EXPONENTIAL 638489 7878
+LOGNORMAL 13.507748 1.726104 EXPONENTIAL 657260 7971
+LOGNORMAL 12.529534 3.872052 EXPONENTIAL 611760 26589
diff --git a/tools/linsched/tests/mcarlo-sims/sim-118 b/tools/linsched/tests/mcarlo-sims/sim-118
new file mode 100644
index 00000000000000..c8fe226c04da24
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-118
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.286556 3.148819 LOGNORMAL 12.309609 3.599529 28144
+LOGNORMAL 13.211011 3.455169 EXPONENTIAL 674580 233
+LOGNORMAL 13.299617 1.666674 EXPONENTIAL 630349 5866
+LOGNORMAL 11.607201 3.222343 EXPONENTIAL 660969 3281
diff --git a/tools/linsched/tests/mcarlo-sims/sim-119 b/tools/linsched/tests/mcarlo-sims/sim-119
new file mode 100644
index 00000000000000..9dc9d721d0d7f1
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-119
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.562652 1.498085 LOGNORMAL 13.455421 1.268672 18626
+LOGNORMAL 13.755274 3.897312 LOGNORMAL 11.354787 2.907762 21237
+LOGNORMAL 13.888751 3.231462 EXPONENTIAL 672267 8169
+LOGNORMAL 11.151312 3.093774 LOGNORMAL 13.619967 3.789025 10884
+LOGNORMAL 12.720918 1.467507 LOGNORMAL 12.676966 3.773054 26179
diff --git a/tools/linsched/tests/mcarlo-sims/sim-12 b/tools/linsched/tests/mcarlo-sims/sim-12
new file mode 100644
index 00000000000000..2c745473698997
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-12
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.214753 2.360411 LOGNORMAL 11.701440 3.110086 14035
+LOGNORMAL 12.550078 1.153322 LOGNORMAL 12.838804 2.777209 31910
+LOGNORMAL 13.518299 2.048990 EXPONENTIAL 613469 16630
+LOGNORMAL 12.621667 1.353301 LOGNORMAL 12.199655 3.609366 10886
diff --git a/tools/linsched/tests/mcarlo-sims/sim-120 b/tools/linsched/tests/mcarlo-sims/sim-120
new file mode 100644
index 00000000000000..8df70f77416311
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-120
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.238379 3.435301 LOGNORMAL 13.999876 1.918084 2162
+LOGNORMAL 12.627294 2.924048 EXPONENTIAL 671199 15147
+LOGNORMAL 13.626574 3.822172 EXPONENTIAL 692442 11027
diff --git a/tools/linsched/tests/mcarlo-sims/sim-121 b/tools/linsched/tests/mcarlo-sims/sim-121
new file mode 100644
index 00000000000000..7f2c36c67e7dfd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-121
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 12.852414 3.519622 LOGNORMAL 11.661201 1.801383 13844
+LOGNORMAL 11.534419 3.986796 EXPONENTIAL 674922 6854
+LOGNORMAL 12.328433 1.972876 EXPONENTIAL 659454 1668
+LOGNORMAL 12.863360 1.490406 LOGNORMAL 11.612712 2.858622 2771
+LOGNORMAL 12.089520 3.557505 LOGNORMAL 12.434913 3.584702 22179
diff --git a/tools/linsched/tests/mcarlo-sims/sim-122 b/tools/linsched/tests/mcarlo-sims/sim-122
new file mode 100644
index 00000000000000..d3859f3a98c02f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-122
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.183193 3.925393 LOGNORMAL 13.627244 3.093365 15880
+LOGNORMAL 11.659026 1.243826 EXPONENTIAL 604844 22625
+LOGNORMAL 13.374557 1.183336 LOGNORMAL 11.673824 3.952661 2529
+LOGNORMAL 12.497215 3.692544 EXPONENTIAL 627533 26131
+LOGNORMAL 11.643944 2.758565 LOGNORMAL 12.667571 1.859502 13091
diff --git a/tools/linsched/tests/mcarlo-sims/sim-123 b/tools/linsched/tests/mcarlo-sims/sim-123
new file mode 100644
index 00000000000000..3c54374c40ed42
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-123
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.327153 1.464604 LOGNORMAL 11.497446 3.579361 13871
+LOGNORMAL 11.095015 1.923555 LOGNORMAL 12.259977 3.430243 5587
+LOGNORMAL 12.612192 1.115151 EXPONENTIAL 668456 2459
+LOGNORMAL 13.410761 3.663314 LOGNORMAL 12.790026 1.974202 18794
+LOGNORMAL 12.339836 1.629217 EXPONENTIAL 631971 27857
diff --git a/tools/linsched/tests/mcarlo-sims/sim-124 b/tools/linsched/tests/mcarlo-sims/sim-124
new file mode 100644
index 00000000000000..8e650ab273a163
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-124
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.122473 2.400918 LOGNORMAL 11.593228 2.383954 1796
+LOGNORMAL 12.680030 1.262878 EXPONENTIAL 633727 25610
+LOGNORMAL 11.475910 1.613814 EXPONENTIAL 605129 9991
diff --git a/tools/linsched/tests/mcarlo-sims/sim-125 b/tools/linsched/tests/mcarlo-sims/sim-125
new file mode 100644
index 00000000000000..b629994085fd72
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-125
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.935920 1.013233 LOGNORMAL 11.061943 1.074251 5465
+LOGNORMAL 13.246482 2.622798 EXPONENTIAL 681286 23035
+LOGNORMAL 13.803461 3.775794 EXPONENTIAL 610566 15053
+LOGNORMAL 12.880027 2.617082 LOGNORMAL 11.292181 3.678282 4097
diff --git a/tools/linsched/tests/mcarlo-sims/sim-126 b/tools/linsched/tests/mcarlo-sims/sim-126
new file mode 100644
index 00000000000000..b64bb1d9ae66d1
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-126
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 13.314748 3.976099 LOGNORMAL 13.517835 3.254020 28686
+LOGNORMAL 12.396866 3.121599 LOGNORMAL 12.040276 3.917617 659
+LOGNORMAL 12.491063 2.294169 LOGNORMAL 11.541665 2.762926 13504
+LOGNORMAL 13.895209 3.785004 LOGNORMAL 12.456966 2.225733 23538
diff --git a/tools/linsched/tests/mcarlo-sims/sim-127 b/tools/linsched/tests/mcarlo-sims/sim-127
new file mode 100644
index 00000000000000..b0486bf38d081e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-127
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.225813 3.241932 LOGNORMAL 11.006428 1.036367 1183
+LOGNORMAL 13.876462 3.691081 EXPONENTIAL 675242 7876
+LOGNORMAL 11.777103 2.770142 LOGNORMAL 12.337432 3.221085 10919
+LOGNORMAL 13.850856 2.341129 EXPONENTIAL 681923 4049
diff --git a/tools/linsched/tests/mcarlo-sims/sim-128 b/tools/linsched/tests/mcarlo-sims/sim-128
new file mode 100644
index 00000000000000..3335127d3a571c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-128
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.898343 3.455999 EXPONENTIAL 666819 28055
+LOGNORMAL 13.347401 3.767489 EXPONENTIAL 649906 31583
+LOGNORMAL 12.174858 3.840060 LOGNORMAL 11.939326 2.246336 15750
diff --git a/tools/linsched/tests/mcarlo-sims/sim-129 b/tools/linsched/tests/mcarlo-sims/sim-129
new file mode 100644
index 00000000000000..fe4dfdc37c4a93
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-129
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.524594 3.851140 LOGNORMAL 11.206640 2.994379 19425
+LOGNORMAL 13.294235 1.202494 LOGNORMAL 13.307515 2.405622 22922
+LOGNORMAL 12.652424 2.288731 LOGNORMAL 12.202441 2.425040 9730
+LOGNORMAL 11.266546 1.846774 LOGNORMAL 12.958360 2.158462 5300
+LOGNORMAL 13.090166 3.417938 EXPONENTIAL 606406 22088
diff --git a/tools/linsched/tests/mcarlo-sims/sim-13 b/tools/linsched/tests/mcarlo-sims/sim-13
new file mode 100644
index 00000000000000..4a8524d6d74b8f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-13
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 13.680346 1.572170 LOGNORMAL 12.472888 2.820294 32258
+LOGNORMAL 12.291553 3.127483 LOGNORMAL 13.170333 3.782667 24036
+LOGNORMAL 13.060818 2.168748 LOGNORMAL 13.893187 2.793126 28698
diff --git a/tools/linsched/tests/mcarlo-sims/sim-130 b/tools/linsched/tests/mcarlo-sims/sim-130
new file mode 100644
index 00000000000000..42e77662e29130
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-130
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.729539 2.360110 EXPONENTIAL 674734 2755
+LOGNORMAL 12.975311 2.050387 EXPONENTIAL 660716 24933
diff --git a/tools/linsched/tests/mcarlo-sims/sim-131 b/tools/linsched/tests/mcarlo-sims/sim-131
new file mode 100644
index 00000000000000..2efe46b7379757
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-131
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.333251 1.941330 EXPONENTIAL 638474 25255
+LOGNORMAL 11.133468 3.192735 LOGNORMAL 12.761821 1.932120 7375
+LOGNORMAL 13.360317 1.847196 EXPONENTIAL 610071 12592
diff --git a/tools/linsched/tests/mcarlo-sims/sim-132 b/tools/linsched/tests/mcarlo-sims/sim-132
new file mode 100644
index 00000000000000..5a41d3cc6900dc
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-132
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.899706 2.356042 EXPONENTIAL 679754 14803
+LOGNORMAL 13.180713 1.244647 EXPONENTIAL 631520 29513
+LOGNORMAL 11.002268 3.114152 LOGNORMAL 13.545649 2.723032 27155
+LOGNORMAL 11.035846 3.460076 LOGNORMAL 12.781097 1.903376 19128
diff --git a/tools/linsched/tests/mcarlo-sims/sim-133 b/tools/linsched/tests/mcarlo-sims/sim-133
new file mode 100644
index 00000000000000..0369d27eca806d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-133
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 12.239230 2.738820 EXPONENTIAL 699681 17037
+LOGNORMAL 11.528704 3.923858 EXPONENTIAL 621254 25151
+LOGNORMAL 13.888951 3.601465 LOGNORMAL 12.239500 1.280948 23469
+LOGNORMAL 11.559006 3.211908 EXPONENTIAL 688416 21571
+LOGNORMAL 12.360098 3.169233 EXPONENTIAL 695772 7501
diff --git a/tools/linsched/tests/mcarlo-sims/sim-134 b/tools/linsched/tests/mcarlo-sims/sim-134
new file mode 100644
index 00000000000000..3c0f72dfa97ac8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-134
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.985864 3.417303 EXPONENTIAL 604831 27238
+LOGNORMAL 12.265448 2.385957 EXPONENTIAL 674596 2973
diff --git a/tools/linsched/tests/mcarlo-sims/sim-135 b/tools/linsched/tests/mcarlo-sims/sim-135
new file mode 100644
index 00000000000000..c54901ae4a626b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-135
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.489475 2.609529 EXPONENTIAL 685151 6321
+LOGNORMAL 12.814918 3.335017 EXPONENTIAL 630342 22037
+LOGNORMAL 13.113416 1.188970 EXPONENTIAL 609393 12213
+LOGNORMAL 12.039656 2.498951 EXPONENTIAL 639866 12973
+LOGNORMAL 13.552430 2.688508 LOGNORMAL 12.735555 1.473169 14479
diff --git a/tools/linsched/tests/mcarlo-sims/sim-136 b/tools/linsched/tests/mcarlo-sims/sim-136
new file mode 100644
index 00000000000000..8d315d40fbb413
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-136
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.665090 1.173254 LOGNORMAL 11.961748 1.092144 15510
+LOGNORMAL 12.782111 3.942563 EXPONENTIAL 640010 22476
+LOGNORMAL 12.809758 3.609133 EXPONENTIAL 645526 13062
+LOGNORMAL 13.962678 3.733613 EXPONENTIAL 673689 30211
diff --git a/tools/linsched/tests/mcarlo-sims/sim-137 b/tools/linsched/tests/mcarlo-sims/sim-137
new file mode 100644
index 00000000000000..29bbad58eb791c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-137
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.625307 2.536029 EXPONENTIAL 697551 8248
+LOGNORMAL 13.334888 3.463478 EXPONENTIAL 616241 2019
diff --git a/tools/linsched/tests/mcarlo-sims/sim-138 b/tools/linsched/tests/mcarlo-sims/sim-138
new file mode 100644
index 00000000000000..dc1a3d15bcab72
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-138
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 12.379096 1.472631 LOGNORMAL 11.398126 2.297399 3088
+LOGNORMAL 13.608425 1.795316 EXPONENTIAL 649121 8857
+LOGNORMAL 12.825354 1.717025 LOGNORMAL 11.916955 1.259465 2927
diff --git a/tools/linsched/tests/mcarlo-sims/sim-139 b/tools/linsched/tests/mcarlo-sims/sim-139
new file mode 100644
index 00000000000000..cae2507431fbb4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-139
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.427850 1.869778 EXPONENTIAL 600579 28612
+LOGNORMAL 12.371993 2.089891 EXPONENTIAL 655426 1829
diff --git a/tools/linsched/tests/mcarlo-sims/sim-14 b/tools/linsched/tests/mcarlo-sims/sim-14
new file mode 100644
index 00000000000000..cd99ef7a9e454a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-14
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.580285 1.857965 LOGNORMAL 13.060757 1.151281 1014
+LOGNORMAL 12.061021 1.586312 LOGNORMAL 12.448778 2.616889 23365
diff --git a/tools/linsched/tests/mcarlo-sims/sim-140 b/tools/linsched/tests/mcarlo-sims/sim-140
new file mode 100644
index 00000000000000..cd7493ab6ad889
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-140
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.520403 3.407908 EXPONENTIAL 630543 2128
+LOGNORMAL 13.650612 2.841619 EXPONENTIAL 633830 21909
+LOGNORMAL 11.414002 2.136050 LOGNORMAL 13.873506 2.007998 19605
+LOGNORMAL 12.728693 3.149732 LOGNORMAL 12.584198 1.610384 28151
diff --git a/tools/linsched/tests/mcarlo-sims/sim-141 b/tools/linsched/tests/mcarlo-sims/sim-141
new file mode 100644
index 00000000000000..3075c92684f6a8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-141
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.810737 1.056193 EXPONENTIAL 676344 8407
+LOGNORMAL 12.987553 3.800907 LOGNORMAL 13.373816 3.723091 12872
+LOGNORMAL 12.366205 3.803950 LOGNORMAL 11.064077 3.935465 26128
+LOGNORMAL 11.053776 1.817782 LOGNORMAL 12.048750 2.348905 26208
diff --git a/tools/linsched/tests/mcarlo-sims/sim-142 b/tools/linsched/tests/mcarlo-sims/sim-142
new file mode 100644
index 00000000000000..383862bd3f084f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-142
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.232553 3.520605 LOGNORMAL 12.876313 3.189280 14781
+LOGNORMAL 12.242421 2.371700 EXPONENTIAL 683646 17766
diff --git a/tools/linsched/tests/mcarlo-sims/sim-143 b/tools/linsched/tests/mcarlo-sims/sim-143
new file mode 100644
index 00000000000000..25757e77c11342
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-143
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.479253 2.809806 EXPONENTIAL 617170 17525
+LOGNORMAL 11.623059 2.756164 LOGNORMAL 11.416462 1.481444 32034
+LOGNORMAL 12.743116 2.554591 LOGNORMAL 12.094750 1.460983 5444
diff --git a/tools/linsched/tests/mcarlo-sims/sim-144 b/tools/linsched/tests/mcarlo-sims/sim-144
new file mode 100644
index 00000000000000..aa1251901a647b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-144
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.209289 1.527359 LOGNORMAL 13.640888 1.407283 16002
+LOGNORMAL 11.925919 1.914451 LOGNORMAL 11.370333 3.189143 28304
diff --git a/tools/linsched/tests/mcarlo-sims/sim-145 b/tools/linsched/tests/mcarlo-sims/sim-145
new file mode 100644
index 00000000000000..d9bb74beac0f83
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-145
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 11.939573 3.398945 EXPONENTIAL 629596 22315
+LOGNORMAL 13.042636 2.588067 EXPONENTIAL 630598 6493
+LOGNORMAL 13.827580 1.133715 LOGNORMAL 12.220933 1.214186 31281
diff --git a/tools/linsched/tests/mcarlo-sims/sim-146 b/tools/linsched/tests/mcarlo-sims/sim-146
new file mode 100644
index 00000000000000..a35ad1f5122636
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-146
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.130561 1.341438 EXPONENTIAL 651119 13511
+LOGNORMAL 11.845423 2.020509 EXPONENTIAL 670377 12251
+LOGNORMAL 13.120005 3.919706 EXPONENTIAL 613284 8012
+LOGNORMAL 12.532996 2.057836 LOGNORMAL 13.563097 1.970937 30330
+LOGNORMAL 13.211319 2.640742 LOGNORMAL 12.073826 3.797716 86
diff --git a/tools/linsched/tests/mcarlo-sims/sim-147 b/tools/linsched/tests/mcarlo-sims/sim-147
new file mode 100644
index 00000000000000..bc81dba7526c7d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-147
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.150073 2.274536 EXPONENTIAL 624541 26191
+LOGNORMAL 11.776508 1.772597 LOGNORMAL 11.236748 2.021228 31172
+LOGNORMAL 11.199031 1.116428 LOGNORMAL 13.163809 2.134718 21856
+LOGNORMAL 13.537674 3.682027 EXPONENTIAL 646878 13381
+LOGNORMAL 11.262025 3.852086 LOGNORMAL 12.036025 1.467499 25336
diff --git a/tools/linsched/tests/mcarlo-sims/sim-148 b/tools/linsched/tests/mcarlo-sims/sim-148
new file mode 100644
index 00000000000000..821d209625962b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-148
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.451196 2.257026 LOGNORMAL 13.267190 2.657134 3647
+LOGNORMAL 12.789158 2.372780 LOGNORMAL 13.715483 1.130052 27012
diff --git a/tools/linsched/tests/mcarlo-sims/sim-149 b/tools/linsched/tests/mcarlo-sims/sim-149
new file mode 100644
index 00000000000000..97f5bfbb960a6c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-149
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.376232 2.323305 EXPONENTIAL 671974 2480
+LOGNORMAL 12.481913 1.512540 LOGNORMAL 13.374098 2.472867 18680
diff --git a/tools/linsched/tests/mcarlo-sims/sim-15 b/tools/linsched/tests/mcarlo-sims/sim-15
new file mode 100644
index 00000000000000..9955ded49e1ffe
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-15
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.377745 2.758825 LOGNORMAL 12.516975 2.790764 13070
+LOGNORMAL 11.132464 1.324358 EXPONENTIAL 629898 5032
+LOGNORMAL 13.936647 1.234461 LOGNORMAL 12.952357 3.267444 15517
diff --git a/tools/linsched/tests/mcarlo-sims/sim-150 b/tools/linsched/tests/mcarlo-sims/sim-150
new file mode 100644
index 00000000000000..32f6c24635edb2
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-150
@@ -0,0 +1,6 @@
+ONE_GROUP 5
+LOGNORMAL 13.030084 1.621827 LOGNORMAL 12.607653 2.820612 24923
+LOGNORMAL 13.465785 1.453997 LOGNORMAL 13.522805 2.780476 30359
+LOGNORMAL 13.338551 2.024149 EXPONENTIAL 676234 25615
+LOGNORMAL 12.274920 2.575881 EXPONENTIAL 608808 17602
+LOGNORMAL 11.280548 3.168385 EXPONENTIAL 661867 23277
diff --git a/tools/linsched/tests/mcarlo-sims/sim-151 b/tools/linsched/tests/mcarlo-sims/sim-151
new file mode 100644
index 00000000000000..f0a03c5e2eb359
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-151
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.712239 2.598971 EXPONENTIAL 649595 8833
+LOGNORMAL 11.209326 3.146394 EXPONENTIAL 666252 30446
+LOGNORMAL 12.749017 2.721514 LOGNORMAL 13.381825 3.333418 10519
+LOGNORMAL 11.063999 2.627045 LOGNORMAL 11.975493 1.116562 28896
diff --git a/tools/linsched/tests/mcarlo-sims/sim-152 b/tools/linsched/tests/mcarlo-sims/sim-152
new file mode 100644
index 00000000000000..ac3423b8e6a732
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-152
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.888709 2.529085 LOGNORMAL 13.991952 3.735639 32076
+LOGNORMAL 11.394448 3.493977 EXPONENTIAL 668912 10616
+LOGNORMAL 12.327948 2.825038 LOGNORMAL 11.975886 1.721564 10859
+LOGNORMAL 12.753775 1.688021 EXPONENTIAL 672259 30762
+LOGNORMAL 12.442935 3.408360 LOGNORMAL 11.339181 1.617507 15238
diff --git a/tools/linsched/tests/mcarlo-sims/sim-153 b/tools/linsched/tests/mcarlo-sims/sim-153
new file mode 100644
index 00000000000000..e7b82799957eda
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-153
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.743544 2.737195 LOGNORMAL 11.596999 2.760382 26908
+LOGNORMAL 13.919304 3.740892 LOGNORMAL 12.087983 1.733797 26274
+LOGNORMAL 11.313760 3.360153 EXPONENTIAL 670625 17881
diff --git a/tools/linsched/tests/mcarlo-sims/sim-154 b/tools/linsched/tests/mcarlo-sims/sim-154
new file mode 100644
index 00000000000000..2d7bf53ef331b4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-154
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.490486 3.596844 LOGNORMAL 12.944921 1.294728 30343
+LOGNORMAL 13.224294 1.711431 LOGNORMAL 12.398944 2.057549 13899
+LOGNORMAL 13.221983 1.874521 LOGNORMAL 12.930448 1.046006 17774
+LOGNORMAL 13.670048 2.488977 LOGNORMAL 12.284869 1.797327 31659
+LOGNORMAL 11.379509 1.409620 EXPONENTIAL 693878 12600
diff --git a/tools/linsched/tests/mcarlo-sims/sim-155 b/tools/linsched/tests/mcarlo-sims/sim-155
new file mode 100644
index 00000000000000..f6bcf71860660a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-155
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.442877 1.431316 EXPONENTIAL 642066 13787
+LOGNORMAL 13.758256 3.007715 LOGNORMAL 11.994214 3.760086 28862
+LOGNORMAL 13.938946 3.861843 LOGNORMAL 13.620269 2.858329 31928
diff --git a/tools/linsched/tests/mcarlo-sims/sim-156 b/tools/linsched/tests/mcarlo-sims/sim-156
new file mode 100644
index 00000000000000..d0bb960258b3c8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-156
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.940325 1.037608 LOGNORMAL 11.936772 1.327420 11320
+LOGNORMAL 12.715624 2.489484 LOGNORMAL 13.765059 3.338949 23838
+LOGNORMAL 12.737790 3.039178 LOGNORMAL 13.258007 1.322291 6848
+LOGNORMAL 12.213221 3.597678 LOGNORMAL 13.012888 3.608450 20859
+LOGNORMAL 12.497952 1.079698 LOGNORMAL 13.046777 3.188642 475
diff --git a/tools/linsched/tests/mcarlo-sims/sim-157 b/tools/linsched/tests/mcarlo-sims/sim-157
new file mode 100644
index 00000000000000..327eb440c8cd10
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-157
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 13.289673 2.534074 EXPONENTIAL 675098 30642
+LOGNORMAL 13.322070 1.023857 EXPONENTIAL 653779 27897
diff --git a/tools/linsched/tests/mcarlo-sims/sim-158 b/tools/linsched/tests/mcarlo-sims/sim-158
new file mode 100644
index 00000000000000..b45b2f3f669c7d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-158
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.410336 3.521471 EXPONENTIAL 600964 8251
+LOGNORMAL 12.991844 3.915508 LOGNORMAL 13.050441 1.762836 7847
+LOGNORMAL 11.606827 2.945696 EXPONENTIAL 663962 16764
+LOGNORMAL 12.332963 3.112335 LOGNORMAL 12.519286 2.634577 30789
+LOGNORMAL 13.192618 3.337830 EXPONENTIAL 611814 21512
diff --git a/tools/linsched/tests/mcarlo-sims/sim-159 b/tools/linsched/tests/mcarlo-sims/sim-159
new file mode 100644
index 00000000000000..22c63cda2f47bb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-159
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.820769 3.671585 EXPONENTIAL 667310 20980
+LOGNORMAL 11.918987 2.407174 EXPONENTIAL 642490 1340
+LOGNORMAL 11.789096 3.341194 LOGNORMAL 12.515097 1.227988 16936
+LOGNORMAL 11.602676 2.181941 EXPONENTIAL 642911 27523
+LOGNORMAL 13.087996 2.955917 EXPONENTIAL 649846 13470
diff --git a/tools/linsched/tests/mcarlo-sims/sim-16 b/tools/linsched/tests/mcarlo-sims/sim-16
new file mode 100644
index 00000000000000..632cc8c318f3cf
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-16
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.628337 1.454058 EXPONENTIAL 681336 7389
+LOGNORMAL 11.906863 2.639440 EXPONENTIAL 659810 17214
+LOGNORMAL 13.347593 3.997440 LOGNORMAL 12.714682 1.658437 15723
+LOGNORMAL 12.263448 1.771341 LOGNORMAL 13.206921 3.727689 22370
diff --git a/tools/linsched/tests/mcarlo-sims/sim-160 b/tools/linsched/tests/mcarlo-sims/sim-160
new file mode 100644
index 00000000000000..358344024eafe9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-160
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.256371 1.829860 EXPONENTIAL 638276 7958
+LOGNORMAL 11.659377 1.151827 EXPONENTIAL 606784 10247
+LOGNORMAL 13.731089 2.411737 EXPONENTIAL 693133 15831
diff --git a/tools/linsched/tests/mcarlo-sims/sim-161 b/tools/linsched/tests/mcarlo-sims/sim-161
new file mode 100644
index 00000000000000..167d0593ae6ce6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-161
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.921907 3.488323 LOGNORMAL 12.192874 3.638420 24321
+LOGNORMAL 13.116220 3.306820 EXPONENTIAL 621292 3556
+LOGNORMAL 11.893851 2.946179 EXPONENTIAL 654776 12096
diff --git a/tools/linsched/tests/mcarlo-sims/sim-162 b/tools/linsched/tests/mcarlo-sims/sim-162
new file mode 100644
index 00000000000000..57461673b8368f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-162
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 13.516013 2.628036 LOGNORMAL 11.863419 1.476380 4619
+LOGNORMAL 13.038515 2.318946 EXPONENTIAL 627444 25030
+LOGNORMAL 13.128742 3.759102 LOGNORMAL 12.813917 1.500989 19363
diff --git a/tools/linsched/tests/mcarlo-sims/sim-163 b/tools/linsched/tests/mcarlo-sims/sim-163
new file mode 100644
index 00000000000000..a616fa269bd7b9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-163
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.826929 1.195284 LOGNORMAL 12.377947 3.162779 24236
+LOGNORMAL 13.618942 1.556159 EXPONENTIAL 663258 14319
+LOGNORMAL 13.565533 3.908099 EXPONENTIAL 653732 26308
+LOGNORMAL 13.031237 3.005262 LOGNORMAL 11.685610 1.052420 3684
+LOGNORMAL 11.640159 2.145515 EXPONENTIAL 619915 448
diff --git a/tools/linsched/tests/mcarlo-sims/sim-164 b/tools/linsched/tests/mcarlo-sims/sim-164
new file mode 100644
index 00000000000000..85d500e5ac81b3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-164
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.690273 1.419977 EXPONENTIAL 679646 5383
+LOGNORMAL 11.717051 1.475826 LOGNORMAL 12.738854 2.915138 18770
+LOGNORMAL 12.181459 3.779431 EXPONENTIAL 670937 32683
+LOGNORMAL 13.790887 2.429545 LOGNORMAL 13.887780 1.923531 27797
diff --git a/tools/linsched/tests/mcarlo-sims/sim-165 b/tools/linsched/tests/mcarlo-sims/sim-165
new file mode 100644
index 00000000000000..b02eec97ab4945
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-165
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.000327 3.487983 EXPONENTIAL 625840 31504
+LOGNORMAL 11.481761 3.957489 EXPONENTIAL 642203 5482
+LOGNORMAL 13.976137 1.929083 LOGNORMAL 11.595589 3.067708 13023
+LOGNORMAL 11.529784 1.074734 EXPONENTIAL 668240 798
diff --git a/tools/linsched/tests/mcarlo-sims/sim-166 b/tools/linsched/tests/mcarlo-sims/sim-166
new file mode 100644
index 00000000000000..c28ba716fa4219
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-166
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.128809 2.896250 EXPONENTIAL 662456 29619
+LOGNORMAL 13.993822 2.163247 EXPONENTIAL 639447 1852
+LOGNORMAL 12.779648 1.545069 EXPONENTIAL 628586 16466
+LOGNORMAL 13.996847 2.008781 LOGNORMAL 13.282263 3.996073 2491
diff --git a/tools/linsched/tests/mcarlo-sims/sim-167 b/tools/linsched/tests/mcarlo-sims/sim-167
new file mode 100644
index 00000000000000..6e48fe85dc81f3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-167
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.434776 1.280815 EXPONENTIAL 638718 12064
+LOGNORMAL 11.101574 1.152777 EXPONENTIAL 623329 8650
+LOGNORMAL 12.410326 1.347733 LOGNORMAL 11.143698 1.130922 7136
+LOGNORMAL 13.985938 1.651553 EXPONENTIAL 625870 26576
diff --git a/tools/linsched/tests/mcarlo-sims/sim-168 b/tools/linsched/tests/mcarlo-sims/sim-168
new file mode 100644
index 00000000000000..baaf1352211674
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-168
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.733093 3.098434 EXPONENTIAL 648390 1645
+LOGNORMAL 11.551131 2.857383 LOGNORMAL 13.847207 1.007173 9679
+LOGNORMAL 11.172481 1.885091 LOGNORMAL 11.100429 2.913856 29934
+LOGNORMAL 12.604083 2.823673 EXPONENTIAL 617888 24280
+LOGNORMAL 13.628051 1.656518 LOGNORMAL 12.824264 1.406773 32318
diff --git a/tools/linsched/tests/mcarlo-sims/sim-169 b/tools/linsched/tests/mcarlo-sims/sim-169
new file mode 100644
index 00000000000000..8b0eee1e7acf81
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-169
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 11.933194 1.198129 LOGNORMAL 13.850515 2.612955 28754
+LOGNORMAL 12.080782 3.709163 LOGNORMAL 11.046588 1.000421 18456
+LOGNORMAL 12.150245 1.164548 LOGNORMAL 13.674625 1.420786 21071
+LOGNORMAL 13.648730 1.212937 EXPONENTIAL 675182 27499
+LOGNORMAL 11.292950 1.607592 EXPONENTIAL 610115 6283
diff --git a/tools/linsched/tests/mcarlo-sims/sim-17 b/tools/linsched/tests/mcarlo-sims/sim-17
new file mode 100644
index 00000000000000..31ea07111b03ba
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-17
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.040562 3.717882 LOGNORMAL 13.023458 1.264833 7781
+LOGNORMAL 11.896083 1.462201 LOGNORMAL 12.030865 1.744386 5604
+LOGNORMAL 12.132220 1.214231 EXPONENTIAL 699740 21089
diff --git a/tools/linsched/tests/mcarlo-sims/sim-170 b/tools/linsched/tests/mcarlo-sims/sim-170
new file mode 100644
index 00000000000000..564a6bb1326ca8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-170
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.634468 1.499699 LOGNORMAL 12.570667 2.205904 29416
+LOGNORMAL 11.902749 2.505513 EXPONENTIAL 698026 13209
+LOGNORMAL 13.562319 3.891641 EXPONENTIAL 651084 15158
+LOGNORMAL 12.581400 2.593236 EXPONENTIAL 630686 32198
+LOGNORMAL 12.754131 1.674935 LOGNORMAL 12.835148 1.325505 30667
diff --git a/tools/linsched/tests/mcarlo-sims/sim-171 b/tools/linsched/tests/mcarlo-sims/sim-171
new file mode 100644
index 00000000000000..92d547e80793df
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-171
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.069689 3.266404 EXPONENTIAL 671091 6927
+LOGNORMAL 11.412916 1.880433 LOGNORMAL 13.187307 1.067139 12879
diff --git a/tools/linsched/tests/mcarlo-sims/sim-172 b/tools/linsched/tests/mcarlo-sims/sim-172
new file mode 100644
index 00000000000000..b3b157868756ed
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-172
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.344699 2.361916 EXPONENTIAL 666052 15163
+LOGNORMAL 11.561162 3.448788 LOGNORMAL 13.238187 1.211017 18516
+LOGNORMAL 12.697426 2.643864 LOGNORMAL 13.787766 3.985107 15068
+LOGNORMAL 12.187821 2.700681 EXPONENTIAL 607350 1159
+LOGNORMAL 13.734682 2.796387 EXPONENTIAL 659117 32618
diff --git a/tools/linsched/tests/mcarlo-sims/sim-173 b/tools/linsched/tests/mcarlo-sims/sim-173
new file mode 100644
index 00000000000000..81bb2faf461734
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-173
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.319467 1.288869 LOGNORMAL 13.159072 3.524741 30363
+LOGNORMAL 13.645136 3.795604 EXPONENTIAL 677336 25387
+LOGNORMAL 12.459432 1.675022 EXPONENTIAL 664410 18209
diff --git a/tools/linsched/tests/mcarlo-sims/sim-174 b/tools/linsched/tests/mcarlo-sims/sim-174
new file mode 100644
index 00000000000000..0e8920d584632d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-174
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 11.095627 3.199750 EXPONENTIAL 679032 21307
+LOGNORMAL 11.296866 1.434605 LOGNORMAL 13.101598 3.565556 5765
+LOGNORMAL 11.984979 1.538342 EXPONENTIAL 619202 13718
diff --git a/tools/linsched/tests/mcarlo-sims/sim-175 b/tools/linsched/tests/mcarlo-sims/sim-175
new file mode 100644
index 00000000000000..ac6f7025fcea72
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-175
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.450450 3.712741 EXPONENTIAL 643175 17500
+LOGNORMAL 12.996461 3.524759 EXPONENTIAL 653321 9549
+LOGNORMAL 13.219368 2.914799 EXPONENTIAL 685439 2217
diff --git a/tools/linsched/tests/mcarlo-sims/sim-176 b/tools/linsched/tests/mcarlo-sims/sim-176
new file mode 100644
index 00000000000000..d00b688f273489
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-176
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.794182 3.812299 LOGNORMAL 11.389976 3.331695 11352
+LOGNORMAL 11.429324 1.654551 EXPONENTIAL 683596 2652
+LOGNORMAL 13.412906 3.713395 LOGNORMAL 12.774962 3.786304 16219
+LOGNORMAL 12.075287 1.347776 LOGNORMAL 11.361481 1.409715 12486
diff --git a/tools/linsched/tests/mcarlo-sims/sim-177 b/tools/linsched/tests/mcarlo-sims/sim-177
new file mode 100644
index 00000000000000..2dd2b2fec110f8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-177
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.656832 2.373542 LOGNORMAL 11.957884 2.163066 22627
+LOGNORMAL 13.796943 2.228124 LOGNORMAL 12.723749 1.046933 30890
diff --git a/tools/linsched/tests/mcarlo-sims/sim-178 b/tools/linsched/tests/mcarlo-sims/sim-178
new file mode 100644
index 00000000000000..cde877d77e9b1f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-178
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.912582 1.759777 EXPONENTIAL 656018 25220
+LOGNORMAL 11.355384 3.931298 EXPONENTIAL 643738 4914
+LOGNORMAL 13.935127 2.671793 EXPONENTIAL 627988 689
+LOGNORMAL 12.530226 3.502146 EXPONENTIAL 660210 32476
+LOGNORMAL 11.747990 2.472439 EXPONENTIAL 620385 18054
diff --git a/tools/linsched/tests/mcarlo-sims/sim-179 b/tools/linsched/tests/mcarlo-sims/sim-179
new file mode 100644
index 00000000000000..3f2571fbfa63b9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-179
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.995985 2.520035 EXPONENTIAL 601868 17120
+LOGNORMAL 11.674570 1.490012 LOGNORMAL 13.982908 1.742766 12582
+LOGNORMAL 12.635318 2.781445 EXPONENTIAL 600746 510
+LOGNORMAL 13.727638 1.407235 EXPONENTIAL 621014 31473
+LOGNORMAL 13.885253 1.448980 LOGNORMAL 11.900655 3.304390 14375
diff --git a/tools/linsched/tests/mcarlo-sims/sim-18 b/tools/linsched/tests/mcarlo-sims/sim-18
new file mode 100644
index 00000000000000..bae404ca2965de
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-18
@@ -0,0 +1,6 @@
+ONE_GROUP 5
+LOGNORMAL 12.484446 2.076030 EXPONENTIAL 614133 7373
+LOGNORMAL 13.787243 1.199272 EXPONENTIAL 662408 11774
+LOGNORMAL 13.395419 3.808615 LOGNORMAL 11.077940 2.931659 19967
+LOGNORMAL 11.509871 2.396300 EXPONENTIAL 625311 28427
+LOGNORMAL 12.494708 3.557501 LOGNORMAL 11.619048 1.346730 5311
diff --git a/tools/linsched/tests/mcarlo-sims/sim-180 b/tools/linsched/tests/mcarlo-sims/sim-180
new file mode 100644
index 00000000000000..8a2db3a60cc2ad
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-180
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.176034 3.604052 EXPONENTIAL 641153 9017
+LOGNORMAL 13.603684 3.109525 LOGNORMAL 11.421630 1.337871 4213
+LOGNORMAL 11.063205 1.293119 EXPONENTIAL 680508 6067
+LOGNORMAL 13.940390 1.131703 EXPONENTIAL 649378 14308
diff --git a/tools/linsched/tests/mcarlo-sims/sim-181 b/tools/linsched/tests/mcarlo-sims/sim-181
new file mode 100644
index 00000000000000..631d559fa7d61f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-181
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 13.254279 1.662046 EXPONENTIAL 653648 22647
+LOGNORMAL 12.936120 3.375104 EXPONENTIAL 620715 4066
diff --git a/tools/linsched/tests/mcarlo-sims/sim-182 b/tools/linsched/tests/mcarlo-sims/sim-182
new file mode 100644
index 00000000000000..1ece1e1df284db
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-182
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.128711 2.246217 EXPONENTIAL 660947 9482
+LOGNORMAL 12.152464 2.460406 EXPONENTIAL 686549 22711
+LOGNORMAL 11.644395 1.341026 LOGNORMAL 12.918000 1.827551 8122
+LOGNORMAL 11.068325 3.342499 LOGNORMAL 13.946079 3.745110 6100
+LOGNORMAL 13.572435 2.910998 LOGNORMAL 13.006022 2.210185 11883
diff --git a/tools/linsched/tests/mcarlo-sims/sim-183 b/tools/linsched/tests/mcarlo-sims/sim-183
new file mode 100644
index 00000000000000..15608595ca0e10
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-183
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.258178 2.203091 LOGNORMAL 13.562175 1.481065 320
+LOGNORMAL 11.965124 3.842556 LOGNORMAL 12.790367 1.698338 23568
diff --git a/tools/linsched/tests/mcarlo-sims/sim-184 b/tools/linsched/tests/mcarlo-sims/sim-184
new file mode 100644
index 00000000000000..e7173145ca7738
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-184
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.545514 1.449981 EXPONENTIAL 639514 29920
+LOGNORMAL 11.048584 1.556011 LOGNORMAL 12.218670 2.192542 18582
diff --git a/tools/linsched/tests/mcarlo-sims/sim-185 b/tools/linsched/tests/mcarlo-sims/sim-185
new file mode 100644
index 00000000000000..6a319fc92e0d9f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-185
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.893293 3.569805 LOGNORMAL 11.174080 1.767471 1665
+LOGNORMAL 11.497577 2.781702 LOGNORMAL 13.506168 2.171327 13339
+LOGNORMAL 12.827640 1.152841 LOGNORMAL 13.170080 2.537504 4273
diff --git a/tools/linsched/tests/mcarlo-sims/sim-186 b/tools/linsched/tests/mcarlo-sims/sim-186
new file mode 100644
index 00000000000000..23ad769cc2a1ce
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-186
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 12.298462 2.255572 EXPONENTIAL 678011 10901
+LOGNORMAL 13.985048 1.706984 EXPONENTIAL 680395 13970
+LOGNORMAL 12.276086 1.183120 EXPONENTIAL 675262 26316
diff --git a/tools/linsched/tests/mcarlo-sims/sim-187 b/tools/linsched/tests/mcarlo-sims/sim-187
new file mode 100644
index 00000000000000..e1f45ad4416da9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-187
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.827712 1.361796 LOGNORMAL 11.063605 2.006594 29289
+LOGNORMAL 12.215042 1.207719 LOGNORMAL 12.034554 3.742144 27310
+LOGNORMAL 11.342184 1.079886 EXPONENTIAL 683364 7123
+LOGNORMAL 13.444671 3.581159 EXPONENTIAL 627142 3349
diff --git a/tools/linsched/tests/mcarlo-sims/sim-188 b/tools/linsched/tests/mcarlo-sims/sim-188
new file mode 100644
index 00000000000000..7c8619e432bb8c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-188
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.304016 1.602064 LOGNORMAL 12.072308 2.280199 4036
+LOGNORMAL 11.398092 1.732233 LOGNORMAL 13.917960 2.158827 24022
+LOGNORMAL 11.400262 2.203576 EXPONENTIAL 670935 18857
+LOGNORMAL 13.181490 2.296143 EXPONENTIAL 611779 5727
diff --git a/tools/linsched/tests/mcarlo-sims/sim-189 b/tools/linsched/tests/mcarlo-sims/sim-189
new file mode 100644
index 00000000000000..d446d2a683533d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-189
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.534066 1.046206 LOGNORMAL 13.905360 3.377791 9538
+LOGNORMAL 12.825279 3.458827 LOGNORMAL 13.092203 1.651980 18483
+LOGNORMAL 12.345197 1.725221 LOGNORMAL 11.654641 2.546757 10987
+LOGNORMAL 12.564951 2.134115 LOGNORMAL 13.902405 1.718187 19470
+LOGNORMAL 12.162618 2.127646 EXPONENTIAL 676803 31777
diff --git a/tools/linsched/tests/mcarlo-sims/sim-19 b/tools/linsched/tests/mcarlo-sims/sim-19
new file mode 100644
index 00000000000000..646be90f75701c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-19
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.076009 2.481388 LOGNORMAL 13.432850 2.905223 8218
+LOGNORMAL 11.546353 3.547400 LOGNORMAL 11.414956 3.171271 17244
+LOGNORMAL 12.167158 3.418076 LOGNORMAL 12.767727 2.188146 1274
diff --git a/tools/linsched/tests/mcarlo-sims/sim-190 b/tools/linsched/tests/mcarlo-sims/sim-190
new file mode 100644
index 00000000000000..d7f961e73e4c78
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-190
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.042131 3.101473 LOGNORMAL 11.168624 3.062655 25489
+LOGNORMAL 13.379073 2.082698 LOGNORMAL 11.645464 1.315010 5127
+LOGNORMAL 13.112231 2.268309 EXPONENTIAL 654457 5236
+LOGNORMAL 13.456847 1.223818 LOGNORMAL 13.509545 1.918335 27569
+LOGNORMAL 12.436213 1.439690 EXPONENTIAL 605542 1173
diff --git a/tools/linsched/tests/mcarlo-sims/sim-191 b/tools/linsched/tests/mcarlo-sims/sim-191
new file mode 100644
index 00000000000000..e00fea4ea7e13d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-191
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.544378 1.364268 LOGNORMAL 11.217013 3.341616 8076
+LOGNORMAL 13.119822 3.840515 EXPONENTIAL 673199 29301
+LOGNORMAL 11.986888 3.626276 LOGNORMAL 13.592021 2.093889 10807
diff --git a/tools/linsched/tests/mcarlo-sims/sim-192 b/tools/linsched/tests/mcarlo-sims/sim-192
new file mode 100644
index 00000000000000..d2a6d1c7e7ae1e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-192
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.116339 3.311732 LOGNORMAL 12.599353 1.320409 28048
+LOGNORMAL 13.195518 1.077617 EXPONENTIAL 682011 17602
diff --git a/tools/linsched/tests/mcarlo-sims/sim-193 b/tools/linsched/tests/mcarlo-sims/sim-193
new file mode 100644
index 00000000000000..ee6ea3c154604e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-193
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 12.928650 3.824403 LOGNORMAL 12.631146 1.662874 32614
+LOGNORMAL 11.137712 2.530201 LOGNORMAL 12.323674 2.997212 14077
+LOGNORMAL 11.229942 1.633081 EXPONENTIAL 626138 20371
+LOGNORMAL 13.414713 1.087706 EXPONENTIAL 609233 24232
+LOGNORMAL 13.247170 2.185390 EXPONENTIAL 686492 15607
diff --git a/tools/linsched/tests/mcarlo-sims/sim-194 b/tools/linsched/tests/mcarlo-sims/sim-194
new file mode 100644
index 00000000000000..2f078f9c8fba5b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-194
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.998534 3.353088 EXPONENTIAL 685000 2919
+LOGNORMAL 13.480867 2.937591 LOGNORMAL 12.764888 2.471320 22590
+LOGNORMAL 13.470024 3.690573 EXPONENTIAL 633705 29354
+LOGNORMAL 13.724206 3.726417 LOGNORMAL 11.742109 2.621451 13570
+LOGNORMAL 12.289323 1.651657 EXPONENTIAL 646155 23605
diff --git a/tools/linsched/tests/mcarlo-sims/sim-195 b/tools/linsched/tests/mcarlo-sims/sim-195
new file mode 100644
index 00000000000000..0f00c259025737
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-195
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.077221 3.853897 EXPONENTIAL 644239 3808
+LOGNORMAL 12.069017 3.965370 LOGNORMAL 13.578822 2.265251 27408
+LOGNORMAL 11.818092 1.677687 EXPONENTIAL 685817 3390
+LOGNORMAL 12.763181 3.783466 LOGNORMAL 12.002755 3.296113 12475
+LOGNORMAL 11.379196 2.153493 LOGNORMAL 12.476446 2.629165 26349
diff --git a/tools/linsched/tests/mcarlo-sims/sim-196 b/tools/linsched/tests/mcarlo-sims/sim-196
new file mode 100644
index 00000000000000..5f4137a82878ff
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-196
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.113256 1.501199 EXPONENTIAL 613052 14635
+LOGNORMAL 13.080228 1.388927 LOGNORMAL 13.024117 3.335936 25000
diff --git a/tools/linsched/tests/mcarlo-sims/sim-197 b/tools/linsched/tests/mcarlo-sims/sim-197
new file mode 100644
index 00000000000000..a751a060e4e274
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-197
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.905920 1.793344 LOGNORMAL 12.605224 1.007372 29963
+LOGNORMAL 11.180630 3.841074 LOGNORMAL 13.552910 1.764335 28512
+LOGNORMAL 12.662320 3.609166 LOGNORMAL 11.755895 3.333948 13810
+LOGNORMAL 11.072410 2.991325 LOGNORMAL 13.591326 2.408525 22755
+LOGNORMAL 12.470925 2.835552 LOGNORMAL 13.989626 3.644521 17374
diff --git a/tools/linsched/tests/mcarlo-sims/sim-198 b/tools/linsched/tests/mcarlo-sims/sim-198
new file mode 100644
index 00000000000000..15dfec50bae0a1
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-198
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 12.877990 1.384237 LOGNORMAL 13.421843 3.908543 6822
+LOGNORMAL 11.013609 1.722738 EXPONENTIAL 652710 22699
+LOGNORMAL 12.181684 1.565179 LOGNORMAL 12.483364 1.892377 7150
diff --git a/tools/linsched/tests/mcarlo-sims/sim-199 b/tools/linsched/tests/mcarlo-sims/sim-199
new file mode 100644
index 00000000000000..a99ccd049f36cb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-199
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.629173 3.514381 LOGNORMAL 12.321039 3.694272 28360
+LOGNORMAL 12.299374 2.571253 EXPONENTIAL 629234 16453
+LOGNORMAL 13.688761 2.011231 EXPONENTIAL 681352 6966
+LOGNORMAL 11.187371 3.144017 LOGNORMAL 13.610941 2.088843 14131
diff --git a/tools/linsched/tests/mcarlo-sims/sim-2 b/tools/linsched/tests/mcarlo-sims/sim-2
new file mode 100644
index 00000000000000..7a6ddaf13051dc
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-2
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.333949 3.675406 EXPONENTIAL 605879 26038
+LOGNORMAL 12.377215 2.847001 EXPONENTIAL 664577 18974
+LOGNORMAL 12.981655 3.667371 LOGNORMAL 13.714666 2.387754 7369
+LOGNORMAL 11.776975 3.610534 EXPONENTIAL 630238 6062
diff --git a/tools/linsched/tests/mcarlo-sims/sim-20 b/tools/linsched/tests/mcarlo-sims/sim-20
new file mode 100644
index 00000000000000..35c3018f075ab9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-20
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.182196 1.175202 EXPONENTIAL 606065 15242
+LOGNORMAL 11.581923 1.380942 EXPONENTIAL 645904 15047
diff --git a/tools/linsched/tests/mcarlo-sims/sim-200 b/tools/linsched/tests/mcarlo-sims/sim-200
new file mode 100644
index 00000000000000..03488dad0fb813
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-200
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.265771 1.819281 LOGNORMAL 12.244165 1.680506 17268
+LOGNORMAL 13.709844 2.346890 EXPONENTIAL 659218 19521
+LOGNORMAL 11.443525 3.321232 EXPONENTIAL 658541 30313
diff --git a/tools/linsched/tests/mcarlo-sims/sim-201 b/tools/linsched/tests/mcarlo-sims/sim-201
new file mode 100644
index 00000000000000..7dc0cb53cfc9d2
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-201
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.895042 3.972488 LOGNORMAL 13.156594 3.882900 16069
+LOGNORMAL 12.618820 1.500931 LOGNORMAL 13.919197 1.943096 5267
+LOGNORMAL 13.239817 1.609774 LOGNORMAL 11.196896 1.235749 24972
+LOGNORMAL 12.440097 3.714662 EXPONENTIAL 660198 32509
diff --git a/tools/linsched/tests/mcarlo-sims/sim-202 b/tools/linsched/tests/mcarlo-sims/sim-202
new file mode 100644
index 00000000000000..52ac209865198e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-202
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.413634 1.941745 EXPONENTIAL 665312 17217
+LOGNORMAL 12.861692 3.452571 LOGNORMAL 13.874632 2.932698 14756
+LOGNORMAL 11.191501 3.558050 EXPONENTIAL 687725 24276
diff --git a/tools/linsched/tests/mcarlo-sims/sim-203 b/tools/linsched/tests/mcarlo-sims/sim-203
new file mode 100644
index 00000000000000..daacd13bee59c7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-203
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.749636 3.138905 EXPONENTIAL 638217 10914
+LOGNORMAL 13.485504 2.867919 EXPONENTIAL 654666 5734
diff --git a/tools/linsched/tests/mcarlo-sims/sim-204 b/tools/linsched/tests/mcarlo-sims/sim-204
new file mode 100644
index 00000000000000..4ca0330e2d598e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-204
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.457756 3.510917 EXPONENTIAL 648702 26064
+LOGNORMAL 11.834669 1.285217 LOGNORMAL 11.774958 2.721118 2227
+LOGNORMAL 11.467412 2.795355 LOGNORMAL 11.634520 3.379751 29203
+LOGNORMAL 12.982459 2.182744 LOGNORMAL 13.281361 3.831974 27785
+LOGNORMAL 12.482642 1.769456 EXPONENTIAL 655438 15945
diff --git a/tools/linsched/tests/mcarlo-sims/sim-205 b/tools/linsched/tests/mcarlo-sims/sim-205
new file mode 100644
index 00000000000000..f4e50560ea0b3b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-205
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 11.273940 3.116925 EXPONENTIAL 613732 22831
+LOGNORMAL 11.893547 3.836304 LOGNORMAL 13.953442 1.494847 22233
diff --git a/tools/linsched/tests/mcarlo-sims/sim-206 b/tools/linsched/tests/mcarlo-sims/sim-206
new file mode 100644
index 00000000000000..2dae558ff91956
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-206
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.237341 3.990394 EXPONENTIAL 673507 27353
+LOGNORMAL 13.316679 3.421173 LOGNORMAL 12.503793 3.249558 1933
diff --git a/tools/linsched/tests/mcarlo-sims/sim-207 b/tools/linsched/tests/mcarlo-sims/sim-207
new file mode 100644
index 00000000000000..c855a61390091a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-207
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.092043 2.974454 LOGNORMAL 11.511957 1.469274 10423
+LOGNORMAL 12.960795 1.079706 EXPONENTIAL 695374 22715
+LOGNORMAL 12.622319 3.315696 EXPONENTIAL 646662 769
diff --git a/tools/linsched/tests/mcarlo-sims/sim-208 b/tools/linsched/tests/mcarlo-sims/sim-208
new file mode 100644
index 00000000000000..6e76664a59e5c0
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-208
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.210104 2.212126 LOGNORMAL 12.109974 2.331839 27241
+LOGNORMAL 13.990441 2.349183 EXPONENTIAL 656119 18741
+LOGNORMAL 13.715945 2.884380 EXPONENTIAL 687564 21047
diff --git a/tools/linsched/tests/mcarlo-sims/sim-209 b/tools/linsched/tests/mcarlo-sims/sim-209
new file mode 100644
index 00000000000000..5dc4058811130f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-209
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.169622 2.836302 LOGNORMAL 11.878849 2.819490 1461
+LOGNORMAL 12.828976 2.607016 EXPONENTIAL 699896 23051
+LOGNORMAL 11.188647 3.583119 LOGNORMAL 13.343597 2.828714 9757
diff --git a/tools/linsched/tests/mcarlo-sims/sim-21 b/tools/linsched/tests/mcarlo-sims/sim-21
new file mode 100644
index 00000000000000..f3cb2f15e18869
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-21
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.929189 2.878949 EXPONENTIAL 649380 2450
+LOGNORMAL 11.761782 3.271480 LOGNORMAL 13.250045 2.498350 6504
+LOGNORMAL 12.555238 3.887072 LOGNORMAL 11.511445 1.859556 21237
+LOGNORMAL 13.266805 2.187912 EXPONENTIAL 630860 32539
diff --git a/tools/linsched/tests/mcarlo-sims/sim-210 b/tools/linsched/tests/mcarlo-sims/sim-210
new file mode 100644
index 00000000000000..8091bcf41be627
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-210
@@ -0,0 +1,3 @@
+ONE_GROUP 2
+LOGNORMAL 13.142530 1.506067 EXPONENTIAL 638720 27907
+LOGNORMAL 13.734074 1.585910 LOGNORMAL 11.374412 2.749077 1157
diff --git a/tools/linsched/tests/mcarlo-sims/sim-211 b/tools/linsched/tests/mcarlo-sims/sim-211
new file mode 100644
index 00000000000000..a14e628ffbc8d9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-211
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.014533 2.260249 EXPONENTIAL 687945 22963
+LOGNORMAL 13.039194 1.738292 EXPONENTIAL 651803 17958
diff --git a/tools/linsched/tests/mcarlo-sims/sim-212 b/tools/linsched/tests/mcarlo-sims/sim-212
new file mode 100644
index 00000000000000..307d1623d3c16a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-212
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.236969 1.744983 EXPONENTIAL 617985 5306
+LOGNORMAL 11.914669 1.836210 EXPONENTIAL 691059 29160
diff --git a/tools/linsched/tests/mcarlo-sims/sim-213 b/tools/linsched/tests/mcarlo-sims/sim-213
new file mode 100644
index 00000000000000..d21afa4c10b75b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-213
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.322805 3.381608 EXPONENTIAL 682355 26207
+LOGNORMAL 11.966672 2.851327 EXPONENTIAL 670972 5990
+LOGNORMAL 11.291734 2.180158 LOGNORMAL 11.556479 2.735009 1143
+LOGNORMAL 12.415025 2.319031 LOGNORMAL 11.327828 2.808973 21708
diff --git a/tools/linsched/tests/mcarlo-sims/sim-214 b/tools/linsched/tests/mcarlo-sims/sim-214
new file mode 100644
index 00000000000000..ad678e95781dab
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-214
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.442368 1.877126 LOGNORMAL 13.154708 2.179178 17653
+LOGNORMAL 13.004317 3.560437 LOGNORMAL 11.309443 2.800976 19521
+LOGNORMAL 12.959789 2.171743 LOGNORMAL 12.151373 2.132145 29272
+LOGNORMAL 11.238391 2.644116 LOGNORMAL 13.052739 1.376107 4499
diff --git a/tools/linsched/tests/mcarlo-sims/sim-215 b/tools/linsched/tests/mcarlo-sims/sim-215
new file mode 100644
index 00000000000000..4aa54507d5be27
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-215
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.817910 1.611386 LOGNORMAL 13.502226 1.908777 19089
+LOGNORMAL 12.719073 3.465083 LOGNORMAL 13.706485 2.885388 6368
+LOGNORMAL 11.917872 1.680496 LOGNORMAL 11.707931 1.196580 26176
+LOGNORMAL 12.188262 1.127781 LOGNORMAL 12.416669 2.951757 16961
diff --git a/tools/linsched/tests/mcarlo-sims/sim-216 b/tools/linsched/tests/mcarlo-sims/sim-216
new file mode 100644
index 00000000000000..26f6f48501032f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-216
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.636362 3.333331 LOGNORMAL 11.359559 2.107910 27119
+LOGNORMAL 11.228398 2.680754 EXPONENTIAL 659439 31227
diff --git a/tools/linsched/tests/mcarlo-sims/sim-217 b/tools/linsched/tests/mcarlo-sims/sim-217
new file mode 100644
index 00000000000000..cbb6425a43792b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-217
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 11.664057 1.799465 EXPONENTIAL 617101 32217
+LOGNORMAL 12.513153 1.570192 EXPONENTIAL 611712 20470
+LOGNORMAL 13.922162 3.772666 LOGNORMAL 11.351756 2.971317 29961
diff --git a/tools/linsched/tests/mcarlo-sims/sim-218 b/tools/linsched/tests/mcarlo-sims/sim-218
new file mode 100644
index 00000000000000..0b7e9336455d30
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-218
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.028270 3.135864 LOGNORMAL 12.511328 3.893141 31309
+LOGNORMAL 12.626234 3.120216 EXPONENTIAL 647340 11585
+LOGNORMAL 12.653122 2.016170 EXPONENTIAL 686425 19189
diff --git a/tools/linsched/tests/mcarlo-sims/sim-219 b/tools/linsched/tests/mcarlo-sims/sim-219
new file mode 100644
index 00000000000000..3b8272ff288cc5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-219
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.978147 3.710995 EXPONENTIAL 657305 9576
+LOGNORMAL 12.240251 1.904678 LOGNORMAL 13.040232 1.171788 9378
+LOGNORMAL 11.775354 3.374393 LOGNORMAL 12.685557 1.155339 22758
diff --git a/tools/linsched/tests/mcarlo-sims/sim-22 b/tools/linsched/tests/mcarlo-sims/sim-22
new file mode 100644
index 00000000000000..1f979e118ae878
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-22
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.820933 1.414141 EXPONENTIAL 618458 16471
+LOGNORMAL 12.146640 3.579457 LOGNORMAL 12.590124 2.218668 16130
diff --git a/tools/linsched/tests/mcarlo-sims/sim-220 b/tools/linsched/tests/mcarlo-sims/sim-220
new file mode 100644
index 00000000000000..bbad239cb2ce79
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-220
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.118267 3.721267 EXPONENTIAL 635279 10884
+LOGNORMAL 11.738974 3.938630 LOGNORMAL 11.929515 2.365546 25403
+LOGNORMAL 11.356014 2.522536 LOGNORMAL 13.127825 3.358146 27064
+LOGNORMAL 12.232053 2.115210 LOGNORMAL 11.852183 1.633024 27809
+LOGNORMAL 12.423031 1.889044 EXPONENTIAL 684901 4204
diff --git a/tools/linsched/tests/mcarlo-sims/sim-221 b/tools/linsched/tests/mcarlo-sims/sim-221
new file mode 100644
index 00000000000000..fe614bd7ce704b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-221
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.056558 3.576284 LOGNORMAL 11.146150 3.340278 18020
+LOGNORMAL 12.192925 1.497215 LOGNORMAL 13.605323 3.669137 604
diff --git a/tools/linsched/tests/mcarlo-sims/sim-222 b/tools/linsched/tests/mcarlo-sims/sim-222
new file mode 100644
index 00000000000000..337179f0efee8f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-222
@@ -0,0 +1,6 @@
+ONE_GROUP 5
+LOGNORMAL 13.997488 3.786466 LOGNORMAL 13.921997 3.997858 26892
+LOGNORMAL 13.681063 1.628926 EXPONENTIAL 693085 25204
+LOGNORMAL 13.261639 2.373371 EXPONENTIAL 642950 26740
+LOGNORMAL 13.526318 1.830033 EXPONENTIAL 695649 24388
+LOGNORMAL 12.606589 2.947376 EXPONENTIAL 678595 4998
diff --git a/tools/linsched/tests/mcarlo-sims/sim-223 b/tools/linsched/tests/mcarlo-sims/sim-223
new file mode 100644
index 00000000000000..f368bf2be2c43e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-223
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.138438 1.727660 EXPONENTIAL 670700 8153
+LOGNORMAL 11.529658 1.955252 LOGNORMAL 13.321729 1.292231 12943
+LOGNORMAL 13.130254 2.174250 LOGNORMAL 13.703853 3.657769 27208
+LOGNORMAL 11.167914 3.136818 LOGNORMAL 11.365052 1.433936 18484
+LOGNORMAL 13.210425 2.609534 EXPONENTIAL 624208 27006
diff --git a/tools/linsched/tests/mcarlo-sims/sim-224 b/tools/linsched/tests/mcarlo-sims/sim-224
new file mode 100644
index 00000000000000..07cdd3ee4a592d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-224
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.463829 3.579505 EXPONENTIAL 668736 11305
+LOGNORMAL 13.514390 2.348295 LOGNORMAL 12.478804 3.259387 23348
diff --git a/tools/linsched/tests/mcarlo-sims/sim-225 b/tools/linsched/tests/mcarlo-sims/sim-225
new file mode 100644
index 00000000000000..558ff64cc8e2d6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-225
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.890716 3.270065 LOGNORMAL 11.830709 3.721360 135
+LOGNORMAL 13.842071 1.685435 LOGNORMAL 12.290490 3.263333 23188
+LOGNORMAL 11.089573 3.447731 EXPONENTIAL 684667 25171
+LOGNORMAL 11.161806 2.470146 LOGNORMAL 12.377865 1.783076 30382
diff --git a/tools/linsched/tests/mcarlo-sims/sim-226 b/tools/linsched/tests/mcarlo-sims/sim-226
new file mode 100644
index 00000000000000..c66173feed2aca
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-226
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.085028 1.057319 EXPONENTIAL 643658 30695
+LOGNORMAL 11.399705 1.835458 EXPONENTIAL 637651 6523
+LOGNORMAL 13.964887 1.856289 LOGNORMAL 12.459675 2.758015 30088
+LOGNORMAL 11.127795 3.845605 EXPONENTIAL 612340 31181
+LOGNORMAL 12.049265 1.993302 EXPONENTIAL 668479 7539
diff --git a/tools/linsched/tests/mcarlo-sims/sim-227 b/tools/linsched/tests/mcarlo-sims/sim-227
new file mode 100644
index 00000000000000..37246bf09a4318
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-227
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.233643 3.834896 EXPONENTIAL 641132 29499
+LOGNORMAL 11.455981 2.671874 EXPONENTIAL 644529 27758
+LOGNORMAL 13.063927 3.427983 LOGNORMAL 13.814908 1.166304 23638
+LOGNORMAL 11.218505 1.414768 LOGNORMAL 13.041275 3.704600 25832
+LOGNORMAL 13.844641 2.875770 EXPONENTIAL 698375 5437
diff --git a/tools/linsched/tests/mcarlo-sims/sim-228 b/tools/linsched/tests/mcarlo-sims/sim-228
new file mode 100644
index 00000000000000..7c588af0d32dc5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-228
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.375895 2.672917 LOGNORMAL 12.693375 3.548722 17909
+LOGNORMAL 11.690291 1.726943 LOGNORMAL 13.595842 3.310328 30928
+LOGNORMAL 12.116950 2.578121 EXPONENTIAL 602572 26603
diff --git a/tools/linsched/tests/mcarlo-sims/sim-229 b/tools/linsched/tests/mcarlo-sims/sim-229
new file mode 100644
index 00000000000000..36a5942ae21fb9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-229
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 11.002251 2.830125 LOGNORMAL 12.518235 2.978640 26775
+LOGNORMAL 13.376719 1.513780 LOGNORMAL 11.706961 2.886677 15089
diff --git a/tools/linsched/tests/mcarlo-sims/sim-23 b/tools/linsched/tests/mcarlo-sims/sim-23
new file mode 100644
index 00000000000000..5dc25bd210f2d9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-23
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.663170 2.901228 LOGNORMAL 11.910681 3.818032 21092
+LOGNORMAL 11.618946 2.627801 LOGNORMAL 13.503391 3.491856 28199
+LOGNORMAL 13.048510 2.313348 EXPONENTIAL 644973 29957
+LOGNORMAL 12.425195 2.248438 EXPONENTIAL 615210 28235
diff --git a/tools/linsched/tests/mcarlo-sims/sim-230 b/tools/linsched/tests/mcarlo-sims/sim-230
new file mode 100644
index 00000000000000..45b10148922dd7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-230
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.765878 2.108507 EXPONENTIAL 656309 19147
+LOGNORMAL 13.423928 2.956464 LOGNORMAL 11.571433 2.075946 6765
+LOGNORMAL 13.358092 3.444132 LOGNORMAL 13.273448 2.846871 9162
diff --git a/tools/linsched/tests/mcarlo-sims/sim-231 b/tools/linsched/tests/mcarlo-sims/sim-231
new file mode 100644
index 00000000000000..51c9c37e6b8690
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-231
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.628827 2.700852 EXPONENTIAL 676193 19006
+LOGNORMAL 11.471691 2.717427 LOGNORMAL 13.821020 1.878948 23892
+LOGNORMAL 11.753074 3.920731 EXPONENTIAL 683074 30837
diff --git a/tools/linsched/tests/mcarlo-sims/sim-232 b/tools/linsched/tests/mcarlo-sims/sim-232
new file mode 100644
index 00000000000000..b176c9cc0746bd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-232
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.629900 1.737002 LOGNORMAL 12.920050 3.287180 828
+LOGNORMAL 11.371509 1.949864 EXPONENTIAL 684774 2707
diff --git a/tools/linsched/tests/mcarlo-sims/sim-233 b/tools/linsched/tests/mcarlo-sims/sim-233
new file mode 100644
index 00000000000000..7adf62b0b701d1
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-233
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.046497 3.477034 EXPONENTIAL 614650 6926
+LOGNORMAL 12.666527 2.327300 EXPONENTIAL 666053 24017
+LOGNORMAL 13.456892 1.991327 LOGNORMAL 12.090441 1.043878 2190
diff --git a/tools/linsched/tests/mcarlo-sims/sim-234 b/tools/linsched/tests/mcarlo-sims/sim-234
new file mode 100644
index 00000000000000..6c101ae124633a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-234
@@ -0,0 +1,6 @@
+ONE_GROUP 5
+LOGNORMAL 11.772303 3.101258 EXPONENTIAL 698478 424
+LOGNORMAL 11.873674 2.835336 EXPONENTIAL 669240 28542
+LOGNORMAL 12.875890 2.079525 LOGNORMAL 12.206044 2.984820 577
+LOGNORMAL 11.592630 1.328346 EXPONENTIAL 652390 8274
+LOGNORMAL 11.812755 1.977094 LOGNORMAL 13.286173 3.712311 4854
diff --git a/tools/linsched/tests/mcarlo-sims/sim-235 b/tools/linsched/tests/mcarlo-sims/sim-235
new file mode 100644
index 00000000000000..1b7d39ec4a4bd4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-235
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.046605 3.292846 LOGNORMAL 11.824677 1.342658 25425
+LOGNORMAL 11.724851 3.566963 LOGNORMAL 12.838712 1.237801 32456
+LOGNORMAL 13.652722 2.297514 EXPONENTIAL 649133 10422
diff --git a/tools/linsched/tests/mcarlo-sims/sim-236 b/tools/linsched/tests/mcarlo-sims/sim-236
new file mode 100644
index 00000000000000..3c603fe6e7c6fe
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-236
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.448647 1.408640 EXPONENTIAL 655469 11932
+LOGNORMAL 11.705225 3.710340 LOGNORMAL 12.905550 2.582775 15216
+LOGNORMAL 12.961788 2.769242 LOGNORMAL 12.724318 1.618074 21219
+LOGNORMAL 11.956424 1.618078 EXPONENTIAL 634118 26051
diff --git a/tools/linsched/tests/mcarlo-sims/sim-237 b/tools/linsched/tests/mcarlo-sims/sim-237
new file mode 100644
index 00000000000000..55f7cbdd338522
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-237
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.871817 3.631782 LOGNORMAL 12.663852 2.362460 25942
+LOGNORMAL 12.337717 2.005188 EXPONENTIAL 688555 11082
+LOGNORMAL 11.266239 2.678552 EXPONENTIAL 697025 18984
+LOGNORMAL 13.566575 3.427083 EXPONENTIAL 602396 21966
diff --git a/tools/linsched/tests/mcarlo-sims/sim-238 b/tools/linsched/tests/mcarlo-sims/sim-238
new file mode 100644
index 00000000000000..ebdb57f8cebeb7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-238
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.960700 1.488026 LOGNORMAL 11.194664 2.724517 12028
+LOGNORMAL 12.540495 2.105473 LOGNORMAL 11.288421 3.498515 31711
diff --git a/tools/linsched/tests/mcarlo-sims/sim-239 b/tools/linsched/tests/mcarlo-sims/sim-239
new file mode 100644
index 00000000000000..13d2aa079b30a0
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-239
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.968947 1.099466 EXPONENTIAL 632730 20440
+LOGNORMAL 12.406470 2.535793 EXPONENTIAL 633875 16712
+LOGNORMAL 11.555922 2.381144 EXPONENTIAL 632172 12580
diff --git a/tools/linsched/tests/mcarlo-sims/sim-24 b/tools/linsched/tests/mcarlo-sims/sim-24
new file mode 100644
index 00000000000000..8ff1d41f6d08d4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-24
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.768030 3.282071 EXPONENTIAL 629637 9024
+LOGNORMAL 13.055221 1.096956 EXPONENTIAL 607370 26066
+LOGNORMAL 12.118304 1.334635 EXPONENTIAL 679778 23481
+LOGNORMAL 13.275491 1.183188 LOGNORMAL 11.137339 2.263181 31256
diff --git a/tools/linsched/tests/mcarlo-sims/sim-240 b/tools/linsched/tests/mcarlo-sims/sim-240
new file mode 100644
index 00000000000000..436faece56552f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-240
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.716097 3.439196 LOGNORMAL 11.915582 2.187227 18422
+LOGNORMAL 11.800887 3.506248 EXPONENTIAL 696877 6829
+LOGNORMAL 12.972994 2.106929 EXPONENTIAL 658449 8699
+LOGNORMAL 13.627524 1.799165 EXPONENTIAL 698523 11470
diff --git a/tools/linsched/tests/mcarlo-sims/sim-241 b/tools/linsched/tests/mcarlo-sims/sim-241
new file mode 100644
index 00000000000000..23b3fd0e1bd51c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-241
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 12.017212 3.285649 LOGNORMAL 13.703954 2.355567 3583
+LOGNORMAL 12.712110 3.435982 LOGNORMAL 12.271493 1.983978 9134
+LOGNORMAL 12.681659 1.639236 EXPONENTIAL 640587 9834
diff --git a/tools/linsched/tests/mcarlo-sims/sim-242 b/tools/linsched/tests/mcarlo-sims/sim-242
new file mode 100644
index 00000000000000..2e4f98ba11f16d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-242
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.928394 1.510062 EXPONENTIAL 638343 20831
+LOGNORMAL 13.237271 3.815649 EXPONENTIAL 673753 510
+LOGNORMAL 13.858352 2.323471 EXPONENTIAL 607258 27441
+LOGNORMAL 11.414977 3.510192 EXPONENTIAL 669430 228
diff --git a/tools/linsched/tests/mcarlo-sims/sim-243 b/tools/linsched/tests/mcarlo-sims/sim-243
new file mode 100644
index 00000000000000..cb4f16f7e412fb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-243
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.848355 3.303462 LOGNORMAL 12.243870 2.715943 60
+LOGNORMAL 11.812664 3.438531 LOGNORMAL 11.739228 2.196871 11919
+LOGNORMAL 11.641289 3.152228 LOGNORMAL 13.097315 3.578964 1702
+LOGNORMAL 11.954392 3.461822 EXPONENTIAL 644043 21629
diff --git a/tools/linsched/tests/mcarlo-sims/sim-244 b/tools/linsched/tests/mcarlo-sims/sim-244
new file mode 100644
index 00000000000000..1cfbae76e6dbe7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-244
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.358652 1.859708 EXPONENTIAL 634355 24744
+LOGNORMAL 12.024154 2.961130 LOGNORMAL 13.785666 1.685490 2565
+LOGNORMAL 11.939237 3.763067 LOGNORMAL 13.543361 3.265005 9473
diff --git a/tools/linsched/tests/mcarlo-sims/sim-245 b/tools/linsched/tests/mcarlo-sims/sim-245
new file mode 100644
index 00000000000000..4f9c3cf028ec9e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-245
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.881717 1.022435 LOGNORMAL 11.691362 1.726238 25003
+LOGNORMAL 13.536229 3.406696 LOGNORMAL 11.294928 1.849618 19707
+LOGNORMAL 12.083817 3.716538 LOGNORMAL 13.678658 3.211286 16448
+LOGNORMAL 11.031711 2.974079 EXPONENTIAL 664306 27103
diff --git a/tools/linsched/tests/mcarlo-sims/sim-246 b/tools/linsched/tests/mcarlo-sims/sim-246
new file mode 100644
index 00000000000000..80eb0ad7f25e4b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-246
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 13.386728 1.732008 LOGNORMAL 13.322648 1.746438 31319
+LOGNORMAL 11.790401 1.269741 EXPONENTIAL 652521 16650
+LOGNORMAL 12.823706 1.029992 LOGNORMAL 12.462138 2.152129 19956
diff --git a/tools/linsched/tests/mcarlo-sims/sim-247 b/tools/linsched/tests/mcarlo-sims/sim-247
new file mode 100644
index 00000000000000..f41fdd4aebf324
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-247
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.340675 3.726707 EXPONENTIAL 643436 2169
+LOGNORMAL 11.319639 3.177073 LOGNORMAL 11.661313 3.684079 27715
+LOGNORMAL 11.272521 3.266213 LOGNORMAL 13.742037 3.416331 30701
diff --git a/tools/linsched/tests/mcarlo-sims/sim-248 b/tools/linsched/tests/mcarlo-sims/sim-248
new file mode 100644
index 00000000000000..e5cacd25cef9d3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-248
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.938862 1.454591 LOGNORMAL 12.555011 3.077821 5747
+LOGNORMAL 12.414829 2.036370 EXPONENTIAL 632816 30676
+LOGNORMAL 12.446062 1.966343 EXPONENTIAL 686103 14974
diff --git a/tools/linsched/tests/mcarlo-sims/sim-249 b/tools/linsched/tests/mcarlo-sims/sim-249
new file mode 100644
index 00000000000000..676e11781618e7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-249
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.947423 3.341529 LOGNORMAL 12.408737 1.648536 19039
+LOGNORMAL 12.099015 1.143216 EXPONENTIAL 678035 18136
+LOGNORMAL 13.262420 3.490726 LOGNORMAL 11.691959 2.756724 10802
+LOGNORMAL 12.356925 3.844963 LOGNORMAL 12.673296 2.084093 24908
+LOGNORMAL 12.953915 2.442682 EXPONENTIAL 678738 27457
diff --git a/tools/linsched/tests/mcarlo-sims/sim-25 b/tools/linsched/tests/mcarlo-sims/sim-25
new file mode 100644
index 00000000000000..8700e32be0a214
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-25
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 11.467129 1.042081 EXPONENTIAL 654335 21549
+LOGNORMAL 11.394932 2.625144 EXPONENTIAL 675130 9523
+LOGNORMAL 12.053625 3.282469 LOGNORMAL 13.424787 2.393768 23605
diff --git a/tools/linsched/tests/mcarlo-sims/sim-250 b/tools/linsched/tests/mcarlo-sims/sim-250
new file mode 100644
index 00000000000000..19c01ff3d7677b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-250
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.938910 3.264088 EXPONENTIAL 608032 30326
+LOGNORMAL 11.011862 2.360611 EXPONENTIAL 678032 28892
+LOGNORMAL 13.574991 3.869853 EXPONENTIAL 670023 5839
diff --git a/tools/linsched/tests/mcarlo-sims/sim-251 b/tools/linsched/tests/mcarlo-sims/sim-251
new file mode 100644
index 00000000000000..f9a3e15ba526ac
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-251
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.272214 2.097155 LOGNORMAL 11.840141 3.252530 7346
+LOGNORMAL 13.260796 3.204176 EXPONENTIAL 612457 9123
+LOGNORMAL 11.459749 2.997892 EXPONENTIAL 641340 22539
+LOGNORMAL 13.374320 3.188061 LOGNORMAL 12.962918 3.767738 23896
diff --git a/tools/linsched/tests/mcarlo-sims/sim-252 b/tools/linsched/tests/mcarlo-sims/sim-252
new file mode 100644
index 00000000000000..1150319990a9fe
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-252
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.178752 1.280919 LOGNORMAL 11.995708 1.864769 15224
+LOGNORMAL 11.211037 1.903558 EXPONENTIAL 669394 32252
+LOGNORMAL 13.714313 2.461698 LOGNORMAL 11.848574 3.989095 19445
diff --git a/tools/linsched/tests/mcarlo-sims/sim-253 b/tools/linsched/tests/mcarlo-sims/sim-253
new file mode 100644
index 00000000000000..07bcd95bc60178
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-253
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 11.641075 2.553445 LOGNORMAL 11.515112 3.491322 25960
+LOGNORMAL 12.352133 1.304180 EXPONENTIAL 681998 19347
+LOGNORMAL 11.650269 1.074336 EXPONENTIAL 602833 23297
diff --git a/tools/linsched/tests/mcarlo-sims/sim-254 b/tools/linsched/tests/mcarlo-sims/sim-254
new file mode 100644
index 00000000000000..bf57ada8eed182
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-254
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.488127 1.950578 EXPONENTIAL 654077 31777
+LOGNORMAL 11.040998 3.051730 LOGNORMAL 11.463940 1.434464 11023
diff --git a/tools/linsched/tests/mcarlo-sims/sim-255 b/tools/linsched/tests/mcarlo-sims/sim-255
new file mode 100644
index 00000000000000..3858241ac05955
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-255
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.903965 3.932094 LOGNORMAL 11.741739 2.402446 134
+LOGNORMAL 12.214968 2.964829 EXPONENTIAL 602055 32374
+LOGNORMAL 11.591439 2.318887 EXPONENTIAL 696687 6909
+LOGNORMAL 11.650974 3.927576 EXPONENTIAL 628775 7857
diff --git a/tools/linsched/tests/mcarlo-sims/sim-256 b/tools/linsched/tests/mcarlo-sims/sim-256
new file mode 100644
index 00000000000000..14347cda8be9a9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-256
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.689755 2.711396 EXPONENTIAL 696427 10663
+LOGNORMAL 13.506755 3.035206 EXPONENTIAL 638554 26446
+LOGNORMAL 11.466646 1.911148 EXPONENTIAL 683930 30492
+LOGNORMAL 11.078510 3.513201 EXPONENTIAL 644243 31015
diff --git a/tools/linsched/tests/mcarlo-sims/sim-257 b/tools/linsched/tests/mcarlo-sims/sim-257
new file mode 100644
index 00000000000000..636f3628f51eea
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-257
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.749350 2.320366 LOGNORMAL 12.798941 1.796736 16879
+LOGNORMAL 11.741441 3.395338 EXPONENTIAL 643965 31677
+LOGNORMAL 11.526374 3.764862 LOGNORMAL 12.335498 3.708367 29970
+LOGNORMAL 13.998868 2.967366 EXPONENTIAL 667156 9928
+LOGNORMAL 11.304016 1.590207 EXPONENTIAL 618106 23263
diff --git a/tools/linsched/tests/mcarlo-sims/sim-258 b/tools/linsched/tests/mcarlo-sims/sim-258
new file mode 100644
index 00000000000000..a0104d6ee05670
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-258
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 13.118179 3.229953 EXPONENTIAL 647996 25524
+LOGNORMAL 13.435205 3.498206 EXPONENTIAL 652173 161
+LOGNORMAL 11.156137 3.200567 LOGNORMAL 11.787262 2.516342 1872
diff --git a/tools/linsched/tests/mcarlo-sims/sim-259 b/tools/linsched/tests/mcarlo-sims/sim-259
new file mode 100644
index 00000000000000..116500eb22852e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-259
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.803742 1.487715 LOGNORMAL 11.153391 2.038246 31788
+LOGNORMAL 11.780708 3.355726 LOGNORMAL 12.542674 2.716117 29305
+LOGNORMAL 11.243500 1.501062 EXPONENTIAL 636520 9035
+LOGNORMAL 13.212248 3.246788 LOGNORMAL 13.799494 3.096044 20803
diff --git a/tools/linsched/tests/mcarlo-sims/sim-26 b/tools/linsched/tests/mcarlo-sims/sim-26
new file mode 100644
index 00000000000000..2f206c538293b2
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-26
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.991405 2.543772 EXPONENTIAL 669653 3847
+LOGNORMAL 12.820596 2.758971 LOGNORMAL 11.603510 1.186102 27692
+LOGNORMAL 11.072508 1.637962 LOGNORMAL 12.919370 3.859170 26150
+LOGNORMAL 12.035495 1.557906 LOGNORMAL 13.461603 3.164874 1142
+LOGNORMAL 12.178016 2.918222 EXPONENTIAL 698735 14107
diff --git a/tools/linsched/tests/mcarlo-sims/sim-260 b/tools/linsched/tests/mcarlo-sims/sim-260
new file mode 100644
index 00000000000000..8d5542aa441839
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-260
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.572570 3.191062 EXPONENTIAL 636152 30475
+LOGNORMAL 11.691479 3.680662 EXPONENTIAL 616363 17822
diff --git a/tools/linsched/tests/mcarlo-sims/sim-261 b/tools/linsched/tests/mcarlo-sims/sim-261
new file mode 100644
index 00000000000000..38a7d7b8196ab1
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-261
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.472924 1.430946 LOGNORMAL 11.646218 1.982059 15133
+LOGNORMAL 11.220425 3.690675 LOGNORMAL 11.778467 1.698829 16655
+LOGNORMAL 13.228106 2.784860 LOGNORMAL 12.933197 2.235868 31456
+LOGNORMAL 11.135507 1.468640 LOGNORMAL 13.301810 2.515984 23391
+LOGNORMAL 12.512958 1.280769 EXPONENTIAL 638231 3425
diff --git a/tools/linsched/tests/mcarlo-sims/sim-262 b/tools/linsched/tests/mcarlo-sims/sim-262
new file mode 100644
index 00000000000000..4235fdde2ab2c7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-262
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.450277 3.807272 LOGNORMAL 11.745120 2.227968 13767
+LOGNORMAL 11.778786 1.048215 LOGNORMAL 13.680082 3.137906 26269
diff --git a/tools/linsched/tests/mcarlo-sims/sim-263 b/tools/linsched/tests/mcarlo-sims/sim-263
new file mode 100644
index 00000000000000..52819f5f1e1e5a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-263
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.029555 2.731658 EXPONENTIAL 695495 25799
+LOGNORMAL 11.261178 1.613275 LOGNORMAL 13.665540 1.725606 32231
+LOGNORMAL 13.252600 3.449832 LOGNORMAL 13.267897 2.539136 5575
diff --git a/tools/linsched/tests/mcarlo-sims/sim-264 b/tools/linsched/tests/mcarlo-sims/sim-264
new file mode 100644
index 00000000000000..0e2e121167dc85
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-264
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.646259 3.671531 LOGNORMAL 12.425755 2.668867 18248
+LOGNORMAL 13.291311 3.057012 EXPONENTIAL 676270 27555
+LOGNORMAL 13.809140 3.217804 EXPONENTIAL 609091 29851
+LOGNORMAL 12.246067 3.654449 LOGNORMAL 12.828473 3.149536 7600
diff --git a/tools/linsched/tests/mcarlo-sims/sim-265 b/tools/linsched/tests/mcarlo-sims/sim-265
new file mode 100644
index 00000000000000..657a3840cad130
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-265
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 13.170732 1.486258 EXPONENTIAL 616509 5246
+LOGNORMAL 13.279738 3.549532 EXPONENTIAL 664846 11389
+LOGNORMAL 11.166133 3.204055 EXPONENTIAL 667543 25852
diff --git a/tools/linsched/tests/mcarlo-sims/sim-266 b/tools/linsched/tests/mcarlo-sims/sim-266
new file mode 100644
index 00000000000000..4e6577e8c744c0
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-266
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.200112 1.280101 LOGNORMAL 12.492147 2.509026 8308
+LOGNORMAL 13.025134 2.429220 LOGNORMAL 13.214466 1.521867 20324
diff --git a/tools/linsched/tests/mcarlo-sims/sim-267 b/tools/linsched/tests/mcarlo-sims/sim-267
new file mode 100644
index 00000000000000..c32741928d6968
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-267
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.153595 2.474907 LOGNORMAL 13.454654 3.376340 15674
+LOGNORMAL 12.691898 2.730507 LOGNORMAL 13.416977 3.130106 24025
+LOGNORMAL 11.546766 1.493295 LOGNORMAL 12.312216 2.409267 4162
diff --git a/tools/linsched/tests/mcarlo-sims/sim-268 b/tools/linsched/tests/mcarlo-sims/sim-268
new file mode 100644
index 00000000000000..c3c01f659c0537
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-268
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.963384 3.593074 LOGNORMAL 12.201600 3.289937 31602
+LOGNORMAL 11.002376 1.939817 EXPONENTIAL 658011 7244
diff --git a/tools/linsched/tests/mcarlo-sims/sim-269 b/tools/linsched/tests/mcarlo-sims/sim-269
new file mode 100644
index 00000000000000..86856f949d37c7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-269
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.879422 3.441158 EXPONENTIAL 644185 25396
+LOGNORMAL 12.082671 2.452893 LOGNORMAL 12.906489 3.363365 4663
+LOGNORMAL 12.949813 2.515182 EXPONENTIAL 665262 7242
+LOGNORMAL 11.989274 1.735965 LOGNORMAL 12.892191 3.058665 28918
diff --git a/tools/linsched/tests/mcarlo-sims/sim-27 b/tools/linsched/tests/mcarlo-sims/sim-27
new file mode 100644
index 00000000000000..05aac88a53cda7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-27
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.351214 1.848596 LOGNORMAL 12.114790 2.283177 4999
+LOGNORMAL 12.638661 1.978197 EXPONENTIAL 697278 21773
diff --git a/tools/linsched/tests/mcarlo-sims/sim-270 b/tools/linsched/tests/mcarlo-sims/sim-270
new file mode 100644
index 00000000000000..c6f7b6e7699990
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-270
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 13.938550 3.216903 EXPONENTIAL 643820 1960
+LOGNORMAL 11.739044 2.115191 EXPONENTIAL 630221 30675
+LOGNORMAL 11.615528 2.181351 EXPONENTIAL 632112 29172
diff --git a/tools/linsched/tests/mcarlo-sims/sim-271 b/tools/linsched/tests/mcarlo-sims/sim-271
new file mode 100644
index 00000000000000..631360740d2971
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-271
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.153697 3.186502 LOGNORMAL 12.209211 2.208553 22558
+LOGNORMAL 13.290679 1.448893 EXPONENTIAL 676407 25562
+LOGNORMAL 11.649996 2.485932 EXPONENTIAL 671096 19282
+LOGNORMAL 11.528056 2.045142 LOGNORMAL 12.921313 3.513091 15975
diff --git a/tools/linsched/tests/mcarlo-sims/sim-272 b/tools/linsched/tests/mcarlo-sims/sim-272
new file mode 100644
index 00000000000000..e89c1593384c77
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-272
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.799913 1.143463 LOGNORMAL 12.483304 3.894139 8608
+LOGNORMAL 11.837143 3.864439 LOGNORMAL 11.583092 3.025277 23401
+LOGNORMAL 13.792118 2.135606 LOGNORMAL 11.582938 3.446825 29482
+LOGNORMAL 13.765489 1.579695 EXPONENTIAL 656434 844
diff --git a/tools/linsched/tests/mcarlo-sims/sim-273 b/tools/linsched/tests/mcarlo-sims/sim-273
new file mode 100644
index 00000000000000..669c471b213375
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-273
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.288191 2.631013 EXPONENTIAL 675243 11847
+LOGNORMAL 11.915695 1.086945 LOGNORMAL 12.537388 3.881175 27615
diff --git a/tools/linsched/tests/mcarlo-sims/sim-274 b/tools/linsched/tests/mcarlo-sims/sim-274
new file mode 100644
index 00000000000000..c93d4aa7cbd6cd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-274
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.982288 1.307438 LOGNORMAL 13.364254 2.018741 2583
+LOGNORMAL 11.878112 2.428954 LOGNORMAL 11.888160 3.311946 17878
+LOGNORMAL 11.971688 3.164098 LOGNORMAL 11.851782 3.897244 771
diff --git a/tools/linsched/tests/mcarlo-sims/sim-275 b/tools/linsched/tests/mcarlo-sims/sim-275
new file mode 100644
index 00000000000000..0c17a98cc5bbf1
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-275
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.807565 3.741353 LOGNORMAL 11.606799 2.466699 13543
+LOGNORMAL 12.731765 3.779398 EXPONENTIAL 602198 25031
diff --git a/tools/linsched/tests/mcarlo-sims/sim-276 b/tools/linsched/tests/mcarlo-sims/sim-276
new file mode 100644
index 00000000000000..4501eb4d55905f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-276
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.948701 2.825327 LOGNORMAL 11.478907 3.988216 20112
+LOGNORMAL 11.568060 2.378362 LOGNORMAL 11.049920 3.001521 30917
diff --git a/tools/linsched/tests/mcarlo-sims/sim-277 b/tools/linsched/tests/mcarlo-sims/sim-277
new file mode 100644
index 00000000000000..3bbbaced7760af
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-277
@@ -0,0 +1,5 @@
+ROOT 4
+LOGNORMAL 13.916092 3.752609 LOGNORMAL 12.366079 1.690243 102
+LOGNORMAL 11.053641 2.544629 EXPONENTIAL 691271 31940
+LOGNORMAL 13.896232 2.972720 LOGNORMAL 12.645305 2.639668 28590
+LOGNORMAL 12.236701 2.236282 EXPONENTIAL 646304 21583
diff --git a/tools/linsched/tests/mcarlo-sims/sim-278 b/tools/linsched/tests/mcarlo-sims/sim-278
new file mode 100644
index 00000000000000..22e16ab1581786
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-278
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.743168 3.431841 EXPONENTIAL 611022 1929
+LOGNORMAL 11.303105 1.286971 EXPONENTIAL 620283 31304
+LOGNORMAL 12.439180 3.299805 LOGNORMAL 11.214972 2.029835 25429
+LOGNORMAL 12.257375 1.705054 LOGNORMAL 12.526980 2.944800 10651
diff --git a/tools/linsched/tests/mcarlo-sims/sim-279 b/tools/linsched/tests/mcarlo-sims/sim-279
new file mode 100644
index 00000000000000..80b23b487084e5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-279
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.806669 3.688639 EXPONENTIAL 686505 27320
+LOGNORMAL 12.782714 2.076381 EXPONENTIAL 659972 10569
+LOGNORMAL 12.943562 2.448476 LOGNORMAL 11.585432 3.355741 10910
+LOGNORMAL 12.312292 3.691273 LOGNORMAL 13.157406 2.529262 16907
+LOGNORMAL 12.919633 2.271435 EXPONENTIAL 666898 2061
diff --git a/tools/linsched/tests/mcarlo-sims/sim-28 b/tools/linsched/tests/mcarlo-sims/sim-28
new file mode 100644
index 00000000000000..cf419875972cc4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-28
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.942450 1.764248 EXPONENTIAL 640891 13303
+LOGNORMAL 13.888409 3.493990 LOGNORMAL 12.555550 3.129463 20374
diff --git a/tools/linsched/tests/mcarlo-sims/sim-280 b/tools/linsched/tests/mcarlo-sims/sim-280
new file mode 100644
index 00000000000000..23f9df11de9023
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-280
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.619662 2.657369 LOGNORMAL 13.218817 2.655954 28563
+LOGNORMAL 13.746301 3.079991 LOGNORMAL 12.065360 2.505072 13926
+LOGNORMAL 12.834068 1.179089 LOGNORMAL 12.045153 1.888489 3230
+LOGNORMAL 12.105327 2.231733 EXPONENTIAL 656151 521
diff --git a/tools/linsched/tests/mcarlo-sims/sim-281 b/tools/linsched/tests/mcarlo-sims/sim-281
new file mode 100644
index 00000000000000..0da312e3884184
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-281
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.531611 1.784797 LOGNORMAL 13.359179 3.717828 4061
+LOGNORMAL 11.791147 1.803218 EXPONENTIAL 677838 13537
diff --git a/tools/linsched/tests/mcarlo-sims/sim-282 b/tools/linsched/tests/mcarlo-sims/sim-282
new file mode 100644
index 00000000000000..3c439854efdb14
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-282
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 11.251483 3.676697 EXPONENTIAL 616005 15454
+LOGNORMAL 13.549609 3.275901 LOGNORMAL 12.885903 2.364762 28045
+LOGNORMAL 13.167325 1.228674 LOGNORMAL 13.371981 2.884879 4007
+LOGNORMAL 13.302888 2.637511 EXPONENTIAL 640666 18814
diff --git a/tools/linsched/tests/mcarlo-sims/sim-283 b/tools/linsched/tests/mcarlo-sims/sim-283
new file mode 100644
index 00000000000000..7d02c27f06ce9a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-283
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.676261 1.911111 EXPONENTIAL 647176 14686
+LOGNORMAL 11.010290 2.945863 LOGNORMAL 11.237072 1.466056 7573
diff --git a/tools/linsched/tests/mcarlo-sims/sim-284 b/tools/linsched/tests/mcarlo-sims/sim-284
new file mode 100644
index 00000000000000..10717101e1a8da
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-284
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.128595 2.302139 LOGNORMAL 13.830189 2.994355 13803
+LOGNORMAL 11.346544 2.366516 LOGNORMAL 11.465113 3.161798 12547
+LOGNORMAL 11.737536 3.762052 LOGNORMAL 13.030101 1.899491 4252
diff --git a/tools/linsched/tests/mcarlo-sims/sim-285 b/tools/linsched/tests/mcarlo-sims/sim-285
new file mode 100644
index 00000000000000..bfe0ce860365d6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-285
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.309017 2.643965 EXPONENTIAL 695617 23125
+LOGNORMAL 11.227786 1.406649 LOGNORMAL 12.479206 1.014115 22494
diff --git a/tools/linsched/tests/mcarlo-sims/sim-286 b/tools/linsched/tests/mcarlo-sims/sim-286
new file mode 100644
index 00000000000000..0c5707e34bbfa7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-286
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.225322 1.979524 LOGNORMAL 13.801361 1.473031 7408
+LOGNORMAL 11.652856 2.556259 LOGNORMAL 12.074424 1.836655 31051
+LOGNORMAL 13.414630 2.692131 EXPONENTIAL 684683 30394
+LOGNORMAL 12.542043 1.109642 LOGNORMAL 13.535411 1.651249 648
+LOGNORMAL 12.831619 2.027210 EXPONENTIAL 610874 21257
diff --git a/tools/linsched/tests/mcarlo-sims/sim-287 b/tools/linsched/tests/mcarlo-sims/sim-287
new file mode 100644
index 00000000000000..a944d55bfa691e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-287
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.809413 1.804119 EXPONENTIAL 682703 20932
+LOGNORMAL 12.905011 2.519581 LOGNORMAL 12.008934 2.150170 13427
diff --git a/tools/linsched/tests/mcarlo-sims/sim-288 b/tools/linsched/tests/mcarlo-sims/sim-288
new file mode 100644
index 00000000000000..4aad3f53ac3372
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-288
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.036228 2.881956 LOGNORMAL 12.080100 1.243234 1204
+LOGNORMAL 11.270773 3.887886 LOGNORMAL 13.547201 1.807358 3009
+LOGNORMAL 11.094410 3.756139 LOGNORMAL 13.489618 3.005956 29376
+LOGNORMAL 13.122800 2.904969 EXPONENTIAL 673098 17974
+LOGNORMAL 13.031585 2.840807 EXPONENTIAL 639082 20897
diff --git a/tools/linsched/tests/mcarlo-sims/sim-289 b/tools/linsched/tests/mcarlo-sims/sim-289
new file mode 100644
index 00000000000000..f33fda6d681126
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-289
@@ -0,0 +1,5 @@
+ROOT 4
+LOGNORMAL 12.972161 3.105609 EXPONENTIAL 620257 18632
+LOGNORMAL 12.989804 2.636292 LOGNORMAL 13.399629 2.561075 2104
+LOGNORMAL 11.777341 3.767789 LOGNORMAL 11.511739 3.796203 17064
+LOGNORMAL 11.661129 3.601930 EXPONENTIAL 658048 23632
diff --git a/tools/linsched/tests/mcarlo-sims/sim-29 b/tools/linsched/tests/mcarlo-sims/sim-29
new file mode 100644
index 00000000000000..432e3b30a45640
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-29
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.108231 3.034209 LOGNORMAL 11.226769 2.307378 17307
+LOGNORMAL 12.447680 2.163743 LOGNORMAL 11.561977 2.152463 14290
+LOGNORMAL 12.504099 2.391482 EXPONENTIAL 637219 29475
+LOGNORMAL 11.136455 2.400131 LOGNORMAL 11.554301 2.135963 22085
diff --git a/tools/linsched/tests/mcarlo-sims/sim-290 b/tools/linsched/tests/mcarlo-sims/sim-290
new file mode 100644
index 00000000000000..a6bc66961977ce
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-290
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.409405 1.870431 LOGNORMAL 11.975478 3.865735 29440
+LOGNORMAL 13.469073 2.716022 EXPONENTIAL 619234 15284
+LOGNORMAL 11.202530 2.923845 EXPONENTIAL 618683 23971
diff --git a/tools/linsched/tests/mcarlo-sims/sim-291 b/tools/linsched/tests/mcarlo-sims/sim-291
new file mode 100644
index 00000000000000..cee6048922e20f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-291
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.290315 1.320986 EXPONENTIAL 672301 1019
+LOGNORMAL 11.484150 2.112704 EXPONENTIAL 631249 27891
+LOGNORMAL 11.953627 2.602855 LOGNORMAL 13.177287 3.668052 3718
+LOGNORMAL 12.298886 3.381904 EXPONENTIAL 695986 16583
+LOGNORMAL 13.681363 3.661438 LOGNORMAL 12.772128 1.148134 32560
diff --git a/tools/linsched/tests/mcarlo-sims/sim-292 b/tools/linsched/tests/mcarlo-sims/sim-292
new file mode 100644
index 00000000000000..4dfec571ca4f9c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-292
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.236985 1.014328 EXPONENTIAL 680421 7189
+LOGNORMAL 11.310426 1.337899 LOGNORMAL 12.116814 3.297454 22070
+LOGNORMAL 11.532708 2.220334 LOGNORMAL 11.957451 3.880974 10793
diff --git a/tools/linsched/tests/mcarlo-sims/sim-293 b/tools/linsched/tests/mcarlo-sims/sim-293
new file mode 100644
index 00000000000000..3c4a6701f32d8d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-293
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.696495 3.983432 LOGNORMAL 13.597454 3.405289 32040
+LOGNORMAL 13.033800 1.076042 LOGNORMAL 13.513298 2.002917 1099
+LOGNORMAL 11.373047 3.794164 LOGNORMAL 12.281773 3.753161 7604
+LOGNORMAL 12.986801 3.157243 EXPONENTIAL 628557 13457
+LOGNORMAL 11.132997 1.275768 LOGNORMAL 12.839485 2.230388 20987
diff --git a/tools/linsched/tests/mcarlo-sims/sim-294 b/tools/linsched/tests/mcarlo-sims/sim-294
new file mode 100644
index 00000000000000..dd08e11d47e0ab
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-294
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 13.235061 2.664727 EXPONENTIAL 628111 23879
+LOGNORMAL 11.949836 1.897673 EXPONENTIAL 665968 11718
+LOGNORMAL 12.283677 2.754058 EXPONENTIAL 638665 23945
+LOGNORMAL 13.635893 1.455409 LOGNORMAL 12.473231 2.593243 28609
diff --git a/tools/linsched/tests/mcarlo-sims/sim-295 b/tools/linsched/tests/mcarlo-sims/sim-295
new file mode 100644
index 00000000000000..b69ad3003d06ae
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-295
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.300996 2.846275 LOGNORMAL 13.299834 2.313637 15779
+LOGNORMAL 12.349766 3.513150 EXPONENTIAL 695492 16236
+LOGNORMAL 11.965113 3.652023 LOGNORMAL 11.617063 3.971319 5837
diff --git a/tools/linsched/tests/mcarlo-sims/sim-296 b/tools/linsched/tests/mcarlo-sims/sim-296
new file mode 100644
index 00000000000000..adfc5e336be779
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-296
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.712383 2.014220 EXPONENTIAL 626468 250
+LOGNORMAL 13.076131 1.530715 LOGNORMAL 12.552446 1.968113 27080
+LOGNORMAL 11.967160 2.065164 LOGNORMAL 11.299979 2.753970 32489
+LOGNORMAL 12.685893 3.810047 LOGNORMAL 11.974626 1.532022 3957
diff --git a/tools/linsched/tests/mcarlo-sims/sim-297 b/tools/linsched/tests/mcarlo-sims/sim-297
new file mode 100644
index 00000000000000..bd1262de09de78
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-297
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.331535 1.116530 EXPONENTIAL 635656 11971
+LOGNORMAL 12.968028 2.647200 EXPONENTIAL 688675 18613
+LOGNORMAL 13.527719 1.373075 EXPONENTIAL 685897 6910
+LOGNORMAL 12.737359 1.789463 LOGNORMAL 13.278867 3.920851 16311
diff --git a/tools/linsched/tests/mcarlo-sims/sim-298 b/tools/linsched/tests/mcarlo-sims/sim-298
new file mode 100644
index 00000000000000..90337fe25c0996
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-298
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.390148 1.215054 LOGNORMAL 11.944805 1.332266 28012
+LOGNORMAL 12.763182 3.796075 LOGNORMAL 13.286915 1.186456 6838
+LOGNORMAL 13.416620 3.133589 LOGNORMAL 11.631773 2.208390 19743
+LOGNORMAL 13.528879 2.870572 EXPONENTIAL 646616 30674
diff --git a/tools/linsched/tests/mcarlo-sims/sim-299 b/tools/linsched/tests/mcarlo-sims/sim-299
new file mode 100644
index 00000000000000..79e42eadd91036
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-299
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.494809 1.248317 EXPONENTIAL 665336 9519
+LOGNORMAL 11.679191 1.157656 LOGNORMAL 13.257051 3.250888 31874
+LOGNORMAL 11.994380 3.550437 LOGNORMAL 13.326236 2.043017 2160
diff --git a/tools/linsched/tests/mcarlo-sims/sim-3 b/tools/linsched/tests/mcarlo-sims/sim-3
new file mode 100644
index 00000000000000..b8f8eb06bc638b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-3
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.660562 2.066516 EXPONENTIAL 620056 2809
+LOGNORMAL 11.929711 2.649428 LOGNORMAL 11.733062 3.578802 2134
+LOGNORMAL 12.731362 3.004924 EXPONENTIAL 690572 3484
+LOGNORMAL 13.008643 1.254807 EXPONENTIAL 645009 18734
+LOGNORMAL 11.307020 1.085926 LOGNORMAL 13.333440 3.123062 16282
diff --git a/tools/linsched/tests/mcarlo-sims/sim-30 b/tools/linsched/tests/mcarlo-sims/sim-30
new file mode 100644
index 00000000000000..5b1c9ad7599561
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-30
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 13.410271 1.422922 LOGNORMAL 11.609872 3.122473 8854
+LOGNORMAL 13.137273 3.151320 LOGNORMAL 12.212589 1.985966 24600
+LOGNORMAL 13.059379 1.980454 LOGNORMAL 12.110958 3.878388 6525
+LOGNORMAL 11.872108 3.513448 EXPONENTIAL 626086 14028
diff --git a/tools/linsched/tests/mcarlo-sims/sim-300 b/tools/linsched/tests/mcarlo-sims/sim-300
new file mode 100644
index 00000000000000..74d658c1f9fa54
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-300
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.233738 3.435827 EXPONENTIAL 695236 8868
+LOGNORMAL 11.764275 3.176827 EXPONENTIAL 637777 28637
+LOGNORMAL 13.452848 3.021470 EXPONENTIAL 670981 14698
+LOGNORMAL 13.476301 1.185491 LOGNORMAL 11.076138 2.652673 12049
diff --git a/tools/linsched/tests/mcarlo-sims/sim-301 b/tools/linsched/tests/mcarlo-sims/sim-301
new file mode 100644
index 00000000000000..0aeaf94c6d45a4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-301
@@ -0,0 +1,5 @@
+ROOT 4
+LOGNORMAL 11.360711 3.464110 EXPONENTIAL 604052 8688
+LOGNORMAL 12.027825 1.660023 EXPONENTIAL 604190 24275
+LOGNORMAL 11.930995 3.237059 LOGNORMAL 11.772796 2.389476 6267
+LOGNORMAL 11.674642 2.710221 LOGNORMAL 11.393235 1.107138 23924
diff --git a/tools/linsched/tests/mcarlo-sims/sim-302 b/tools/linsched/tests/mcarlo-sims/sim-302
new file mode 100644
index 00000000000000..909db1d76a9e0d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-302
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.680761 2.545770 EXPONENTIAL 645777 24868
+LOGNORMAL 11.014876 2.024910 LOGNORMAL 11.680842 1.913013 17861
diff --git a/tools/linsched/tests/mcarlo-sims/sim-303 b/tools/linsched/tests/mcarlo-sims/sim-303
new file mode 100644
index 00000000000000..e5299b7c63ba79
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-303
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.548310 3.450999 EXPONENTIAL 606659 7932
+LOGNORMAL 12.063613 3.150200 EXPONENTIAL 674185 21921
+LOGNORMAL 13.676691 3.146598 LOGNORMAL 11.022816 3.475556 4289
+LOGNORMAL 11.454529 2.266281 LOGNORMAL 12.120760 3.606798 13060
diff --git a/tools/linsched/tests/mcarlo-sims/sim-304 b/tools/linsched/tests/mcarlo-sims/sim-304
new file mode 100644
index 00000000000000..f048c76a2a513f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-304
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.489885 3.505202 EXPONENTIAL 674525 27934
+LOGNORMAL 11.462162 1.556407 EXPONENTIAL 698697 30925
+LOGNORMAL 13.322880 2.649394 LOGNORMAL 11.164822 2.164474 9127
diff --git a/tools/linsched/tests/mcarlo-sims/sim-305 b/tools/linsched/tests/mcarlo-sims/sim-305
new file mode 100644
index 00000000000000..796a1afab876c9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-305
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.055929 2.991464 EXPONENTIAL 615965 20394
+LOGNORMAL 12.516695 1.090388 LOGNORMAL 11.598551 1.853842 23811
+LOGNORMAL 13.487742 1.474664 EXPONENTIAL 666852 7369
+LOGNORMAL 12.377890 2.190627 EXPONENTIAL 649006 3294
+LOGNORMAL 11.350139 2.780538 EXPONENTIAL 675510 7381
diff --git a/tools/linsched/tests/mcarlo-sims/sim-306 b/tools/linsched/tests/mcarlo-sims/sim-306
new file mode 100644
index 00000000000000..0cdaacf2a80e73
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-306
@@ -0,0 +1,6 @@
+ONE_GROUP 5
+LOGNORMAL 11.551063 1.715900 EXPONENTIAL 600869 7543
+LOGNORMAL 11.443302 2.571994 EXPONENTIAL 676219 17952
+LOGNORMAL 12.523402 2.825066 LOGNORMAL 11.707527 3.401233 69
+LOGNORMAL 11.508342 3.700694 LOGNORMAL 13.820061 3.764414 29015
+LOGNORMAL 11.714509 3.755120 LOGNORMAL 13.719427 1.415941 17538
diff --git a/tools/linsched/tests/mcarlo-sims/sim-307 b/tools/linsched/tests/mcarlo-sims/sim-307
new file mode 100644
index 00000000000000..99ee78bdf64198
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-307
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.177851 1.145770 EXPONENTIAL 680512 28806
+LOGNORMAL 12.750507 3.772290 LOGNORMAL 13.795140 1.911689 5165
+LOGNORMAL 11.349549 1.863197 EXPONENTIAL 606111 20448
+LOGNORMAL 12.949337 3.510732 LOGNORMAL 12.239571 2.465398 16525
+LOGNORMAL 12.710375 1.266126 LOGNORMAL 11.255658 1.851711 8930
diff --git a/tools/linsched/tests/mcarlo-sims/sim-308 b/tools/linsched/tests/mcarlo-sims/sim-308
new file mode 100644
index 00000000000000..d3168d4d9e83f6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-308
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.933716 1.964038 LOGNORMAL 13.991149 2.241562 5270
+LOGNORMAL 13.180274 2.872888 LOGNORMAL 12.185322 2.700314 11837
+LOGNORMAL 12.793803 2.447387 LOGNORMAL 13.293349 1.309978 23388
+LOGNORMAL 13.334093 2.104711 EXPONENTIAL 664668 4406
+LOGNORMAL 12.731079 1.240332 EXPONENTIAL 610314 4291
diff --git a/tools/linsched/tests/mcarlo-sims/sim-309 b/tools/linsched/tests/mcarlo-sims/sim-309
new file mode 100644
index 00000000000000..ec364a0aaece29
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-309
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.996035 1.362661 LOGNORMAL 11.140662 1.109835 475
+LOGNORMAL 13.235543 1.775538 EXPONENTIAL 617729 6140
+LOGNORMAL 12.473637 3.409580 LOGNORMAL 11.195942 3.198814 23726
diff --git a/tools/linsched/tests/mcarlo-sims/sim-31 b/tools/linsched/tests/mcarlo-sims/sim-31
new file mode 100644
index 00000000000000..2ddb71f333b72b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-31
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.730340 1.819258 EXPONENTIAL 657070 20685
+LOGNORMAL 12.698216 3.917848 EXPONENTIAL 630746 26818
+LOGNORMAL 11.857568 2.150220 LOGNORMAL 12.379246 3.993982 15950
+LOGNORMAL 11.401849 1.869831 LOGNORMAL 11.103831 3.079872 10786
diff --git a/tools/linsched/tests/mcarlo-sims/sim-310 b/tools/linsched/tests/mcarlo-sims/sim-310
new file mode 100644
index 00000000000000..0ee8f2cd412a0f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-310
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.114433 1.273762 LOGNORMAL 13.843462 1.071049 10061
+LOGNORMAL 13.150813 2.718698 EXPONENTIAL 660723 20461
+LOGNORMAL 11.905250 2.534618 LOGNORMAL 13.581519 2.586714 28083
diff --git a/tools/linsched/tests/mcarlo-sims/sim-311 b/tools/linsched/tests/mcarlo-sims/sim-311
new file mode 100644
index 00000000000000..b89b8d118f251e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-311
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.322642 2.642152 LOGNORMAL 11.569494 2.479760 28297
+LOGNORMAL 12.666104 1.204865 LOGNORMAL 13.332867 2.497332 4656
+LOGNORMAL 13.786292 3.215799 EXPONENTIAL 624745 25886
+LOGNORMAL 12.364012 2.948959 LOGNORMAL 12.878553 1.833662 20871
diff --git a/tools/linsched/tests/mcarlo-sims/sim-312 b/tools/linsched/tests/mcarlo-sims/sim-312
new file mode 100644
index 00000000000000..d972c70f1dd8ac
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-312
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.749010 3.603915 LOGNORMAL 12.099772 1.860698 1722
+LOGNORMAL 13.202516 1.683129 LOGNORMAL 13.966424 3.681335 16666
diff --git a/tools/linsched/tests/mcarlo-sims/sim-313 b/tools/linsched/tests/mcarlo-sims/sim-313
new file mode 100644
index 00000000000000..66b900d49634e4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-313
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 12.753957 1.759887 EXPONENTIAL 637511 29219
+LOGNORMAL 11.513274 2.589505 EXPONENTIAL 615726 4869
+LOGNORMAL 11.540398 2.468525 LOGNORMAL 11.173717 1.659757 32468
diff --git a/tools/linsched/tests/mcarlo-sims/sim-314 b/tools/linsched/tests/mcarlo-sims/sim-314
new file mode 100644
index 00000000000000..ee32a305c9a66c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-314
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.133210 3.860175 EXPONENTIAL 629307 28222
+LOGNORMAL 12.683855 2.552432 EXPONENTIAL 616282 24299
+LOGNORMAL 13.147615 2.961214 LOGNORMAL 11.935120 3.566380 28565
diff --git a/tools/linsched/tests/mcarlo-sims/sim-315 b/tools/linsched/tests/mcarlo-sims/sim-315
new file mode 100644
index 00000000000000..be27b6d89d4b9a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-315
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.494786 3.867275 LOGNORMAL 11.325107 2.078152 22713
+LOGNORMAL 12.445964 3.314705 EXPONENTIAL 675923 5535
+LOGNORMAL 13.335589 3.240152 LOGNORMAL 12.763835 2.770116 11217
+LOGNORMAL 12.571085 3.217517 LOGNORMAL 12.701351 2.606210 17386
+LOGNORMAL 12.274822 3.931170 EXPONENTIAL 642300 3452
diff --git a/tools/linsched/tests/mcarlo-sims/sim-316 b/tools/linsched/tests/mcarlo-sims/sim-316
new file mode 100644
index 00000000000000..37c04717ed4984
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-316
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.844037 2.724656 EXPONENTIAL 621171 4917
+LOGNORMAL 12.020302 1.221505 LOGNORMAL 12.121782 2.792707 6419
+LOGNORMAL 11.659687 3.356323 EXPONENTIAL 610443 25760
+LOGNORMAL 13.416706 1.578305 LOGNORMAL 12.670179 3.701875 7992
diff --git a/tools/linsched/tests/mcarlo-sims/sim-317 b/tools/linsched/tests/mcarlo-sims/sim-317
new file mode 100644
index 00000000000000..2a462835e1d5b8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-317
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.729141 3.664870 LOGNORMAL 13.003475 1.402019 28715
+LOGNORMAL 12.894462 2.225246 LOGNORMAL 11.314291 3.290408 14491
diff --git a/tools/linsched/tests/mcarlo-sims/sim-318 b/tools/linsched/tests/mcarlo-sims/sim-318
new file mode 100644
index 00000000000000..01199d789dd673
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-318
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 11.069784 3.854242 LOGNORMAL 12.366226 1.167970 24165
+LOGNORMAL 11.372759 1.953734 LOGNORMAL 13.412520 3.217313 611
+LOGNORMAL 11.334117 3.510132 LOGNORMAL 13.683294 3.114496 23701
diff --git a/tools/linsched/tests/mcarlo-sims/sim-319 b/tools/linsched/tests/mcarlo-sims/sim-319
new file mode 100644
index 00000000000000..40a822e169051e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-319
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.270808 3.470019 LOGNORMAL 12.809550 3.111755 10396
+LOGNORMAL 13.649613 1.046473 EXPONENTIAL 640512 17960
diff --git a/tools/linsched/tests/mcarlo-sims/sim-32 b/tools/linsched/tests/mcarlo-sims/sim-32
new file mode 100644
index 00000000000000..eb280056a7018f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-32
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.223771 3.913567 LOGNORMAL 12.692440 2.840377 2785
+LOGNORMAL 11.619145 2.970264 EXPONENTIAL 626400 24436
+LOGNORMAL 12.840593 2.839107 EXPONENTIAL 671777 1719
diff --git a/tools/linsched/tests/mcarlo-sims/sim-320 b/tools/linsched/tests/mcarlo-sims/sim-320
new file mode 100644
index 00000000000000..170b7053c39963
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-320
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.179449 3.007669 EXPONENTIAL 621398 15459
+LOGNORMAL 11.130416 2.903798 EXPONENTIAL 657506 20829
+LOGNORMAL 11.903729 3.969462 EXPONENTIAL 613686 23392
+LOGNORMAL 11.073082 2.281371 LOGNORMAL 13.872042 1.408584 15483
diff --git a/tools/linsched/tests/mcarlo-sims/sim-321 b/tools/linsched/tests/mcarlo-sims/sim-321
new file mode 100644
index 00000000000000..b1513c021de3e2
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-321
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.681056 2.503415 LOGNORMAL 12.760053 2.209894 23448
+LOGNORMAL 11.335591 1.272185 LOGNORMAL 11.736451 3.526110 5076
+LOGNORMAL 13.148203 3.855592 EXPONENTIAL 689526 2355
+LOGNORMAL 13.064445 3.123869 LOGNORMAL 11.782459 2.795803 19379
+LOGNORMAL 11.522266 3.728091 LOGNORMAL 12.767733 2.280747 28847
diff --git a/tools/linsched/tests/mcarlo-sims/sim-322 b/tools/linsched/tests/mcarlo-sims/sim-322
new file mode 100644
index 00000000000000..a71fa15ac8ac8d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-322
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.653362 1.058975 EXPONENTIAL 670237 20732
+LOGNORMAL 11.359891 1.681145 EXPONENTIAL 679199 418
+LOGNORMAL 11.236039 2.113470 LOGNORMAL 13.889199 1.767551 31395
+LOGNORMAL 13.151700 2.618422 EXPONENTIAL 694887 10176
diff --git a/tools/linsched/tests/mcarlo-sims/sim-323 b/tools/linsched/tests/mcarlo-sims/sim-323
new file mode 100644
index 00000000000000..7342d6f884e538
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-323
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.263269 3.761101 EXPONENTIAL 643994 28255
+LOGNORMAL 11.885583 1.996350 EXPONENTIAL 604868 25094
+LOGNORMAL 13.582086 3.116908 LOGNORMAL 12.551474 3.629237 8570
+LOGNORMAL 11.110185 1.887084 LOGNORMAL 12.344909 2.890826 7194
diff --git a/tools/linsched/tests/mcarlo-sims/sim-324 b/tools/linsched/tests/mcarlo-sims/sim-324
new file mode 100644
index 00000000000000..742e3508e67929
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-324
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.239957 3.949326 LOGNORMAL 12.792798 3.557996 10066
+LOGNORMAL 12.945736 2.983071 LOGNORMAL 13.611407 3.920863 11198
+LOGNORMAL 13.049532 1.482774 EXPONENTIAL 681226 29773
+LOGNORMAL 12.339348 2.422564 LOGNORMAL 12.207286 2.863053 15432
diff --git a/tools/linsched/tests/mcarlo-sims/sim-325 b/tools/linsched/tests/mcarlo-sims/sim-325
new file mode 100644
index 00000000000000..e305460b110fe4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-325
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 13.966095 1.150996 EXPONENTIAL 661123 15063
+LOGNORMAL 12.538941 2.979025 LOGNORMAL 12.218149 2.427533 20920
diff --git a/tools/linsched/tests/mcarlo-sims/sim-326 b/tools/linsched/tests/mcarlo-sims/sim-326
new file mode 100644
index 00000000000000..cd41d491e19242
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-326
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.698608 2.503675 LOGNORMAL 12.007830 1.594913 4402
+LOGNORMAL 13.190153 3.901807 EXPONENTIAL 663454 14547
+LOGNORMAL 11.414412 3.030384 EXPONENTIAL 629494 26764
+LOGNORMAL 11.806967 3.686316 LOGNORMAL 12.156354 1.846481 671
+LOGNORMAL 12.129294 3.043649 EXPONENTIAL 646078 25411
diff --git a/tools/linsched/tests/mcarlo-sims/sim-327 b/tools/linsched/tests/mcarlo-sims/sim-327
new file mode 100644
index 00000000000000..c75a1031bb8e10
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-327
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.112014 1.611156 EXPONENTIAL 607762 15145
+LOGNORMAL 13.943426 1.155373 LOGNORMAL 13.208866 3.418989 22900
+LOGNORMAL 13.750638 3.967782 EXPONENTIAL 682149 9768
+LOGNORMAL 12.971550 1.838735 LOGNORMAL 12.848975 2.725470 15691
+LOGNORMAL 12.931105 3.081727 EXPONENTIAL 611255 22599
diff --git a/tools/linsched/tests/mcarlo-sims/sim-328 b/tools/linsched/tests/mcarlo-sims/sim-328
new file mode 100644
index 00000000000000..3fd44e5a8b1711
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-328
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.259014 1.240310 EXPONENTIAL 642345 12611
+LOGNORMAL 11.733297 1.526979 EXPONENTIAL 625383 23486
+LOGNORMAL 12.629972 2.933685 EXPONENTIAL 601264 16869
+LOGNORMAL 12.350182 1.516803 EXPONENTIAL 685032 26541
+LOGNORMAL 12.520598 3.697683 EXPONENTIAL 697045 19227
diff --git a/tools/linsched/tests/mcarlo-sims/sim-329 b/tools/linsched/tests/mcarlo-sims/sim-329
new file mode 100644
index 00000000000000..ec867a982945f4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-329
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.238409 1.937950 EXPONENTIAL 669683 11421
+LOGNORMAL 11.192187 3.081173 EXPONENTIAL 696002 16316
diff --git a/tools/linsched/tests/mcarlo-sims/sim-33 b/tools/linsched/tests/mcarlo-sims/sim-33
new file mode 100644
index 00000000000000..b2b1cf326759dc
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-33
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.354931 1.319129 LOGNORMAL 13.823775 3.192262 27133
+LOGNORMAL 12.901455 2.749850 EXPONENTIAL 686610 31795
diff --git a/tools/linsched/tests/mcarlo-sims/sim-330 b/tools/linsched/tests/mcarlo-sims/sim-330
new file mode 100644
index 00000000000000..050122d705f1eb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-330
@@ -0,0 +1,6 @@
+ONE_GROUP 5
+LOGNORMAL 11.826681 2.026490 EXPONENTIAL 624985 20860
+LOGNORMAL 11.382332 3.854275 LOGNORMAL 12.577575 1.299362 27763
+LOGNORMAL 13.730060 3.110030 EXPONENTIAL 678746 5864
+LOGNORMAL 11.368910 3.262077 LOGNORMAL 11.057476 3.993418 11921
+LOGNORMAL 12.096549 1.691062 EXPONENTIAL 629323 1965
diff --git a/tools/linsched/tests/mcarlo-sims/sim-331 b/tools/linsched/tests/mcarlo-sims/sim-331
new file mode 100644
index 00000000000000..04a3aea1a661b5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-331
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.611748 3.650798 EXPONENTIAL 608531 12617
+LOGNORMAL 12.362058 3.103518 EXPONENTIAL 601466 31943
+LOGNORMAL 12.287220 2.308181 EXPONENTIAL 642615 14186
diff --git a/tools/linsched/tests/mcarlo-sims/sim-332 b/tools/linsched/tests/mcarlo-sims/sim-332
new file mode 100644
index 00000000000000..4fcb236a3333ef
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-332
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.373834 3.027631 LOGNORMAL 12.710763 1.792073 23573
+LOGNORMAL 13.003763 3.237212 EXPONENTIAL 657128 5925
diff --git a/tools/linsched/tests/mcarlo-sims/sim-333 b/tools/linsched/tests/mcarlo-sims/sim-333
new file mode 100644
index 00000000000000..8f5287a9bff961
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-333
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.529333 1.499098 LOGNORMAL 13.288677 3.793986 2542
+LOGNORMAL 11.412143 3.895359 LOGNORMAL 12.235175 3.584840 4184
+LOGNORMAL 11.029396 3.065042 EXPONENTIAL 699470 12182
+LOGNORMAL 11.359945 2.594107 EXPONENTIAL 627162 20658
+LOGNORMAL 13.824360 1.018316 EXPONENTIAL 644260 10709
diff --git a/tools/linsched/tests/mcarlo-sims/sim-334 b/tools/linsched/tests/mcarlo-sims/sim-334
new file mode 100644
index 00000000000000..0066bc701f2a85
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-334
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.867086 2.106095 EXPONENTIAL 615261 8901
+LOGNORMAL 11.143295 3.358984 LOGNORMAL 13.193646 2.611480 25053
+LOGNORMAL 12.665566 1.171020 EXPONENTIAL 612402 11691
diff --git a/tools/linsched/tests/mcarlo-sims/sim-335 b/tools/linsched/tests/mcarlo-sims/sim-335
new file mode 100644
index 00000000000000..ee1fc550a5bc15
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-335
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.805630 2.231602 EXPONENTIAL 610271 18980
+LOGNORMAL 12.742295 3.755098 LOGNORMAL 13.526480 1.556122 17495
+LOGNORMAL 11.570912 2.326128 LOGNORMAL 13.773224 2.568488 29097
diff --git a/tools/linsched/tests/mcarlo-sims/sim-336 b/tools/linsched/tests/mcarlo-sims/sim-336
new file mode 100644
index 00000000000000..3ac6c38fcadd8c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-336
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.565743 1.448397 EXPONENTIAL 636602 6426
+LOGNORMAL 12.310654 3.164790 EXPONENTIAL 619595 6035
+LOGNORMAL 12.527574 3.943754 LOGNORMAL 11.627216 3.622570 30348
+LOGNORMAL 12.422258 3.886831 LOGNORMAL 11.381140 1.826526 7328
+LOGNORMAL 13.491820 1.014265 EXPONENTIAL 666792 7033
diff --git a/tools/linsched/tests/mcarlo-sims/sim-337 b/tools/linsched/tests/mcarlo-sims/sim-337
new file mode 100644
index 00000000000000..3f5f30b2e94678
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-337
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 13.368200 2.335951 LOGNORMAL 11.303727 2.746913 5268
+LOGNORMAL 11.289228 2.051478 LOGNORMAL 11.366199 2.700916 14018
diff --git a/tools/linsched/tests/mcarlo-sims/sim-338 b/tools/linsched/tests/mcarlo-sims/sim-338
new file mode 100644
index 00000000000000..99077c25fb0476
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-338
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.185217 3.948303 LOGNORMAL 11.737732 1.056476 19624
+LOGNORMAL 13.087689 3.796078 LOGNORMAL 13.490714 3.436609 27755
+LOGNORMAL 12.984433 2.367270 EXPONENTIAL 680648 3236
diff --git a/tools/linsched/tests/mcarlo-sims/sim-339 b/tools/linsched/tests/mcarlo-sims/sim-339
new file mode 100644
index 00000000000000..cdb643d0d9f4bb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-339
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.355557 3.838317 LOGNORMAL 12.979382 1.472146 8850
+LOGNORMAL 13.785267 3.980584 EXPONENTIAL 612678 29066
+LOGNORMAL 12.436683 3.332051 EXPONENTIAL 643681 14679
diff --git a/tools/linsched/tests/mcarlo-sims/sim-34 b/tools/linsched/tests/mcarlo-sims/sim-34
new file mode 100644
index 00000000000000..6872b35776c5c5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-34
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.820836 3.794255 EXPONENTIAL 659526 27839
+LOGNORMAL 12.820589 2.643289 LOGNORMAL 13.803615 3.359482 11161
+LOGNORMAL 12.994456 2.829046 LOGNORMAL 11.080925 2.101981 26405
+LOGNORMAL 12.078910 2.241054 LOGNORMAL 12.848051 2.192960 24550
diff --git a/tools/linsched/tests/mcarlo-sims/sim-340 b/tools/linsched/tests/mcarlo-sims/sim-340
new file mode 100644
index 00000000000000..09e3962dd4537b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-340
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.004065 2.316002 LOGNORMAL 12.181170 1.929375 3232
+LOGNORMAL 12.491285 3.018965 EXPONENTIAL 665445 3446
+LOGNORMAL 12.448296 3.517302 EXPONENTIAL 643800 31869
diff --git a/tools/linsched/tests/mcarlo-sims/sim-341 b/tools/linsched/tests/mcarlo-sims/sim-341
new file mode 100644
index 00000000000000..72d7511f2824ce
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-341
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.438685 2.982112 EXPONENTIAL 604933 28830
+LOGNORMAL 11.892777 2.900935 LOGNORMAL 12.352642 3.848509 16624
+LOGNORMAL 13.000804 1.512242 LOGNORMAL 13.355572 3.091391 32513
diff --git a/tools/linsched/tests/mcarlo-sims/sim-342 b/tools/linsched/tests/mcarlo-sims/sim-342
new file mode 100644
index 00000000000000..2b1472a59ac2c5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-342
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 13.412437 1.826645 EXPONENTIAL 643070 27352
+LOGNORMAL 13.037505 3.339771 EXPONENTIAL 681940 12079
+LOGNORMAL 13.547980 2.907738 LOGNORMAL 13.688445 2.701407 32718
+LOGNORMAL 12.849998 1.919948 LOGNORMAL 11.244193 1.149869 28962
diff --git a/tools/linsched/tests/mcarlo-sims/sim-343 b/tools/linsched/tests/mcarlo-sims/sim-343
new file mode 100644
index 00000000000000..0c90d390965125
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-343
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.985966 3.133000 LOGNORMAL 13.408113 1.153031 22643
+LOGNORMAL 11.826753 3.233762 EXPONENTIAL 640633 4359
+LOGNORMAL 11.324405 2.275204 LOGNORMAL 11.995720 2.067253 3926
diff --git a/tools/linsched/tests/mcarlo-sims/sim-344 b/tools/linsched/tests/mcarlo-sims/sim-344
new file mode 100644
index 00000000000000..e7bc833f5fe96d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-344
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.261226 3.418264 LOGNORMAL 13.866933 2.540862 8681
+LOGNORMAL 13.044145 3.945714 LOGNORMAL 11.695534 2.845067 4312
+LOGNORMAL 13.939550 2.023882 LOGNORMAL 12.502949 1.065148 3058
+LOGNORMAL 11.386775 3.532747 EXPONENTIAL 616737 790
+LOGNORMAL 11.942680 1.629911 LOGNORMAL 13.822745 3.867076 16597
diff --git a/tools/linsched/tests/mcarlo-sims/sim-345 b/tools/linsched/tests/mcarlo-sims/sim-345
new file mode 100644
index 00000000000000..0e81e59fc8ecaf
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-345
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.691596 3.656695 LOGNORMAL 11.272989 2.127488 3530
+LOGNORMAL 11.025771 2.129174 LOGNORMAL 13.629400 3.321534 7886
+LOGNORMAL 12.419017 3.410558 EXPONENTIAL 656526 10170
diff --git a/tools/linsched/tests/mcarlo-sims/sim-346 b/tools/linsched/tests/mcarlo-sims/sim-346
new file mode 100644
index 00000000000000..79f3f34dd95649
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-346
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.352177 2.035014 LOGNORMAL 12.006222 1.574662 7219
+LOGNORMAL 11.312491 3.040184 EXPONENTIAL 606051 6456
+LOGNORMAL 12.906955 2.198438 LOGNORMAL 13.304158 2.975183 18320
+LOGNORMAL 12.268342 3.020886 EXPONENTIAL 662744 1392
diff --git a/tools/linsched/tests/mcarlo-sims/sim-347 b/tools/linsched/tests/mcarlo-sims/sim-347
new file mode 100644
index 00000000000000..4ca73308b13580
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-347
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.336497 1.511277 EXPONENTIAL 633177 28097
+LOGNORMAL 11.221087 2.802257 EXPONENTIAL 626108 16179
diff --git a/tools/linsched/tests/mcarlo-sims/sim-348 b/tools/linsched/tests/mcarlo-sims/sim-348
new file mode 100644
index 00000000000000..11fa8fa6d6573f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-348
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.263093 3.804588 LOGNORMAL 11.147462 1.398243 20427
+LOGNORMAL 13.151125 1.952402 LOGNORMAL 11.173294 3.553171 28835
+LOGNORMAL 11.277471 2.460839 EXPONENTIAL 643821 2210
diff --git a/tools/linsched/tests/mcarlo-sims/sim-349 b/tools/linsched/tests/mcarlo-sims/sim-349
new file mode 100644
index 00000000000000..ed8125b9bebb97
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-349
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 11.896082 1.445343 EXPONENTIAL 678885 10272
+LOGNORMAL 12.050010 2.516965 LOGNORMAL 11.981464 2.462489 5656
diff --git a/tools/linsched/tests/mcarlo-sims/sim-35 b/tools/linsched/tests/mcarlo-sims/sim-35
new file mode 100644
index 00000000000000..0a888de0e3d1e6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-35
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.995082 1.346442 EXPONENTIAL 634912 24623
+LOGNORMAL 12.258703 3.028590 EXPONENTIAL 662303 1513
+LOGNORMAL 11.749603 2.569983 LOGNORMAL 12.568012 2.574210 16999
diff --git a/tools/linsched/tests/mcarlo-sims/sim-350 b/tools/linsched/tests/mcarlo-sims/sim-350
new file mode 100644
index 00000000000000..707437c5e10990
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-350
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.149839 3.336494 EXPONENTIAL 644174 27286
+LOGNORMAL 12.477412 3.866447 LOGNORMAL 12.459745 3.926547 28950
diff --git a/tools/linsched/tests/mcarlo-sims/sim-351 b/tools/linsched/tests/mcarlo-sims/sim-351
new file mode 100644
index 00000000000000..186aeb16456ce5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-351
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.740202 3.573126 LOGNORMAL 13.554070 3.248214 24078
+LOGNORMAL 12.352859 1.496716 LOGNORMAL 12.267157 1.110392 6543
+LOGNORMAL 12.695978 2.307722 LOGNORMAL 12.205578 1.152894 13169
+LOGNORMAL 11.532771 3.287882 EXPONENTIAL 620575 5227
+LOGNORMAL 11.864655 1.259405 EXPONENTIAL 689089 16191
diff --git a/tools/linsched/tests/mcarlo-sims/sim-352 b/tools/linsched/tests/mcarlo-sims/sim-352
new file mode 100644
index 00000000000000..26abc841cd78cc
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-352
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.306178 3.936140 EXPONENTIAL 615176 6425
+LOGNORMAL 13.969890 1.942581 LOGNORMAL 13.440791 1.369487 29584
+LOGNORMAL 11.627794 1.335571 EXPONENTIAL 661636 17606
+LOGNORMAL 12.118151 1.772196 EXPONENTIAL 679760 15700
+LOGNORMAL 12.849228 3.979133 EXPONENTIAL 630931 3878
diff --git a/tools/linsched/tests/mcarlo-sims/sim-353 b/tools/linsched/tests/mcarlo-sims/sim-353
new file mode 100644
index 00000000000000..ca420c9e562e61
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-353
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.813940 1.886845 EXPONENTIAL 641081 7697
+LOGNORMAL 11.891789 1.298835 EXPONENTIAL 677011 10321
+LOGNORMAL 13.842009 3.647987 LOGNORMAL 11.488429 2.018316 10317
diff --git a/tools/linsched/tests/mcarlo-sims/sim-354 b/tools/linsched/tests/mcarlo-sims/sim-354
new file mode 100644
index 00000000000000..4627e66e410e08
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-354
@@ -0,0 +1,3 @@
+ONE_GROUP 2
+LOGNORMAL 12.973625 3.721904 LOGNORMAL 11.700035 3.487474 14466
+LOGNORMAL 12.786749 3.885500 EXPONENTIAL 615776 11455
diff --git a/tools/linsched/tests/mcarlo-sims/sim-355 b/tools/linsched/tests/mcarlo-sims/sim-355
new file mode 100644
index 00000000000000..f2ce12bf60f9ee
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-355
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.006146 3.291553 LOGNORMAL 13.564120 1.169454 18311
+LOGNORMAL 13.858655 1.407707 EXPONENTIAL 633628 4042
+LOGNORMAL 11.532796 3.700269 EXPONENTIAL 688357 21711
diff --git a/tools/linsched/tests/mcarlo-sims/sim-356 b/tools/linsched/tests/mcarlo-sims/sim-356
new file mode 100644
index 00000000000000..db16c8c0d3e830
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-356
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.483943 1.629085 LOGNORMAL 12.884939 1.169601 9559
+LOGNORMAL 11.992272 1.108442 LOGNORMAL 12.967509 2.920509 12402
diff --git a/tools/linsched/tests/mcarlo-sims/sim-357 b/tools/linsched/tests/mcarlo-sims/sim-357
new file mode 100644
index 00000000000000..3a4c3feb96f96f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-357
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.630225 1.186315 EXPONENTIAL 607934 24221
+LOGNORMAL 13.899481 3.583974 LOGNORMAL 12.440812 3.723145 16761
+LOGNORMAL 13.337755 3.649251 EXPONENTIAL 664775 2904
diff --git a/tools/linsched/tests/mcarlo-sims/sim-358 b/tools/linsched/tests/mcarlo-sims/sim-358
new file mode 100644
index 00000000000000..1300c7f03b7249
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-358
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.946875 3.128045 EXPONENTIAL 683984 2551
+LOGNORMAL 13.036742 2.515741 EXPONENTIAL 633561 22069
+LOGNORMAL 11.994136 2.442696 LOGNORMAL 12.267967 2.719164 28176
+LOGNORMAL 11.139484 2.315421 EXPONENTIAL 616398 4474
diff --git a/tools/linsched/tests/mcarlo-sims/sim-359 b/tools/linsched/tests/mcarlo-sims/sim-359
new file mode 100644
index 00000000000000..2a63c4fe875876
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-359
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.837029 2.949984 LOGNORMAL 11.923591 1.794243 5029
+LOGNORMAL 13.057708 3.900263 LOGNORMAL 11.392188 1.505626 32529
+LOGNORMAL 12.336635 1.825667 LOGNORMAL 13.062193 1.276393 27202
+LOGNORMAL 12.139042 1.870885 EXPONENTIAL 603774 12678
+LOGNORMAL 11.406942 3.467708 LOGNORMAL 13.053195 3.045065 28679
diff --git a/tools/linsched/tests/mcarlo-sims/sim-36 b/tools/linsched/tests/mcarlo-sims/sim-36
new file mode 100644
index 00000000000000..1a2f7b172da742
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-36
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.089186 2.947187 LOGNORMAL 13.900658 2.365686 15447
+LOGNORMAL 12.306086 1.391817 LOGNORMAL 12.508120 3.978301 5472
+LOGNORMAL 13.533188 3.284507 LOGNORMAL 13.884209 1.895670 7627
+LOGNORMAL 12.625564 3.854940 EXPONENTIAL 689799 10394
diff --git a/tools/linsched/tests/mcarlo-sims/sim-360 b/tools/linsched/tests/mcarlo-sims/sim-360
new file mode 100644
index 00000000000000..49421d6d31a5ec
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-360
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.997151 1.117506 EXPONENTIAL 620949 6425
+LOGNORMAL 12.139317 3.498194 EXPONENTIAL 625003 1887
diff --git a/tools/linsched/tests/mcarlo-sims/sim-361 b/tools/linsched/tests/mcarlo-sims/sim-361
new file mode 100644
index 00000000000000..5865c38569cf89
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-361
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 12.545372 3.065004 LOGNORMAL 12.632859 3.468171 26829
+LOGNORMAL 11.550074 3.089686 LOGNORMAL 12.446898 1.009315 15271
diff --git a/tools/linsched/tests/mcarlo-sims/sim-362 b/tools/linsched/tests/mcarlo-sims/sim-362
new file mode 100644
index 00000000000000..c46b34eeb28d4e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-362
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.059039 1.273473 LOGNORMAL 13.324157 3.098474 30600
+LOGNORMAL 12.452504 2.239473 EXPONENTIAL 672026 18849
+LOGNORMAL 11.978774 2.249217 EXPONENTIAL 662779 6087
diff --git a/tools/linsched/tests/mcarlo-sims/sim-363 b/tools/linsched/tests/mcarlo-sims/sim-363
new file mode 100644
index 00000000000000..6bd0a07b5aa69e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-363
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.303511 2.110868 LOGNORMAL 11.892328 1.360761 1927
+LOGNORMAL 11.048853 3.067404 EXPONENTIAL 697614 23582
+LOGNORMAL 11.456495 2.305588 EXPONENTIAL 691379 21931
diff --git a/tools/linsched/tests/mcarlo-sims/sim-364 b/tools/linsched/tests/mcarlo-sims/sim-364
new file mode 100644
index 00000000000000..6b0e1973a57433
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-364
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.608414 2.612116 LOGNORMAL 12.488450 3.372976 24650
+LOGNORMAL 13.096443 3.920276 EXPONENTIAL 640760 26638
+LOGNORMAL 12.751224 3.827591 LOGNORMAL 13.167511 1.363346 16826
+LOGNORMAL 11.297839 2.779375 LOGNORMAL 12.866906 1.088552 19649
+LOGNORMAL 12.645210 1.044615 LOGNORMAL 12.601343 1.776025 19739
diff --git a/tools/linsched/tests/mcarlo-sims/sim-365 b/tools/linsched/tests/mcarlo-sims/sim-365
new file mode 100644
index 00000000000000..784c6d59073dad
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-365
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.893859 1.081849 LOGNORMAL 13.698352 1.200565 15649
+LOGNORMAL 11.580967 3.318720 LOGNORMAL 11.219709 3.650002 28808
+LOGNORMAL 13.358565 2.408410 LOGNORMAL 13.131531 2.636244 10887
+LOGNORMAL 11.019822 1.152926 EXPONENTIAL 693716 15498
+LOGNORMAL 13.867825 2.542767 EXPONENTIAL 659867 17337
diff --git a/tools/linsched/tests/mcarlo-sims/sim-366 b/tools/linsched/tests/mcarlo-sims/sim-366
new file mode 100644
index 00000000000000..757be195b798fd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-366
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 11.271596 2.717996 LOGNORMAL 13.999388 2.710375 11453
+LOGNORMAL 12.788576 1.595234 EXPONENTIAL 604644 21309
+LOGNORMAL 13.134637 3.842862 EXPONENTIAL 647609 1719
+LOGNORMAL 11.716917 2.215751 EXPONENTIAL 670983 4088
diff --git a/tools/linsched/tests/mcarlo-sims/sim-367 b/tools/linsched/tests/mcarlo-sims/sim-367
new file mode 100644
index 00000000000000..f7d6991f160194
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-367
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.253371 3.410902 LOGNORMAL 11.872822 3.519561 16850
+LOGNORMAL 13.721145 3.278878 EXPONENTIAL 642535 2979
diff --git a/tools/linsched/tests/mcarlo-sims/sim-368 b/tools/linsched/tests/mcarlo-sims/sim-368
new file mode 100644
index 00000000000000..7e5b8e16b85547
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-368
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.812170 1.142846 EXPONENTIAL 673911 20360
+LOGNORMAL 13.240757 2.404592 EXPONENTIAL 684064 15705
+LOGNORMAL 12.044543 3.641478 EXPONENTIAL 652444 18389
diff --git a/tools/linsched/tests/mcarlo-sims/sim-369 b/tools/linsched/tests/mcarlo-sims/sim-369
new file mode 100644
index 00000000000000..140b44a52551f4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-369
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.973534 3.182598 EXPONENTIAL 647135 2612
+LOGNORMAL 11.660338 2.296648 EXPONENTIAL 607492 7842
diff --git a/tools/linsched/tests/mcarlo-sims/sim-37 b/tools/linsched/tests/mcarlo-sims/sim-37
new file mode 100644
index 00000000000000..22eb950436d8dd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-37
@@ -0,0 +1,5 @@
+ROOT 4
+LOGNORMAL 13.935532 3.484374 LOGNORMAL 12.496847 3.505916 15443
+LOGNORMAL 12.960695 2.392779 LOGNORMAL 11.998699 1.135417 7444
+LOGNORMAL 12.538325 1.624504 EXPONENTIAL 641741 26304
+LOGNORMAL 11.466894 3.080380 EXPONENTIAL 623282 146
diff --git a/tools/linsched/tests/mcarlo-sims/sim-370 b/tools/linsched/tests/mcarlo-sims/sim-370
new file mode 100644
index 00000000000000..f2e7883218e339
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-370
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.784012 2.889623 LOGNORMAL 11.522264 3.682917 28861
+LOGNORMAL 11.330603 1.443154 EXPONENTIAL 692854 17189
diff --git a/tools/linsched/tests/mcarlo-sims/sim-371 b/tools/linsched/tests/mcarlo-sims/sim-371
new file mode 100644
index 00000000000000..ad683d30d36149
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-371
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.526074 2.722144 LOGNORMAL 11.088786 2.234041 6435
+LOGNORMAL 11.931527 3.165906 EXPONENTIAL 685031 6131
+LOGNORMAL 11.221787 2.578368 EXPONENTIAL 680502 338
+LOGNORMAL 13.327455 1.535583 LOGNORMAL 12.891954 2.066301 20126
diff --git a/tools/linsched/tests/mcarlo-sims/sim-372 b/tools/linsched/tests/mcarlo-sims/sim-372
new file mode 100644
index 00000000000000..ce73c5b1d5443d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-372
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.349172 1.538982 LOGNORMAL 11.533050 1.966939 10458
+LOGNORMAL 12.523783 3.228358 EXPONENTIAL 607315 13503
diff --git a/tools/linsched/tests/mcarlo-sims/sim-373 b/tools/linsched/tests/mcarlo-sims/sim-373
new file mode 100644
index 00000000000000..5b8b2800fe9efa
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-373
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 12.389190 3.110781 LOGNORMAL 12.550546 3.018706 8767
+LOGNORMAL 11.430135 3.274735 EXPONENTIAL 694717 11602
diff --git a/tools/linsched/tests/mcarlo-sims/sim-374 b/tools/linsched/tests/mcarlo-sims/sim-374
new file mode 100644
index 00000000000000..e46a8cb88c91cd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-374
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.607859 3.290261 EXPONENTIAL 649054 19112
+LOGNORMAL 13.700111 3.768087 EXPONENTIAL 638370 12862
+LOGNORMAL 13.389974 2.295717 LOGNORMAL 13.009989 2.881858 23822
diff --git a/tools/linsched/tests/mcarlo-sims/sim-375 b/tools/linsched/tests/mcarlo-sims/sim-375
new file mode 100644
index 00000000000000..51412d5b7257cb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-375
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.045265 1.769314 EXPONENTIAL 697219 6884
+LOGNORMAL 12.698267 1.778709 LOGNORMAL 11.803113 1.921146 12340
+LOGNORMAL 12.152075 1.919174 EXPONENTIAL 673739 31449
diff --git a/tools/linsched/tests/mcarlo-sims/sim-376 b/tools/linsched/tests/mcarlo-sims/sim-376
new file mode 100644
index 00000000000000..952a28b101116b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-376
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.750021 2.606851 LOGNORMAL 12.315208 1.699872 6873
+LOGNORMAL 12.761112 2.007691 EXPONENTIAL 603400 22352
+LOGNORMAL 11.377710 1.169257 EXPONENTIAL 663551 6444
diff --git a/tools/linsched/tests/mcarlo-sims/sim-377 b/tools/linsched/tests/mcarlo-sims/sim-377
new file mode 100644
index 00000000000000..8ff168cd2c2415
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-377
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.461401 1.769200 EXPONENTIAL 601532 27276
+LOGNORMAL 11.322695 3.540369 EXPONENTIAL 609484 25329
+LOGNORMAL 13.120923 1.357336 LOGNORMAL 11.682445 1.848880 23319
+LOGNORMAL 13.074998 3.486975 LOGNORMAL 12.455714 2.185165 26001
+LOGNORMAL 12.438943 2.314391 LOGNORMAL 13.718212 1.982355 17802
diff --git a/tools/linsched/tests/mcarlo-sims/sim-378 b/tools/linsched/tests/mcarlo-sims/sim-378
new file mode 100644
index 00000000000000..45bf76ecaf9c58
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-378
@@ -0,0 +1,3 @@
+ONE_GROUP 2
+LOGNORMAL 11.592097 1.378133 EXPONENTIAL 677546 3121
+LOGNORMAL 12.706613 1.051704 EXPONENTIAL 600092 2143
diff --git a/tools/linsched/tests/mcarlo-sims/sim-379 b/tools/linsched/tests/mcarlo-sims/sim-379
new file mode 100644
index 00000000000000..e85efe29862a96
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-379
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.566424 3.887254 EXPONENTIAL 693846 27280
+LOGNORMAL 13.924932 2.337278 LOGNORMAL 11.378986 1.617774 15145
diff --git a/tools/linsched/tests/mcarlo-sims/sim-38 b/tools/linsched/tests/mcarlo-sims/sim-38
new file mode 100644
index 00000000000000..b223ae78a3f7b0
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-38
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.039333 2.072546 EXPONENTIAL 694210 29979
+LOGNORMAL 13.901417 3.118786 EXPONENTIAL 632313 28806
+LOGNORMAL 11.815882 3.524229 LOGNORMAL 12.386941 1.312775 16788
+LOGNORMAL 12.723999 2.249810 EXPONENTIAL 669022 10197
+LOGNORMAL 13.838678 1.657218 LOGNORMAL 12.168042 3.278684 26356
diff --git a/tools/linsched/tests/mcarlo-sims/sim-380 b/tools/linsched/tests/mcarlo-sims/sim-380
new file mode 100644
index 00000000000000..c5d82e8a59005c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-380
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.215079 1.839894 LOGNORMAL 13.227400 2.910348 12433
+LOGNORMAL 11.752569 1.421505 EXPONENTIAL 691552 6940
+LOGNORMAL 12.743764 1.443967 EXPONENTIAL 622077 8834
diff --git a/tools/linsched/tests/mcarlo-sims/sim-381 b/tools/linsched/tests/mcarlo-sims/sim-381
new file mode 100644
index 00000000000000..cfc687fef5980a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-381
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.472380 1.292009 EXPONENTIAL 677365 1122
+LOGNORMAL 12.834193 3.273425 LOGNORMAL 12.509346 3.579035 27338
+LOGNORMAL 12.621622 3.601970 LOGNORMAL 11.661896 1.494355 4288
+LOGNORMAL 13.445796 1.490998 EXPONENTIAL 652947 25322
+LOGNORMAL 12.551689 1.245090 EXPONENTIAL 645787 12160
diff --git a/tools/linsched/tests/mcarlo-sims/sim-382 b/tools/linsched/tests/mcarlo-sims/sim-382
new file mode 100644
index 00000000000000..3a47ad6781663f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-382
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.419812 1.777778 LOGNORMAL 11.073435 2.217970 9149
+LOGNORMAL 12.605768 1.136237 EXPONENTIAL 671616 6888
+LOGNORMAL 11.607438 1.209635 EXPONENTIAL 625329 19269
+LOGNORMAL 11.638362 1.942977 EXPONENTIAL 659553 30634
+LOGNORMAL 12.453330 1.110649 EXPONENTIAL 628348 23065
diff --git a/tools/linsched/tests/mcarlo-sims/sim-383 b/tools/linsched/tests/mcarlo-sims/sim-383
new file mode 100644
index 00000000000000..8f6d7687a45b9f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-383
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.693168 2.071459 EXPONENTIAL 639770 1854
+LOGNORMAL 13.256762 1.403133 EXPONENTIAL 696131 13079
diff --git a/tools/linsched/tests/mcarlo-sims/sim-384 b/tools/linsched/tests/mcarlo-sims/sim-384
new file mode 100644
index 00000000000000..9dcf42a9812649
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-384
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.572551 3.864781 EXPONENTIAL 602026 7901
+LOGNORMAL 13.494830 3.603079 LOGNORMAL 12.159901 1.452281 5305
+LOGNORMAL 11.696255 2.961202 EXPONENTIAL 687691 6874
+LOGNORMAL 13.150812 2.704516 LOGNORMAL 13.125652 2.838648 1901
diff --git a/tools/linsched/tests/mcarlo-sims/sim-385 b/tools/linsched/tests/mcarlo-sims/sim-385
new file mode 100644
index 00000000000000..30006368a981db
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-385
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 12.348177 3.808788 LOGNORMAL 13.261614 1.953611 3618
+LOGNORMAL 11.042740 2.323814 EXPONENTIAL 673517 31577
+LOGNORMAL 12.071927 1.876859 LOGNORMAL 12.058469 3.692870 14821
+LOGNORMAL 11.003556 3.774028 EXPONENTIAL 606116 14599
+LOGNORMAL 11.944362 2.885561 EXPONENTIAL 677606 5185
diff --git a/tools/linsched/tests/mcarlo-sims/sim-386 b/tools/linsched/tests/mcarlo-sims/sim-386
new file mode 100644
index 00000000000000..cdd673ddfca2dd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-386
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.550602 3.967966 EXPONENTIAL 680624 9062
+LOGNORMAL 13.437700 3.419050 LOGNORMAL 11.606163 3.773632 21504
+LOGNORMAL 12.786700 3.060468 EXPONENTIAL 625332 4462
diff --git a/tools/linsched/tests/mcarlo-sims/sim-387 b/tools/linsched/tests/mcarlo-sims/sim-387
new file mode 100644
index 00000000000000..05299d0f6c4e01
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-387
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.234758 2.573040 LOGNORMAL 12.217796 2.495700 25370
+LOGNORMAL 11.501578 1.016052 LOGNORMAL 12.208470 1.762748 26947
+LOGNORMAL 13.660208 2.111534 LOGNORMAL 11.064061 3.674401 32168
+LOGNORMAL 13.748232 2.542323 EXPONENTIAL 648503 24933
+LOGNORMAL 11.580429 3.277479 LOGNORMAL 11.290767 3.921674 27267
diff --git a/tools/linsched/tests/mcarlo-sims/sim-388 b/tools/linsched/tests/mcarlo-sims/sim-388
new file mode 100644
index 00000000000000..e7c58fbad77972
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-388
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.770542 2.491043 LOGNORMAL 13.284156 2.803878 16685
+LOGNORMAL 12.637787 2.293635 LOGNORMAL 12.695971 2.178000 6538
+LOGNORMAL 11.656408 2.250012 LOGNORMAL 12.360405 2.330199 514
+LOGNORMAL 12.314639 1.140259 EXPONENTIAL 695248 2528
+LOGNORMAL 12.200808 1.982495 LOGNORMAL 13.584969 3.565788 31622
diff --git a/tools/linsched/tests/mcarlo-sims/sim-389 b/tools/linsched/tests/mcarlo-sims/sim-389
new file mode 100644
index 00000000000000..0fbfe82abbbf28
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-389
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.626033 2.740962 LOGNORMAL 12.688393 3.820886 21692
+LOGNORMAL 12.250756 1.451274 EXPONENTIAL 606029 18373
+LOGNORMAL 12.477091 1.467168 EXPONENTIAL 634339 30017
+LOGNORMAL 11.774530 1.527941 EXPONENTIAL 698448 22942
+LOGNORMAL 12.777153 1.609246 EXPONENTIAL 645621 23592
diff --git a/tools/linsched/tests/mcarlo-sims/sim-39 b/tools/linsched/tests/mcarlo-sims/sim-39
new file mode 100644
index 00000000000000..2b1e438178cf57
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-39
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.570662 3.116316 EXPONENTIAL 617093 19274
+LOGNORMAL 12.176992 3.708083 LOGNORMAL 12.823115 3.092413 1574
+LOGNORMAL 13.499903 1.865533 LOGNORMAL 11.416112 1.600256 18493
diff --git a/tools/linsched/tests/mcarlo-sims/sim-390 b/tools/linsched/tests/mcarlo-sims/sim-390
new file mode 100644
index 00000000000000..c94c8e8b50551a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-390
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 12.128071 3.482243 EXPONENTIAL 629162 24657
+LOGNORMAL 12.707203 1.957586 LOGNORMAL 13.968793 1.496502 12440
+LOGNORMAL 11.327283 2.642354 EXPONENTIAL 630267 31674
+LOGNORMAL 12.319358 2.450032 EXPONENTIAL 684604 3339
diff --git a/tools/linsched/tests/mcarlo-sims/sim-391 b/tools/linsched/tests/mcarlo-sims/sim-391
new file mode 100644
index 00000000000000..86ead397d186e6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-391
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.460485 3.367649 LOGNORMAL 12.828188 1.360056 30763
+LOGNORMAL 11.165982 3.662465 EXPONENTIAL 693889 10146
+LOGNORMAL 13.679652 1.911717 EXPONENTIAL 633836 14025
+LOGNORMAL 12.601596 3.024687 LOGNORMAL 12.362474 1.097733 32504
+LOGNORMAL 11.001334 2.421750 LOGNORMAL 12.062185 3.149997 28357
diff --git a/tools/linsched/tests/mcarlo-sims/sim-392 b/tools/linsched/tests/mcarlo-sims/sim-392
new file mode 100644
index 00000000000000..68a330bea68d40
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-392
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.761955 3.186012 LOGNORMAL 11.396751 3.191632 13512
+LOGNORMAL 12.700702 3.700634 LOGNORMAL 12.722330 1.206622 30603
+LOGNORMAL 13.585950 2.065379 EXPONENTIAL 612047 27052
+LOGNORMAL 11.498138 3.212813 EXPONENTIAL 644440 17408
diff --git a/tools/linsched/tests/mcarlo-sims/sim-393 b/tools/linsched/tests/mcarlo-sims/sim-393
new file mode 100644
index 00000000000000..4c251f0100a772
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-393
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.113240 3.220076 EXPONENTIAL 643567 17866
+LOGNORMAL 11.885993 2.882913 LOGNORMAL 12.722844 3.843154 2646
+LOGNORMAL 12.827755 3.080499 EXPONENTIAL 670640 12122
+LOGNORMAL 11.799327 1.284405 LOGNORMAL 12.147936 1.362575 28455
+LOGNORMAL 11.603885 1.501724 LOGNORMAL 11.734103 3.069352 16403
diff --git a/tools/linsched/tests/mcarlo-sims/sim-394 b/tools/linsched/tests/mcarlo-sims/sim-394
new file mode 100644
index 00000000000000..b43bbc014d3a81
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-394
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.736754 3.632683 EXPONENTIAL 652445 3796
+LOGNORMAL 11.133675 3.670296 LOGNORMAL 13.730107 3.901299 16647
+LOGNORMAL 12.588452 1.105535 EXPONENTIAL 687918 1395
diff --git a/tools/linsched/tests/mcarlo-sims/sim-395 b/tools/linsched/tests/mcarlo-sims/sim-395
new file mode 100644
index 00000000000000..2fa6a75a9d2798
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-395
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.875994 3.834658 LOGNORMAL 12.563678 1.733378 22393
+LOGNORMAL 13.723233 2.385404 EXPONENTIAL 621704 28066
+LOGNORMAL 11.987086 3.958032 LOGNORMAL 11.077168 1.959123 23116
+LOGNORMAL 11.386219 3.175548 EXPONENTIAL 626632 20559
+LOGNORMAL 12.974775 2.044458 EXPONENTIAL 609987 12570
diff --git a/tools/linsched/tests/mcarlo-sims/sim-396 b/tools/linsched/tests/mcarlo-sims/sim-396
new file mode 100644
index 00000000000000..8bc226bcc80933
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-396
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.269927 3.669447 LOGNORMAL 12.459305 2.540208 32720
+LOGNORMAL 12.257139 3.741405 LOGNORMAL 12.155432 1.343860 25955
+LOGNORMAL 11.829986 3.572682 LOGNORMAL 12.654120 3.792814 5709
+LOGNORMAL 11.536299 2.569412 EXPONENTIAL 626454 14557
diff --git a/tools/linsched/tests/mcarlo-sims/sim-397 b/tools/linsched/tests/mcarlo-sims/sim-397
new file mode 100644
index 00000000000000..d561bf85214b23
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-397
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 11.573065 2.510062 EXPONENTIAL 679646 9519
+LOGNORMAL 11.587770 3.647629 EXPONENTIAL 628173 23118
+LOGNORMAL 12.792416 3.139653 EXPONENTIAL 636559 27515
+LOGNORMAL 11.123778 2.334623 EXPONENTIAL 628381 1994
+LOGNORMAL 11.022089 3.251042 EXPONENTIAL 608008 3949
diff --git a/tools/linsched/tests/mcarlo-sims/sim-398 b/tools/linsched/tests/mcarlo-sims/sim-398
new file mode 100644
index 00000000000000..b910fb150cf557
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-398
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.155629 2.656958 EXPONENTIAL 678096 10030
+LOGNORMAL 12.032099 1.492827 EXPONENTIAL 603167 2501
+LOGNORMAL 11.630599 3.482629 EXPONENTIAL 694259 15307
+LOGNORMAL 13.519127 3.970504 LOGNORMAL 12.604532 1.366783 12080
+LOGNORMAL 12.116230 2.484408 EXPONENTIAL 622052 19221
diff --git a/tools/linsched/tests/mcarlo-sims/sim-399 b/tools/linsched/tests/mcarlo-sims/sim-399
new file mode 100644
index 00000000000000..76b6099c158ebf
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-399
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.724325 2.732472 LOGNORMAL 11.265710 2.795842 25477
+LOGNORMAL 11.355534 3.457603 LOGNORMAL 12.993312 1.594773 18980
diff --git a/tools/linsched/tests/mcarlo-sims/sim-4 b/tools/linsched/tests/mcarlo-sims/sim-4
new file mode 100644
index 00000000000000..d81f64fe2879f2
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-4
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.352650 1.982653 EXPONENTIAL 681399 8703
+LOGNORMAL 11.261561 2.063949 EXPONENTIAL 611590 7059
+LOGNORMAL 13.733747 2.091916 LOGNORMAL 11.119722 3.175149 4753
+LOGNORMAL 13.269429 1.296797 LOGNORMAL 12.989370 1.344456 4151
+LOGNORMAL 13.232286 1.030805 LOGNORMAL 13.695460 3.588340 20329
diff --git a/tools/linsched/tests/mcarlo-sims/sim-40 b/tools/linsched/tests/mcarlo-sims/sim-40
new file mode 100644
index 00000000000000..c58d4772cc14e5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-40
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.898150 1.208706 LOGNORMAL 11.084641 1.553989 29014
+LOGNORMAL 13.421128 3.894776 EXPONENTIAL 631009 7113
+LOGNORMAL 11.004512 1.834231 LOGNORMAL 13.918148 2.311061 21177
+LOGNORMAL 13.524234 2.806694 LOGNORMAL 13.895737 3.653509 17129
diff --git a/tools/linsched/tests/mcarlo-sims/sim-400 b/tools/linsched/tests/mcarlo-sims/sim-400
new file mode 100644
index 00000000000000..e12bab4c3be3e4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-400
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.378683 3.525069 LOGNORMAL 11.592400 3.464412 4948
+LOGNORMAL 11.942198 2.513606 EXPONENTIAL 615293 9815
+LOGNORMAL 13.939885 1.646518 EXPONENTIAL 659617 16957
+LOGNORMAL 12.546739 2.036893 LOGNORMAL 11.664243 1.929348 26939
+LOGNORMAL 12.657302 3.267680 EXPONENTIAL 681701 25786
diff --git a/tools/linsched/tests/mcarlo-sims/sim-401 b/tools/linsched/tests/mcarlo-sims/sim-401
new file mode 100644
index 00000000000000..37408ddf0937e8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-401
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.826105 3.347549 EXPONENTIAL 651264 16107
+LOGNORMAL 12.198129 1.949848 EXPONENTIAL 611438 22445
+LOGNORMAL 13.174517 2.105788 LOGNORMAL 13.400602 3.918735 30319
+LOGNORMAL 13.389912 1.243524 EXPONENTIAL 673890 14904
diff --git a/tools/linsched/tests/mcarlo-sims/sim-402 b/tools/linsched/tests/mcarlo-sims/sim-402
new file mode 100644
index 00000000000000..86b11c9b8ee205
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-402
@@ -0,0 +1,3 @@
+ONE_GROUP 2
+LOGNORMAL 11.928396 1.544694 EXPONENTIAL 692516 5446
+LOGNORMAL 11.170845 1.398263 LOGNORMAL 12.646684 1.810565 22198
diff --git a/tools/linsched/tests/mcarlo-sims/sim-403 b/tools/linsched/tests/mcarlo-sims/sim-403
new file mode 100644
index 00000000000000..81a3f783f479bf
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-403
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.549209 1.557112 EXPONENTIAL 630371 7160
+LOGNORMAL 11.751978 3.501817 LOGNORMAL 11.001015 3.060436 25349
+LOGNORMAL 13.163932 1.205528 LOGNORMAL 12.076841 3.471242 3600
+LOGNORMAL 12.561606 2.904187 LOGNORMAL 12.138998 1.145568 24259
+LOGNORMAL 13.169930 3.010659 LOGNORMAL 13.293795 2.819371 11561
diff --git a/tools/linsched/tests/mcarlo-sims/sim-404 b/tools/linsched/tests/mcarlo-sims/sim-404
new file mode 100644
index 00000000000000..3ca9bac01246d7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-404
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.193543 2.871694 LOGNORMAL 12.086689 3.979722 3460
+LOGNORMAL 12.878058 2.515531 EXPONENTIAL 698718 10020
+LOGNORMAL 11.648974 3.310025 LOGNORMAL 13.183917 1.097855 27725
diff --git a/tools/linsched/tests/mcarlo-sims/sim-405 b/tools/linsched/tests/mcarlo-sims/sim-405
new file mode 100644
index 00000000000000..a50aebd8033ab8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-405
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.248185 3.248283 LOGNORMAL 11.551009 3.816579 5804
+LOGNORMAL 12.690112 2.709768 EXPONENTIAL 647495 16399
diff --git a/tools/linsched/tests/mcarlo-sims/sim-406 b/tools/linsched/tests/mcarlo-sims/sim-406
new file mode 100644
index 00000000000000..0dc523d4660b31
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-406
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.598445 3.071167 LOGNORMAL 12.758189 3.881157 2476
+LOGNORMAL 11.449705 2.194706 LOGNORMAL 11.329991 3.155736 15137
diff --git a/tools/linsched/tests/mcarlo-sims/sim-407 b/tools/linsched/tests/mcarlo-sims/sim-407
new file mode 100644
index 00000000000000..940b71e8b00f24
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-407
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.892094 2.423119 LOGNORMAL 11.807966 2.492943 29852
+LOGNORMAL 11.917083 3.409893 EXPONENTIAL 648309 30374
+LOGNORMAL 11.544069 1.170893 LOGNORMAL 12.746870 2.648096 19616
diff --git a/tools/linsched/tests/mcarlo-sims/sim-408 b/tools/linsched/tests/mcarlo-sims/sim-408
new file mode 100644
index 00000000000000..0e3c9946239a43
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-408
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.764872 1.209544 LOGNORMAL 12.371072 1.609434 25314
+LOGNORMAL 13.807452 1.845486 LOGNORMAL 13.807294 2.185209 6012
diff --git a/tools/linsched/tests/mcarlo-sims/sim-409 b/tools/linsched/tests/mcarlo-sims/sim-409
new file mode 100644
index 00000000000000..d021820606f54b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-409
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 13.322177 2.827264 EXPONENTIAL 655909 1661
+LOGNORMAL 13.988909 3.586614 LOGNORMAL 12.038762 2.470280 6600
diff --git a/tools/linsched/tests/mcarlo-sims/sim-41 b/tools/linsched/tests/mcarlo-sims/sim-41
new file mode 100644
index 00000000000000..177059901881ac
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-41
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.843004 1.366466 EXPONENTIAL 686098 20835
+LOGNORMAL 11.353960 1.005594 EXPONENTIAL 675731 26653
+LOGNORMAL 13.649138 2.066183 EXPONENTIAL 644855 29782
diff --git a/tools/linsched/tests/mcarlo-sims/sim-410 b/tools/linsched/tests/mcarlo-sims/sim-410
new file mode 100644
index 00000000000000..f5f31877c5184c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-410
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.049584 2.359601 EXPONENTIAL 605257 28867
+LOGNORMAL 12.141371 2.019409 EXPONENTIAL 663196 20814
diff --git a/tools/linsched/tests/mcarlo-sims/sim-411 b/tools/linsched/tests/mcarlo-sims/sim-411
new file mode 100644
index 00000000000000..8cea82a627c1e7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-411
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.898172 1.572867 LOGNORMAL 13.420959 1.058124 9414
+LOGNORMAL 11.363380 3.334516 LOGNORMAL 12.366311 2.583290 4610
+LOGNORMAL 13.476546 2.313752 EXPONENTIAL 665894 28888
+LOGNORMAL 11.644335 3.344830 LOGNORMAL 12.149037 1.871461 5301
diff --git a/tools/linsched/tests/mcarlo-sims/sim-412 b/tools/linsched/tests/mcarlo-sims/sim-412
new file mode 100644
index 00000000000000..9f907f22c10db3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-412
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.962692 2.956844 EXPONENTIAL 650405 25550
+LOGNORMAL 11.014303 1.387300 EXPONENTIAL 657660 14676
+LOGNORMAL 12.079791 2.053013 LOGNORMAL 11.774664 3.780691 26457
+LOGNORMAL 12.323118 2.649615 EXPONENTIAL 646495 18080
+LOGNORMAL 11.857858 1.026361 EXPONENTIAL 629501 29837
diff --git a/tools/linsched/tests/mcarlo-sims/sim-413 b/tools/linsched/tests/mcarlo-sims/sim-413
new file mode 100644
index 00000000000000..155d8d23a31bb7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-413
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.011589 3.771408 LOGNORMAL 11.338041 3.449516 9934
+LOGNORMAL 11.370389 1.121733 EXPONENTIAL 639787 25324
diff --git a/tools/linsched/tests/mcarlo-sims/sim-414 b/tools/linsched/tests/mcarlo-sims/sim-414
new file mode 100644
index 00000000000000..5e050573d3d7bb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-414
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 12.016421 1.983396 EXPONENTIAL 674607 23666
+LOGNORMAL 13.610633 2.905642 EXPONENTIAL 678305 28243
+LOGNORMAL 13.045522 3.095622 LOGNORMAL 13.782204 3.501044 10171
+LOGNORMAL 13.227970 3.491092 LOGNORMAL 11.076961 1.480647 15529
diff --git a/tools/linsched/tests/mcarlo-sims/sim-415 b/tools/linsched/tests/mcarlo-sims/sim-415
new file mode 100644
index 00000000000000..345893fe9babc8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-415
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.402401 1.147429 LOGNORMAL 11.245107 1.506896 23300
+LOGNORMAL 12.930328 2.015744 LOGNORMAL 11.283378 2.728323 1239
+LOGNORMAL 12.566316 1.075199 EXPONENTIAL 663095 3667
diff --git a/tools/linsched/tests/mcarlo-sims/sim-416 b/tools/linsched/tests/mcarlo-sims/sim-416
new file mode 100644
index 00000000000000..548e4e44c68b3c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-416
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.511239 3.397295 EXPONENTIAL 658153 6619
+LOGNORMAL 13.906027 2.597259 LOGNORMAL 11.426165 2.554882 10183
+LOGNORMAL 12.374807 1.380148 EXPONENTIAL 630757 14979
+LOGNORMAL 11.339745 2.100648 EXPONENTIAL 623401 5042
diff --git a/tools/linsched/tests/mcarlo-sims/sim-417 b/tools/linsched/tests/mcarlo-sims/sim-417
new file mode 100644
index 00000000000000..825ec417572472
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-417
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.526295 2.445359 LOGNORMAL 13.148851 2.746446 10216
+LOGNORMAL 11.423142 2.747314 EXPONENTIAL 699822 15345
diff --git a/tools/linsched/tests/mcarlo-sims/sim-418 b/tools/linsched/tests/mcarlo-sims/sim-418
new file mode 100644
index 00000000000000..ae20a0bf2bd1d6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-418
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.530116 3.666190 EXPONENTIAL 623116 17328
+LOGNORMAL 11.214777 1.764596 EXPONENTIAL 600190 10277
diff --git a/tools/linsched/tests/mcarlo-sims/sim-419 b/tools/linsched/tests/mcarlo-sims/sim-419
new file mode 100644
index 00000000000000..10cbe9d378c05f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-419
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.926106 3.058053 LOGNORMAL 11.846214 3.312901 8672
+LOGNORMAL 11.653057 2.933235 LOGNORMAL 11.718462 1.189960 15842
diff --git a/tools/linsched/tests/mcarlo-sims/sim-42 b/tools/linsched/tests/mcarlo-sims/sim-42
new file mode 100644
index 00000000000000..d966acedfe0439
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-42
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 12.796350 3.249331 LOGNORMAL 12.029304 2.512869 24967
+LOGNORMAL 13.914207 2.081875 LOGNORMAL 12.862935 3.344375 3113
+LOGNORMAL 13.315280 3.909148 LOGNORMAL 13.071618 3.689017 11609
+LOGNORMAL 11.453631 2.172502 EXPONENTIAL 638752 28145
diff --git a/tools/linsched/tests/mcarlo-sims/sim-420 b/tools/linsched/tests/mcarlo-sims/sim-420
new file mode 100644
index 00000000000000..023c3314815d7b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-420
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.266102 3.369007 LOGNORMAL 12.672097 2.935638 16044
+LOGNORMAL 12.572335 3.241016 LOGNORMAL 12.163897 2.624952 14459
+LOGNORMAL 11.699142 3.474721 LOGNORMAL 12.462716 2.868370 20580
+LOGNORMAL 13.985266 2.366954 EXPONENTIAL 671255 30580
diff --git a/tools/linsched/tests/mcarlo-sims/sim-421 b/tools/linsched/tests/mcarlo-sims/sim-421
new file mode 100644
index 00000000000000..2ae82e8832376b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-421
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 11.362849 3.410647 LOGNORMAL 13.359688 3.276573 15788
+LOGNORMAL 11.151360 3.907771 LOGNORMAL 13.987615 2.848882 14679
diff --git a/tools/linsched/tests/mcarlo-sims/sim-422 b/tools/linsched/tests/mcarlo-sims/sim-422
new file mode 100644
index 00000000000000..145c44f190f6fb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-422
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.644650 1.629453 EXPONENTIAL 604854 399
+LOGNORMAL 12.706021 3.098980 EXPONENTIAL 611873 1940
+LOGNORMAL 12.967775 1.387315 EXPONENTIAL 685777 24171
+LOGNORMAL 11.478024 1.153294 LOGNORMAL 12.394784 1.134794 1665
+LOGNORMAL 11.809791 3.161001 EXPONENTIAL 648755 22008
diff --git a/tools/linsched/tests/mcarlo-sims/sim-423 b/tools/linsched/tests/mcarlo-sims/sim-423
new file mode 100644
index 00000000000000..232dec965a0da2
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-423
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.614999 1.291871 EXPONENTIAL 613273 1808
+LOGNORMAL 12.890807 3.797913 EXPONENTIAL 633085 20461
+LOGNORMAL 12.544707 3.887258 LOGNORMAL 13.725346 1.890792 802
+LOGNORMAL 11.598316 3.893785 EXPONENTIAL 624925 2016
diff --git a/tools/linsched/tests/mcarlo-sims/sim-424 b/tools/linsched/tests/mcarlo-sims/sim-424
new file mode 100644
index 00000000000000..6c6723f7f64961
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-424
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.980807 3.430807 LOGNORMAL 12.346744 3.724459 28802
+LOGNORMAL 13.886397 2.678252 EXPONENTIAL 672451 13453
+LOGNORMAL 13.996859 2.202695 EXPONENTIAL 637567 23156
diff --git a/tools/linsched/tests/mcarlo-sims/sim-425 b/tools/linsched/tests/mcarlo-sims/sim-425
new file mode 100644
index 00000000000000..410e70ed6e4f66
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-425
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.135221 2.660776 LOGNORMAL 12.071352 1.219738 23622
+LOGNORMAL 11.267406 1.290581 EXPONENTIAL 627631 13560
diff --git a/tools/linsched/tests/mcarlo-sims/sim-426 b/tools/linsched/tests/mcarlo-sims/sim-426
new file mode 100644
index 00000000000000..4611cc57e0b45d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-426
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 12.681247 3.725367 EXPONENTIAL 671342 22467
+LOGNORMAL 11.747662 2.951468 LOGNORMAL 13.559343 1.875930 3300
+LOGNORMAL 11.352385 1.529097 LOGNORMAL 13.811573 2.107774 5124
diff --git a/tools/linsched/tests/mcarlo-sims/sim-427 b/tools/linsched/tests/mcarlo-sims/sim-427
new file mode 100644
index 00000000000000..eb1824a658beb3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-427
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.033910 2.931408 EXPONENTIAL 626356 25555
+LOGNORMAL 11.619815 2.233450 EXPONENTIAL 644887 24137
+LOGNORMAL 11.328886 2.586884 EXPONENTIAL 634135 14913
+LOGNORMAL 11.042714 1.897152 LOGNORMAL 11.600373 2.472782 8552
+LOGNORMAL 13.909393 2.160167 EXPONENTIAL 632748 20900
diff --git a/tools/linsched/tests/mcarlo-sims/sim-428 b/tools/linsched/tests/mcarlo-sims/sim-428
new file mode 100644
index 00000000000000..a227ea2bb6b33d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-428
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.194688 2.119123 EXPONENTIAL 635144 9493
+LOGNORMAL 13.917372 1.267830 EXPONENTIAL 618759 13314
diff --git a/tools/linsched/tests/mcarlo-sims/sim-429 b/tools/linsched/tests/mcarlo-sims/sim-429
new file mode 100644
index 00000000000000..c435f3f8f43442
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-429
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.337326 3.436970 EXPONENTIAL 669578 26364
+LOGNORMAL 12.939662 2.893657 EXPONENTIAL 629568 19104
+LOGNORMAL 11.718231 3.301702 LOGNORMAL 13.477498 3.313543 29194
+LOGNORMAL 11.626072 2.392922 EXPONENTIAL 693759 18315
diff --git a/tools/linsched/tests/mcarlo-sims/sim-43 b/tools/linsched/tests/mcarlo-sims/sim-43
new file mode 100644
index 00000000000000..12146604a6620c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-43
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.022343 3.523198 EXPONENTIAL 687253 27044
+LOGNORMAL 11.690944 3.698424 EXPONENTIAL 636164 26183
+LOGNORMAL 11.589357 3.323042 LOGNORMAL 13.273168 1.139263 28656
diff --git a/tools/linsched/tests/mcarlo-sims/sim-430 b/tools/linsched/tests/mcarlo-sims/sim-430
new file mode 100644
index 00000000000000..56d3579bc2c3c5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-430
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.936829 3.291691 LOGNORMAL 13.237052 3.139759 29816
+LOGNORMAL 13.214525 2.521890 EXPONENTIAL 637792 8240
+LOGNORMAL 12.872627 1.238927 EXPONENTIAL 694922 18909
+LOGNORMAL 13.035403 1.014726 LOGNORMAL 11.528625 2.608558 28494
diff --git a/tools/linsched/tests/mcarlo-sims/sim-431 b/tools/linsched/tests/mcarlo-sims/sim-431
new file mode 100644
index 00000000000000..7ab209ab30c135
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-431
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.993867 3.923062 LOGNORMAL 13.624910 2.868745 20213
+LOGNORMAL 12.923190 2.050886 EXPONENTIAL 625534 21868
+LOGNORMAL 12.517234 1.159968 LOGNORMAL 13.034219 2.120338 30057
diff --git a/tools/linsched/tests/mcarlo-sims/sim-432 b/tools/linsched/tests/mcarlo-sims/sim-432
new file mode 100644
index 00000000000000..afb29f90c765eb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-432
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.100569 1.263825 EXPONENTIAL 609434 15180
+LOGNORMAL 12.545289 1.669218 EXPONENTIAL 662375 14941
diff --git a/tools/linsched/tests/mcarlo-sims/sim-433 b/tools/linsched/tests/mcarlo-sims/sim-433
new file mode 100644
index 00000000000000..d98ed1f91cf8e7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-433
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 13.790804 1.038361 EXPONENTIAL 679692 17258
+LOGNORMAL 11.402293 3.337244 LOGNORMAL 11.055207 1.872339 11218
+LOGNORMAL 12.346523 3.007834 EXPONENTIAL 680022 7769
+LOGNORMAL 12.298771 1.446287 EXPONENTIAL 653861 9325
+LOGNORMAL 12.642106 2.868261 EXPONENTIAL 637648 8471
diff --git a/tools/linsched/tests/mcarlo-sims/sim-434 b/tools/linsched/tests/mcarlo-sims/sim-434
new file mode 100644
index 00000000000000..f866e226551618
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-434
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.684165 1.769255 EXPONENTIAL 675668 5241
+LOGNORMAL 11.196983 2.687017 EXPONENTIAL 620842 21949
+LOGNORMAL 13.532214 1.914662 EXPONENTIAL 648413 1819
diff --git a/tools/linsched/tests/mcarlo-sims/sim-435 b/tools/linsched/tests/mcarlo-sims/sim-435
new file mode 100644
index 00000000000000..4f59cc15847dfa
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-435
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.220589 1.433442 LOGNORMAL 12.019415 1.307623 10533
+LOGNORMAL 11.005029 1.524905 LOGNORMAL 11.758222 3.439341 1289
diff --git a/tools/linsched/tests/mcarlo-sims/sim-436 b/tools/linsched/tests/mcarlo-sims/sim-436
new file mode 100644
index 00000000000000..0d94742b82b548
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-436
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.851471 3.668180 EXPONENTIAL 672612 16129
+LOGNORMAL 11.082763 2.997857 EXPONENTIAL 662426 30224
+LOGNORMAL 11.335362 3.429735 EXPONENTIAL 629982 20213
+LOGNORMAL 12.491949 2.182248 EXPONENTIAL 604173 25502
diff --git a/tools/linsched/tests/mcarlo-sims/sim-437 b/tools/linsched/tests/mcarlo-sims/sim-437
new file mode 100644
index 00000000000000..e706ae45bfa410
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-437
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.423530 2.275578 LOGNORMAL 11.074308 1.888703 17868
+LOGNORMAL 13.045666 2.503310 EXPONENTIAL 690061 5232
+LOGNORMAL 12.164726 1.557384 EXPONENTIAL 610896 5551
+LOGNORMAL 13.472040 1.581420 LOGNORMAL 13.339710 3.513921 20254
+LOGNORMAL 11.209251 1.874319 EXPONENTIAL 694318 254
diff --git a/tools/linsched/tests/mcarlo-sims/sim-438 b/tools/linsched/tests/mcarlo-sims/sim-438
new file mode 100644
index 00000000000000..27d7cbfd2d41c0
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-438
@@ -0,0 +1,3 @@
+ONE_GROUP 2
+LOGNORMAL 13.831590 2.537937 LOGNORMAL 12.726935 3.602120 27174
+LOGNORMAL 12.997443 2.019184 LOGNORMAL 13.994725 2.351342 2583
diff --git a/tools/linsched/tests/mcarlo-sims/sim-439 b/tools/linsched/tests/mcarlo-sims/sim-439
new file mode 100644
index 00000000000000..ea1fbc8e87ec6f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-439
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.364608 2.965138 EXPONENTIAL 658970 32325
+LOGNORMAL 11.852053 2.459352 EXPONENTIAL 622284 14615
diff --git a/tools/linsched/tests/mcarlo-sims/sim-44 b/tools/linsched/tests/mcarlo-sims/sim-44
new file mode 100644
index 00000000000000..db8bc3566fffd3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-44
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.458043 2.332023 EXPONENTIAL 669491 27539
+LOGNORMAL 11.222224 3.912091 LOGNORMAL 11.108721 1.273114 15100
+LOGNORMAL 11.772095 2.603739 EXPONENTIAL 628329 15973
+LOGNORMAL 12.602539 3.873930 LOGNORMAL 11.116988 2.214232 1709
diff --git a/tools/linsched/tests/mcarlo-sims/sim-440 b/tools/linsched/tests/mcarlo-sims/sim-440
new file mode 100644
index 00000000000000..a1d5a3626d662d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-440
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.686772 2.583845 EXPONENTIAL 687827 14630
+LOGNORMAL 11.750819 2.022539 EXPONENTIAL 666438 16713
+LOGNORMAL 12.879657 2.391831 EXPONENTIAL 654231 16213
+LOGNORMAL 12.612122 2.942018 EXPONENTIAL 616288 3262
+LOGNORMAL 11.093953 2.060157 EXPONENTIAL 617570 15309
diff --git a/tools/linsched/tests/mcarlo-sims/sim-441 b/tools/linsched/tests/mcarlo-sims/sim-441
new file mode 100644
index 00000000000000..e129b859650381
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-441
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.129501 3.528606 LOGNORMAL 13.464090 2.954610 14620
+LOGNORMAL 11.638964 3.060030 LOGNORMAL 11.928704 3.723903 4124
+LOGNORMAL 12.971781 2.728989 LOGNORMAL 11.583159 1.160586 26553
+LOGNORMAL 11.774137 3.916107 LOGNORMAL 11.725812 1.728314 29718
+LOGNORMAL 12.580295 2.012199 EXPONENTIAL 688603 6279
diff --git a/tools/linsched/tests/mcarlo-sims/sim-442 b/tools/linsched/tests/mcarlo-sims/sim-442
new file mode 100644
index 00000000000000..b4797b9464e796
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-442
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.230839 3.716615 EXPONENTIAL 697297 1180
+LOGNORMAL 13.664518 2.553480 EXPONENTIAL 697304 22546
+LOGNORMAL 13.674035 3.505887 LOGNORMAL 13.289263 1.644176 15422
+LOGNORMAL 13.014034 1.873668 LOGNORMAL 11.995377 2.296722 19200
diff --git a/tools/linsched/tests/mcarlo-sims/sim-443 b/tools/linsched/tests/mcarlo-sims/sim-443
new file mode 100644
index 00000000000000..4b683d568647d6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-443
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.976794 2.975291 EXPONENTIAL 647704 4537
+LOGNORMAL 12.406831 2.612843 LOGNORMAL 13.633163 3.573476 16516
+LOGNORMAL 13.017740 1.163084 EXPONENTIAL 622714 13640
+LOGNORMAL 13.643231 1.778577 EXPONENTIAL 614457 16976
diff --git a/tools/linsched/tests/mcarlo-sims/sim-444 b/tools/linsched/tests/mcarlo-sims/sim-444
new file mode 100644
index 00000000000000..bf5311565ab7b8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-444
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.472496 2.239006 EXPONENTIAL 673983 1215
+LOGNORMAL 11.947913 2.572036 LOGNORMAL 12.048739 2.148863 18920
diff --git a/tools/linsched/tests/mcarlo-sims/sim-445 b/tools/linsched/tests/mcarlo-sims/sim-445
new file mode 100644
index 00000000000000..d49068bde2e323
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-445
@@ -0,0 +1,3 @@
+ROOT 2
+LOGNORMAL 13.828727 2.415063 LOGNORMAL 12.532488 2.523462 27934
+LOGNORMAL 11.453149 3.081484 LOGNORMAL 12.177968 2.107066 8752
diff --git a/tools/linsched/tests/mcarlo-sims/sim-446 b/tools/linsched/tests/mcarlo-sims/sim-446
new file mode 100644
index 00000000000000..57a25d131e3361
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-446
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.168929 3.194609 LOGNORMAL 11.919799 1.061473 12323
+LOGNORMAL 13.694052 3.925015 EXPONENTIAL 608834 30080
+LOGNORMAL 12.403672 3.509276 LOGNORMAL 11.226356 1.360826 28639
+LOGNORMAL 13.118975 1.617153 EXPONENTIAL 655647 21228
diff --git a/tools/linsched/tests/mcarlo-sims/sim-447 b/tools/linsched/tests/mcarlo-sims/sim-447
new file mode 100644
index 00000000000000..21270842b9daa5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-447
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.979329 1.584761 EXPONENTIAL 661099 26397
+LOGNORMAL 11.006351 2.733324 EXPONENTIAL 620533 16977
+LOGNORMAL 11.354547 1.871609 EXPONENTIAL 642703 10762
+LOGNORMAL 11.019966 3.564676 EXPONENTIAL 640382 13178
diff --git a/tools/linsched/tests/mcarlo-sims/sim-448 b/tools/linsched/tests/mcarlo-sims/sim-448
new file mode 100644
index 00000000000000..538118ad34c04f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-448
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.021885 3.816854 EXPONENTIAL 622837 29324
+LOGNORMAL 13.266833 2.660288 EXPONENTIAL 609845 24368
+LOGNORMAL 12.239760 2.643131 EXPONENTIAL 643686 6913
+LOGNORMAL 12.054844 2.768295 EXPONENTIAL 661583 10609
+LOGNORMAL 11.482715 1.993884 EXPONENTIAL 630654 322
diff --git a/tools/linsched/tests/mcarlo-sims/sim-449 b/tools/linsched/tests/mcarlo-sims/sim-449
new file mode 100644
index 00000000000000..b6840738c5e32a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-449
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.310634 2.831903 EXPONENTIAL 695903 25829
+LOGNORMAL 12.376372 3.686962 EXPONENTIAL 612158 19406
+LOGNORMAL 11.575542 2.140704 EXPONENTIAL 670816 24306
+LOGNORMAL 13.371486 3.559704 EXPONENTIAL 616991 14036
diff --git a/tools/linsched/tests/mcarlo-sims/sim-45 b/tools/linsched/tests/mcarlo-sims/sim-45
new file mode 100644
index 00000000000000..756307520b5673
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-45
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.446499 2.314075 EXPONENTIAL 637086 31556
+LOGNORMAL 13.695835 3.895204 LOGNORMAL 12.525639 1.408919 29445
+LOGNORMAL 11.832418 2.449011 LOGNORMAL 12.861925 1.371680 3469
+LOGNORMAL 13.443689 2.078892 EXPONENTIAL 669892 32183
+LOGNORMAL 11.875452 2.727621 LOGNORMAL 11.133690 3.921335 8290
diff --git a/tools/linsched/tests/mcarlo-sims/sim-450 b/tools/linsched/tests/mcarlo-sims/sim-450
new file mode 100644
index 00000000000000..d1b199f8b6cb2c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-450
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 12.047240 3.970807 EXPONENTIAL 607225 31974
+LOGNORMAL 11.785929 1.109901 LOGNORMAL 13.952993 2.949413 4419
+LOGNORMAL 12.938629 3.535975 EXPONENTIAL 643949 2807
+LOGNORMAL 12.349941 3.465930 EXPONENTIAL 660191 11247
diff --git a/tools/linsched/tests/mcarlo-sims/sim-451 b/tools/linsched/tests/mcarlo-sims/sim-451
new file mode 100644
index 00000000000000..b08d21b79ee8b8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-451
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.599441 3.803710 EXPONENTIAL 669024 17590
+LOGNORMAL 11.821814 1.226312 EXPONENTIAL 647660 19946
+LOGNORMAL 11.425764 1.811894 EXPONENTIAL 657500 1164
diff --git a/tools/linsched/tests/mcarlo-sims/sim-452 b/tools/linsched/tests/mcarlo-sims/sim-452
new file mode 100644
index 00000000000000..aafd2682deff58
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-452
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.986727 3.925263 EXPONENTIAL 622076 26871
+LOGNORMAL 11.938792 2.269757 LOGNORMAL 12.714802 3.682688 21743
+LOGNORMAL 11.558640 3.065688 EXPONENTIAL 687696 27073
+LOGNORMAL 12.942741 3.651518 LOGNORMAL 12.834826 1.915448 17946
+LOGNORMAL 11.227846 2.409348 EXPONENTIAL 690123 2424
diff --git a/tools/linsched/tests/mcarlo-sims/sim-453 b/tools/linsched/tests/mcarlo-sims/sim-453
new file mode 100644
index 00000000000000..5f9fcbde455613
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-453
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.500128 1.658528 LOGNORMAL 12.990162 2.656006 12530
+LOGNORMAL 12.284912 2.518135 EXPONENTIAL 640194 4313
+LOGNORMAL 12.012323 2.109053 EXPONENTIAL 647732 15596
+LOGNORMAL 12.768877 3.517556 EXPONENTIAL 646484 21086
+LOGNORMAL 13.712377 2.924421 EXPONENTIAL 626018 17678
diff --git a/tools/linsched/tests/mcarlo-sims/sim-454 b/tools/linsched/tests/mcarlo-sims/sim-454
new file mode 100644
index 00000000000000..bdf5a2e5e10c1d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-454
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.994036 2.758485 EXPONENTIAL 652626 1063
+LOGNORMAL 13.625871 1.016407 EXPONENTIAL 686165 23507
diff --git a/tools/linsched/tests/mcarlo-sims/sim-455 b/tools/linsched/tests/mcarlo-sims/sim-455
new file mode 100644
index 00000000000000..357f6ae2f67107
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-455
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.937764 3.992922 EXPONENTIAL 601681 32685
+LOGNORMAL 12.728049 1.311306 LOGNORMAL 11.837337 1.119160 21725
+LOGNORMAL 13.394709 3.873433 EXPONENTIAL 621817 15182
+LOGNORMAL 12.828424 2.314783 EXPONENTIAL 642355 6837
+LOGNORMAL 11.968541 1.268157 EXPONENTIAL 688328 8850
diff --git a/tools/linsched/tests/mcarlo-sims/sim-456 b/tools/linsched/tests/mcarlo-sims/sim-456
new file mode 100644
index 00000000000000..158ad390fc3868
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-456
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.833424 2.362687 EXPONENTIAL 656807 615
+LOGNORMAL 13.774594 1.603911 LOGNORMAL 11.740614 1.497279 4134
+LOGNORMAL 12.550685 2.362085 EXPONENTIAL 673555 22424
+LOGNORMAL 12.144503 3.659028 LOGNORMAL 13.585156 3.713937 25378
diff --git a/tools/linsched/tests/mcarlo-sims/sim-457 b/tools/linsched/tests/mcarlo-sims/sim-457
new file mode 100644
index 00000000000000..5dce60cace00b1
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-457
@@ -0,0 +1,5 @@
+ROOT 4
+LOGNORMAL 12.676032 3.073326 LOGNORMAL 13.318463 3.401599 16115
+LOGNORMAL 11.320278 1.908693 LOGNORMAL 11.175002 2.258423 24874
+LOGNORMAL 13.875717 3.177421 LOGNORMAL 13.363866 1.488896 12052
+LOGNORMAL 11.484537 2.606532 LOGNORMAL 13.410753 3.517908 3833
diff --git a/tools/linsched/tests/mcarlo-sims/sim-458 b/tools/linsched/tests/mcarlo-sims/sim-458
new file mode 100644
index 00000000000000..b55d956ce4fbc5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-458
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.641102 2.004048 EXPONENTIAL 653500 395
+LOGNORMAL 11.667257 1.583386 LOGNORMAL 11.349191 1.851114 9516
+LOGNORMAL 11.884605 3.553367 LOGNORMAL 12.244505 1.397387 13379
+LOGNORMAL 11.088602 2.130901 LOGNORMAL 11.473934 1.406443 23409
+LOGNORMAL 12.086548 1.610868 EXPONENTIAL 671936 32437
diff --git a/tools/linsched/tests/mcarlo-sims/sim-459 b/tools/linsched/tests/mcarlo-sims/sim-459
new file mode 100644
index 00000000000000..8e64f5dfff3d77
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-459
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.026518 1.695489 LOGNORMAL 13.362074 1.371751 31631
+LOGNORMAL 11.660813 1.291965 LOGNORMAL 12.067707 2.947085 8483
+LOGNORMAL 12.306669 2.188498 EXPONENTIAL 619762 17213
+LOGNORMAL 11.387260 2.682252 EXPONENTIAL 638639 32703
diff --git a/tools/linsched/tests/mcarlo-sims/sim-46 b/tools/linsched/tests/mcarlo-sims/sim-46
new file mode 100644
index 00000000000000..1a9b0cf3cfc0b6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-46
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.546082 3.994394 EXPONENTIAL 658682 4416
+LOGNORMAL 11.724567 1.792487 EXPONENTIAL 623087 10421
+LOGNORMAL 13.234389 3.377052 LOGNORMAL 13.250802 3.233488 11467
+LOGNORMAL 11.818803 1.617682 LOGNORMAL 11.341558 2.562255 26158
+LOGNORMAL 12.811300 2.514172 EXPONENTIAL 668838 9066
diff --git a/tools/linsched/tests/mcarlo-sims/sim-460 b/tools/linsched/tests/mcarlo-sims/sim-460
new file mode 100644
index 00000000000000..2c8f87bb3d7140
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-460
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.956463 2.273051 LOGNORMAL 12.596397 2.652047 3554
+LOGNORMAL 11.344962 2.776473 LOGNORMAL 12.489884 3.486841 6356
+LOGNORMAL 12.366947 1.275465 EXPONENTIAL 651511 18109
diff --git a/tools/linsched/tests/mcarlo-sims/sim-461 b/tools/linsched/tests/mcarlo-sims/sim-461
new file mode 100644
index 00000000000000..054f84939d805e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-461
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.854505 3.664732 LOGNORMAL 12.840769 2.810130 2313
+LOGNORMAL 12.391713 3.524240 LOGNORMAL 12.243242 1.164479 32503
+LOGNORMAL 11.538588 2.050895 LOGNORMAL 11.588084 2.922445 18084
+LOGNORMAL 12.031857 3.413801 EXPONENTIAL 636665 27832
+LOGNORMAL 13.917245 2.129306 EXPONENTIAL 677604 28284
diff --git a/tools/linsched/tests/mcarlo-sims/sim-462 b/tools/linsched/tests/mcarlo-sims/sim-462
new file mode 100644
index 00000000000000..afa4134d701204
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-462
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 13.700935 2.607307 LOGNORMAL 13.212843 1.252199 5571
+LOGNORMAL 13.226248 1.551589 LOGNORMAL 12.125542 2.987876 860
+LOGNORMAL 13.646911 3.637715 EXPONENTIAL 679781 15776
diff --git a/tools/linsched/tests/mcarlo-sims/sim-463 b/tools/linsched/tests/mcarlo-sims/sim-463
new file mode 100644
index 00000000000000..4da55cc728e58e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-463
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.019697 2.039125 LOGNORMAL 12.609333 1.064617 15293
+LOGNORMAL 13.059831 3.575570 LOGNORMAL 12.431590 1.736780 18760
diff --git a/tools/linsched/tests/mcarlo-sims/sim-464 b/tools/linsched/tests/mcarlo-sims/sim-464
new file mode 100644
index 00000000000000..afa3267b75dc0d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-464
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.516962 1.577355 EXPONENTIAL 690838 22305
+LOGNORMAL 13.005066 1.150287 EXPONENTIAL 668671 1824
+LOGNORMAL 12.164229 2.204433 EXPONENTIAL 639735 5148
+LOGNORMAL 12.626650 1.110322 LOGNORMAL 13.556409 3.560459 27359
+LOGNORMAL 13.046999 3.919026 EXPONENTIAL 661305 8285
diff --git a/tools/linsched/tests/mcarlo-sims/sim-465 b/tools/linsched/tests/mcarlo-sims/sim-465
new file mode 100644
index 00000000000000..3fa7f59beb9680
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-465
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.743917 3.016212 LOGNORMAL 13.617710 1.846834 9635
+LOGNORMAL 11.646392 1.916784 LOGNORMAL 11.499758 3.439022 7390
+LOGNORMAL 13.566868 2.347106 LOGNORMAL 11.156083 2.288544 177
diff --git a/tools/linsched/tests/mcarlo-sims/sim-466 b/tools/linsched/tests/mcarlo-sims/sim-466
new file mode 100644
index 00000000000000..ebf068af891897
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-466
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.905715 1.344286 EXPONENTIAL 609753 8807
+LOGNORMAL 11.411427 3.860650 EXPONENTIAL 675921 15539
+LOGNORMAL 11.905613 2.638787 EXPONENTIAL 626931 23349
+LOGNORMAL 12.446948 1.855971 EXPONENTIAL 679874 11353
diff --git a/tools/linsched/tests/mcarlo-sims/sim-467 b/tools/linsched/tests/mcarlo-sims/sim-467
new file mode 100644
index 00000000000000..5da74abdb102c3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-467
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.712050 1.418108 LOGNORMAL 12.944733 1.130167 10837
+LOGNORMAL 11.609948 1.393538 LOGNORMAL 12.689818 3.777629 30994
+LOGNORMAL 11.692641 2.215186 EXPONENTIAL 663332 11674
+LOGNORMAL 12.284686 1.725320 EXPONENTIAL 601900 337
+LOGNORMAL 11.951338 3.136305 EXPONENTIAL 674923 12688
diff --git a/tools/linsched/tests/mcarlo-sims/sim-468 b/tools/linsched/tests/mcarlo-sims/sim-468
new file mode 100644
index 00000000000000..16fa77aec539e4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-468
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.837318 1.808328 LOGNORMAL 13.012500 3.079779 8310
+LOGNORMAL 12.961908 1.796029 LOGNORMAL 13.965508 3.295053 21003
+LOGNORMAL 12.790900 1.648057 EXPONENTIAL 600556 28371
+LOGNORMAL 12.349428 3.838907 LOGNORMAL 12.881575 1.636065 434
+LOGNORMAL 13.901229 2.951948 EXPONENTIAL 649128 31657
diff --git a/tools/linsched/tests/mcarlo-sims/sim-469 b/tools/linsched/tests/mcarlo-sims/sim-469
new file mode 100644
index 00000000000000..efdd1d71e7a10e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-469
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 11.830163 3.551852 EXPONENTIAL 655746 20608
+LOGNORMAL 13.379617 2.224523 LOGNORMAL 12.898653 3.659212 14063
+LOGNORMAL 13.008885 2.330358 EXPONENTIAL 640838 13098
+LOGNORMAL 13.041830 1.037827 EXPONENTIAL 613867 20144
+LOGNORMAL 12.808584 1.864588 LOGNORMAL 12.842019 2.815244 18125
diff --git a/tools/linsched/tests/mcarlo-sims/sim-47 b/tools/linsched/tests/mcarlo-sims/sim-47
new file mode 100644
index 00000000000000..e7704bcf2ff49e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-47
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.565171 2.820663 LOGNORMAL 11.630466 1.243028 4347
+LOGNORMAL 13.848986 3.905915 EXPONENTIAL 689349 664
+LOGNORMAL 12.031299 3.036621 LOGNORMAL 13.098346 2.903375 3734
diff --git a/tools/linsched/tests/mcarlo-sims/sim-470 b/tools/linsched/tests/mcarlo-sims/sim-470
new file mode 100644
index 00000000000000..6bb8448cdfc340
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-470
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.744328 3.923695 EXPONENTIAL 604029 15251
+LOGNORMAL 11.139028 3.641251 LOGNORMAL 11.220220 3.245680 23626
diff --git a/tools/linsched/tests/mcarlo-sims/sim-471 b/tools/linsched/tests/mcarlo-sims/sim-471
new file mode 100644
index 00000000000000..c9b66c1cf832a8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-471
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.247827 1.229657 LOGNORMAL 13.678426 2.312087 13741
+LOGNORMAL 11.550973 3.205700 EXPONENTIAL 668294 12319
+LOGNORMAL 11.864488 1.445364 EXPONENTIAL 634106 27873
+LOGNORMAL 13.576699 2.582290 EXPONENTIAL 699993 29628
+LOGNORMAL 11.843296 2.269670 EXPONENTIAL 620415 32465
diff --git a/tools/linsched/tests/mcarlo-sims/sim-472 b/tools/linsched/tests/mcarlo-sims/sim-472
new file mode 100644
index 00000000000000..8c006d31b8aab0
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-472
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.042038 1.526752 EXPONENTIAL 694309 8987
+LOGNORMAL 13.271019 1.014918 EXPONENTIAL 681601 364
+LOGNORMAL 12.826513 3.207080 EXPONENTIAL 696862 13073
diff --git a/tools/linsched/tests/mcarlo-sims/sim-473 b/tools/linsched/tests/mcarlo-sims/sim-473
new file mode 100644
index 00000000000000..4fa2b134384d6f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-473
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.891430 2.256799 EXPONENTIAL 670748 3528
+LOGNORMAL 12.157955 1.748420 EXPONENTIAL 667378 29394
+LOGNORMAL 11.008204 3.880027 LOGNORMAL 12.291873 2.514905 29586
+LOGNORMAL 11.789995 3.437884 EXPONENTIAL 678510 11058
+LOGNORMAL 12.636348 2.101795 EXPONENTIAL 685699 5428
diff --git a/tools/linsched/tests/mcarlo-sims/sim-474 b/tools/linsched/tests/mcarlo-sims/sim-474
new file mode 100644
index 00000000000000..9b99bcf6e9fc43
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-474
@@ -0,0 +1,6 @@
+ONE_GROUP 5
+LOGNORMAL 11.310127 2.310881 EXPONENTIAL 695853 21167
+LOGNORMAL 13.790591 3.456952 LOGNORMAL 13.735024 2.545951 13854
+LOGNORMAL 12.198065 3.877956 LOGNORMAL 13.377711 3.189159 4591
+LOGNORMAL 12.624787 2.788911 LOGNORMAL 13.108331 2.726520 8208
+LOGNORMAL 11.464524 2.262208 EXPONENTIAL 614643 13676
diff --git a/tools/linsched/tests/mcarlo-sims/sim-475 b/tools/linsched/tests/mcarlo-sims/sim-475
new file mode 100644
index 00000000000000..af32e72bd38b0f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-475
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.655619 3.991853 LOGNORMAL 11.542595 3.398861 7230
+LOGNORMAL 13.050600 1.434336 EXPONENTIAL 697528 24555
+LOGNORMAL 12.654883 1.617056 EXPONENTIAL 629181 23839
+LOGNORMAL 11.043340 3.419596 EXPONENTIAL 647236 22357
+LOGNORMAL 11.416598 3.769741 EXPONENTIAL 650604 12592
diff --git a/tools/linsched/tests/mcarlo-sims/sim-476 b/tools/linsched/tests/mcarlo-sims/sim-476
new file mode 100644
index 00000000000000..e5a65b72975088
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-476
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.362372 3.388298 LOGNORMAL 12.351640 2.011148 29455
+LOGNORMAL 11.979572 3.660859 LOGNORMAL 13.327862 2.382161 1107
+LOGNORMAL 13.919921 2.104805 LOGNORMAL 13.554193 2.325693 13374
+LOGNORMAL 12.056418 2.209175 LOGNORMAL 13.957387 1.800622 30216
diff --git a/tools/linsched/tests/mcarlo-sims/sim-477 b/tools/linsched/tests/mcarlo-sims/sim-477
new file mode 100644
index 00000000000000..190d81d21d48cf
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-477
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.623311 1.986544 EXPONENTIAL 663185 22598
+LOGNORMAL 12.653919 3.423656 LOGNORMAL 11.510487 3.748239 2113
+LOGNORMAL 13.713276 3.031184 LOGNORMAL 13.665920 2.119695 7463
diff --git a/tools/linsched/tests/mcarlo-sims/sim-478 b/tools/linsched/tests/mcarlo-sims/sim-478
new file mode 100644
index 00000000000000..1b9671ffa8ac99
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-478
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.703484 3.452781 EXPONENTIAL 625869 21466
+LOGNORMAL 11.625538 2.419724 EXPONENTIAL 634427 12735
+LOGNORMAL 13.194187 2.695617 EXPONENTIAL 643087 4367
+LOGNORMAL 11.934177 2.719203 LOGNORMAL 13.874692 3.949719 4457
diff --git a/tools/linsched/tests/mcarlo-sims/sim-479 b/tools/linsched/tests/mcarlo-sims/sim-479
new file mode 100644
index 00000000000000..bae4662c343cc3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-479
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.899469 2.367348 LOGNORMAL 11.143446 2.894681 31421
+LOGNORMAL 11.373436 1.335560 LOGNORMAL 11.718812 1.067673 13410
diff --git a/tools/linsched/tests/mcarlo-sims/sim-48 b/tools/linsched/tests/mcarlo-sims/sim-48
new file mode 100644
index 00000000000000..b58c2eb5bef550
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-48
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.478757 3.473361 LOGNORMAL 12.754267 3.967483 768
+LOGNORMAL 13.117867 3.987725 EXPONENTIAL 612510 4979
+LOGNORMAL 12.299094 3.868247 EXPONENTIAL 627610 6934
diff --git a/tools/linsched/tests/mcarlo-sims/sim-480 b/tools/linsched/tests/mcarlo-sims/sim-480
new file mode 100644
index 00000000000000..4bbe7fa56a3d59
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-480
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.574111 2.081498 LOGNORMAL 13.961033 3.080060 25462
+LOGNORMAL 13.609276 1.108063 EXPONENTIAL 674878 2061
+LOGNORMAL 12.772593 2.964422 EXPONENTIAL 665791 17749
diff --git a/tools/linsched/tests/mcarlo-sims/sim-481 b/tools/linsched/tests/mcarlo-sims/sim-481
new file mode 100644
index 00000000000000..462a7f76160dc6
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-481
@@ -0,0 +1,4 @@
+ROOT 3
+LOGNORMAL 13.241240 1.515027 LOGNORMAL 13.273125 3.419839 1679
+LOGNORMAL 11.604767 1.322793 LOGNORMAL 11.693750 2.855156 12680
+LOGNORMAL 13.639477 1.683922 EXPONENTIAL 672754 30242
diff --git a/tools/linsched/tests/mcarlo-sims/sim-482 b/tools/linsched/tests/mcarlo-sims/sim-482
new file mode 100644
index 00000000000000..b91c6dee727e90
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-482
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.917257 3.343114 EXPONENTIAL 620588 10648
+LOGNORMAL 12.460208 2.715107 LOGNORMAL 13.095145 3.109922 3018
+LOGNORMAL 13.906578 2.848802 LOGNORMAL 11.876769 3.857197 19097
diff --git a/tools/linsched/tests/mcarlo-sims/sim-483 b/tools/linsched/tests/mcarlo-sims/sim-483
new file mode 100644
index 00000000000000..7f26d653c46e37
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-483
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.488410 1.700926 EXPONENTIAL 657072 9233
+LOGNORMAL 13.702362 2.603143 EXPONENTIAL 606615 7187
diff --git a/tools/linsched/tests/mcarlo-sims/sim-484 b/tools/linsched/tests/mcarlo-sims/sim-484
new file mode 100644
index 00000000000000..eeeb1d1939be11
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-484
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.818592 2.071875 LOGNORMAL 12.328087 2.165694 32064
+LOGNORMAL 13.805845 1.843549 LOGNORMAL 12.215160 3.197644 7385
+LOGNORMAL 13.340432 3.645506 EXPONENTIAL 660051 2897
diff --git a/tools/linsched/tests/mcarlo-sims/sim-485 b/tools/linsched/tests/mcarlo-sims/sim-485
new file mode 100644
index 00000000000000..7d1a639e474f9b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-485
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.902684 2.416959 EXPONENTIAL 609755 27968
+LOGNORMAL 11.387785 2.499079 LOGNORMAL 12.574767 2.116522 17200
+LOGNORMAL 11.382233 2.183314 EXPONENTIAL 643191 16473
+LOGNORMAL 11.531106 2.301396 LOGNORMAL 13.124339 1.764177 27825
diff --git a/tools/linsched/tests/mcarlo-sims/sim-486 b/tools/linsched/tests/mcarlo-sims/sim-486
new file mode 100644
index 00000000000000..9c30528fc118cc
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-486
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 13.591028 3.406629 LOGNORMAL 11.996186 3.892699 32219
+LOGNORMAL 12.581325 1.334498 EXPONENTIAL 674472 23040
+LOGNORMAL 12.978042 2.956151 EXPONENTIAL 652351 1059
diff --git a/tools/linsched/tests/mcarlo-sims/sim-487 b/tools/linsched/tests/mcarlo-sims/sim-487
new file mode 100644
index 00000000000000..0efd1cd073eb82
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-487
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.794332 1.336757 LOGNORMAL 12.451736 1.326340 6284
+LOGNORMAL 12.545043 3.531448 LOGNORMAL 13.355446 3.986348 15803
+LOGNORMAL 13.958387 3.618590 EXPONENTIAL 667406 27778
diff --git a/tools/linsched/tests/mcarlo-sims/sim-488 b/tools/linsched/tests/mcarlo-sims/sim-488
new file mode 100644
index 00000000000000..c97c62328cead2
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-488
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.377076 1.512152 EXPONENTIAL 613957 25462
+LOGNORMAL 12.178899 2.748941 EXPONENTIAL 600829 8361
+LOGNORMAL 12.505171 2.417356 LOGNORMAL 12.096044 2.213156 25147
+LOGNORMAL 11.563773 2.327225 EXPONENTIAL 654401 10944
diff --git a/tools/linsched/tests/mcarlo-sims/sim-489 b/tools/linsched/tests/mcarlo-sims/sim-489
new file mode 100644
index 00000000000000..518db1ddc5ed83
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-489
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.570737 1.373763 LOGNORMAL 11.811624 3.966953 26678
+LOGNORMAL 11.457741 2.254071 LOGNORMAL 13.935881 3.357438 21474
+LOGNORMAL 12.557852 2.817116 EXPONENTIAL 652397 17734
diff --git a/tools/linsched/tests/mcarlo-sims/sim-49 b/tools/linsched/tests/mcarlo-sims/sim-49
new file mode 100644
index 00000000000000..ddd45f57d0f5f3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-49
@@ -0,0 +1,5 @@
+ROOT 4
+LOGNORMAL 12.735364 1.260311 LOGNORMAL 13.077920 1.601817 31460
+LOGNORMAL 11.206629 2.807109 EXPONENTIAL 668751 11147
+LOGNORMAL 11.516386 3.903822 EXPONENTIAL 629946 30146
+LOGNORMAL 12.720141 3.408803 LOGNORMAL 11.305292 2.050558 16867
diff --git a/tools/linsched/tests/mcarlo-sims/sim-490 b/tools/linsched/tests/mcarlo-sims/sim-490
new file mode 100644
index 00000000000000..b5e38807d421a7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-490
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.729068 3.446594 LOGNORMAL 13.016546 2.088399 273
+LOGNORMAL 11.152273 1.249184 EXPONENTIAL 662902 10282
+LOGNORMAL 12.219411 2.645626 LOGNORMAL 12.455398 2.868580 12931
+LOGNORMAL 12.853797 2.760581 EXPONENTIAL 683748 24411
diff --git a/tools/linsched/tests/mcarlo-sims/sim-491 b/tools/linsched/tests/mcarlo-sims/sim-491
new file mode 100644
index 00000000000000..e3db0436569275
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-491
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.416601 1.806001 LOGNORMAL 13.541248 3.761612 30418
+LOGNORMAL 12.365508 1.091491 EXPONENTIAL 642074 8637
+LOGNORMAL 12.989368 1.301700 LOGNORMAL 12.644815 3.405545 10178
+LOGNORMAL 12.679672 1.247108 EXPONENTIAL 607898 28608
diff --git a/tools/linsched/tests/mcarlo-sims/sim-492 b/tools/linsched/tests/mcarlo-sims/sim-492
new file mode 100644
index 00000000000000..78e745b152dcb4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-492
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.399795 3.350354 EXPONENTIAL 677171 15040
+LOGNORMAL 12.665749 1.247535 EXPONENTIAL 605994 16530
+LOGNORMAL 13.249322 2.349813 EXPONENTIAL 680970 1497
+LOGNORMAL 11.040702 1.077681 LOGNORMAL 12.655069 1.750226 13790
diff --git a/tools/linsched/tests/mcarlo-sims/sim-493 b/tools/linsched/tests/mcarlo-sims/sim-493
new file mode 100644
index 00000000000000..545231c846fe0a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-493
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 13.050471 2.267144 EXPONENTIAL 624017 5103
+LOGNORMAL 12.655215 1.204497 LOGNORMAL 11.819380 2.322583 25978
+LOGNORMAL 12.732879 1.499948 EXPONENTIAL 659109 1237
+LOGNORMAL 12.545083 1.209126 LOGNORMAL 11.847487 3.716996 22447
+LOGNORMAL 13.876476 3.933996 LOGNORMAL 11.562125 1.642939 23301
diff --git a/tools/linsched/tests/mcarlo-sims/sim-494 b/tools/linsched/tests/mcarlo-sims/sim-494
new file mode 100644
index 00000000000000..15e0e311ead774
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-494
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.454524 1.176888 EXPONENTIAL 658843 19486
+LOGNORMAL 12.878991 3.205304 EXPONENTIAL 616598 30562
+LOGNORMAL 13.533337 2.802125 LOGNORMAL 12.375531 1.556883 5633
+LOGNORMAL 11.962083 3.733399 LOGNORMAL 13.912298 2.997439 13531
diff --git a/tools/linsched/tests/mcarlo-sims/sim-495 b/tools/linsched/tests/mcarlo-sims/sim-495
new file mode 100644
index 00000000000000..f000619428e813
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-495
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.148818 1.184795 EXPONENTIAL 637564 6078
+LOGNORMAL 13.621442 1.583386 EXPONENTIAL 655345 28360
+LOGNORMAL 11.656425 2.540636 LOGNORMAL 11.197249 1.166220 19024
+LOGNORMAL 13.752624 1.350659 EXPONENTIAL 658159 28800
+LOGNORMAL 13.464774 2.463200 EXPONENTIAL 644159 12275
diff --git a/tools/linsched/tests/mcarlo-sims/sim-496 b/tools/linsched/tests/mcarlo-sims/sim-496
new file mode 100644
index 00000000000000..5e403009c6900f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-496
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 13.056362 2.270770 LOGNORMAL 11.817986 2.888086 16992
+LOGNORMAL 11.023527 3.421468 LOGNORMAL 11.694650 2.977392 21678
+LOGNORMAL 13.641445 1.773710 EXPONENTIAL 676883 17936
+LOGNORMAL 11.074739 3.138675 EXPONENTIAL 689171 30508
+LOGNORMAL 11.935742 2.020641 LOGNORMAL 12.362015 2.388227 14314
diff --git a/tools/linsched/tests/mcarlo-sims/sim-497 b/tools/linsched/tests/mcarlo-sims/sim-497
new file mode 100644
index 00000000000000..cae3b258766469
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-497
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.761200 2.480997 EXPONENTIAL 687090 12138
+LOGNORMAL 13.333012 1.928664 LOGNORMAL 11.702987 2.107892 4628
+LOGNORMAL 11.784955 2.732683 EXPONENTIAL 630102 32551
diff --git a/tools/linsched/tests/mcarlo-sims/sim-498 b/tools/linsched/tests/mcarlo-sims/sim-498
new file mode 100644
index 00000000000000..70a850fde2e695
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-498
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 12.609204 1.895922 EXPONENTIAL 615699 13212
+LOGNORMAL 11.510192 1.796566 LOGNORMAL 11.184619 1.883412 32285
+LOGNORMAL 11.846730 2.983735 EXPONENTIAL 648076 31938
+LOGNORMAL 13.799410 1.676967 EXPONENTIAL 655881 16626
diff --git a/tools/linsched/tests/mcarlo-sims/sim-499 b/tools/linsched/tests/mcarlo-sims/sim-499
new file mode 100644
index 00000000000000..0001fb2dc4f8ee
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-499
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.429079 3.526737 LOGNORMAL 13.436313 1.118548 13275
+LOGNORMAL 11.844759 2.867135 EXPONENTIAL 655300 3025
+LOGNORMAL 12.621511 1.727844 EXPONENTIAL 695778 31602
+LOGNORMAL 11.968190 1.367388 LOGNORMAL 13.072571 1.692448 12519
diff --git a/tools/linsched/tests/mcarlo-sims/sim-5 b/tools/linsched/tests/mcarlo-sims/sim-5
new file mode 100644
index 00000000000000..dd268facfb8e2e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-5
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.418817 3.063729 EXPONENTIAL 680195 27188
+LOGNORMAL 12.043162 1.430596 LOGNORMAL 11.359242 2.781463 20510
diff --git a/tools/linsched/tests/mcarlo-sims/sim-50 b/tools/linsched/tests/mcarlo-sims/sim-50
new file mode 100644
index 00000000000000..370803d41cf308
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-50
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.095167 2.479546 LOGNORMAL 13.607001 1.864705 29463
+LOGNORMAL 12.536757 2.268501 LOGNORMAL 12.619851 3.839266 3654
+LOGNORMAL 12.432862 2.114672 LOGNORMAL 11.880831 3.125450 24663
+LOGNORMAL 12.199336 1.247466 LOGNORMAL 11.570542 2.101934 14074
+LOGNORMAL 13.476913 2.474365 EXPONENTIAL 642326 10547
diff --git a/tools/linsched/tests/mcarlo-sims/sim-500 b/tools/linsched/tests/mcarlo-sims/sim-500
new file mode 100644
index 00000000000000..b13b08ba545d44
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-500
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.352617 3.428984 EXPONENTIAL 673376 10147
+LOGNORMAL 11.352517 3.758368 EXPONENTIAL 679765 6540
+LOGNORMAL 13.151894 2.885516 LOGNORMAL 11.824819 3.739522 21128
+LOGNORMAL 11.034296 1.418670 LOGNORMAL 12.380727 1.874816 7081
+LOGNORMAL 11.159276 1.946829 LOGNORMAL 13.647619 3.535025 9058
diff --git a/tools/linsched/tests/mcarlo-sims/sim-51 b/tools/linsched/tests/mcarlo-sims/sim-51
new file mode 100644
index 00000000000000..b581b9c485a6bd
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-51
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.675936 3.454833 LOGNORMAL 11.870162 3.819401 1821
+LOGNORMAL 12.593411 3.460594 LOGNORMAL 11.823750 3.771619 19722
diff --git a/tools/linsched/tests/mcarlo-sims/sim-52 b/tools/linsched/tests/mcarlo-sims/sim-52
new file mode 100644
index 00000000000000..04aee54b352bdb
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-52
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.124320 1.453784 EXPONENTIAL 635673 12636
+LOGNORMAL 12.436361 3.919483 LOGNORMAL 13.371661 3.514573 26871
diff --git a/tools/linsched/tests/mcarlo-sims/sim-53 b/tools/linsched/tests/mcarlo-sims/sim-53
new file mode 100644
index 00000000000000..ed5ccf652d13db
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-53
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.945154 1.204132 EXPONENTIAL 624812 17428
+LOGNORMAL 13.339382 3.998186 EXPONENTIAL 694619 15972
+LOGNORMAL 11.801482 1.506517 LOGNORMAL 13.585679 3.500970 28121
+LOGNORMAL 11.316398 2.705496 EXPONENTIAL 625388 6690
diff --git a/tools/linsched/tests/mcarlo-sims/sim-54 b/tools/linsched/tests/mcarlo-sims/sim-54
new file mode 100644
index 00000000000000..57ce0c020da9a7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-54
@@ -0,0 +1,3 @@
+ONE_GROUP 2
+LOGNORMAL 12.315489 3.416590 LOGNORMAL 11.716065 2.907676 23387
+LOGNORMAL 13.759101 2.212177 LOGNORMAL 11.875393 1.737179 87
diff --git a/tools/linsched/tests/mcarlo-sims/sim-55 b/tools/linsched/tests/mcarlo-sims/sim-55
new file mode 100644
index 00000000000000..4d4ecdb997b304
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-55
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.944029 2.300156 EXPONENTIAL 622377 9804
+LOGNORMAL 11.926887 3.195170 LOGNORMAL 11.917689 1.604803 8637
diff --git a/tools/linsched/tests/mcarlo-sims/sim-56 b/tools/linsched/tests/mcarlo-sims/sim-56
new file mode 100644
index 00000000000000..dd5a4cc5c6a500
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-56
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.108998 1.925068 EXPONENTIAL 647609 29140
+LOGNORMAL 13.201488 2.410817 LOGNORMAL 13.244623 1.373725 20790
+LOGNORMAL 13.617624 3.412942 EXPONENTIAL 692413 19101
+LOGNORMAL 11.083253 2.235432 EXPONENTIAL 639519 20694
diff --git a/tools/linsched/tests/mcarlo-sims/sim-57 b/tools/linsched/tests/mcarlo-sims/sim-57
new file mode 100644
index 00000000000000..6a48863e985254
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-57
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.744092 3.959655 LOGNORMAL 13.092519 3.966546 4571
+LOGNORMAL 11.466945 3.938565 EXPONENTIAL 636283 30496
+LOGNORMAL 12.773644 2.642148 LOGNORMAL 12.938100 3.646503 11390
+LOGNORMAL 13.732689 2.309779 LOGNORMAL 11.472693 1.547792 21784
diff --git a/tools/linsched/tests/mcarlo-sims/sim-58 b/tools/linsched/tests/mcarlo-sims/sim-58
new file mode 100644
index 00000000000000..525e90b7e20aad
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-58
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.218180 1.951508 EXPONENTIAL 635301 17496
+LOGNORMAL 13.712044 3.317117 EXPONENTIAL 685207 7838
+LOGNORMAL 12.625561 3.810025 EXPONENTIAL 640349 29051
+LOGNORMAL 11.859367 2.383610 LOGNORMAL 12.326676 2.449447 25000
diff --git a/tools/linsched/tests/mcarlo-sims/sim-59 b/tools/linsched/tests/mcarlo-sims/sim-59
new file mode 100644
index 00000000000000..fe8a23399c320d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-59
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.030300 1.254342 LOGNORMAL 13.985533 3.854586 17032
+LOGNORMAL 11.475983 2.853910 LOGNORMAL 11.035075 2.509399 3668
+LOGNORMAL 11.489169 2.457195 EXPONENTIAL 647790 18907
+LOGNORMAL 12.080768 3.463242 LOGNORMAL 11.439876 2.001433 5622
diff --git a/tools/linsched/tests/mcarlo-sims/sim-6 b/tools/linsched/tests/mcarlo-sims/sim-6
new file mode 100644
index 00000000000000..4dd9c8ecfbfd16
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-6
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 12.965564 3.230148 EXPONENTIAL 684831 25466
+LOGNORMAL 12.205268 1.933465 LOGNORMAL 11.282191 3.780520 6204
+LOGNORMAL 12.413508 3.827130 LOGNORMAL 11.555679 1.296389 11753
diff --git a/tools/linsched/tests/mcarlo-sims/sim-60 b/tools/linsched/tests/mcarlo-sims/sim-60
new file mode 100644
index 00000000000000..7dc60bf2f20a38
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-60
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.459053 1.302135 EXPONENTIAL 675060 14581
+LOGNORMAL 12.839677 2.459047 LOGNORMAL 11.708340 2.076804 1247
diff --git a/tools/linsched/tests/mcarlo-sims/sim-61 b/tools/linsched/tests/mcarlo-sims/sim-61
new file mode 100644
index 00000000000000..8a0bad5a458755
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-61
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 13.412877 3.229655 EXPONENTIAL 658623 18735
+LOGNORMAL 12.696906 2.895525 LOGNORMAL 13.565010 1.124870 22776
+LOGNORMAL 12.221895 2.389836 LOGNORMAL 13.460159 2.900531 17972
+LOGNORMAL 11.315286 2.009458 EXPONENTIAL 682258 7038
+LOGNORMAL 12.080183 2.634512 EXPONENTIAL 688471 2339
diff --git a/tools/linsched/tests/mcarlo-sims/sim-62 b/tools/linsched/tests/mcarlo-sims/sim-62
new file mode 100644
index 00000000000000..8f8eb9a3995a82
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-62
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.538787 3.393835 EXPONENTIAL 677494 1609
+LOGNORMAL 11.141028 1.259107 LOGNORMAL 13.428407 3.229615 32055
diff --git a/tools/linsched/tests/mcarlo-sims/sim-63 b/tools/linsched/tests/mcarlo-sims/sim-63
new file mode 100644
index 00000000000000..90b2a01b7ab1a4
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-63
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.177164 1.591255 EXPONENTIAL 674318 10876
+LOGNORMAL 12.427354 2.544040 LOGNORMAL 11.049570 3.118666 25847
+LOGNORMAL 13.662909 2.505125 LOGNORMAL 13.991487 1.927451 28498
diff --git a/tools/linsched/tests/mcarlo-sims/sim-64 b/tools/linsched/tests/mcarlo-sims/sim-64
new file mode 100644
index 00000000000000..b5131e148a3a22
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-64
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.901277 2.768332 LOGNORMAL 13.891209 2.542506 18211
+LOGNORMAL 12.832950 3.389651 LOGNORMAL 11.359238 2.721356 28273
diff --git a/tools/linsched/tests/mcarlo-sims/sim-65 b/tools/linsched/tests/mcarlo-sims/sim-65
new file mode 100644
index 00000000000000..f763fbf317ab3d
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-65
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.386398 1.194288 EXPONENTIAL 625129 13755
+LOGNORMAL 12.823971 2.474869 LOGNORMAL 12.357961 3.246315 14167
+LOGNORMAL 12.096266 2.938985 EXPONENTIAL 681069 2710
diff --git a/tools/linsched/tests/mcarlo-sims/sim-66 b/tools/linsched/tests/mcarlo-sims/sim-66
new file mode 100644
index 00000000000000..418dbd66624170
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-66
@@ -0,0 +1,5 @@
+ONE_GROUP 4
+LOGNORMAL 12.732152 1.274494 LOGNORMAL 12.445594 3.092624 19050
+LOGNORMAL 11.502348 1.970321 EXPONENTIAL 672417 11154
+LOGNORMAL 13.089469 3.709987 LOGNORMAL 12.839808 1.652888 15558
+LOGNORMAL 13.919784 2.806129 EXPONENTIAL 616725 13928
diff --git a/tools/linsched/tests/mcarlo-sims/sim-67 b/tools/linsched/tests/mcarlo-sims/sim-67
new file mode 100644
index 00000000000000..88ddb7ac7bf77e
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-67
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.959585 2.742040 EXPONENTIAL 664163 27335
+LOGNORMAL 13.278347 1.183641 EXPONENTIAL 664043 27892
+LOGNORMAL 11.540105 3.549652 EXPONENTIAL 698638 13882
+LOGNORMAL 12.164128 3.502527 LOGNORMAL 13.439424 2.399665 20044
diff --git a/tools/linsched/tests/mcarlo-sims/sim-68 b/tools/linsched/tests/mcarlo-sims/sim-68
new file mode 100644
index 00000000000000..e63deb68a7767c
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-68
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.301823 1.744193 LOGNORMAL 11.115327 1.304593 3491
+LOGNORMAL 11.553726 1.477973 EXPONENTIAL 637336 27870
+LOGNORMAL 13.556359 2.727279 EXPONENTIAL 634794 15204
+LOGNORMAL 13.903056 3.656516 EXPONENTIAL 621288 26267
diff --git a/tools/linsched/tests/mcarlo-sims/sim-69 b/tools/linsched/tests/mcarlo-sims/sim-69
new file mode 100644
index 00000000000000..e0fdced29ec359
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-69
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 13.865035 3.650739 LOGNORMAL 11.587099 1.372515 27949
+LOGNORMAL 13.293304 3.564892 LOGNORMAL 11.296583 2.667477 25638
+LOGNORMAL 13.136769 3.679729 EXPONENTIAL 632776 6107
+LOGNORMAL 13.594492 1.626482 EXPONENTIAL 620972 30157
diff --git a/tools/linsched/tests/mcarlo-sims/sim-7 b/tools/linsched/tests/mcarlo-sims/sim-7
new file mode 100644
index 00000000000000..bcc48d298fec96
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-7
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.941232 2.289316 EXPONENTIAL 649875 9570
+LOGNORMAL 13.847439 1.914401 LOGNORMAL 13.336777 2.204132 8040
diff --git a/tools/linsched/tests/mcarlo-sims/sim-70 b/tools/linsched/tests/mcarlo-sims/sim-70
new file mode 100644
index 00000000000000..98ba931f82d36a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-70
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.103959 2.241264 LOGNORMAL 13.278792 2.655209 26553
+LOGNORMAL 11.718647 1.304980 EXPONENTIAL 673637 17048
diff --git a/tools/linsched/tests/mcarlo-sims/sim-71 b/tools/linsched/tests/mcarlo-sims/sim-71
new file mode 100644
index 00000000000000..0adf6a953d13e5
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-71
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.120561 3.262246 LOGNORMAL 11.752889 3.802470 23695
+LOGNORMAL 12.097397 3.955184 EXPONENTIAL 639610 31706
+LOGNORMAL 13.795413 3.512725 EXPONENTIAL 640167 25884
+LOGNORMAL 11.550290 3.728901 LOGNORMAL 11.287029 1.088389 18779
diff --git a/tools/linsched/tests/mcarlo-sims/sim-72 b/tools/linsched/tests/mcarlo-sims/sim-72
new file mode 100644
index 00000000000000..4315d6a518b361
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-72
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.055139 3.728813 LOGNORMAL 12.672838 3.390436 11609
+LOGNORMAL 12.972205 3.842219 LOGNORMAL 11.632599 1.088652 26877
diff --git a/tools/linsched/tests/mcarlo-sims/sim-73 b/tools/linsched/tests/mcarlo-sims/sim-73
new file mode 100644
index 00000000000000..48aaf701d6e826
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-73
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 12.598540 2.663598 LOGNORMAL 12.109072 2.171214 3690
+LOGNORMAL 13.386812 3.148338 LOGNORMAL 12.608253 3.915713 7628
+LOGNORMAL 12.123516 1.927650 EXPONENTIAL 600787 28616
+LOGNORMAL 13.659936 3.544237 EXPONENTIAL 638655 31699
+LOGNORMAL 13.002860 3.065529 LOGNORMAL 12.733443 1.969894 8252
diff --git a/tools/linsched/tests/mcarlo-sims/sim-74 b/tools/linsched/tests/mcarlo-sims/sim-74
new file mode 100644
index 00000000000000..e0cfafba337569
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-74
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.360562 1.960117 EXPONENTIAL 624861 1508
+LOGNORMAL 11.970057 2.741980 LOGNORMAL 11.743006 2.696494 30490
+LOGNORMAL 11.116394 1.239251 EXPONENTIAL 670167 6634
diff --git a/tools/linsched/tests/mcarlo-sims/sim-75 b/tools/linsched/tests/mcarlo-sims/sim-75
new file mode 100644
index 00000000000000..1645822691ffe9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-75
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.131180 2.747402 EXPONENTIAL 657063 19855
+LOGNORMAL 13.911291 1.065316 EXPONENTIAL 612696 5943
+LOGNORMAL 12.443187 1.636173 EXPONENTIAL 618126 21883
diff --git a/tools/linsched/tests/mcarlo-sims/sim-76 b/tools/linsched/tests/mcarlo-sims/sim-76
new file mode 100644
index 00000000000000..b8b377476c0ee8
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-76
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.414822 1.919022 EXPONENTIAL 637832 2758
+LOGNORMAL 13.088547 3.216453 EXPONENTIAL 695053 2455
diff --git a/tools/linsched/tests/mcarlo-sims/sim-77 b/tools/linsched/tests/mcarlo-sims/sim-77
new file mode 100644
index 00000000000000..6a9481946c05aa
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-77
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.220257 1.854853 EXPONENTIAL 639938 28898
+LOGNORMAL 13.461841 1.157121 LOGNORMAL 12.125167 2.683195 24498
+LOGNORMAL 11.516359 3.443702 LOGNORMAL 12.178237 3.628578 28586
diff --git a/tools/linsched/tests/mcarlo-sims/sim-78 b/tools/linsched/tests/mcarlo-sims/sim-78
new file mode 100644
index 00000000000000..e0b62dc7f936bf
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-78
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 11.989532 3.059290 LOGNORMAL 12.653692 2.601891 1790
+LOGNORMAL 13.417487 2.712213 LOGNORMAL 12.069693 3.329352 18716
+LOGNORMAL 12.148011 2.619106 LOGNORMAL 13.278705 1.195701 32049
diff --git a/tools/linsched/tests/mcarlo-sims/sim-79 b/tools/linsched/tests/mcarlo-sims/sim-79
new file mode 100644
index 00000000000000..87a216b584abc7
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-79
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.550736 1.220278 EXPONENTIAL 687331 1575
+LOGNORMAL 12.186475 1.084126 EXPONENTIAL 616596 14782
+LOGNORMAL 13.670716 1.730375 LOGNORMAL 12.343686 3.333294 17213
diff --git a/tools/linsched/tests/mcarlo-sims/sim-8 b/tools/linsched/tests/mcarlo-sims/sim-8
new file mode 100644
index 00000000000000..16fa622a976d4f
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-8
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.033449 3.170757 LOGNORMAL 11.575935 2.744156 29899
+LOGNORMAL 13.172370 2.026242 LOGNORMAL 11.961350 3.410553 28460
diff --git a/tools/linsched/tests/mcarlo-sims/sim-80 b/tools/linsched/tests/mcarlo-sims/sim-80
new file mode 100644
index 00000000000000..071e3477a1abee
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-80
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.756935 2.810105 EXPONENTIAL 639526 21396
+LOGNORMAL 11.664851 3.143769 EXPONENTIAL 695288 25316
+LOGNORMAL 12.563522 2.121820 EXPONENTIAL 691893 8370
+LOGNORMAL 13.644588 3.595433 LOGNORMAL 13.565531 3.876637 10679
+LOGNORMAL 11.426084 1.201922 EXPONENTIAL 664033 1469
diff --git a/tools/linsched/tests/mcarlo-sims/sim-81 b/tools/linsched/tests/mcarlo-sims/sim-81
new file mode 100644
index 00000000000000..b3bdc3a76e7cce
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-81
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.336960 1.285405 LOGNORMAL 11.993720 1.443645 13700
+LOGNORMAL 12.333858 3.151502 LOGNORMAL 11.977851 1.746197 2091
+LOGNORMAL 11.900332 3.887549 EXPONENTIAL 658298 6394
+LOGNORMAL 12.638433 1.147345 EXPONENTIAL 612741 31511
+LOGNORMAL 13.039746 2.006365 EXPONENTIAL 648120 15667
diff --git a/tools/linsched/tests/mcarlo-sims/sim-82 b/tools/linsched/tests/mcarlo-sims/sim-82
new file mode 100644
index 00000000000000..955b5a1338b74b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-82
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.031972 2.347376 LOGNORMAL 12.588801 3.978106 348
+LOGNORMAL 12.466417 2.067814 EXPONENTIAL 646769 2097
+LOGNORMAL 13.027900 3.918464 EXPONENTIAL 665833 873
+LOGNORMAL 13.739067 1.493667 EXPONENTIAL 669559 590
+LOGNORMAL 11.710300 2.009610 EXPONENTIAL 648594 30397
diff --git a/tools/linsched/tests/mcarlo-sims/sim-83 b/tools/linsched/tests/mcarlo-sims/sim-83
new file mode 100644
index 00000000000000..5adddd070e5e8b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-83
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 12.956420 2.550231 LOGNORMAL 12.732311 3.958884 28490
+LOGNORMAL 12.584186 1.414592 EXPONENTIAL 638171 10093
+LOGNORMAL 11.987012 2.710235 EXPONENTIAL 659399 9776
+LOGNORMAL 11.964557 3.314100 LOGNORMAL 12.456479 3.036173 15857
diff --git a/tools/linsched/tests/mcarlo-sims/sim-84 b/tools/linsched/tests/mcarlo-sims/sim-84
new file mode 100644
index 00000000000000..4f26e401cf0ad3
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-84
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 12.093496 1.390620 EXPONENTIAL 683747 26103
+LOGNORMAL 13.245183 1.795985 LOGNORMAL 13.061820 1.008880 2820
+LOGNORMAL 11.358611 1.175457 LOGNORMAL 13.458465 1.422345 31368
diff --git a/tools/linsched/tests/mcarlo-sims/sim-85 b/tools/linsched/tests/mcarlo-sims/sim-85
new file mode 100644
index 00000000000000..241006581fccce
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-85
@@ -0,0 +1,6 @@
+ROOT 5
+LOGNORMAL 11.985411 2.804915 LOGNORMAL 11.493791 2.141369 10741
+LOGNORMAL 12.918638 3.545693 LOGNORMAL 13.182660 3.960131 15049
+LOGNORMAL 12.534702 3.728409 LOGNORMAL 12.748791 1.930061 969
+LOGNORMAL 12.646373 2.586018 EXPONENTIAL 676043 7266
+LOGNORMAL 13.371622 2.858004 LOGNORMAL 13.854510 3.757028 2754
diff --git a/tools/linsched/tests/mcarlo-sims/sim-86 b/tools/linsched/tests/mcarlo-sims/sim-86
new file mode 100644
index 00000000000000..9ab12bfcf82a69
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-86
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.767159 2.641783 LOGNORMAL 12.752367 2.027772 5927
+LOGNORMAL 13.630785 2.608818 EXPONENTIAL 603003 23264
+LOGNORMAL 13.733165 1.306035 EXPONENTIAL 697524 17340
diff --git a/tools/linsched/tests/mcarlo-sims/sim-87 b/tools/linsched/tests/mcarlo-sims/sim-87
new file mode 100644
index 00000000000000..b2bce565b4f4f9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-87
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.787596 3.129382 LOGNORMAL 11.217456 1.786207 23052
+LOGNORMAL 11.096780 1.583914 EXPONENTIAL 625203 30098
diff --git a/tools/linsched/tests/mcarlo-sims/sim-88 b/tools/linsched/tests/mcarlo-sims/sim-88
new file mode 100644
index 00000000000000..67f57fcba1fb14
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-88
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 12.216593 3.274248 EXPONENTIAL 634969 22537
+LOGNORMAL 11.680514 2.391713 LOGNORMAL 12.810007 1.784892 28526
diff --git a/tools/linsched/tests/mcarlo-sims/sim-89 b/tools/linsched/tests/mcarlo-sims/sim-89
new file mode 100644
index 00000000000000..1c96926b3b65a0
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-89
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.063882 3.659848 EXPONENTIAL 687564 14701
+LOGNORMAL 12.050684 1.853946 EXPONENTIAL 625318 29221
+LOGNORMAL 11.891471 1.952501 EXPONENTIAL 664587 12193
+LOGNORMAL 11.847601 2.626833 EXPONENTIAL 608242 18231
+LOGNORMAL 11.361275 3.952510 LOGNORMAL 13.147558 2.010850 1866
diff --git a/tools/linsched/tests/mcarlo-sims/sim-9 b/tools/linsched/tests/mcarlo-sims/sim-9
new file mode 100644
index 00000000000000..204b8abbe1d816
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-9
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.926980 1.761179 EXPONENTIAL 666759 21058
+LOGNORMAL 13.832910 3.718251 LOGNORMAL 12.182868 3.459144 5916
+LOGNORMAL 11.428848 2.655759 LOGNORMAL 13.469712 1.451445 23267
+LOGNORMAL 12.856364 3.911096 LOGNORMAL 13.748489 3.859990 16511
+LOGNORMAL 13.268504 3.740244 LOGNORMAL 12.474731 3.807715 29715
diff --git a/tools/linsched/tests/mcarlo-sims/sim-90 b/tools/linsched/tests/mcarlo-sims/sim-90
new file mode 100644
index 00000000000000..4adf61ff818619
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-90
@@ -0,0 +1,4 @@
+ONE_GROUP 3
+LOGNORMAL 12.700867 3.466590 EXPONENTIAL 653838 10136
+LOGNORMAL 12.711150 2.298322 LOGNORMAL 13.923301 1.919362 6529
+LOGNORMAL 13.190324 3.767737 EXPONENTIAL 649697 3992
diff --git a/tools/linsched/tests/mcarlo-sims/sim-91 b/tools/linsched/tests/mcarlo-sims/sim-91
new file mode 100644
index 00000000000000..fedca690b5eece
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-91
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 11.851806 1.309795 LOGNORMAL 12.123306 1.404704 30626
+LOGNORMAL 13.935423 1.651947 EXPONENTIAL 696489 24645
+LOGNORMAL 12.215599 1.576963 LOGNORMAL 13.173956 1.684609 5812
+LOGNORMAL 12.537289 2.216906 EXPONENTIAL 685312 16569
+LOGNORMAL 11.495630 3.059456 LOGNORMAL 13.822631 1.955524 23900
diff --git a/tools/linsched/tests/mcarlo-sims/sim-92 b/tools/linsched/tests/mcarlo-sims/sim-92
new file mode 100644
index 00000000000000..e8828f41bdaaf9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-92
@@ -0,0 +1,6 @@
+5
+LOGNORMAL 12.844466 1.936342 LOGNORMAL 12.880553 2.458609 31464
+LOGNORMAL 12.645631 2.121429 EXPONENTIAL 685122 28730
+LOGNORMAL 12.687944 2.283176 EXPONENTIAL 688359 12105
+LOGNORMAL 13.779658 2.705205 EXPONENTIAL 615671 8012
+LOGNORMAL 11.956488 2.689781 LOGNORMAL 11.194198 3.889210 387
diff --git a/tools/linsched/tests/mcarlo-sims/sim-93 b/tools/linsched/tests/mcarlo-sims/sim-93
new file mode 100644
index 00000000000000..fbe1ab4f7e0213
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-93
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 11.366007 2.482400 LOGNORMAL 13.206902 3.402949 17547
+LOGNORMAL 13.804594 1.812232 EXPONENTIAL 688034 9474
+LOGNORMAL 11.011710 2.815311 LOGNORMAL 12.189858 3.936813 29988
diff --git a/tools/linsched/tests/mcarlo-sims/sim-94 b/tools/linsched/tests/mcarlo-sims/sim-94
new file mode 100644
index 00000000000000..25b86127636bb0
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-94
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.879748 2.918083 EXPONENTIAL 629174 21360
+LOGNORMAL 12.475792 3.636787 EXPONENTIAL 663607 4814
diff --git a/tools/linsched/tests/mcarlo-sims/sim-95 b/tools/linsched/tests/mcarlo-sims/sim-95
new file mode 100644
index 00000000000000..baa740cae8ec7a
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-95
@@ -0,0 +1,5 @@
+4
+LOGNORMAL 11.152850 1.956293 LOGNORMAL 12.237697 3.967166 22552
+LOGNORMAL 12.933146 1.378340 EXPONENTIAL 659407 15835
+LOGNORMAL 11.006543 2.967383 EXPONENTIAL 651615 5363
+LOGNORMAL 13.535897 3.813503 EXPONENTIAL 627410 32438
diff --git a/tools/linsched/tests/mcarlo-sims/sim-96 b/tools/linsched/tests/mcarlo-sims/sim-96
new file mode 100644
index 00000000000000..cc619a8026236b
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-96
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 11.191132 3.355128 EXPONENTIAL 670197 17406
+LOGNORMAL 13.439986 2.852987 LOGNORMAL 13.382601 1.382307 30734
diff --git a/tools/linsched/tests/mcarlo-sims/sim-97 b/tools/linsched/tests/mcarlo-sims/sim-97
new file mode 100644
index 00000000000000..63980169101baa
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-97
@@ -0,0 +1,5 @@
+ROOT 4
+LOGNORMAL 12.463876 1.367229 EXPONENTIAL 658514 19167
+LOGNORMAL 12.898280 3.399189 LOGNORMAL 11.386749 3.084602 7995
+LOGNORMAL 12.852148 2.050492 EXPONENTIAL 690876 1456
+LOGNORMAL 12.852690 2.154516 LOGNORMAL 11.823546 3.329675 6852
diff --git a/tools/linsched/tests/mcarlo-sims/sim-98 b/tools/linsched/tests/mcarlo-sims/sim-98
new file mode 100644
index 00000000000000..5c9aefb832abc9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-98
@@ -0,0 +1,3 @@
+2
+LOGNORMAL 13.430145 2.451243 LOGNORMAL 12.700928 1.492439 3140
+LOGNORMAL 11.639747 1.219648 EXPONENTIAL 628429 310
diff --git a/tools/linsched/tests/mcarlo-sims/sim-99 b/tools/linsched/tests/mcarlo-sims/sim-99
new file mode 100644
index 00000000000000..f2991b615f57b9
--- /dev/null
+++ b/tools/linsched/tests/mcarlo-sims/sim-99
@@ -0,0 +1,4 @@
+3
+LOGNORMAL 13.714238 1.192887 EXPONENTIAL 603027 11600
+LOGNORMAL 11.979736 3.417494 EXPONENTIAL 698205 2101
+LOGNORMAL 11.083617 2.351645 LOGNORMAL 11.679245 2.074022 29336
diff --git a/tools/linsched/tests/perf_replay.c b/tools/linsched/tests/perf_replay.c
new file mode 100644
index 00000000000000..c092d4b60141e8
--- /dev/null
+++ b/tools/linsched/tests/perf_replay.c
@@ -0,0 +1,49 @@
+/* Copyright 2011 Google Inc. All Rights Reserved.
+ * Author: asr@google.com (Abhishek Srivastava)
+ *
+ * Simple demo program for replaying perf traces
+ * processed into .rlog(s)
+ */
+
+#include "linsched.h"
+#include <strings.h>
+#include <stdio.h>
+
+void usage(void)
+{
+ fprintf(stdout, "\nUsage: perf_replay \
+ <PATH_TO_DIRECTORY_WITH_RLOGS> <SIM_DURATION>\n");
+}
+
+int linsched_test_main(int argc, char **argv)
+{
+ int perf_error = 0, duration;
+
+ /* Initialize linsched. */
+ linsched_init(NULL);
+
+ if (argc == 3)
+ perf_error = linsched_create_perf_tasks(argv[1]);
+ else {
+ fprintf(stderr, "\ninvalid number of arguments.Exiting ...\n");
+ usage();
+ return -1;
+ }
+
+ if (perf_error) {
+ fprintf(stderr, "\nfailed to create perf tasks.Exiting ...\n");
+ return -1;
+ }
+
+ /* Run simulation */
+ duration = simple_strtol(argv[2], NULL, 0);
+ linsched_run_sim(duration);
+
+ linsched_show_schedstat();
+
+ /* we always want these */
+ linsched_global_options.print_tasks = 1;
+ linsched_global_options.print_cgroups = 1;
+
+ return 0;
+}
diff --git a/tools/linsched/tests/run_tests.sh b/tools/linsched/tests/run_tests.sh
new file mode 100755
index 00000000000000..018688fa8c38fe
--- /dev/null
+++ b/tools/linsched/tests/run_tests.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+#runs all tests given to it, stopping on the first unexpected failure
+#knows to run subtests for basic_tests
+
+function die() {
+ echo $1
+ exit 1
+}
+
+for i in "$@"; do
+ if [ "$i" = "basic_tests" ]; then
+ for a in $(./basic_tests list); do
+ echo "Running test $a"
+ for topo in "uniprocessor" "dual_cpu" "dual_cpu_mc" "quad_cpu" "quad_cpu_mc" "quad_cpu_dual_socket" "quad_cpu_quad_socket" "hex_cpu_dual_socket_smt"; do
+ echo -ne "Testing topology $topo ....."
+ ./basic_tests $a $topo
+ if [ $? -eq 0 ]; then
+ echo "PASSED"
+ else
+ echo "'basic_tests $a $topo' FAILED"
+ fi
+ done
+ done
+ else
+ ./$i || die "$i failed"
+ fi
+done
diff --git a/tools/linsched/tests/run_unit_tests.sh b/tools/linsched/tests/run_unit_tests.sh
new file mode 100755
index 00000000000000..db2ba140ed476e
--- /dev/null
+++ b/tools/linsched/tests/run_unit_tests.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+#
+# Copyright 2011 Google Inc. All Rights Reserved.
+# Author: asr@google.com (Abhishek Srivastava)
+
+function die()
+{
+ echo $1 exit 1
+}
+
+seed_list=(100 1000 5000 10000)
+n_list=(1000 10000 100000 1000000)
+
+mu_gaussian_list=(10 20 100 200 500 1000)
+sigma_gaussian_list=(5 10 100 200 500)
+
+mu_poisson_list=(10 20 100 200 500 1000)
+
+mu_exp_list=(10 20 100 200 500 1000)
+
+mulog_lnorm_list=(2 3 4 5 6 7 8 9 10)
+sdlog_lnorm_list=(1 2 3 4 5)
+
+for i in "$@"; do
+ if [ "$i" = "rand" ]; then
+ for seed in ${seed_list[@]}; do
+ for n in ${n_list[@]}; do
+ echo -e "\nRunning rand with seed=$seed and n=$n"
+ ./linsched_rand_test $i $seed $n
+ done
+ done
+ elif [ "$i" = "gaussian" ]; then
+ for seed in ${seed_list[@]}; do
+ for mu in ${mu_gaussian_list[@]}; do
+ for sigma in ${sigma_gaussian_list[@]}; do
+ for n in ${n_list[@]}; do
+ echo -e "\nRunning gaussian with seed=$seed,mu=$mu,sigma=$sigma,n=$n"
+ ./linsched_rand_test $i $seed $mu $sigma $n
+ done
+ done
+ done
+ done
+ elif [ "$i" = "poisson" ]; then
+ for seed in ${seed_list[@]}; do
+ for mu in ${mu_poisson_list[@]}; do
+ for n in ${n_list[@]}; do
+ echo -e "\nRunning poisson with seed=$seed,mu=$mu,n=$n"
+ ./linsched_rand_test $i $seed $mu $n
+ done
+ done
+ done
+ elif [ "$i" = "exp" ]; then
+ for seed in ${seed_list[@]}; do
+ for mu in ${mu_exp_list[@]}; do
+ for n in ${n_list[@]}; do
+ echo -e "\nRunning exponential with seed=$seed,mu=$mu,n=$n"
+ ./linsched_rand_test $i $seed $mu $n
+ done
+ done
+ done
+ elif [ "$i" = "lnorm" ]; then
+ for seed in ${seed_list[@]}; do
+ for mulog in ${mulog_lnorm_list[@]}; do
+ for sdlog in ${sdlog_lnorm_list[@]}; do
+ for n in ${n_list[@]}; do
+ echo -e "\nRunning lognormal with seed=$seed,mu=$mulog,sigma=$sdlog,n=$n"
+ ./linsched_rand_test $i $seed $mulog $sdlog $n
+ done
+ done
+ done
+ done
+ else
+ ./$i || die "$i failed"
+ fi
+done
diff --git a/tools/linsched/validation/Makefile b/tools/linsched/validation/Makefile
new file mode 100644
index 00000000000000..9c4887fed79987
--- /dev/null
+++ b/tools/linsched/validation/Makefile
@@ -0,0 +1,18 @@
+LINUXDIR = ./../../..
+LINSCHED_DIR=${LINUXDIR}/tools/linsched
+include ../Makefile.inc
+
+UNIX_TESTS := unix-mcarlo-sim trace-imbalance
+
+
+.DEFAULT_GOAL := all
+.PHONY: all
+
+all: ${UNIX_TESTS}
+
+.SECONDEXPANSION:
+${UNIX_TESTS}: ${OBJ_FILES} $$@.o
+ @echo CC UNIX_TEST $@
+ @${LD_PERCPU} -o $@.percpu $^
+#two definitions of mktime
+ @${CC} -Wl,--allow-multiple-definition -static -o $@ $@.percpu -lrt -lm -lpcre
diff --git a/tools/linsched/validation/trace-imbalance.c b/tools/linsched/validation/trace-imbalance.c
new file mode 100644
index 00000000000000..89e186f2c6480c
--- /dev/null
+++ b/tools/linsched/validation/trace-imbalance.c
@@ -0,0 +1,327 @@
+/*
+ * Takes the output of perf script -D and runs load_balance_score.c
+ * against it.
+ *
+ * Note that even using perf script event ordering occasionally breaks
+ * or events get dropped, so the BUG_ONs are used to make sure such
+ * runs get dropped.
+ */
+
+#define _BSD_SOURCE
+#include "linsched.h"
+#include "test_lib.h"
+#include "load_balance_score.h"
+#include "sanity_check.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <pcre.h>
+
+#ifdef NDEBUG
+#define debugf(...) do { } while(0)
+#else
+#define debugf(...) printf(__VA_ARGS__)
+#endif
+
+struct pid_map {
+ int pid;
+ struct task_struct *p;
+};
+
+struct pid_map *pid_map;
+int pid_map_size;
+
+static void move_task(struct task_struct *p, int cpu)
+{
+ debugf("(%d) %d -> %d\n", task_thread_info(p)->id, task_cpu(p), cpu);
+ if (p->on_rq) {
+ linsched_force_migration(p, cpu, 0);
+ }
+}
+
+static void sleep_task(struct task_struct *p)
+{
+ int cpu = task_cpu(p);
+ struct rq *rq = cpu_rq(cpu);
+ debugf("(%d) %d -> sleep\n", task_thread_info(p)->id, cpu);
+ BUG_ON(!p->on_rq || p->state);
+ linsched_change_cpu(cpu);
+ if (p == rq->curr) {
+ p->state = TASK_INTERRUPTIBLE;
+ schedule();
+ } else {
+ /*
+ * Technically we should somehow force the task to run
+ * and then do the above. Just forcing a dequeue is enough
+ * to get load balance scoring though.
+ */
+
+ p->state = TASK_INTERRUPTIBLE;
+ p->sched_class->dequeue_task(rq, p, DEQUEUE_SLEEP);
+ p->on_rq = 0;
+ rq->nr_running--;
+ }
+
+}
+
+static void wake_task(struct task_struct *p, int cpu)
+{
+ int ret;
+ debugf("(%d) wake %d -> %d\n", task_thread_info(p)->id, task_cpu(p), cpu);
+
+ if (p->on_rq && task_cpu(p) == cpu) {
+ /*
+ * if we get an hrtimer interrupt between the hrtimer
+ * creation and the schedule() call, we get a spurious
+ * wakeup. Ignore it.
+ */
+ return;
+ }
+
+ BUG_ON(!p->state || p->on_rq);
+ linsched_change_cpu(cpu);
+ set_cpus_allowed(p, cpumask_of_cpu(cpu));
+ ret = wake_up_process(p);
+ BUG_ON(!ret || p->state || !p->on_rq);
+}
+
+struct cgroup *find_cgroup(char *target)
+{
+ int i, shares;
+ char path[512];
+ struct cgroup *cg;
+ FILE *f;
+ extern int num_cgroups; /* defined in linux_linsched.c */
+
+ for (i = 0; i < num_cgroups; i++) {
+ cg = &__linsched_cgroups[i].cg;
+ if (cgroup_path(cg, path, sizeof(path)))
+ continue;
+ if (!strcmp(path, target))
+ return cg;
+ }
+ /* only support one level deep for now */
+ BUG_ON(strchr(target + 1, '/'));
+ snprintf(path, sizeof(path), "/dev/cgroup/cpu%s/cpu.shares", target);
+ f = fopen(path, "r");
+ if (!f || fscanf(f, "%d", &shares) != 1)
+ return NULL;
+ fclose(f);
+ cg = linsched_create_cgroup(root_cgroup, target + 1);
+ sched_group_set_shares(cgroup_tg(cg), shares);
+ return cg;
+}
+
+int find_cpu_cgroup(void)
+{
+ FILE *f;
+ char line[256];
+ int id;
+ f = fopen("/proc/cgroups", "r");
+ BUG_ON(!f);
+
+ while (fgets(line, sizeof(line), f)) {
+ if (sscanf(line, "cpu %d %*d 1", &id) == 1) {
+ return id;
+ }
+ }
+ BUG();
+ return -1;
+}
+
+struct pid_map *pid_find(int pid)
+{
+ int i = pid % pid_map_size;
+ while (pid_map[i].pid != pid && pid_map[i].pid) {
+ i++;
+ i %= pid_map_size;
+ }
+ return &pid_map[i];
+}
+
+pcre *re_comp(const char *regex) {
+ const char *err_str;
+ int err_place;
+ pcre *res = pcre_compile(regex, 0, &err_str, &err_place, NULL);
+ if (!res) {
+ printf("%s: at %d in %s\n", err_str, err_place, regex);
+ BUG();
+ }
+ return res;
+}
+
+int re_exec(pcre *re, char *str, int *ovec, int ovecsize) {
+ int res = pcre_exec(re, NULL, str, strlen(str), 0, 0, ovec, ovecsize);
+ BUG_ON(res < 0 && res != PCRE_ERROR_NOMATCH);
+ return res;
+}
+
+char *group(char *line, int *ovec, int group)
+{
+ int start = ovec[group * 2];
+ int end = ovec[group * 2 + 1];
+ BUG_ON(start < 0 || end < 0);
+ line[end] = '\0';
+ return &line[start];
+}
+
+/* Now that everything is set up parse stdin from perf script -D
+ * format into calls to wake_task/sleep_task/move_task */
+void run_input(void)
+{
+ pcre *timestamp_re, *common_re, *switch_re, *migrate_re, *wakeup_re;
+ u64 next_ns = 0;
+ char line[512];
+
+ timestamp_re = re_comp("[0-9]+ ([0-9]+) 0x.*: PERF_RECORD_SAMPLE.*");
+
+ common_re = re_comp("^.* \\[([0-9]*)\\] *([0-9]*)\\.([0-9]*):"
+ " ([^:]*): (.*)$");
+
+ wakeup_re = re_comp("^comm=.* pid=([0-9]*) .* target_cpu=*([0-9]*)");
+ switch_re = re_comp("^prev_comm.* prev_pid=([0-9]*) .* prev_state=[^R ]+"
+ " ==> next_comm.*");
+ migrate_re = re_comp("^comm.* pid=([0-9]*) .* dest_cpu=([0-9]*)");
+
+ while(fgets(line, sizeof(line), stdin)) {
+ struct pid_map *pid;
+ char *tail, *name;
+ int ovec[30];
+ int res;
+ long long secs, usecs;
+ int cpu;
+ tail = strchr(line, '\n');
+ if (tail)
+ *tail = '\0';
+
+ res = re_exec(timestamp_re, line, ovec, ARRAY_SIZE(ovec));
+ if (res > 0) {
+ next_ns = strtoull(group(line, ovec, 1), NULL, 10);
+ continue;
+ }
+
+ res = re_exec(common_re, line, ovec, ARRAY_SIZE(ovec));
+ if (res < 0)
+ continue;
+
+ cpu = atoi(group(line, ovec, 1));
+ secs = atoll(group(line, ovec, 2));
+ usecs = atoll(group(line, ovec, 3));
+ name = group(line, ovec, 4);
+ tail = group(line, ovec, 5);
+ current_time = secs * 1000000000ULL + usecs * 1000;
+ if (next_ns > current_time && next_ns - current_time < 1000)
+ current_time = next_ns;
+ next_ns = 0;
+
+ if (!strcmp(name, "sched_wakeup")) {
+ res = re_exec(wakeup_re, tail, ovec, ARRAY_SIZE(ovec));
+ BUG_ON(res < 0);
+ pid = pid_find(atol(group(tail, ovec, 1)));
+ cpu = atoi(group(tail, ovec, 2));
+ if (!pid->p)
+ continue;
+
+ wake_task(pid->p, cpu);
+ } else if(!strcmp(name, "sched_switch")) {
+ res = re_exec(switch_re, tail, ovec, ARRAY_SIZE(ovec));
+ if (res < 0)
+ continue;
+ pid = pid_find(atol(group(tail, ovec, 1)));
+ if (!pid->p)
+ continue;
+
+ sleep_task(pid->p);
+ } else if (!strcmp(name, "sched_migrate_task")) {
+ res = re_exec(migrate_re, tail, ovec, ARRAY_SIZE(ovec));
+ BUG_ON(res < 0);
+ pid = pid_find(atol(group(tail, ovec, 1)));
+ cpu = atoi(group(tail, ovec, 2));
+ if (!pid->p)
+ continue;
+
+ move_task(pid->p, cpu);
+ }
+
+ linsched_enable_migrations();
+ compute_lb_info();
+ for_each_online_cpu(cpu) {
+ linsched_change_cpu(cpu);
+ run_sanity_check();
+ }
+ linsched_disable_migrations();
+ }
+}
+
+int linsched_test_main(int argc, char **argv)
+{
+ struct linsched_topology topo;
+ struct cpumask monitor_cpus;
+ int cpu, i;
+ int cpu_cgroup;
+ cpumask_var_t *doms = alloc_sched_domains(2);
+
+ if (argc < 4) {
+ fprintf(stderr, "Usage: %s <topology> <monitoring cpus> <pid> ...\n", argv[0]);
+ return 1;
+ }
+
+ topo = linsched_topo_db[parse_topology(argv[1])];
+
+ linsched_init(&topo);
+
+ if (cpulist_parse(argv[2], &monitor_cpus)) {
+ BUG();
+ }
+
+ cpu_cgroup = find_cpu_cgroup();
+
+ /* Turn off the cpus used for monitoring. This is entirely
+ * equivalent for our purposes to the cpuset-like that
+ * mcarlo-sim does. */
+ for_each_cpu(cpu, &monitor_cpus) {
+ linsched_offline_cpu(cpu);
+ }
+
+ pid_map_size = (argc - 3) * 2; /* 2 * npids */
+ pid_map = calloc(pid_map_size, sizeof(struct pid_map));
+
+ for (i = 3; i < argc; i++) {
+ char line[512];
+ FILE *f;
+ int pid = atoi(argv[i]);
+ struct pid_map *pmap;
+ struct task_data *td = linsched_create_sleep_run(0, 10);
+ struct task_struct *p = linsched_create_normal_task(td, 0);
+ struct cgroup *cg = NULL;
+ snprintf(line, sizeof(line), "/proc/%d/cgroup", pid);
+ f = fopen(line, "r");
+ BUG_ON(!f);
+ while (fgets(line, sizeof(line), f)) {
+ int id;
+ int len;
+ if (sscanf(line, "%d:%*[^:]:%n", &id, &len) < 1)
+ continue;
+ if (id == cpu_cgroup) {
+ char *nl = strchr(line, '\n');
+ if (nl)
+ *nl = '\0';
+ cg = find_cgroup(&line[len]);
+ break;
+ }
+ }
+ BUG_ON(!cg);
+ linsched_add_task_to_group(p, cg);
+ sleep_task(p);
+
+ pmap = pid_find(pid);
+ pmap->p = p;
+ pmap->pid = pid;
+ }
+
+ linsched_disable_migrations();
+
+ run_input();
+
+ printf("average imbalance: %f\n", get_average_imbalance());
+ return 0;
+}
diff --git a/tools/linsched/validation/unix-mcarlo-sim-init.sh b/tools/linsched/validation/unix-mcarlo-sim-init.sh
new file mode 100644
index 00000000000000..2cd1392a5da43b
--- /dev/null
+++ b/tools/linsched/validation/unix-mcarlo-sim-init.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+# Cgroup initialization for unix-mcarlo-sim, because the file
+# manipulation would be painful in C.
+
+die () {
+ [ -n "$*" ] && echo "$@" >&2
+ echo 'cgroup initialization failed' >&2
+ exit 1
+}
+
+move_tasks () {
+ from=$1
+ to=$2
+ for t in $(cat $from/tasks); do
+ echo $t > $to/tasks 2>/dev/null
+ done
+}
+
+for h in /dev/cgroup/*; do
+ find $h -mindepth 1 -depth -type d | while read cg; do
+ move_tasks $cg $h
+ rmdir $cg 2> /dev/null
+ done
+done
+
+umount /dev/cgroup/*
+rmdir /dev/cgroup/* 2> /dev/null
+rm -rf /dev/cgroup/* 2> /dev/null
+mkdir /dev/cgroup/cpu /dev/cgroup/cpuset
+mount -t cgroup -o cpu,cpuacct none /dev/cgroup/cpu || die
+mount -t cgroup -o cpuset none /dev/cgroup/cpuset || die
+
+mkdir /dev/cgroup/cpuset/test /dev/cgroup/cpuset/monitor 2>/dev/null
+[ -f /dev/cgroup/cpuset/test/cpuset.cpus -a \
+ -f /dev/cgroup/cpuset/monitor/cpuset.cpus ] || die "cpuset cgroups failed"
+
+echo $1 > /dev/cgroup/cpuset/test/cpuset.cpus || die
+echo $2 > /dev/cgroup/cpuset/monitor/cpuset.cpus || die
+cat /dev/cgroup/cpuset/cpuset.mems > /dev/cgroup/cpuset/monitor/cpuset.mems || die
+cat /dev/cgroup/cpuset/cpuset.mems > /dev/cgroup/cpuset/test/cpuset.mems || die
+
+move_tasks /dev/cgroup/cpuset /dev/cgroup/cpuset/monitor
+echo 0 > /dev/cgroup/cpuset/cpuset.sched_load_balance || die
+echo 1 > /dev/cgroup/cpuset/test/cpuset.sched_load_balance || die
diff --git a/tools/linsched/validation/unix-mcarlo-sim-monitor.sh b/tools/linsched/validation/unix-mcarlo-sim-monitor.sh
new file mode 100644
index 00000000000000..30ef15eca61a70
--- /dev/null
+++ b/tools/linsched/validation/unix-mcarlo-sim-monitor.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+# Monitor and produce statistics comparable to
+# mcarlo-sim --print_cgroup_stats --print_average_imbalance --print_sched_stats
+# and then clean up
+
+BASE_DIR="$(dirname $0)"
+DURATION="$1"
+TOPO="$2"
+MONITOR_CPUS="$3"
+
+CHILDREN=$(pgrep -P $$)
+CHILDREN=$(echo $CHILDREN) #squash the lines together
+CPUACCT_NAMES=( $(find /dev/cgroup/cpu -name cpuacct.usage) )
+
+# take schedstats delta (primarily for number of load balences)
+CPUACCT_BEFORE=( $(cat "${CPUACCT_NAMES[@]}" ) )
+cat /proc/schedstat > schedstat.before
+
+# grab trace (of _all_ cpus - cpuset away ones still start load balances)
+perf record -a -T -e sched:sched_wakeup -e sched:sched_switch -e sched:sched_migrate_task -- \
+ bash -c \
+"sleep 1;
+kill -CONT $CHILDREN;
+sleep $( echo $DURATION / 1000 | bc -l);
+kill -STOP $CHILDREN"
+
+CPUACCT_AFTER=( $(cat "${CPUACCT_NAMES[@]}" ) )
+cat /proc/schedstat > schedstat.after
+
+echo ------ group runtime
+for i in "${!CPUACCT_NAMES[@]}"; do
+ name="${CPUACCT_NAMES[$i]}"
+ name="${name#/dev/cgroup/cpu}"
+ name="${name%/cpuacct.usage}"
+ [ -z "$name" ] && name=/
+ usage="$(( ${CPUACCT_AFTER[$i]} - ${CPUACCT_BEFORE[$i]} ))"
+ echo "CGroup = $name exec_time = $usage"
+done | tac
+echo ------ sched stats
+$BASE_DIR/schedstat-diff.py schedstat.before schedstat.after
+
+perf script -D | grep -v '^#\|^\.' | \
+ $BASE_DIR/trace-imbalance $TOPO $MONITOR_CPUS $CHILDREN | tail | tee imbalance
+kill -KILL $CHILDREN
+
+# Cleanup
+echo 1 > /dev/cgroup/cpuset/cpuset.sched_load_balance
+move_tasks () {
+ from=$1
+ to=$2
+ for t in $(cat $from/tasks); do
+ echo $t > $to/tasks 2>/dev/null
+ done
+}
+
+for h in /dev/cgroup/*; do
+ find $h -mindepth 1 -depth -type d | while read cg; do
+ move_tasks $cg $h
+ rmdir $cg 2> /dev/null
+ done
+done
+
+umount /dev/cgroup/*
+rmdir /dev/cgroup/* 2> /dev/null
+rm -rf /dev/cgroup/* 2> /dev/null
+
+if grep 'BUG\|nan' imbalance >& /dev/null; then
+ echo error $$ >&2
+ exit 1
+fi
diff --git a/tools/linsched/validation/unix-mcarlo-sim.c b/tools/linsched/validation/unix-mcarlo-sim.c
new file mode 100644
index 00000000000000..3bba27918276cc
--- /dev/null
+++ b/tools/linsched/validation/unix-mcarlo-sim.c
@@ -0,0 +1,298 @@
+/*
+ * Runs the equivalent of mcarlo-sim on the current machine instead of
+ * in simulation. Requires root.
+ *
+ * Prints the equivalent of --print_cgroup_stats
+ * --print_average_imbalance --print_sched_stats
+ *
+ * Requires the arguments -c to specify a cpu list to run the tests
+ * on, and -m to specify the cpus to monitor from, as well as the
+ * normal mcarlo-sim ones.
+ *
+ * Depends on the scripts schedstat-diff.py, unix-mcarlo-sim-init.sh,
+ * and unix-mcarlo-sim-monitor.sh being in the same directory.
+ */
+
+#define __STRICT_ANSI__
+#include <errno.h>
+#undef __always_inline
+#include "linsched.h"
+#include "linsched_rand.h"
+#include "linsched_sim.h"
+#include "test_lib.h"
+#include <string.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#define _SYS_RESOURCE_H
+#include <sys/wait.h>
+
+/* Faked header include due to conflicts with linux_sched_headers.h */
+/* #include <time.h> */
+int nanosleep(const struct timespec *req, struct timespec *rem);
+int clock_gettime(clockid_t clk_id, struct timespec *tp);
+/* #include <signal.h> */
+int killpg(int pgrp, int sig);
+int kill(pid_t pid, int sig);
+/* #include <sys/stat.h> */
+int mkdir(const char *pathname, mode_t mode);
+
+
+static char exec_dir[512];
+
+s64 time_sub(struct timespec *end, struct timespec *start)
+{
+ return (end->tv_sec - start->tv_sec) * NSEC_PER_SEC +
+ end->tv_nsec - start->tv_nsec;
+}
+
+void sleep_cycle(u64 ns)
+{
+ struct timespec dur = {0, 0};
+ struct timespec rem = { ns / NSEC_PER_SEC, ns % NSEC_PER_SEC };
+ int rc = 0;
+
+ do {
+ dur = rem;
+ rc = nanosleep(&dur, &rem);
+ } while(rc == -1 && errno == EINTR);
+}
+
+void busy_cycle(u64 ns)
+{
+ struct timespec start, prev, cur;
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ cur = start;
+ do {
+ long delta;
+ prev = cur;
+ clock_gettime(CLOCK_MONOTONIC, &cur);
+ delta = time_sub(&cur, &prev);
+ /* assume skips of 2+ microseconds are due to context switch */
+ if(delta > 2000) {
+ ns += delta;
+ }
+ } while(time_sub(&cur, &start) < ns);
+}
+
+void run_rand_dist(struct rnd_dist_task *d)
+{
+ struct rand_dist *sdist = d->sleep_rdist;
+ struct rand_dist *bdist = d->busy_rdist;
+
+ kill(getpid(), SIGSTOP);
+
+ while(1) {
+ busy_cycle(d->busy);
+ d->sleep = sdist->gen_fn(sdist);
+ d->busy = bdist->gen_fn(bdist);
+ if (!d->sleep)
+ d->sleep = 1;
+ sleep_cycle(d->sleep);
+ }
+}
+
+
+
+void print_usage(char *cmd)
+{
+ printf("Usage: %s -c <cpulist> -m <cpulist> -f <SHARES_FILE>"
+ " --duration <SIMDUARATION> -t <topology> [-s seed]\n", cmd);
+}
+
+void append_file(char *fn, char *contents)
+{
+ FILE *f = fopen(fn, "a");
+ fputs(contents, f);
+ fclose(f);
+}
+
+void write_file(char *fn, char *contents)
+{
+ FILE *f = fopen(fn, "a");
+ fputs(contents, f);
+ fclose(f);
+}
+
+
+void run_mcarlo_sim(struct linsched_sim *sim, char *cpus, char *monitor_cpus,
+ char *duration, char *topo)
+{
+ int group;
+ char buf[512];
+ int pid = getpid();
+ int ret;
+ int total_tasks = 0;
+
+ /* invoke half of this via a shell script to avoid painful
+ * directory traversal in C */
+
+ sprintf(buf, "%s/unix-mcarlo-sim-init.sh %s %s", exec_dir,
+ cpus, monitor_cpus);
+ ret = system(buf);
+ if (ret) {
+ if (ret == -1) {
+ int err = errno;
+ fprintf(stderr, "Unable to run '%s': ", buf);
+ errno = err;
+ perror(NULL);
+ }
+ exit(1);
+ }
+
+ sprintf(buf, "%d", pid);
+ append_file("/dev/cgroup/cpuset/test/tasks", buf);
+ for(group = 0; group < sim->n_task_grps; group++) {
+ char cg_base[512], path[512];
+ struct linsched_tg_sim *tgsim = sim->tg_sim_arr[group];
+ int task;
+ cgroup_path(tgsim->cg, buf, sizeof(buf));
+ sprintf(cg_base, "/dev/cgroup/cpu%s", buf);
+
+ mkdir(cg_base, 0777);
+
+ sprintf(buf, "%lu", cgroup_tg(tgsim->cg)->shares);
+ sprintf(path, "%s/cpu.shares", cg_base);
+ write_file(path, buf);
+
+ sprintf(buf, "%d", pid);
+ sprintf(path, "%s/tasks", cg_base);
+ append_file(path, buf);
+
+ for(task = 0; task < tgsim->n_tasks; task++) {
+ if(!fork()) {
+ struct task_data *td;
+ /* child automatically in the correct cgroups */
+
+ td = task_thread_info(tgsim->tasks[task])->td;
+ run_rand_dist(td->data);
+ }
+ total_tasks++;
+ }
+ }
+ sprintf(buf, "%d", pid);
+ append_file("/dev/cgroup/cpuset/monitor/tasks", buf);
+ append_file("/dev/cgroup/cpu/tasks", buf);
+
+ while(total_tasks) {
+ int status;
+ pid_t cpid;
+ cpid = waitpid(0, &status, WUNTRACED);
+ if (cpid == -1) {
+ perror("failed waitpid");
+ exit(1);
+ }
+ if (!WIFSTOPPED(status)) {
+ char *msg = "??? with raw status";
+ int num = status;
+
+ if (WIFEXITED(status)) {
+ msg = "exited with code";
+ num = WEXITSTATUS(status);
+ } else if (WIFSIGNALED(status)) {
+ msg = "killed by signal";
+ num = WTERMSIG(status);
+ }
+ fprintf(stderr, "Child %d %s %d", cpid, msg, num);
+ killpg(0, SIGTERM);
+ exit(1);
+ }
+ total_tasks--;
+ }
+
+ sprintf(buf, "%s/unix-mcarlo-sim-monitor.sh", exec_dir);
+ ret = execl(buf, buf, duration, topo, monitor_cpus, NULL);
+ perror("execl of monitoring script failed");
+ exit(1);
+}
+
+int linsched_test_main(int argc, char **argv)
+{
+ int c;
+ char tg_file[512] = "", cpus[64] = "", monitor_cpus[64] = "";
+ char duration[64] = "", topo[64] = "";
+ unsigned int seed = getticks();
+ char *slash;
+
+ strcpy(exec_dir, argv[0]);
+ slash = strrchr(exec_dir, '/');
+ if (slash) {
+ *slash = '\0';
+ } else {
+ strcpy(exec_dir, ".");
+ }
+
+ while (1) {
+ static struct option const long_options[] = {
+ {"cpus", required_argument, 0, 'c'},
+ {"monitor_cpus", required_argument, 0, 'm'},
+ {"topo", required_argument, 0, 't'},
+ {"tg_file", required_argument, 0, 'f'},
+ {"duration", required_argument, 0, 'd'},
+ {"seed", required_argument, 0, 's'},
+ {0, 0, 0, 0}
+ };
+ /* getopt_long stores the option index here. */
+ int option_index = 0;
+
+ c = getopt_long(argc, argv, "t:f:d:s:c:m:",
+ long_options, &option_index);
+
+ /* Detect the end of the options. */
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'c':
+ strcpy(cpus, optarg);
+ break;
+
+ case 'm':
+ strcpy(monitor_cpus, optarg);
+ break;
+
+ case 'f':
+ strcpy(tg_file, optarg);
+ break;
+
+ case 'd':
+ strcpy(duration, optarg);
+ break;
+ case 't':
+ strcpy(topo, optarg);
+ break;
+ case 's':
+ seed = simple_strtoul(optarg, NULL, 0);
+ break;
+ case '?':
+ /* getopt_long already printed an error message. */
+ break;
+ }
+ }
+
+ if (strcmp(cpus, "") && strcmp(monitor_cpus, "") &&
+ strcmp(tg_file, "") && strcmp(duration, "") &&
+ strcmp(topo, "")) {
+ fprintf(stdout, "\nMonitoring cpus = %s, test cpus = %s, "
+ "tg_file = %s, duration = %s\n",
+ monitor_cpus, cpus, tg_file, duration);
+ struct linsched_topology ltopo = TOPO_UNIPROCESSOR;
+ struct linsched_sim *lsim;
+ unsigned int *rand_state = linsched_init_rand(seed);
+
+ linsched_init(&ltopo);
+ lsim = linsched_create_sim(tg_file, cpu_online_mask, rand_state);
+ if (lsim) {
+ run_mcarlo_sim(lsim, cpus, monitor_cpus, duration, topo);
+ } else {
+ fprintf(stderr, "failed to create simulation.\n");
+ print_usage("unix-mcarlo-sim");
+ }
+ } else {
+ print_usage(argv[0]);
+ }
+
+ return 0;
+}