1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * trace_events_synth - synthetic trace events 4 * 5 * Copyright (C) 2015, 2020 Tom Zanussi <tom.zanussi@linux.intel.com> 6 */ 7 8 #include <linux/module.h> 9 #include <linux/kallsyms.h> 10 #include <linux/security.h> 11 #include <linux/mutex.h> 12 #include <linux/slab.h> 13 #include <linux/stacktrace.h> 14 #include <linux/rculist.h> 15 #include <linux/tracefs.h> 16 17 /* for gfp flag names */ 18 #include <linux/trace_events.h> 19 #include <trace/events/mmflags.h> 20 21 #include "trace_synth.h" 22 23 static int create_synth_event(int argc, const char **argv); 24 static int synth_event_show(struct seq_file *m, struct dyn_event *ev); 25 static int synth_event_release(struct dyn_event *ev); 26 static bool synth_event_is_busy(struct dyn_event *ev); 27 static bool synth_event_match(const char *system, const char *event, 28 int argc, const char **argv, struct dyn_event *ev); 29 30 static struct dyn_event_operations synth_event_ops = { 31 .create = create_synth_event, 32 .show = synth_event_show, 33 .is_busy = synth_event_is_busy, 34 .free = synth_event_release, 35 .match = synth_event_match, 36 }; 37 38 static bool is_synth_event(struct dyn_event *ev) 39 { 40 return ev->ops == &synth_event_ops; 41 } 42 43 static struct synth_event *to_synth_event(struct dyn_event *ev) 44 { 45 return container_of(ev, struct synth_event, devent); 46 } 47 48 static bool synth_event_is_busy(struct dyn_event *ev) 49 { 50 struct synth_event *event = to_synth_event(ev); 51 52 return event->ref != 0; 53 } 54 55 static bool synth_event_match(const char *system, const char *event, 56 int argc, const char **argv, struct dyn_event *ev) 57 { 58 struct synth_event *sev = to_synth_event(ev); 59 60 return strcmp(sev->name, event) == 0 && 61 (!system || strcmp(system, SYNTH_SYSTEM) == 0); 62 } 63 64 struct synth_trace_event { 65 struct trace_entry ent; 66 u64 fields[]; 67 }; 68 69 static int synth_event_define_fields(struct trace_event_call *call) 70 { 71 struct synth_trace_event trace; 72 int offset = offsetof(typeof(trace), fields); 73 struct synth_event *event = call->data; 74 unsigned int i, size, n_u64; 75 char *name, *type; 76 bool is_signed; 77 int ret = 0; 78 79 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { 80 size = event->fields[i]->size; 81 is_signed = event->fields[i]->is_signed; 82 type = event->fields[i]->type; 83 name = event->fields[i]->name; 84 ret = trace_define_field(call, type, name, offset, size, 85 is_signed, FILTER_OTHER); 86 if (ret) 87 break; 88 89 event->fields[i]->offset = n_u64; 90 91 if (event->fields[i]->is_string) { 92 offset += STR_VAR_LEN_MAX; 93 n_u64 += STR_VAR_LEN_MAX / sizeof(u64); 94 } else { 95 offset += sizeof(u64); 96 n_u64++; 97 } 98 } 99 100 event->n_u64 = n_u64; 101 102 return ret; 103 } 104 105 static bool synth_field_signed(char *type) 106 { 107 if (str_has_prefix(type, "u")) 108 return false; 109 if (strcmp(type, "gfp_t") == 0) 110 return false; 111 112 return true; 113 } 114 115 static int synth_field_is_string(char *type) 116 { 117 if (strstr(type, "char[") != NULL) 118 return true; 119 120 return false; 121 } 122 123 static int synth_field_string_size(char *type) 124 { 125 char buf[4], *end, *start; 126 unsigned int len; 127 int size, err; 128 129 start = strstr(type, "char["); 130 if (start == NULL) 131 return -EINVAL; 132 start += sizeof("char[") - 1; 133 134 end = strchr(type, ']'); 135 if (!end || end < start) 136 return -EINVAL; 137 138 len = end - start; 139 if (len > 3) 140 return -EINVAL; 141 142 strncpy(buf, start, len); 143 buf[len] = '\0'; 144 145 err = kstrtouint(buf, 0, &size); 146 if (err) 147 return err; 148 149 if (size > STR_VAR_LEN_MAX) 150 return -EINVAL; 151 152 return size; 153 } 154 155 static int synth_field_size(char *type) 156 { 157 int size = 0; 158 159 if (strcmp(type, "s64") == 0) 160 size = sizeof(s64); 161 else if (strcmp(type, "u64") == 0) 162 size = sizeof(u64); 163 else if (strcmp(type, "s32") == 0) 164 size = sizeof(s32); 165 else if (strcmp(type, "u32") == 0) 166 size = sizeof(u32); 167 else if (strcmp(type, "s16") == 0) 168 size = sizeof(s16); 169 else if (strcmp(type, "u16") == 0) 170 size = sizeof(u16); 171 else if (strcmp(type, "s8") == 0) 172 size = sizeof(s8); 173 else if (strcmp(type, "u8") == 0) 174 size = sizeof(u8); 175 else if (strcmp(type, "char") == 0) 176 size = sizeof(char); 177 else if (strcmp(type, "unsigned char") == 0) 178 size = sizeof(unsigned char); 179 else if (strcmp(type, "int") == 0) 180 size = sizeof(int); 181 else if (strcmp(type, "unsigned int") == 0) 182 size = sizeof(unsigned int); 183 else if (strcmp(type, "long") == 0) 184 size = sizeof(long); 185 else if (strcmp(type, "unsigned long") == 0) 186 size = sizeof(unsigned long); 187 else if (strcmp(type, "pid_t") == 0) 188 size = sizeof(pid_t); 189 else if (strcmp(type, "gfp_t") == 0) 190 size = sizeof(gfp_t); 191 else if (synth_field_is_string(type)) 192 size = synth_field_string_size(type); 193 194 return size; 195 } 196 197 static const char *synth_field_fmt(char *type) 198 { 199 const char *fmt = "%llu"; 200 201 if (strcmp(type, "s64") == 0) 202 fmt = "%lld"; 203 else if (strcmp(type, "u64") == 0) 204 fmt = "%llu"; 205 else if (strcmp(type, "s32") == 0) 206 fmt = "%d"; 207 else if (strcmp(type, "u32") == 0) 208 fmt = "%u"; 209 else if (strcmp(type, "s16") == 0) 210 fmt = "%d"; 211 else if (strcmp(type, "u16") == 0) 212 fmt = "%u"; 213 else if (strcmp(type, "s8") == 0) 214 fmt = "%d"; 215 else if (strcmp(type, "u8") == 0) 216 fmt = "%u"; 217 else if (strcmp(type, "char") == 0) 218 fmt = "%d"; 219 else if (strcmp(type, "unsigned char") == 0) 220 fmt = "%u"; 221 else if (strcmp(type, "int") == 0) 222 fmt = "%d"; 223 else if (strcmp(type, "unsigned int") == 0) 224 fmt = "%u"; 225 else if (strcmp(type, "long") == 0) 226 fmt = "%ld"; 227 else if (strcmp(type, "unsigned long") == 0) 228 fmt = "%lu"; 229 else if (strcmp(type, "pid_t") == 0) 230 fmt = "%d"; 231 else if (strcmp(type, "gfp_t") == 0) 232 fmt = "%x"; 233 else if (synth_field_is_string(type)) 234 fmt = "%s"; 235 236 return fmt; 237 } 238 239 static void print_synth_event_num_val(struct trace_seq *s, 240 char *print_fmt, char *name, 241 int size, u64 val, char *space) 242 { 243 switch (size) { 244 case 1: 245 trace_seq_printf(s, print_fmt, name, (u8)val, space); 246 break; 247 248 case 2: 249 trace_seq_printf(s, print_fmt, name, (u16)val, space); 250 break; 251 252 case 4: 253 trace_seq_printf(s, print_fmt, name, (u32)val, space); 254 break; 255 256 default: 257 trace_seq_printf(s, print_fmt, name, val, space); 258 break; 259 } 260 } 261 262 static enum print_line_t print_synth_event(struct trace_iterator *iter, 263 int flags, 264 struct trace_event *event) 265 { 266 struct trace_array *tr = iter->tr; 267 struct trace_seq *s = &iter->seq; 268 struct synth_trace_event *entry; 269 struct synth_event *se; 270 unsigned int i, n_u64; 271 char print_fmt[32]; 272 const char *fmt; 273 274 entry = (struct synth_trace_event *)iter->ent; 275 se = container_of(event, struct synth_event, call.event); 276 277 trace_seq_printf(s, "%s: ", se->name); 278 279 for (i = 0, n_u64 = 0; i < se->n_fields; i++) { 280 if (trace_seq_has_overflowed(s)) 281 goto end; 282 283 fmt = synth_field_fmt(se->fields[i]->type); 284 285 /* parameter types */ 286 if (tr && tr->trace_flags & TRACE_ITER_VERBOSE) 287 trace_seq_printf(s, "%s ", fmt); 288 289 snprintf(print_fmt, sizeof(print_fmt), "%%s=%s%%s", fmt); 290 291 /* parameter values */ 292 if (se->fields[i]->is_string) { 293 trace_seq_printf(s, print_fmt, se->fields[i]->name, 294 (char *)&entry->fields[n_u64], 295 i == se->n_fields - 1 ? "" : " "); 296 n_u64 += STR_VAR_LEN_MAX / sizeof(u64); 297 } else { 298 struct trace_print_flags __flags[] = { 299 __def_gfpflag_names, {-1, NULL} }; 300 char *space = (i == se->n_fields - 1 ? "" : " "); 301 302 print_synth_event_num_val(s, print_fmt, 303 se->fields[i]->name, 304 se->fields[i]->size, 305 entry->fields[n_u64], 306 space); 307 308 if (strcmp(se->fields[i]->type, "gfp_t") == 0) { 309 trace_seq_puts(s, " ("); 310 trace_print_flags_seq(s, "|", 311 entry->fields[n_u64], 312 __flags); 313 trace_seq_putc(s, ')'); 314 } 315 n_u64++; 316 } 317 } 318 end: 319 trace_seq_putc(s, '\n'); 320 321 return trace_handle_return(s); 322 } 323 324 static struct trace_event_functions synth_event_funcs = { 325 .trace = print_synth_event 326 }; 327 328 static notrace void trace_event_raw_event_synth(void *__data, 329 u64 *var_ref_vals, 330 unsigned int *var_ref_idx) 331 { 332 struct trace_event_file *trace_file = __data; 333 struct synth_trace_event *entry; 334 struct trace_event_buffer fbuffer; 335 struct trace_buffer *buffer; 336 struct synth_event *event; 337 unsigned int i, n_u64, val_idx; 338 int fields_size = 0; 339 340 event = trace_file->event_call->data; 341 342 if (trace_trigger_soft_disabled(trace_file)) 343 return; 344 345 fields_size = event->n_u64 * sizeof(u64); 346 347 /* 348 * Avoid ring buffer recursion detection, as this event 349 * is being performed within another event. 350 */ 351 buffer = trace_file->tr->array_buffer.buffer; 352 ring_buffer_nest_start(buffer); 353 354 entry = trace_event_buffer_reserve(&fbuffer, trace_file, 355 sizeof(*entry) + fields_size); 356 if (!entry) 357 goto out; 358 359 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { 360 val_idx = var_ref_idx[i]; 361 if (event->fields[i]->is_string) { 362 char *str_val = (char *)(long)var_ref_vals[val_idx]; 363 char *str_field = (char *)&entry->fields[n_u64]; 364 365 strscpy(str_field, str_val, STR_VAR_LEN_MAX); 366 n_u64 += STR_VAR_LEN_MAX / sizeof(u64); 367 } else { 368 struct synth_field *field = event->fields[i]; 369 u64 val = var_ref_vals[val_idx]; 370 371 switch (field->size) { 372 case 1: 373 *(u8 *)&entry->fields[n_u64] = (u8)val; 374 break; 375 376 case 2: 377 *(u16 *)&entry->fields[n_u64] = (u16)val; 378 break; 379 380 case 4: 381 *(u32 *)&entry->fields[n_u64] = (u32)val; 382 break; 383 384 default: 385 entry->fields[n_u64] = val; 386 break; 387 } 388 n_u64++; 389 } 390 } 391 392 trace_event_buffer_commit(&fbuffer); 393 out: 394 ring_buffer_nest_end(buffer); 395 } 396 397 static void free_synth_event_print_fmt(struct trace_event_call *call) 398 { 399 if (call) { 400 kfree(call->print_fmt); 401 call->print_fmt = NULL; 402 } 403 } 404 405 static int __set_synth_event_print_fmt(struct synth_event *event, 406 char *buf, int len) 407 { 408 const char *fmt; 409 int pos = 0; 410 int i; 411 412 /* When len=0, we just calculate the needed length */ 413 #define LEN_OR_ZERO (len ? len - pos : 0) 414 415 pos += snprintf(buf + pos, LEN_OR_ZERO, "\""); 416 for (i = 0; i < event->n_fields; i++) { 417 fmt = synth_field_fmt(event->fields[i]->type); 418 pos += snprintf(buf + pos, LEN_OR_ZERO, "%s=%s%s", 419 event->fields[i]->name, fmt, 420 i == event->n_fields - 1 ? "" : ", "); 421 } 422 pos += snprintf(buf + pos, LEN_OR_ZERO, "\""); 423 424 for (i = 0; i < event->n_fields; i++) { 425 pos += snprintf(buf + pos, LEN_OR_ZERO, 426 ", REC->%s", event->fields[i]->name); 427 } 428 429 #undef LEN_OR_ZERO 430 431 /* return the length of print_fmt */ 432 return pos; 433 } 434 435 static int set_synth_event_print_fmt(struct trace_event_call *call) 436 { 437 struct synth_event *event = call->data; 438 char *print_fmt; 439 int len; 440 441 /* First: called with 0 length to calculate the needed length */ 442 len = __set_synth_event_print_fmt(event, NULL, 0); 443 444 print_fmt = kmalloc(len + 1, GFP_KERNEL); 445 if (!print_fmt) 446 return -ENOMEM; 447 448 /* Second: actually write the @print_fmt */ 449 __set_synth_event_print_fmt(event, print_fmt, len + 1); 450 call->print_fmt = print_fmt; 451 452 return 0; 453 } 454 455 static void free_synth_field(struct synth_field *field) 456 { 457 kfree(field->type); 458 kfree(field->name); 459 kfree(field); 460 } 461 462 static struct synth_field *parse_synth_field(int argc, const char **argv, 463 int *consumed) 464 { 465 struct synth_field *field; 466 const char *prefix = NULL, *field_type = argv[0], *field_name, *array; 467 int len, ret = 0; 468 469 if (field_type[0] == ';') 470 field_type++; 471 472 if (!strcmp(field_type, "unsigned")) { 473 if (argc < 3) 474 return ERR_PTR(-EINVAL); 475 prefix = "unsigned "; 476 field_type = argv[1]; 477 field_name = argv[2]; 478 *consumed = 3; 479 } else { 480 field_name = argv[1]; 481 *consumed = 2; 482 } 483 484 field = kzalloc(sizeof(*field), GFP_KERNEL); 485 if (!field) 486 return ERR_PTR(-ENOMEM); 487 488 len = strlen(field_name); 489 array = strchr(field_name, '['); 490 if (array) 491 len -= strlen(array); 492 else if (field_name[len - 1] == ';') 493 len--; 494 495 field->name = kmemdup_nul(field_name, len, GFP_KERNEL); 496 if (!field->name) { 497 ret = -ENOMEM; 498 goto free; 499 } 500 501 if (field_type[0] == ';') 502 field_type++; 503 len = strlen(field_type) + 1; 504 if (array) 505 len += strlen(array); 506 if (prefix) 507 len += strlen(prefix); 508 509 field->type = kzalloc(len, GFP_KERNEL); 510 if (!field->type) { 511 ret = -ENOMEM; 512 goto free; 513 } 514 if (prefix) 515 strcat(field->type, prefix); 516 strcat(field->type, field_type); 517 if (array) { 518 strcat(field->type, array); 519 if (field->type[len - 1] == ';') 520 field->type[len - 1] = '\0'; 521 } 522 523 field->size = synth_field_size(field->type); 524 if (!field->size) { 525 ret = -EINVAL; 526 goto free; 527 } 528 529 if (synth_field_is_string(field->type)) 530 field->is_string = true; 531 532 field->is_signed = synth_field_signed(field->type); 533 534 out: 535 return field; 536 free: 537 free_synth_field(field); 538 field = ERR_PTR(ret); 539 goto out; 540 } 541 542 static void free_synth_tracepoint(struct tracepoint *tp) 543 { 544 if (!tp) 545 return; 546 547 kfree(tp->name); 548 kfree(tp); 549 } 550 551 static struct tracepoint *alloc_synth_tracepoint(char *name) 552 { 553 struct tracepoint *tp; 554 555 tp = kzalloc(sizeof(*tp), GFP_KERNEL); 556 if (!tp) 557 return ERR_PTR(-ENOMEM); 558 559 tp->name = kstrdup(name, GFP_KERNEL); 560 if (!tp->name) { 561 kfree(tp); 562 return ERR_PTR(-ENOMEM); 563 } 564 565 return tp; 566 } 567 568 struct synth_event *find_synth_event(const char *name) 569 { 570 struct dyn_event *pos; 571 struct synth_event *event; 572 573 for_each_dyn_event(pos) { 574 if (!is_synth_event(pos)) 575 continue; 576 event = to_synth_event(pos); 577 if (strcmp(event->name, name) == 0) 578 return event; 579 } 580 581 return NULL; 582 } 583 584 static struct trace_event_fields synth_event_fields_array[] = { 585 { .type = TRACE_FUNCTION_TYPE, 586 .define_fields = synth_event_define_fields }, 587 {} 588 }; 589 590 static int register_synth_event(struct synth_event *event) 591 { 592 struct trace_event_call *call = &event->call; 593 int ret = 0; 594 595 event->call.class = &event->class; 596 event->class.system = kstrdup(SYNTH_SYSTEM, GFP_KERNEL); 597 if (!event->class.system) { 598 ret = -ENOMEM; 599 goto out; 600 } 601 602 event->tp = alloc_synth_tracepoint(event->name); 603 if (IS_ERR(event->tp)) { 604 ret = PTR_ERR(event->tp); 605 event->tp = NULL; 606 goto out; 607 } 608 609 INIT_LIST_HEAD(&call->class->fields); 610 call->event.funcs = &synth_event_funcs; 611 call->class->fields_array = synth_event_fields_array; 612 613 ret = register_trace_event(&call->event); 614 if (!ret) { 615 ret = -ENODEV; 616 goto out; 617 } 618 call->flags = TRACE_EVENT_FL_TRACEPOINT; 619 call->class->reg = trace_event_reg; 620 call->class->probe = trace_event_raw_event_synth; 621 call->data = event; 622 call->tp = event->tp; 623 624 ret = trace_add_event_call(call); 625 if (ret) { 626 pr_warn("Failed to register synthetic event: %s\n", 627 trace_event_name(call)); 628 goto err; 629 } 630 631 ret = set_synth_event_print_fmt(call); 632 if (ret < 0) { 633 trace_remove_event_call(call); 634 goto err; 635 } 636 out: 637 return ret; 638 err: 639 unregister_trace_event(&call->event); 640 goto out; 641 } 642 643 static int unregister_synth_event(struct synth_event *event) 644 { 645 struct trace_event_call *call = &event->call; 646 int ret; 647 648 ret = trace_remove_event_call(call); 649 650 return ret; 651 } 652 653 static void free_synth_event(struct synth_event *event) 654 { 655 unsigned int i; 656 657 if (!event) 658 return; 659 660 for (i = 0; i < event->n_fields; i++) 661 free_synth_field(event->fields[i]); 662 663 kfree(event->fields); 664 kfree(event->name); 665 kfree(event->class.system); 666 free_synth_tracepoint(event->tp); 667 free_synth_event_print_fmt(&event->call); 668 kfree(event); 669 } 670 671 static struct synth_event *alloc_synth_event(const char *name, int n_fields, 672 struct synth_field **fields) 673 { 674 struct synth_event *event; 675 unsigned int i; 676 677 event = kzalloc(sizeof(*event), GFP_KERNEL); 678 if (!event) { 679 event = ERR_PTR(-ENOMEM); 680 goto out; 681 } 682 683 event->name = kstrdup(name, GFP_KERNEL); 684 if (!event->name) { 685 kfree(event); 686 event = ERR_PTR(-ENOMEM); 687 goto out; 688 } 689 690 event->fields = kcalloc(n_fields, sizeof(*event->fields), GFP_KERNEL); 691 if (!event->fields) { 692 free_synth_event(event); 693 event = ERR_PTR(-ENOMEM); 694 goto out; 695 } 696 697 dyn_event_init(&event->devent, &synth_event_ops); 698 699 for (i = 0; i < n_fields; i++) 700 event->fields[i] = fields[i]; 701 702 event->n_fields = n_fields; 703 out: 704 return event; 705 } 706 707 static int synth_event_check_arg_fn(void *data) 708 { 709 struct dynevent_arg_pair *arg_pair = data; 710 int size; 711 712 size = synth_field_size((char *)arg_pair->lhs); 713 714 return size ? 0 : -EINVAL; 715 } 716 717 /** 718 * synth_event_add_field - Add a new field to a synthetic event cmd 719 * @cmd: A pointer to the dynevent_cmd struct representing the new event 720 * @type: The type of the new field to add 721 * @name: The name of the new field to add 722 * 723 * Add a new field to a synthetic event cmd object. Field ordering is in 724 * the same order the fields are added. 725 * 726 * See synth_field_size() for available types. If field_name contains 727 * [n] the field is considered to be an array. 728 * 729 * Return: 0 if successful, error otherwise. 730 */ 731 int synth_event_add_field(struct dynevent_cmd *cmd, const char *type, 732 const char *name) 733 { 734 struct dynevent_arg_pair arg_pair; 735 int ret; 736 737 if (cmd->type != DYNEVENT_TYPE_SYNTH) 738 return -EINVAL; 739 740 if (!type || !name) 741 return -EINVAL; 742 743 dynevent_arg_pair_init(&arg_pair, 0, ';'); 744 745 arg_pair.lhs = type; 746 arg_pair.rhs = name; 747 748 ret = dynevent_arg_pair_add(cmd, &arg_pair, synth_event_check_arg_fn); 749 if (ret) 750 return ret; 751 752 if (++cmd->n_fields > SYNTH_FIELDS_MAX) 753 ret = -EINVAL; 754 755 return ret; 756 } 757 EXPORT_SYMBOL_GPL(synth_event_add_field); 758 759 /** 760 * synth_event_add_field_str - Add a new field to a synthetic event cmd 761 * @cmd: A pointer to the dynevent_cmd struct representing the new event 762 * @type_name: The type and name of the new field to add, as a single string 763 * 764 * Add a new field to a synthetic event cmd object, as a single 765 * string. The @type_name string is expected to be of the form 'type 766 * name', which will be appended by ';'. No sanity checking is done - 767 * what's passed in is assumed to already be well-formed. Field 768 * ordering is in the same order the fields are added. 769 * 770 * See synth_field_size() for available types. If field_name contains 771 * [n] the field is considered to be an array. 772 * 773 * Return: 0 if successful, error otherwise. 774 */ 775 int synth_event_add_field_str(struct dynevent_cmd *cmd, const char *type_name) 776 { 777 struct dynevent_arg arg; 778 int ret; 779 780 if (cmd->type != DYNEVENT_TYPE_SYNTH) 781 return -EINVAL; 782 783 if (!type_name) 784 return -EINVAL; 785 786 dynevent_arg_init(&arg, ';'); 787 788 arg.str = type_name; 789 790 ret = dynevent_arg_add(cmd, &arg, NULL); 791 if (ret) 792 return ret; 793 794 if (++cmd->n_fields > SYNTH_FIELDS_MAX) 795 ret = -EINVAL; 796 797 return ret; 798 } 799 EXPORT_SYMBOL_GPL(synth_event_add_field_str); 800 801 /** 802 * synth_event_add_fields - Add multiple fields to a synthetic event cmd 803 * @cmd: A pointer to the dynevent_cmd struct representing the new event 804 * @fields: An array of type/name field descriptions 805 * @n_fields: The number of field descriptions contained in the fields array 806 * 807 * Add a new set of fields to a synthetic event cmd object. The event 808 * fields that will be defined for the event should be passed in as an 809 * array of struct synth_field_desc, and the number of elements in the 810 * array passed in as n_fields. Field ordering will retain the 811 * ordering given in the fields array. 812 * 813 * See synth_field_size() for available types. If field_name contains 814 * [n] the field is considered to be an array. 815 * 816 * Return: 0 if successful, error otherwise. 817 */ 818 int synth_event_add_fields(struct dynevent_cmd *cmd, 819 struct synth_field_desc *fields, 820 unsigned int n_fields) 821 { 822 unsigned int i; 823 int ret = 0; 824 825 for (i = 0; i < n_fields; i++) { 826 if (fields[i].type == NULL || fields[i].name == NULL) { 827 ret = -EINVAL; 828 break; 829 } 830 831 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); 832 if (ret) 833 break; 834 } 835 836 return ret; 837 } 838 EXPORT_SYMBOL_GPL(synth_event_add_fields); 839 840 /** 841 * __synth_event_gen_cmd_start - Start a synthetic event command from arg list 842 * @cmd: A pointer to the dynevent_cmd struct representing the new event 843 * @name: The name of the synthetic event 844 * @mod: The module creating the event, NULL if not created from a module 845 * @args: Variable number of arg (pairs), one pair for each field 846 * 847 * NOTE: Users normally won't want to call this function directly, but 848 * rather use the synth_event_gen_cmd_start() wrapper, which 849 * automatically adds a NULL to the end of the arg list. If this 850 * function is used directly, make sure the last arg in the variable 851 * arg list is NULL. 852 * 853 * Generate a synthetic event command to be executed by 854 * synth_event_gen_cmd_end(). This function can be used to generate 855 * the complete command or only the first part of it; in the latter 856 * case, synth_event_add_field(), synth_event_add_field_str(), or 857 * synth_event_add_fields() can be used to add more fields following 858 * this. 859 * 860 * There should be an even number variable args, each pair consisting 861 * of a type followed by a field name. 862 * 863 * See synth_field_size() for available types. If field_name contains 864 * [n] the field is considered to be an array. 865 * 866 * Return: 0 if successful, error otherwise. 867 */ 868 int __synth_event_gen_cmd_start(struct dynevent_cmd *cmd, const char *name, 869 struct module *mod, ...) 870 { 871 struct dynevent_arg arg; 872 va_list args; 873 int ret; 874 875 cmd->event_name = name; 876 cmd->private_data = mod; 877 878 if (cmd->type != DYNEVENT_TYPE_SYNTH) 879 return -EINVAL; 880 881 dynevent_arg_init(&arg, 0); 882 arg.str = name; 883 ret = dynevent_arg_add(cmd, &arg, NULL); 884 if (ret) 885 return ret; 886 887 va_start(args, mod); 888 for (;;) { 889 const char *type, *name; 890 891 type = va_arg(args, const char *); 892 if (!type) 893 break; 894 name = va_arg(args, const char *); 895 if (!name) 896 break; 897 898 if (++cmd->n_fields > SYNTH_FIELDS_MAX) { 899 ret = -EINVAL; 900 break; 901 } 902 903 ret = synth_event_add_field(cmd, type, name); 904 if (ret) 905 break; 906 } 907 va_end(args); 908 909 return ret; 910 } 911 EXPORT_SYMBOL_GPL(__synth_event_gen_cmd_start); 912 913 /** 914 * synth_event_gen_cmd_array_start - Start synthetic event command from an array 915 * @cmd: A pointer to the dynevent_cmd struct representing the new event 916 * @name: The name of the synthetic event 917 * @fields: An array of type/name field descriptions 918 * @n_fields: The number of field descriptions contained in the fields array 919 * 920 * Generate a synthetic event command to be executed by 921 * synth_event_gen_cmd_end(). This function can be used to generate 922 * the complete command or only the first part of it; in the latter 923 * case, synth_event_add_field(), synth_event_add_field_str(), or 924 * synth_event_add_fields() can be used to add more fields following 925 * this. 926 * 927 * The event fields that will be defined for the event should be 928 * passed in as an array of struct synth_field_desc, and the number of 929 * elements in the array passed in as n_fields. Field ordering will 930 * retain the ordering given in the fields array. 931 * 932 * See synth_field_size() for available types. If field_name contains 933 * [n] the field is considered to be an array. 934 * 935 * Return: 0 if successful, error otherwise. 936 */ 937 int synth_event_gen_cmd_array_start(struct dynevent_cmd *cmd, const char *name, 938 struct module *mod, 939 struct synth_field_desc *fields, 940 unsigned int n_fields) 941 { 942 struct dynevent_arg arg; 943 unsigned int i; 944 int ret = 0; 945 946 cmd->event_name = name; 947 cmd->private_data = mod; 948 949 if (cmd->type != DYNEVENT_TYPE_SYNTH) 950 return -EINVAL; 951 952 if (n_fields > SYNTH_FIELDS_MAX) 953 return -EINVAL; 954 955 dynevent_arg_init(&arg, 0); 956 arg.str = name; 957 ret = dynevent_arg_add(cmd, &arg, NULL); 958 if (ret) 959 return ret; 960 961 for (i = 0; i < n_fields; i++) { 962 if (fields[i].type == NULL || fields[i].name == NULL) 963 return -EINVAL; 964 965 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); 966 if (ret) 967 break; 968 } 969 970 return ret; 971 } 972 EXPORT_SYMBOL_GPL(synth_event_gen_cmd_array_start); 973 974 static int __create_synth_event(int argc, const char *name, const char **argv) 975 { 976 struct synth_field *field, *fields[SYNTH_FIELDS_MAX]; 977 struct synth_event *event = NULL; 978 int i, consumed = 0, n_fields = 0, ret = 0; 979 980 /* 981 * Argument syntax: 982 * - Add synthetic event: <event_name> field[;field] ... 983 * - Remove synthetic event: !<event_name> field[;field] ... 984 * where 'field' = type field_name 985 */ 986 987 if (name[0] == '\0' || argc < 1) 988 return -EINVAL; 989 990 mutex_lock(&event_mutex); 991 992 event = find_synth_event(name); 993 if (event) { 994 ret = -EEXIST; 995 goto out; 996 } 997 998 for (i = 0; i < argc - 1; i++) { 999 if (strcmp(argv[i], ";") == 0) 1000 continue; 1001 if (n_fields == SYNTH_FIELDS_MAX) { 1002 ret = -EINVAL; 1003 goto err; 1004 } 1005 1006 field = parse_synth_field(argc - i, &argv[i], &consumed); 1007 if (IS_ERR(field)) { 1008 ret = PTR_ERR(field); 1009 goto err; 1010 } 1011 fields[n_fields++] = field; 1012 i += consumed - 1; 1013 } 1014 1015 if (i < argc && strcmp(argv[i], ";") != 0) { 1016 ret = -EINVAL; 1017 goto err; 1018 } 1019 1020 event = alloc_synth_event(name, n_fields, fields); 1021 if (IS_ERR(event)) { 1022 ret = PTR_ERR(event); 1023 event = NULL; 1024 goto err; 1025 } 1026 ret = register_synth_event(event); 1027 if (!ret) 1028 dyn_event_add(&event->devent); 1029 else 1030 free_synth_event(event); 1031 out: 1032 mutex_unlock(&event_mutex); 1033 1034 return ret; 1035 err: 1036 for (i = 0; i < n_fields; i++) 1037 free_synth_field(fields[i]); 1038 1039 goto out; 1040 } 1041 1042 /** 1043 * synth_event_create - Create a new synthetic event 1044 * @name: The name of the new sythetic event 1045 * @fields: An array of type/name field descriptions 1046 * @n_fields: The number of field descriptions contained in the fields array 1047 * @mod: The module creating the event, NULL if not created from a module 1048 * 1049 * Create a new synthetic event with the given name under the 1050 * trace/events/synthetic/ directory. The event fields that will be 1051 * defined for the event should be passed in as an array of struct 1052 * synth_field_desc, and the number elements in the array passed in as 1053 * n_fields. Field ordering will retain the ordering given in the 1054 * fields array. 1055 * 1056 * If the new synthetic event is being created from a module, the mod 1057 * param must be non-NULL. This will ensure that the trace buffer 1058 * won't contain unreadable events. 1059 * 1060 * The new synth event should be deleted using synth_event_delete() 1061 * function. The new synthetic event can be generated from modules or 1062 * other kernel code using trace_synth_event() and related functions. 1063 * 1064 * Return: 0 if successful, error otherwise. 1065 */ 1066 int synth_event_create(const char *name, struct synth_field_desc *fields, 1067 unsigned int n_fields, struct module *mod) 1068 { 1069 struct dynevent_cmd cmd; 1070 char *buf; 1071 int ret; 1072 1073 buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL); 1074 if (!buf) 1075 return -ENOMEM; 1076 1077 synth_event_cmd_init(&cmd, buf, MAX_DYNEVENT_CMD_LEN); 1078 1079 ret = synth_event_gen_cmd_array_start(&cmd, name, mod, 1080 fields, n_fields); 1081 if (ret) 1082 goto out; 1083 1084 ret = synth_event_gen_cmd_end(&cmd); 1085 out: 1086 kfree(buf); 1087 1088 return ret; 1089 } 1090 EXPORT_SYMBOL_GPL(synth_event_create); 1091 1092 static int destroy_synth_event(struct synth_event *se) 1093 { 1094 int ret; 1095 1096 if (se->ref) 1097 ret = -EBUSY; 1098 else { 1099 ret = unregister_synth_event(se); 1100 if (!ret) { 1101 dyn_event_remove(&se->devent); 1102 free_synth_event(se); 1103 } 1104 } 1105 1106 return ret; 1107 } 1108 1109 /** 1110 * synth_event_delete - Delete a synthetic event 1111 * @event_name: The name of the new sythetic event 1112 * 1113 * Delete a synthetic event that was created with synth_event_create(). 1114 * 1115 * Return: 0 if successful, error otherwise. 1116 */ 1117 int synth_event_delete(const char *event_name) 1118 { 1119 struct synth_event *se = NULL; 1120 struct module *mod = NULL; 1121 int ret = -ENOENT; 1122 1123 mutex_lock(&event_mutex); 1124 se = find_synth_event(event_name); 1125 if (se) { 1126 mod = se->mod; 1127 ret = destroy_synth_event(se); 1128 } 1129 mutex_unlock(&event_mutex); 1130 1131 if (mod) { 1132 mutex_lock(&trace_types_lock); 1133 /* 1134 * It is safest to reset the ring buffer if the module 1135 * being unloaded registered any events that were 1136 * used. The only worry is if a new module gets 1137 * loaded, and takes on the same id as the events of 1138 * this module. When printing out the buffer, traced 1139 * events left over from this module may be passed to 1140 * the new module events and unexpected results may 1141 * occur. 1142 */ 1143 tracing_reset_all_online_cpus(); 1144 mutex_unlock(&trace_types_lock); 1145 } 1146 1147 return ret; 1148 } 1149 EXPORT_SYMBOL_GPL(synth_event_delete); 1150 1151 static int create_or_delete_synth_event(int argc, char **argv) 1152 { 1153 const char *name = argv[0]; 1154 int ret; 1155 1156 /* trace_run_command() ensures argc != 0 */ 1157 if (name[0] == '!') { 1158 ret = synth_event_delete(name + 1); 1159 return ret; 1160 } 1161 1162 ret = __create_synth_event(argc - 1, name, (const char **)argv + 1); 1163 return ret == -ECANCELED ? -EINVAL : ret; 1164 } 1165 1166 static int synth_event_run_command(struct dynevent_cmd *cmd) 1167 { 1168 struct synth_event *se; 1169 int ret; 1170 1171 ret = trace_run_command(cmd->seq.buffer, create_or_delete_synth_event); 1172 if (ret) 1173 return ret; 1174 1175 se = find_synth_event(cmd->event_name); 1176 if (WARN_ON(!se)) 1177 return -ENOENT; 1178 1179 se->mod = cmd->private_data; 1180 1181 return ret; 1182 } 1183 1184 /** 1185 * synth_event_cmd_init - Initialize a synthetic event command object 1186 * @cmd: A pointer to the dynevent_cmd struct representing the new event 1187 * @buf: A pointer to the buffer used to build the command 1188 * @maxlen: The length of the buffer passed in @buf 1189 * 1190 * Initialize a synthetic event command object. Use this before 1191 * calling any of the other dyenvent_cmd functions. 1192 */ 1193 void synth_event_cmd_init(struct dynevent_cmd *cmd, char *buf, int maxlen) 1194 { 1195 dynevent_cmd_init(cmd, buf, maxlen, DYNEVENT_TYPE_SYNTH, 1196 synth_event_run_command); 1197 } 1198 EXPORT_SYMBOL_GPL(synth_event_cmd_init); 1199 1200 static inline int 1201 __synth_event_trace_start(struct trace_event_file *file, 1202 struct synth_event_trace_state *trace_state) 1203 { 1204 int entry_size, fields_size = 0; 1205 int ret = 0; 1206 1207 memset(trace_state, '\0', sizeof(*trace_state)); 1208 1209 /* 1210 * Normal event tracing doesn't get called at all unless the 1211 * ENABLED bit is set (which attaches the probe thus allowing 1212 * this code to be called, etc). Because this is called 1213 * directly by the user, we don't have that but we still need 1214 * to honor not logging when disabled. For the the iterated 1215 * trace case, we save the enabed state upon start and just 1216 * ignore the following data calls. 1217 */ 1218 if (!(file->flags & EVENT_FILE_FL_ENABLED) || 1219 trace_trigger_soft_disabled(file)) { 1220 trace_state->disabled = true; 1221 ret = -ENOENT; 1222 goto out; 1223 } 1224 1225 trace_state->event = file->event_call->data; 1226 1227 fields_size = trace_state->event->n_u64 * sizeof(u64); 1228 1229 /* 1230 * Avoid ring buffer recursion detection, as this event 1231 * is being performed within another event. 1232 */ 1233 trace_state->buffer = file->tr->array_buffer.buffer; 1234 ring_buffer_nest_start(trace_state->buffer); 1235 1236 entry_size = sizeof(*trace_state->entry) + fields_size; 1237 trace_state->entry = trace_event_buffer_reserve(&trace_state->fbuffer, 1238 file, 1239 entry_size); 1240 if (!trace_state->entry) { 1241 ring_buffer_nest_end(trace_state->buffer); 1242 ret = -EINVAL; 1243 } 1244 out: 1245 return ret; 1246 } 1247 1248 static inline void 1249 __synth_event_trace_end(struct synth_event_trace_state *trace_state) 1250 { 1251 trace_event_buffer_commit(&trace_state->fbuffer); 1252 1253 ring_buffer_nest_end(trace_state->buffer); 1254 } 1255 1256 /** 1257 * synth_event_trace - Trace a synthetic event 1258 * @file: The trace_event_file representing the synthetic event 1259 * @n_vals: The number of values in vals 1260 * @args: Variable number of args containing the event values 1261 * 1262 * Trace a synthetic event using the values passed in the variable 1263 * argument list. 1264 * 1265 * The argument list should be a list 'n_vals' u64 values. The number 1266 * of vals must match the number of field in the synthetic event, and 1267 * must be in the same order as the synthetic event fields. 1268 * 1269 * All vals should be cast to u64, and string vals are just pointers 1270 * to strings, cast to u64. Strings will be copied into space 1271 * reserved in the event for the string, using these pointers. 1272 * 1273 * Return: 0 on success, err otherwise. 1274 */ 1275 int synth_event_trace(struct trace_event_file *file, unsigned int n_vals, ...) 1276 { 1277 struct synth_event_trace_state state; 1278 unsigned int i, n_u64; 1279 va_list args; 1280 int ret; 1281 1282 ret = __synth_event_trace_start(file, &state); 1283 if (ret) { 1284 if (ret == -ENOENT) 1285 ret = 0; /* just disabled, not really an error */ 1286 return ret; 1287 } 1288 1289 if (n_vals != state.event->n_fields) { 1290 ret = -EINVAL; 1291 goto out; 1292 } 1293 1294 va_start(args, n_vals); 1295 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { 1296 u64 val; 1297 1298 val = va_arg(args, u64); 1299 1300 if (state.event->fields[i]->is_string) { 1301 char *str_val = (char *)(long)val; 1302 char *str_field = (char *)&state.entry->fields[n_u64]; 1303 1304 strscpy(str_field, str_val, STR_VAR_LEN_MAX); 1305 n_u64 += STR_VAR_LEN_MAX / sizeof(u64); 1306 } else { 1307 struct synth_field *field = state.event->fields[i]; 1308 1309 switch (field->size) { 1310 case 1: 1311 *(u8 *)&state.entry->fields[n_u64] = (u8)val; 1312 break; 1313 1314 case 2: 1315 *(u16 *)&state.entry->fields[n_u64] = (u16)val; 1316 break; 1317 1318 case 4: 1319 *(u32 *)&state.entry->fields[n_u64] = (u32)val; 1320 break; 1321 1322 default: 1323 state.entry->fields[n_u64] = val; 1324 break; 1325 } 1326 n_u64++; 1327 } 1328 } 1329 va_end(args); 1330 out: 1331 __synth_event_trace_end(&state); 1332 1333 return ret; 1334 } 1335 EXPORT_SYMBOL_GPL(synth_event_trace); 1336 1337 /** 1338 * synth_event_trace_array - Trace a synthetic event from an array 1339 * @file: The trace_event_file representing the synthetic event 1340 * @vals: Array of values 1341 * @n_vals: The number of values in vals 1342 * 1343 * Trace a synthetic event using the values passed in as 'vals'. 1344 * 1345 * The 'vals' array is just an array of 'n_vals' u64. The number of 1346 * vals must match the number of field in the synthetic event, and 1347 * must be in the same order as the synthetic event fields. 1348 * 1349 * All vals should be cast to u64, and string vals are just pointers 1350 * to strings, cast to u64. Strings will be copied into space 1351 * reserved in the event for the string, using these pointers. 1352 * 1353 * Return: 0 on success, err otherwise. 1354 */ 1355 int synth_event_trace_array(struct trace_event_file *file, u64 *vals, 1356 unsigned int n_vals) 1357 { 1358 struct synth_event_trace_state state; 1359 unsigned int i, n_u64; 1360 int ret; 1361 1362 ret = __synth_event_trace_start(file, &state); 1363 if (ret) { 1364 if (ret == -ENOENT) 1365 ret = 0; /* just disabled, not really an error */ 1366 return ret; 1367 } 1368 1369 if (n_vals != state.event->n_fields) { 1370 ret = -EINVAL; 1371 goto out; 1372 } 1373 1374 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { 1375 if (state.event->fields[i]->is_string) { 1376 char *str_val = (char *)(long)vals[i]; 1377 char *str_field = (char *)&state.entry->fields[n_u64]; 1378 1379 strscpy(str_field, str_val, STR_VAR_LEN_MAX); 1380 n_u64 += STR_VAR_LEN_MAX / sizeof(u64); 1381 } else { 1382 struct synth_field *field = state.event->fields[i]; 1383 u64 val = vals[i]; 1384 1385 switch (field->size) { 1386 case 1: 1387 *(u8 *)&state.entry->fields[n_u64] = (u8)val; 1388 break; 1389 1390 case 2: 1391 *(u16 *)&state.entry->fields[n_u64] = (u16)val; 1392 break; 1393 1394 case 4: 1395 *(u32 *)&state.entry->fields[n_u64] = (u32)val; 1396 break; 1397 1398 default: 1399 state.entry->fields[n_u64] = val; 1400 break; 1401 } 1402 n_u64++; 1403 } 1404 } 1405 out: 1406 __synth_event_trace_end(&state); 1407 1408 return ret; 1409 } 1410 EXPORT_SYMBOL_GPL(synth_event_trace_array); 1411 1412 /** 1413 * synth_event_trace_start - Start piecewise synthetic event trace 1414 * @file: The trace_event_file representing the synthetic event 1415 * @trace_state: A pointer to object tracking the piecewise trace state 1416 * 1417 * Start the trace of a synthetic event field-by-field rather than all 1418 * at once. 1419 * 1420 * This function 'opens' an event trace, which means space is reserved 1421 * for the event in the trace buffer, after which the event's 1422 * individual field values can be set through either 1423 * synth_event_add_next_val() or synth_event_add_val(). 1424 * 1425 * A pointer to a trace_state object is passed in, which will keep 1426 * track of the current event trace state until the event trace is 1427 * closed (and the event finally traced) using 1428 * synth_event_trace_end(). 1429 * 1430 * Note that synth_event_trace_end() must be called after all values 1431 * have been added for each event trace, regardless of whether adding 1432 * all field values succeeded or not. 1433 * 1434 * Note also that for a given event trace, all fields must be added 1435 * using either synth_event_add_next_val() or synth_event_add_val() 1436 * but not both together or interleaved. 1437 * 1438 * Return: 0 on success, err otherwise. 1439 */ 1440 int synth_event_trace_start(struct trace_event_file *file, 1441 struct synth_event_trace_state *trace_state) 1442 { 1443 int ret; 1444 1445 if (!trace_state) 1446 return -EINVAL; 1447 1448 ret = __synth_event_trace_start(file, trace_state); 1449 if (ret == -ENOENT) 1450 ret = 0; /* just disabled, not really an error */ 1451 1452 return ret; 1453 } 1454 EXPORT_SYMBOL_GPL(synth_event_trace_start); 1455 1456 static int __synth_event_add_val(const char *field_name, u64 val, 1457 struct synth_event_trace_state *trace_state) 1458 { 1459 struct synth_field *field = NULL; 1460 struct synth_trace_event *entry; 1461 struct synth_event *event; 1462 int i, ret = 0; 1463 1464 if (!trace_state) { 1465 ret = -EINVAL; 1466 goto out; 1467 } 1468 1469 /* can't mix add_next_synth_val() with add_synth_val() */ 1470 if (field_name) { 1471 if (trace_state->add_next) { 1472 ret = -EINVAL; 1473 goto out; 1474 } 1475 trace_state->add_name = true; 1476 } else { 1477 if (trace_state->add_name) { 1478 ret = -EINVAL; 1479 goto out; 1480 } 1481 trace_state->add_next = true; 1482 } 1483 1484 if (trace_state->disabled) 1485 goto out; 1486 1487 event = trace_state->event; 1488 if (trace_state->add_name) { 1489 for (i = 0; i < event->n_fields; i++) { 1490 field = event->fields[i]; 1491 if (strcmp(field->name, field_name) == 0) 1492 break; 1493 } 1494 if (!field) { 1495 ret = -EINVAL; 1496 goto out; 1497 } 1498 } else { 1499 if (trace_state->cur_field >= event->n_fields) { 1500 ret = -EINVAL; 1501 goto out; 1502 } 1503 field = event->fields[trace_state->cur_field++]; 1504 } 1505 1506 entry = trace_state->entry; 1507 if (field->is_string) { 1508 char *str_val = (char *)(long)val; 1509 char *str_field; 1510 1511 if (!str_val) { 1512 ret = -EINVAL; 1513 goto out; 1514 } 1515 1516 str_field = (char *)&entry->fields[field->offset]; 1517 strscpy(str_field, str_val, STR_VAR_LEN_MAX); 1518 } else { 1519 switch (field->size) { 1520 case 1: 1521 *(u8 *)&trace_state->entry->fields[field->offset] = (u8)val; 1522 break; 1523 1524 case 2: 1525 *(u16 *)&trace_state->entry->fields[field->offset] = (u16)val; 1526 break; 1527 1528 case 4: 1529 *(u32 *)&trace_state->entry->fields[field->offset] = (u32)val; 1530 break; 1531 1532 default: 1533 trace_state->entry->fields[field->offset] = val; 1534 break; 1535 } 1536 } 1537 out: 1538 return ret; 1539 } 1540 1541 /** 1542 * synth_event_add_next_val - Add the next field's value to an open synth trace 1543 * @val: The value to set the next field to 1544 * @trace_state: A pointer to object tracking the piecewise trace state 1545 * 1546 * Set the value of the next field in an event that's been opened by 1547 * synth_event_trace_start(). 1548 * 1549 * The val param should be the value cast to u64. If the value points 1550 * to a string, the val param should be a char * cast to u64. 1551 * 1552 * This function assumes all the fields in an event are to be set one 1553 * after another - successive calls to this function are made, one for 1554 * each field, in the order of the fields in the event, until all 1555 * fields have been set. If you'd rather set each field individually 1556 * without regard to ordering, synth_event_add_val() can be used 1557 * instead. 1558 * 1559 * Note however that synth_event_add_next_val() and 1560 * synth_event_add_val() can't be intermixed for a given event trace - 1561 * one or the other but not both can be used at the same time. 1562 * 1563 * Note also that synth_event_trace_end() must be called after all 1564 * values have been added for each event trace, regardless of whether 1565 * adding all field values succeeded or not. 1566 * 1567 * Return: 0 on success, err otherwise. 1568 */ 1569 int synth_event_add_next_val(u64 val, 1570 struct synth_event_trace_state *trace_state) 1571 { 1572 return __synth_event_add_val(NULL, val, trace_state); 1573 } 1574 EXPORT_SYMBOL_GPL(synth_event_add_next_val); 1575 1576 /** 1577 * synth_event_add_val - Add a named field's value to an open synth trace 1578 * @field_name: The name of the synthetic event field value to set 1579 * @val: The value to set the next field to 1580 * @trace_state: A pointer to object tracking the piecewise trace state 1581 * 1582 * Set the value of the named field in an event that's been opened by 1583 * synth_event_trace_start(). 1584 * 1585 * The val param should be the value cast to u64. If the value points 1586 * to a string, the val param should be a char * cast to u64. 1587 * 1588 * This function looks up the field name, and if found, sets the field 1589 * to the specified value. This lookup makes this function more 1590 * expensive than synth_event_add_next_val(), so use that or the 1591 * none-piecewise synth_event_trace() instead if efficiency is more 1592 * important. 1593 * 1594 * Note however that synth_event_add_next_val() and 1595 * synth_event_add_val() can't be intermixed for a given event trace - 1596 * one or the other but not both can be used at the same time. 1597 * 1598 * Note also that synth_event_trace_end() must be called after all 1599 * values have been added for each event trace, regardless of whether 1600 * adding all field values succeeded or not. 1601 * 1602 * Return: 0 on success, err otherwise. 1603 */ 1604 int synth_event_add_val(const char *field_name, u64 val, 1605 struct synth_event_trace_state *trace_state) 1606 { 1607 return __synth_event_add_val(field_name, val, trace_state); 1608 } 1609 EXPORT_SYMBOL_GPL(synth_event_add_val); 1610 1611 /** 1612 * synth_event_trace_end - End piecewise synthetic event trace 1613 * @trace_state: A pointer to object tracking the piecewise trace state 1614 * 1615 * End the trace of a synthetic event opened by 1616 * synth_event_trace__start(). 1617 * 1618 * This function 'closes' an event trace, which basically means that 1619 * it commits the reserved event and cleans up other loose ends. 1620 * 1621 * A pointer to a trace_state object is passed in, which will keep 1622 * track of the current event trace state opened with 1623 * synth_event_trace_start(). 1624 * 1625 * Note that this function must be called after all values have been 1626 * added for each event trace, regardless of whether adding all field 1627 * values succeeded or not. 1628 * 1629 * Return: 0 on success, err otherwise. 1630 */ 1631 int synth_event_trace_end(struct synth_event_trace_state *trace_state) 1632 { 1633 if (!trace_state) 1634 return -EINVAL; 1635 1636 __synth_event_trace_end(trace_state); 1637 1638 return 0; 1639 } 1640 EXPORT_SYMBOL_GPL(synth_event_trace_end); 1641 1642 static int create_synth_event(int argc, const char **argv) 1643 { 1644 const char *name = argv[0]; 1645 int len; 1646 1647 if (name[0] != 's' || name[1] != ':') 1648 return -ECANCELED; 1649 name += 2; 1650 1651 /* This interface accepts group name prefix */ 1652 if (strchr(name, '/')) { 1653 len = str_has_prefix(name, SYNTH_SYSTEM "/"); 1654 if (len == 0) 1655 return -EINVAL; 1656 name += len; 1657 } 1658 return __create_synth_event(argc - 1, name, argv + 1); 1659 } 1660 1661 static int synth_event_release(struct dyn_event *ev) 1662 { 1663 struct synth_event *event = to_synth_event(ev); 1664 int ret; 1665 1666 if (event->ref) 1667 return -EBUSY; 1668 1669 ret = unregister_synth_event(event); 1670 if (ret) 1671 return ret; 1672 1673 dyn_event_remove(ev); 1674 free_synth_event(event); 1675 return 0; 1676 } 1677 1678 static int __synth_event_show(struct seq_file *m, struct synth_event *event) 1679 { 1680 struct synth_field *field; 1681 unsigned int i; 1682 1683 seq_printf(m, "%s\t", event->name); 1684 1685 for (i = 0; i < event->n_fields; i++) { 1686 field = event->fields[i]; 1687 1688 /* parameter values */ 1689 seq_printf(m, "%s %s%s", field->type, field->name, 1690 i == event->n_fields - 1 ? "" : "; "); 1691 } 1692 1693 seq_putc(m, '\n'); 1694 1695 return 0; 1696 } 1697 1698 static int synth_event_show(struct seq_file *m, struct dyn_event *ev) 1699 { 1700 struct synth_event *event = to_synth_event(ev); 1701 1702 seq_printf(m, "s:%s/", event->class.system); 1703 1704 return __synth_event_show(m, event); 1705 } 1706 1707 static int synth_events_seq_show(struct seq_file *m, void *v) 1708 { 1709 struct dyn_event *ev = v; 1710 1711 if (!is_synth_event(ev)) 1712 return 0; 1713 1714 return __synth_event_show(m, to_synth_event(ev)); 1715 } 1716 1717 static const struct seq_operations synth_events_seq_op = { 1718 .start = dyn_event_seq_start, 1719 .next = dyn_event_seq_next, 1720 .stop = dyn_event_seq_stop, 1721 .show = synth_events_seq_show, 1722 }; 1723 1724 static int synth_events_open(struct inode *inode, struct file *file) 1725 { 1726 int ret; 1727 1728 ret = security_locked_down(LOCKDOWN_TRACEFS); 1729 if (ret) 1730 return ret; 1731 1732 if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { 1733 ret = dyn_events_release_all(&synth_event_ops); 1734 if (ret < 0) 1735 return ret; 1736 } 1737 1738 return seq_open(file, &synth_events_seq_op); 1739 } 1740 1741 static ssize_t synth_events_write(struct file *file, 1742 const char __user *buffer, 1743 size_t count, loff_t *ppos) 1744 { 1745 return trace_parse_run_command(file, buffer, count, ppos, 1746 create_or_delete_synth_event); 1747 } 1748 1749 static const struct file_operations synth_events_fops = { 1750 .open = synth_events_open, 1751 .write = synth_events_write, 1752 .read = seq_read, 1753 .llseek = seq_lseek, 1754 .release = seq_release, 1755 }; 1756 1757 static __init int trace_events_synth_init(void) 1758 { 1759 struct dentry *entry = NULL; 1760 struct dentry *d_tracer; 1761 int err = 0; 1762 1763 err = dyn_event_register(&synth_event_ops); 1764 if (err) { 1765 pr_warn("Could not register synth_event_ops\n"); 1766 return err; 1767 } 1768 1769 d_tracer = tracing_init_dentry(); 1770 if (IS_ERR(d_tracer)) { 1771 err = PTR_ERR(d_tracer); 1772 goto err; 1773 } 1774 1775 entry = tracefs_create_file("synthetic_events", 0644, d_tracer, 1776 NULL, &synth_events_fops); 1777 if (!entry) { 1778 err = -ENODEV; 1779 goto err; 1780 } 1781 1782 return err; 1783 err: 1784 pr_warn("Could not create tracefs 'synthetic_events' entry\n"); 1785 1786 return err; 1787 } 1788 1789 fs_initcall(trace_events_synth_init); 1790