0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/trace_events.h>
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 static struct trace_event_file *create_synth_test;
0038 static struct trace_event_file *empty_synth_test;
0039 static struct trace_event_file *gen_synth_test;
0040
0041
0042
0043
0044
0045 static int __init test_gen_synth_cmd(void)
0046 {
0047 struct dynevent_cmd cmd;
0048 u64 vals[7];
0049 char *buf;
0050 int ret;
0051
0052
0053 buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL);
0054 if (!buf)
0055 return -ENOMEM;
0056
0057
0058 synth_event_cmd_init(&cmd, buf, MAX_DYNEVENT_CMD_LEN);
0059
0060
0061
0062
0063
0064 ret = synth_event_gen_cmd_start(&cmd, "gen_synth_test", THIS_MODULE,
0065 "pid_t", "next_pid_field",
0066 "char[16]", "next_comm_field",
0067 "u64", "ts_ns",
0068 "u64", "ts_ms");
0069 if (ret)
0070 goto free;
0071
0072
0073
0074 ret = synth_event_add_field(&cmd, "unsigned int", "cpu");
0075 if (ret)
0076 goto free;
0077
0078 ret = synth_event_add_field(&cmd, "char[64]", "my_string_field");
0079 if (ret)
0080 goto free;
0081
0082 ret = synth_event_add_field(&cmd, "int", "my_int_field");
0083 if (ret)
0084 goto free;
0085
0086 ret = synth_event_gen_cmd_end(&cmd);
0087 if (ret)
0088 goto free;
0089
0090
0091
0092
0093
0094
0095
0096 gen_synth_test = trace_get_event_file(NULL, "synthetic",
0097 "gen_synth_test");
0098 if (IS_ERR(gen_synth_test)) {
0099 ret = PTR_ERR(gen_synth_test);
0100 goto delete;
0101 }
0102
0103
0104 ret = trace_array_set_clr_event(gen_synth_test->tr,
0105 "synthetic", "gen_synth_test", true);
0106 if (ret) {
0107 trace_put_event_file(gen_synth_test);
0108 goto delete;
0109 }
0110
0111
0112
0113 vals[0] = 777;
0114 vals[1] = (u64)(long)"hula hoops";
0115 vals[2] = 1000000;
0116 vals[3] = 1000;
0117 vals[4] = raw_smp_processor_id();
0118 vals[5] = (u64)(long)"thneed";
0119 vals[6] = 598;
0120
0121
0122 ret = synth_event_trace_array(gen_synth_test, vals, ARRAY_SIZE(vals));
0123 out:
0124 return ret;
0125 delete:
0126
0127 synth_event_delete("gen_synth_test");
0128 free:
0129 kfree(buf);
0130
0131 goto out;
0132 }
0133
0134
0135
0136
0137
0138 static int __init test_empty_synth_event(void)
0139 {
0140 struct dynevent_cmd cmd;
0141 u64 vals[7];
0142 char *buf;
0143 int ret;
0144
0145
0146 buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL);
0147 if (!buf)
0148 return -ENOMEM;
0149
0150
0151 synth_event_cmd_init(&cmd, buf, MAX_DYNEVENT_CMD_LEN);
0152
0153
0154
0155
0156 ret = synth_event_gen_cmd_start(&cmd, "empty_synth_test", THIS_MODULE);
0157 if (ret)
0158 goto free;
0159
0160
0161
0162 ret = synth_event_add_field(&cmd, "pid_t", "next_pid_field");
0163 if (ret)
0164 goto free;
0165
0166 ret = synth_event_add_field(&cmd, "char[16]", "next_comm_field");
0167 if (ret)
0168 goto free;
0169
0170 ret = synth_event_add_field(&cmd, "u64", "ts_ns");
0171 if (ret)
0172 goto free;
0173
0174 ret = synth_event_add_field(&cmd, "u64", "ts_ms");
0175 if (ret)
0176 goto free;
0177
0178 ret = synth_event_add_field(&cmd, "unsigned int", "cpu");
0179 if (ret)
0180 goto free;
0181
0182 ret = synth_event_add_field(&cmd, "char[64]", "my_string_field");
0183 if (ret)
0184 goto free;
0185
0186 ret = synth_event_add_field(&cmd, "int", "my_int_field");
0187 if (ret)
0188 goto free;
0189
0190
0191
0192 ret = synth_event_gen_cmd_end(&cmd);
0193 if (ret)
0194 goto free;
0195
0196
0197
0198
0199
0200
0201
0202
0203 empty_synth_test = trace_get_event_file(NULL, "synthetic",
0204 "empty_synth_test");
0205 if (IS_ERR(empty_synth_test)) {
0206 ret = PTR_ERR(empty_synth_test);
0207 goto delete;
0208 }
0209
0210
0211 ret = trace_array_set_clr_event(empty_synth_test->tr,
0212 "synthetic", "empty_synth_test", true);
0213 if (ret) {
0214 trace_put_event_file(empty_synth_test);
0215 goto delete;
0216 }
0217
0218
0219
0220 vals[0] = 777;
0221 vals[1] = (u64)(long)"tiddlywinks";
0222 vals[2] = 1000000;
0223 vals[3] = 1000;
0224 vals[4] = raw_smp_processor_id();
0225 vals[5] = (u64)(long)"thneed_2.0";
0226 vals[6] = 399;
0227
0228
0229 ret = synth_event_trace_array(empty_synth_test, vals, ARRAY_SIZE(vals));
0230 out:
0231 return ret;
0232 delete:
0233
0234 synth_event_delete("empty_synth_test");
0235 free:
0236 kfree(buf);
0237
0238 goto out;
0239 }
0240
0241 static struct synth_field_desc create_synth_test_fields[] = {
0242 { .type = "pid_t", .name = "next_pid_field" },
0243 { .type = "char[16]", .name = "next_comm_field" },
0244 { .type = "u64", .name = "ts_ns" },
0245 { .type = "char[]", .name = "dynstring_field_1" },
0246 { .type = "u64", .name = "ts_ms" },
0247 { .type = "unsigned int", .name = "cpu" },
0248 { .type = "char[64]", .name = "my_string_field" },
0249 { .type = "char[]", .name = "dynstring_field_2" },
0250 { .type = "int", .name = "my_int_field" },
0251 };
0252
0253
0254
0255
0256
0257 static int __init test_create_synth_event(void)
0258 {
0259 u64 vals[9];
0260 int ret;
0261
0262
0263 ret = synth_event_create("create_synth_test",
0264 create_synth_test_fields,
0265 ARRAY_SIZE(create_synth_test_fields),
0266 THIS_MODULE);
0267 if (ret)
0268 goto out;
0269
0270
0271
0272
0273
0274
0275
0276
0277 create_synth_test = trace_get_event_file(NULL, "synthetic",
0278 "create_synth_test");
0279 if (IS_ERR(create_synth_test)) {
0280 ret = PTR_ERR(create_synth_test);
0281 goto delete;
0282 }
0283
0284
0285 ret = trace_array_set_clr_event(create_synth_test->tr,
0286 "synthetic", "create_synth_test", true);
0287 if (ret) {
0288 trace_put_event_file(create_synth_test);
0289 goto delete;
0290 }
0291
0292
0293
0294 vals[0] = 777;
0295 vals[1] = (u64)(long)"tiddlywinks";
0296 vals[2] = 1000000;
0297 vals[3] = (u64)(long)"xrayspecs";
0298 vals[4] = 1000;
0299 vals[5] = raw_smp_processor_id();
0300 vals[6] = (u64)(long)"thneed";
0301 vals[7] = (u64)(long)"kerplunk";
0302 vals[8] = 398;
0303
0304
0305 ret = synth_event_trace_array(create_synth_test, vals, ARRAY_SIZE(vals));
0306 out:
0307 return ret;
0308 delete:
0309
0310 synth_event_delete("create_synth_test");
0311
0312 goto out;
0313 }
0314
0315
0316
0317
0318
0319 static int __init test_add_next_synth_val(void)
0320 {
0321 struct synth_event_trace_state trace_state;
0322 int ret;
0323
0324
0325 ret = synth_event_trace_start(gen_synth_test, &trace_state);
0326 if (ret)
0327 return ret;
0328
0329
0330
0331
0332 ret = synth_event_add_next_val(777, &trace_state);
0333 if (ret)
0334 goto out;
0335
0336
0337 ret = synth_event_add_next_val((u64)(long)"slinky", &trace_state);
0338 if (ret)
0339 goto out;
0340
0341
0342 ret = synth_event_add_next_val(1000000, &trace_state);
0343 if (ret)
0344 goto out;
0345
0346
0347 ret = synth_event_add_next_val(1000, &trace_state);
0348 if (ret)
0349 goto out;
0350
0351
0352 ret = synth_event_add_next_val(raw_smp_processor_id(), &trace_state);
0353 if (ret)
0354 goto out;
0355
0356
0357 ret = synth_event_add_next_val((u64)(long)"thneed_2.01", &trace_state);
0358 if (ret)
0359 goto out;
0360
0361
0362 ret = synth_event_add_next_val(395, &trace_state);
0363 out:
0364
0365 ret = synth_event_trace_end(&trace_state);
0366
0367 return ret;
0368 }
0369
0370
0371
0372
0373
0374
0375 static int __init test_add_synth_val(void)
0376 {
0377 struct synth_event_trace_state trace_state;
0378 int ret;
0379
0380
0381 ret = synth_event_trace_start(gen_synth_test, &trace_state);
0382 if (ret)
0383 return ret;
0384
0385
0386
0387 ret = synth_event_add_val("ts_ns", 1000000, &trace_state);
0388 if (ret)
0389 goto out;
0390
0391 ret = synth_event_add_val("ts_ms", 1000, &trace_state);
0392 if (ret)
0393 goto out;
0394
0395 ret = synth_event_add_val("cpu", raw_smp_processor_id(), &trace_state);
0396 if (ret)
0397 goto out;
0398
0399 ret = synth_event_add_val("next_pid_field", 777, &trace_state);
0400 if (ret)
0401 goto out;
0402
0403 ret = synth_event_add_val("next_comm_field", (u64)(long)"silly putty",
0404 &trace_state);
0405 if (ret)
0406 goto out;
0407
0408 ret = synth_event_add_val("my_string_field", (u64)(long)"thneed_9",
0409 &trace_state);
0410 if (ret)
0411 goto out;
0412
0413 ret = synth_event_add_val("my_int_field", 3999, &trace_state);
0414 out:
0415
0416 ret = synth_event_trace_end(&trace_state);
0417
0418 return ret;
0419 }
0420
0421
0422
0423
0424 static int __init test_trace_synth_event(void)
0425 {
0426 int ret;
0427
0428
0429 ret = synth_event_trace(create_synth_test, 9,
0430 (u64)444,
0431 (u64)(long)"clackers",
0432 (u64)1000000,
0433 (u64)(long)"viewmaster",
0434 (u64)1000,
0435 (u64)raw_smp_processor_id(),
0436 (u64)(long)"Thneed",
0437 (u64)(long)"yoyos",
0438 (u64)999);
0439 return ret;
0440 }
0441
0442 static int __init synth_event_gen_test_init(void)
0443 {
0444 int ret;
0445
0446 ret = test_gen_synth_cmd();
0447 if (ret)
0448 return ret;
0449
0450 ret = test_empty_synth_event();
0451 if (ret) {
0452 WARN_ON(trace_array_set_clr_event(gen_synth_test->tr,
0453 "synthetic",
0454 "gen_synth_test", false));
0455 trace_put_event_file(gen_synth_test);
0456 WARN_ON(synth_event_delete("gen_synth_test"));
0457 goto out;
0458 }
0459
0460 ret = test_create_synth_event();
0461 if (ret) {
0462 WARN_ON(trace_array_set_clr_event(gen_synth_test->tr,
0463 "synthetic",
0464 "gen_synth_test", false));
0465 trace_put_event_file(gen_synth_test);
0466 WARN_ON(synth_event_delete("gen_synth_test"));
0467
0468 WARN_ON(trace_array_set_clr_event(empty_synth_test->tr,
0469 "synthetic",
0470 "empty_synth_test", false));
0471 trace_put_event_file(empty_synth_test);
0472 WARN_ON(synth_event_delete("empty_synth_test"));
0473 goto out;
0474 }
0475
0476 ret = test_add_next_synth_val();
0477 WARN_ON(ret);
0478
0479 ret = test_add_synth_val();
0480 WARN_ON(ret);
0481
0482 ret = test_trace_synth_event();
0483 WARN_ON(ret);
0484 out:
0485 return ret;
0486 }
0487
0488 static void __exit synth_event_gen_test_exit(void)
0489 {
0490
0491 WARN_ON(trace_array_set_clr_event(gen_synth_test->tr,
0492 "synthetic",
0493 "gen_synth_test", false));
0494
0495
0496 trace_put_event_file(gen_synth_test);
0497
0498
0499 WARN_ON(synth_event_delete("gen_synth_test"));
0500
0501
0502 WARN_ON(trace_array_set_clr_event(empty_synth_test->tr,
0503 "synthetic",
0504 "empty_synth_test", false));
0505
0506
0507 trace_put_event_file(empty_synth_test);
0508
0509
0510 WARN_ON(synth_event_delete("empty_synth_test"));
0511
0512
0513 WARN_ON(trace_array_set_clr_event(create_synth_test->tr,
0514 "synthetic",
0515 "create_synth_test", false));
0516
0517
0518 trace_put_event_file(create_synth_test);
0519
0520
0521 WARN_ON(synth_event_delete("create_synth_test"));
0522 }
0523
0524 module_init(synth_event_gen_test_init)
0525 module_exit(synth_event_gen_test_exit)
0526
0527 MODULE_AUTHOR("Tom Zanussi");
0528 MODULE_DESCRIPTION("synthetic event generation test");
0529 MODULE_LICENSE("GPL v2");