Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.5-rc3 804 lines 19 kB view raw
1/* 2 * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> 3 * 4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; 8 * version 2.1 of the License (not later!) 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20 */ 21#ifndef _PARSE_EVENTS_H 22#define _PARSE_EVENTS_H 23 24#include <stdarg.h> 25#include <regex.h> 26 27#ifndef __unused 28#define __unused __attribute__ ((unused)) 29#endif 30 31/* ----------------------- trace_seq ----------------------- */ 32 33 34#ifndef TRACE_SEQ_BUF_SIZE 35#define TRACE_SEQ_BUF_SIZE 4096 36#endif 37 38#ifndef DEBUG_RECORD 39#define DEBUG_RECORD 0 40#endif 41 42struct pevent_record { 43 unsigned long long ts; 44 unsigned long long offset; 45 long long missed_events; /* buffer dropped events before */ 46 int record_size; /* size of binary record */ 47 int size; /* size of data */ 48 void *data; 49 int cpu; 50 int ref_count; 51 int locked; /* Do not free, even if ref_count is zero */ 52 void *private; 53#if DEBUG_RECORD 54 struct pevent_record *prev; 55 struct pevent_record *next; 56 long alloc_addr; 57#endif 58}; 59 60/* 61 * Trace sequences are used to allow a function to call several other functions 62 * to create a string of data to use (up to a max of PAGE_SIZE). 63 */ 64 65struct trace_seq { 66 char *buffer; 67 unsigned int buffer_size; 68 unsigned int len; 69 unsigned int readpos; 70}; 71 72void trace_seq_init(struct trace_seq *s); 73void trace_seq_destroy(struct trace_seq *s); 74 75extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) 76 __attribute__ ((format (printf, 2, 3))); 77extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) 78 __attribute__ ((format (printf, 2, 0))); 79 80extern int trace_seq_puts(struct trace_seq *s, const char *str); 81extern int trace_seq_putc(struct trace_seq *s, unsigned char c); 82 83extern void trace_seq_terminate(struct trace_seq *s); 84 85extern int trace_seq_do_printf(struct trace_seq *s); 86 87 88/* ----------------------- pevent ----------------------- */ 89 90struct pevent; 91struct event_format; 92 93typedef int (*pevent_event_handler_func)(struct trace_seq *s, 94 struct pevent_record *record, 95 struct event_format *event, 96 void *context); 97 98typedef int (*pevent_plugin_load_func)(struct pevent *pevent); 99typedef int (*pevent_plugin_unload_func)(void); 100 101struct plugin_option { 102 struct plugin_option *next; 103 void *handle; 104 char *file; 105 char *name; 106 char *plugin_alias; 107 char *description; 108 char *value; 109 void *private; 110 int set; 111}; 112 113/* 114 * Plugin hooks that can be called: 115 * 116 * PEVENT_PLUGIN_LOADER: (required) 117 * The function name to initialized the plugin. 118 * 119 * int PEVENT_PLUGIN_LOADER(struct pevent *pevent) 120 * 121 * PEVENT_PLUGIN_UNLOADER: (optional) 122 * The function called just before unloading 123 * 124 * int PEVENT_PLUGIN_UNLOADER(void) 125 * 126 * PEVENT_PLUGIN_OPTIONS: (optional) 127 * Plugin options that can be set before loading 128 * 129 * struct plugin_option PEVENT_PLUGIN_OPTIONS[] = { 130 * { 131 * .name = "option-name", 132 * .plugin_alias = "overide-file-name", (optional) 133 * .description = "description of option to show users", 134 * }, 135 * { 136 * .name = NULL, 137 * }, 138 * }; 139 * 140 * Array must end with .name = NULL; 141 * 142 * 143 * .plugin_alias is used to give a shorter name to access 144 * the vairable. Useful if a plugin handles more than one event. 145 * 146 * PEVENT_PLUGIN_ALIAS: (optional) 147 * The name to use for finding options (uses filename if not defined) 148 */ 149#define PEVENT_PLUGIN_LOADER pevent_plugin_loader 150#define PEVENT_PLUGIN_UNLOADER pevent_plugin_unloader 151#define PEVENT_PLUGIN_OPTIONS pevent_plugin_options 152#define PEVENT_PLUGIN_ALIAS pevent_plugin_alias 153#define _MAKE_STR(x) #x 154#define MAKE_STR(x) _MAKE_STR(x) 155#define PEVENT_PLUGIN_LOADER_NAME MAKE_STR(PEVENT_PLUGIN_LOADER) 156#define PEVENT_PLUGIN_UNLOADER_NAME MAKE_STR(PEVENT_PLUGIN_UNLOADER) 157#define PEVENT_PLUGIN_OPTIONS_NAME MAKE_STR(PEVENT_PLUGIN_OPTIONS) 158#define PEVENT_PLUGIN_ALIAS_NAME MAKE_STR(PEVENT_PLUGIN_ALIAS) 159 160#define NSECS_PER_SEC 1000000000ULL 161#define NSECS_PER_USEC 1000ULL 162 163enum format_flags { 164 FIELD_IS_ARRAY = 1, 165 FIELD_IS_POINTER = 2, 166 FIELD_IS_SIGNED = 4, 167 FIELD_IS_STRING = 8, 168 FIELD_IS_DYNAMIC = 16, 169 FIELD_IS_LONG = 32, 170 FIELD_IS_FLAG = 64, 171 FIELD_IS_SYMBOLIC = 128, 172}; 173 174struct format_field { 175 struct format_field *next; 176 struct event_format *event; 177 char *type; 178 char *name; 179 int offset; 180 int size; 181 unsigned int arraylen; 182 unsigned int elementsize; 183 unsigned long flags; 184}; 185 186struct format { 187 int nr_common; 188 int nr_fields; 189 struct format_field *common_fields; 190 struct format_field *fields; 191}; 192 193struct print_arg_atom { 194 char *atom; 195}; 196 197struct print_arg_string { 198 char *string; 199 int offset; 200}; 201 202struct print_arg_field { 203 char *name; 204 struct format_field *field; 205}; 206 207struct print_flag_sym { 208 struct print_flag_sym *next; 209 char *value; 210 char *str; 211}; 212 213struct print_arg_typecast { 214 char *type; 215 struct print_arg *item; 216}; 217 218struct print_arg_flags { 219 struct print_arg *field; 220 char *delim; 221 struct print_flag_sym *flags; 222}; 223 224struct print_arg_symbol { 225 struct print_arg *field; 226 struct print_flag_sym *symbols; 227}; 228 229struct print_arg_dynarray { 230 struct format_field *field; 231 struct print_arg *index; 232}; 233 234struct print_arg; 235 236struct print_arg_op { 237 char *op; 238 int prio; 239 struct print_arg *left; 240 struct print_arg *right; 241}; 242 243struct pevent_function_handler; 244 245struct print_arg_func { 246 struct pevent_function_handler *func; 247 struct print_arg *args; 248}; 249 250enum print_arg_type { 251 PRINT_NULL, 252 PRINT_ATOM, 253 PRINT_FIELD, 254 PRINT_FLAGS, 255 PRINT_SYMBOL, 256 PRINT_TYPE, 257 PRINT_STRING, 258 PRINT_BSTRING, 259 PRINT_DYNAMIC_ARRAY, 260 PRINT_OP, 261 PRINT_FUNC, 262}; 263 264struct print_arg { 265 struct print_arg *next; 266 enum print_arg_type type; 267 union { 268 struct print_arg_atom atom; 269 struct print_arg_field field; 270 struct print_arg_typecast typecast; 271 struct print_arg_flags flags; 272 struct print_arg_symbol symbol; 273 struct print_arg_func func; 274 struct print_arg_string string; 275 struct print_arg_op op; 276 struct print_arg_dynarray dynarray; 277 }; 278}; 279 280struct print_fmt { 281 char *format; 282 struct print_arg *args; 283}; 284 285struct event_format { 286 struct pevent *pevent; 287 char *name; 288 int id; 289 int flags; 290 struct format format; 291 struct print_fmt print_fmt; 292 char *system; 293 pevent_event_handler_func handler; 294 void *context; 295}; 296 297enum { 298 EVENT_FL_ISFTRACE = 0x01, 299 EVENT_FL_ISPRINT = 0x02, 300 EVENT_FL_ISBPRINT = 0x04, 301 EVENT_FL_ISFUNCENT = 0x10, 302 EVENT_FL_ISFUNCRET = 0x20, 303 304 EVENT_FL_FAILED = 0x80000000 305}; 306 307enum event_sort_type { 308 EVENT_SORT_ID, 309 EVENT_SORT_NAME, 310 EVENT_SORT_SYSTEM, 311}; 312 313enum event_type { 314 EVENT_ERROR, 315 EVENT_NONE, 316 EVENT_SPACE, 317 EVENT_NEWLINE, 318 EVENT_OP, 319 EVENT_DELIM, 320 EVENT_ITEM, 321 EVENT_DQUOTE, 322 EVENT_SQUOTE, 323}; 324 325typedef unsigned long long (*pevent_func_handler)(struct trace_seq *s, 326 unsigned long long *args); 327 328enum pevent_func_arg_type { 329 PEVENT_FUNC_ARG_VOID, 330 PEVENT_FUNC_ARG_INT, 331 PEVENT_FUNC_ARG_LONG, 332 PEVENT_FUNC_ARG_STRING, 333 PEVENT_FUNC_ARG_PTR, 334 PEVENT_FUNC_ARG_MAX_TYPES 335}; 336 337enum pevent_flag { 338 PEVENT_NSEC_OUTPUT = 1, /* output in NSECS */ 339}; 340 341struct cmdline; 342struct cmdline_list; 343struct func_map; 344struct func_list; 345struct event_handler; 346 347struct pevent { 348 int ref_count; 349 350 int header_page_ts_offset; 351 int header_page_ts_size; 352 int header_page_size_offset; 353 int header_page_size_size; 354 int header_page_data_offset; 355 int header_page_data_size; 356 int header_page_overwrite; 357 358 int file_bigendian; 359 int host_bigendian; 360 361 int latency_format; 362 363 int old_format; 364 365 int cpus; 366 int long_size; 367 368 struct cmdline *cmdlines; 369 struct cmdline_list *cmdlist; 370 int cmdline_count; 371 372 struct func_map *func_map; 373 struct func_list *funclist; 374 unsigned int func_count; 375 376 struct printk_map *printk_map; 377 struct printk_list *printklist; 378 unsigned int printk_count; 379 380 381 struct event_format **events; 382 int nr_events; 383 struct event_format **sort_events; 384 enum event_sort_type last_type; 385 386 int type_offset; 387 int type_size; 388 389 int pid_offset; 390 int pid_size; 391 392 int pc_offset; 393 int pc_size; 394 395 int flags_offset; 396 int flags_size; 397 398 int ld_offset; 399 int ld_size; 400 401 int print_raw; 402 403 int test_filters; 404 405 int flags; 406 407 struct format_field *bprint_ip_field; 408 struct format_field *bprint_fmt_field; 409 struct format_field *bprint_buf_field; 410 411 struct event_handler *handlers; 412 struct pevent_function_handler *func_handlers; 413 414 /* cache */ 415 struct event_format *last_event; 416}; 417 418static inline void pevent_set_flag(struct pevent *pevent, int flag) 419{ 420 pevent->flags |= flag; 421} 422 423static inline unsigned short 424__data2host2(struct pevent *pevent, unsigned short data) 425{ 426 unsigned short swap; 427 428 if (pevent->host_bigendian == pevent->file_bigendian) 429 return data; 430 431 swap = ((data & 0xffULL) << 8) | 432 ((data & (0xffULL << 8)) >> 8); 433 434 return swap; 435} 436 437static inline unsigned int 438__data2host4(struct pevent *pevent, unsigned int data) 439{ 440 unsigned int swap; 441 442 if (pevent->host_bigendian == pevent->file_bigendian) 443 return data; 444 445 swap = ((data & 0xffULL) << 24) | 446 ((data & (0xffULL << 8)) << 8) | 447 ((data & (0xffULL << 16)) >> 8) | 448 ((data & (0xffULL << 24)) >> 24); 449 450 return swap; 451} 452 453static inline unsigned long long 454__data2host8(struct pevent *pevent, unsigned long long data) 455{ 456 unsigned long long swap; 457 458 if (pevent->host_bigendian == pevent->file_bigendian) 459 return data; 460 461 swap = ((data & 0xffULL) << 56) | 462 ((data & (0xffULL << 8)) << 40) | 463 ((data & (0xffULL << 16)) << 24) | 464 ((data & (0xffULL << 24)) << 8) | 465 ((data & (0xffULL << 32)) >> 8) | 466 ((data & (0xffULL << 40)) >> 24) | 467 ((data & (0xffULL << 48)) >> 40) | 468 ((data & (0xffULL << 56)) >> 56); 469 470 return swap; 471} 472 473#define data2host2(pevent, ptr) __data2host2(pevent, *(unsigned short *)(ptr)) 474#define data2host4(pevent, ptr) __data2host4(pevent, *(unsigned int *)(ptr)) 475#define data2host8(pevent, ptr) \ 476({ \ 477 unsigned long long __val; \ 478 \ 479 memcpy(&__val, (ptr), sizeof(unsigned long long)); \ 480 __data2host8(pevent, __val); \ 481}) 482 483/* taken from kernel/trace/trace.h */ 484enum trace_flag_type { 485 TRACE_FLAG_IRQS_OFF = 0x01, 486 TRACE_FLAG_IRQS_NOSUPPORT = 0x02, 487 TRACE_FLAG_NEED_RESCHED = 0x04, 488 TRACE_FLAG_HARDIRQ = 0x08, 489 TRACE_FLAG_SOFTIRQ = 0x10, 490}; 491 492int pevent_register_comm(struct pevent *pevent, const char *comm, int pid); 493int pevent_register_function(struct pevent *pevent, char *name, 494 unsigned long long addr, char *mod); 495int pevent_register_print_string(struct pevent *pevent, char *fmt, 496 unsigned long long addr); 497int pevent_pid_is_registered(struct pevent *pevent, int pid); 498 499void pevent_print_event(struct pevent *pevent, struct trace_seq *s, 500 struct pevent_record *record); 501 502int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size, 503 int long_size); 504 505int pevent_parse_event(struct pevent *pevent, const char *buf, 506 unsigned long size, const char *sys); 507 508void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event, 509 const char *name, struct pevent_record *record, 510 int *len, int err); 511 512int pevent_get_field_val(struct trace_seq *s, struct event_format *event, 513 const char *name, struct pevent_record *record, 514 unsigned long long *val, int err); 515int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event, 516 const char *name, struct pevent_record *record, 517 unsigned long long *val, int err); 518int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event, 519 const char *name, struct pevent_record *record, 520 unsigned long long *val, int err); 521 522int pevent_print_num_field(struct trace_seq *s, const char *fmt, 523 struct event_format *event, const char *name, 524 struct pevent_record *record, int err); 525 526int pevent_register_event_handler(struct pevent *pevent, int id, char *sys_name, char *event_name, 527 pevent_event_handler_func func, void *context); 528int pevent_register_print_function(struct pevent *pevent, 529 pevent_func_handler func, 530 enum pevent_func_arg_type ret_type, 531 char *name, ...); 532 533struct format_field *pevent_find_common_field(struct event_format *event, const char *name); 534struct format_field *pevent_find_field(struct event_format *event, const char *name); 535struct format_field *pevent_find_any_field(struct event_format *event, const char *name); 536 537const char *pevent_find_function(struct pevent *pevent, unsigned long long addr); 538unsigned long long 539pevent_find_function_address(struct pevent *pevent, unsigned long long addr); 540unsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size); 541int pevent_read_number_field(struct format_field *field, const void *data, 542 unsigned long long *value); 543 544struct event_format *pevent_find_event(struct pevent *pevent, int id); 545 546struct event_format * 547pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name); 548 549void pevent_data_lat_fmt(struct pevent *pevent, 550 struct trace_seq *s, struct pevent_record *record); 551int pevent_data_type(struct pevent *pevent, struct pevent_record *rec); 552struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type); 553int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec); 554const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid); 555void pevent_event_info(struct trace_seq *s, struct event_format *event, 556 struct pevent_record *record); 557 558struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type); 559struct format_field **pevent_event_common_fields(struct event_format *event); 560struct format_field **pevent_event_fields(struct event_format *event); 561 562static inline int pevent_get_cpus(struct pevent *pevent) 563{ 564 return pevent->cpus; 565} 566 567static inline void pevent_set_cpus(struct pevent *pevent, int cpus) 568{ 569 pevent->cpus = cpus; 570} 571 572static inline int pevent_get_long_size(struct pevent *pevent) 573{ 574 return pevent->long_size; 575} 576 577static inline void pevent_set_long_size(struct pevent *pevent, int long_size) 578{ 579 pevent->long_size = long_size; 580} 581 582static inline int pevent_is_file_bigendian(struct pevent *pevent) 583{ 584 return pevent->file_bigendian; 585} 586 587static inline void pevent_set_file_bigendian(struct pevent *pevent, int endian) 588{ 589 pevent->file_bigendian = endian; 590} 591 592static inline int pevent_is_host_bigendian(struct pevent *pevent) 593{ 594 return pevent->host_bigendian; 595} 596 597static inline void pevent_set_host_bigendian(struct pevent *pevent, int endian) 598{ 599 pevent->host_bigendian = endian; 600} 601 602static inline int pevent_is_latency_format(struct pevent *pevent) 603{ 604 return pevent->latency_format; 605} 606 607static inline void pevent_set_latency_format(struct pevent *pevent, int lat) 608{ 609 pevent->latency_format = lat; 610} 611 612struct pevent *pevent_alloc(void); 613void pevent_free(struct pevent *pevent); 614void pevent_ref(struct pevent *pevent); 615void pevent_unref(struct pevent *pevent); 616 617/* access to the internal parser */ 618void pevent_buffer_init(const char *buf, unsigned long long size); 619enum event_type pevent_read_token(char **tok); 620void pevent_free_token(char *token); 621int pevent_peek_char(void); 622const char *pevent_get_input_buf(void); 623unsigned long long pevent_get_input_buf_ptr(void); 624 625/* for debugging */ 626void pevent_print_funcs(struct pevent *pevent); 627void pevent_print_printk(struct pevent *pevent); 628 629/* ----------------------- filtering ----------------------- */ 630 631enum filter_boolean_type { 632 FILTER_FALSE, 633 FILTER_TRUE, 634}; 635 636enum filter_op_type { 637 FILTER_OP_AND = 1, 638 FILTER_OP_OR, 639 FILTER_OP_NOT, 640}; 641 642enum filter_cmp_type { 643 FILTER_CMP_NONE, 644 FILTER_CMP_EQ, 645 FILTER_CMP_NE, 646 FILTER_CMP_GT, 647 FILTER_CMP_LT, 648 FILTER_CMP_GE, 649 FILTER_CMP_LE, 650 FILTER_CMP_MATCH, 651 FILTER_CMP_NOT_MATCH, 652 FILTER_CMP_REGEX, 653 FILTER_CMP_NOT_REGEX, 654}; 655 656enum filter_exp_type { 657 FILTER_EXP_NONE, 658 FILTER_EXP_ADD, 659 FILTER_EXP_SUB, 660 FILTER_EXP_MUL, 661 FILTER_EXP_DIV, 662 FILTER_EXP_MOD, 663 FILTER_EXP_RSHIFT, 664 FILTER_EXP_LSHIFT, 665 FILTER_EXP_AND, 666 FILTER_EXP_OR, 667 FILTER_EXP_XOR, 668 FILTER_EXP_NOT, 669}; 670 671enum filter_arg_type { 672 FILTER_ARG_NONE, 673 FILTER_ARG_BOOLEAN, 674 FILTER_ARG_VALUE, 675 FILTER_ARG_FIELD, 676 FILTER_ARG_EXP, 677 FILTER_ARG_OP, 678 FILTER_ARG_NUM, 679 FILTER_ARG_STR, 680}; 681 682enum filter_value_type { 683 FILTER_NUMBER, 684 FILTER_STRING, 685 FILTER_CHAR 686}; 687 688struct fliter_arg; 689 690struct filter_arg_boolean { 691 enum filter_boolean_type value; 692}; 693 694struct filter_arg_field { 695 struct format_field *field; 696}; 697 698struct filter_arg_value { 699 enum filter_value_type type; 700 union { 701 char *str; 702 unsigned long long val; 703 }; 704}; 705 706struct filter_arg_op { 707 enum filter_op_type type; 708 struct filter_arg *left; 709 struct filter_arg *right; 710}; 711 712struct filter_arg_exp { 713 enum filter_exp_type type; 714 struct filter_arg *left; 715 struct filter_arg *right; 716}; 717 718struct filter_arg_num { 719 enum filter_cmp_type type; 720 struct filter_arg *left; 721 struct filter_arg *right; 722}; 723 724struct filter_arg_str { 725 enum filter_cmp_type type; 726 struct format_field *field; 727 char *val; 728 char *buffer; 729 regex_t reg; 730}; 731 732struct filter_arg { 733 enum filter_arg_type type; 734 union { 735 struct filter_arg_boolean boolean; 736 struct filter_arg_field field; 737 struct filter_arg_value value; 738 struct filter_arg_op op; 739 struct filter_arg_exp exp; 740 struct filter_arg_num num; 741 struct filter_arg_str str; 742 }; 743}; 744 745struct filter_type { 746 int event_id; 747 struct event_format *event; 748 struct filter_arg *filter; 749}; 750 751struct event_filter { 752 struct pevent *pevent; 753 int filters; 754 struct filter_type *event_filters; 755}; 756 757struct event_filter *pevent_filter_alloc(struct pevent *pevent); 758 759#define FILTER_NONE -2 760#define FILTER_NOEXIST -1 761#define FILTER_MISS 0 762#define FILTER_MATCH 1 763 764enum filter_trivial_type { 765 FILTER_TRIVIAL_FALSE, 766 FILTER_TRIVIAL_TRUE, 767 FILTER_TRIVIAL_BOTH, 768}; 769 770int pevent_filter_add_filter_str(struct event_filter *filter, 771 const char *filter_str, 772 char **error_str); 773 774 775int pevent_filter_match(struct event_filter *filter, 776 struct pevent_record *record); 777 778int pevent_event_filtered(struct event_filter *filter, 779 int event_id); 780 781void pevent_filter_reset(struct event_filter *filter); 782 783void pevent_filter_clear_trivial(struct event_filter *filter, 784 enum filter_trivial_type type); 785 786void pevent_filter_free(struct event_filter *filter); 787 788char *pevent_filter_make_string(struct event_filter *filter, int event_id); 789 790int pevent_filter_remove_event(struct event_filter *filter, 791 int event_id); 792 793int pevent_filter_event_has_trivial(struct event_filter *filter, 794 int event_id, 795 enum filter_trivial_type type); 796 797int pevent_filter_copy(struct event_filter *dest, struct event_filter *source); 798 799int pevent_update_trivial(struct event_filter *dest, struct event_filter *source, 800 enum filter_trivial_type type); 801 802int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2); 803 804#endif /* _PARSE_EVENTS_H */