/* Use synth_event_add_field to add the rest of the fields */
ret = synth_event_add_field(&cmd, "unsigned int", "cpu"); if (ret) goto free;
ret = synth_event_add_field(&cmd, "char[64]", "my_string_field"); if (ret) goto free;
ret = synth_event_add_field(&cmd, "int", "my_int_field"); if (ret) goto free;
ret = synth_event_gen_cmd_end(&cmd); if (ret) goto free;
/* *Nowgetthegen_synth_testeventfile.Weneedtoprevent *theinstanceandeventfromdisappearingfromunderneath *us,whichtrace_get_event_file()does(thoughinthiscase *we'reusingthetop-levelinstancewhichnevergoesaway).
*/
gen_synth_test = trace_get_event_file(NULL, "synthetic", "gen_synth_test"); if (IS_ERR(gen_synth_test)) {
ret = PTR_ERR(gen_synth_test); gotodelete;
}
/* Enable the event or you won't see anything */
ret = trace_array_set_clr_event(gen_synth_test->tr, "synthetic", "gen_synth_test", true); if (ret) {
trace_put_event_file(gen_synth_test); gotodelete;
}
/* Now generate a gen_synth_test event */
ret = synth_event_trace_array(gen_synth_test, vals, ARRAY_SIZE(vals));
free:
kfree(buf); return ret; delete: /* We got an error after creating the event, delete it */
synth_event_delete("gen_synth_test"); goto free;
}
/* Create a buffer to hold the generated command */
buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL); if (!buf) return -ENOMEM;
/* Before generating the command, initialize the cmd object */
synth_event_cmd_init(&cmd, buf, MAX_DYNEVENT_CMD_LEN);
/* *Createtheempty_synth_testsyntheticeventwithnofields.
*/
ret = synth_event_gen_cmd_start(&cmd, "empty_synth_test", THIS_MODULE); if (ret) goto free;
/* Use synth_event_add_field to add all of the fields */
ret = synth_event_add_field(&cmd, "pid_t", "next_pid_field"); if (ret) goto free;
ret = synth_event_add_field(&cmd, "char[16]", "next_comm_field"); if (ret) goto free;
ret = synth_event_add_field(&cmd, "u64", "ts_ns"); if (ret) goto free;
ret = synth_event_add_field(&cmd, "u64", "ts_ms"); if (ret) goto free;
ret = synth_event_add_field(&cmd, "unsigned int", "cpu"); if (ret) goto free;
ret = synth_event_add_field(&cmd, "char[64]", "my_string_field"); if (ret) goto free;
ret = synth_event_add_field(&cmd, "int", "my_int_field"); if (ret) goto free;
/* All fields have been added, close and register the synth event */
ret = synth_event_gen_cmd_end(&cmd); if (ret) goto free;
/* *Nowgettheempty_synth_testeventfile.Weneedto *preventtheinstanceandeventfromdisappearingfrom *underneathus,whichtrace_get_event_file()does(thoughin *thiscasewe'reusingthetop-levelinstancewhichnever *goesaway).
*/
empty_synth_test = trace_get_event_file(NULL, "synthetic", "empty_synth_test"); if (IS_ERR(empty_synth_test)) {
ret = PTR_ERR(empty_synth_test); gotodelete;
}
/* Enable the event or you won't see anything */
ret = trace_array_set_clr_event(empty_synth_test->tr, "synthetic", "empty_synth_test", true); if (ret) {
trace_put_event_file(empty_synth_test); gotodelete;
}
/* Now trace an empty_synth_test event */
ret = synth_event_trace_array(empty_synth_test, vals, ARRAY_SIZE(vals));
free:
kfree(buf); return ret; delete: /* We got an error after creating the event, delete it */
synth_event_delete("empty_synth_test"); goto free;
}
/* Create the create_synth_test event with the fields above */
ret = synth_event_create("create_synth_test",
create_synth_test_fields,
ARRAY_SIZE(create_synth_test_fields),
THIS_MODULE); if (ret) goto out;
/* *Nowgetthecreate_synth_testeventfile.Weneedto *preventtheinstanceandeventfromdisappearingfrom *underneathus,whichtrace_get_event_file()does(thoughin *thiscasewe'reusingthetop-levelinstancewhichnever *goesaway).
*/
create_synth_test = trace_get_event_file(NULL, "synthetic", "create_synth_test"); if (IS_ERR(create_synth_test)) {
ret = PTR_ERR(create_synth_test); gotodelete;
}
/* Enable the event or you won't see anything */
ret = trace_array_set_clr_event(create_synth_test->tr, "synthetic", "create_synth_test", true); if (ret) {
trace_put_event_file(create_synth_test); gotodelete;
}
/* Now generate a create_synth_test event */
ret = synth_event_trace_array(create_synth_test, vals, ARRAY_SIZE(vals));
out: return ret; delete: /* We got an error after creating the event, delete it */
synth_event_delete("create_synth_test");
staticvoid __exit synth_event_gen_test_exit(void)
{ /* Disable the event or you can't remove it */
WARN_ON(trace_array_set_clr_event(gen_synth_test->tr, "synthetic", "gen_synth_test", false));
/* Now give the file and instance back */
trace_put_event_file(gen_synth_test);
/* Now unregister and free the synthetic event */
WARN_ON(synth_event_delete("gen_synth_test"));
/* Disable the event or you can't remove it */
WARN_ON(trace_array_set_clr_event(empty_synth_test->tr, "synthetic", "empty_synth_test", false));
/* Now give the file and instance back */
trace_put_event_file(empty_synth_test);
/* Now unregister and free the synthetic event */
WARN_ON(synth_event_delete("empty_synth_test"));
/* Disable the event or you can't remove it */
WARN_ON(trace_array_set_clr_event(create_synth_test->tr, "synthetic", "create_synth_test", false));
/* Now give the file and instance back */
trace_put_event_file(create_synth_test);
/* Now unregister and free the synthetic event */
WARN_ON(synth_event_delete("create_synth_test"));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.