@@ -289,8 +289,8 @@ void analy_ctx_handle(analy_ctx_t *ctx)
289289 analy_ctx_free (ctx );
290290}
291291
292- static int try_run_analyzer (trace_t * trace , analyzer_t * analyzer ,
293- analy_entry_t * entry )
292+ static int try_run_entry (trace_t * trace , analyzer_t * analyzer ,
293+ analy_entry_t * entry )
294294{
295295 if (analyzer && (analyzer -> mode & (1 << trace_ctx .mode )) &&
296296 analyzer -> analy_entry )
@@ -299,6 +299,16 @@ static int try_run_analyzer(trace_t *trace, analyzer_t *analyzer,
299299 return RESULT_CONT ;
300300}
301301
302+ static int try_run_exit (trace_t * trace , analyzer_t * analyzer ,
303+ analy_exit_t * exit )
304+ {
305+ if (analyzer && (analyzer -> mode & (1 << trace_ctx .mode )) &&
306+ analyzer -> analy_exit )
307+ return analyzer -> analy_exit (trace , exit );
308+
309+ return RESULT_CONT ;
310+ }
311+
302312void tl_poll_handler (void * raw_ctx , int cpu , void * data , u32 size )
303313{
304314 static char buf [1024 ], tinfo [128 ];
@@ -340,7 +350,7 @@ void tl_poll_handler(void *raw_ctx, int cpu, void *data, u32 size)
340350
341351 entry -> ctx = analy_ctx ;
342352 entry -> fake_ctx = fake ;
343- switch (try_run_analyzer (trace , analyzer , entry )) {
353+ switch (try_run_entry (trace , analyzer , entry )) {
344354 case RESULT_CONSUME :
345355 goto check_pending ;
346356 case RESULT_CONT :
@@ -349,7 +359,7 @@ void tl_poll_handler(void *raw_ctx, int cpu, void *data, u32 size)
349359 break ;
350360 }
351361
352- switch (try_run_analyzer (trace , trace -> analyzer , entry )) {
362+ switch (try_run_entry (trace , trace -> analyzer , entry )) {
353363 case RESULT_CONSUME :
354364 goto check_pending ;
355365 case RESULT_CONT :
@@ -407,17 +417,33 @@ do_ret:;
407417 }
408418}
409419
420+ static inline void do_basic_poll (analy_entry_t * entry )
421+ {
422+ trace_t * trace ;
423+
424+ trace = get_trace_from_analy_entry (entry );
425+ try_run_entry (trace , trace -> analyzer , entry );
426+
427+ if (trace_ctx .mode == TRACE_MODE_MONITOR ) {
428+ analy_exit_t analy_exit = {
429+ .event = {
430+ .val = entry -> event -> retval ,
431+ },
432+ .entry = entry ,
433+ };
434+ try_run_exit (trace , trace -> analyzer , & analy_exit );
435+ }
436+
437+ analy_entry_handle (entry );
438+ }
439+
410440void basic_poll_handler (void * ctx , int cpu , void * data , u32 size )
411441{
412442 analy_entry_t entry = {
413443 .event = data ,
414444 .cpu = cpu
415445 };
416- trace_t * trace ;
417-
418- trace = get_trace_from_analy_entry (& entry );
419- try_run_analyzer (trace , trace -> analyzer , & entry );
420- analy_entry_handle (& entry );
446+ do_basic_poll (& entry );
421447}
422448
423449static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER ;
@@ -439,9 +465,7 @@ static void *do_async_poll(void *arg)
439465 pthread_mutex_unlock (& mutex );
440466
441467 list_for_each_entry_safe (entry , pos , & head , list ) {
442- trace = get_trace_from_analy_entry (entry );
443- try_run_analyzer (trace , trace -> analyzer , entry );
444- analy_entry_handle (entry );
468+ do_basic_poll (entry );
445469 list_del (& entry -> list );
446470 analy_entry_free (entry );
447471 }
@@ -513,6 +537,8 @@ static inline void rule_run(analy_entry_t *entry, trace_t *trace, int ret)
513537 if (!hit )
514538 continue ;
515539 entry -> rule = rule ;
540+ if (!mode_has_context ())
541+ break ;
516542 switch (rule -> level ) {
517543 case RULE_INFO :
518544 break ;
@@ -540,7 +566,8 @@ DEFINE_ANALYZER_ENTRY(free, TRACE_MODE_TIMELINE_MASK | TRACE_MODE_DIAG_MASK)
540566}
541567
542568DEFINE_ANALYZER_ENTRY (drop , TRACE_MODE_TIMELINE_MASK | TRACE_MODE_DIAG_MASK |
543- TRACE_MODE_DROP_MASK )
569+ TRACE_MODE_DROP_MASK |
570+ TRACE_MODE_MONITOR_MASK )
544571{
545572 define_pure_event (drop_event_t , event , e -> event );
546573 char * reason = NULL , * sym_str , * info ;
@@ -550,7 +577,7 @@ DEFINE_ANALYZER_ENTRY(drop, TRACE_MODE_TIMELINE_MASK | TRACE_MODE_DIAG_MASK |
550577 sym = sym_parse (event -> location );
551578 sym_str = sym ? sym -> desc : "unknow" ;
552579
553- if (trace_ctx . mode == TRACE_MODE_DROP ) {
580+ if (! mode_has_context () ) {
554581 info = malloc (1024 );
555582 if (trace_ctx .drop_reason )
556583 sprintf (info , ", reason: %s, %s" , reason , sym_str );
@@ -595,7 +622,8 @@ DEFINE_ANALYZER_EXIT(clone, TRACE_MODE_TIMELINE_MASK | TRACE_MODE_DIAG_MASK)
595622 return RESULT_CONSUME ;
596623}
597624
598- DEFINE_ANALYZER_EXIT (ret , TRACE_MODE_DIAG_MASK )
625+ DEFINE_ANALYZER_EXIT (ret , TRACE_MODE_DIAG_MASK |
626+ TRACE_MODE_MONITOR_MASK )
599627{
600628 int ret = (int ) e -> event .val ;
601629
@@ -644,7 +672,8 @@ const char *pf_names[] = {
644672};
645673DEFINE_ANALYZER_ENTRY (nf , TRACE_MODE_DIAG_MASK |
646674 TRACE_MODE_BASIC_MASK |
647- TRACE_MODE_TIMELINE_MASK )
675+ TRACE_MODE_TIMELINE_MASK |
676+ TRACE_MODE_MONITOR_MASK )
648677{
649678 define_pure_event (nf_hooks_event_t , event , e -> event );
650679 char * msg = malloc (1024 ), * extinfo ;
@@ -681,7 +710,8 @@ DEFINE_ANALYZER_EXIT_FUNC_DEFAULT(nf)
681710
682711DEFINE_ANALYZER_ENTRY (iptable , TRACE_MODE_DIAG_MASK |
683712 TRACE_MODE_BASIC_MASK |
684- TRACE_MODE_TIMELINE_MASK )
713+ TRACE_MODE_TIMELINE_MASK |
714+ TRACE_MODE_MONITOR_MASK )
685715{
686716 define_pure_event (nf_event_t , event , e -> event );
687717 char * msg = malloc (1024 );
@@ -702,7 +732,8 @@ DEFINE_ANALYZER_EXIT_FUNC_DEFAULT(iptable)
702732
703733DEFINE_ANALYZER_ENTRY (qdisc , TRACE_MODE_DIAG_MASK |
704734 TRACE_MODE_BASIC_MASK |
705- TRACE_MODE_TIMELINE_MASK )
735+ TRACE_MODE_TIMELINE_MASK |
736+ TRACE_MODE_MONITOR_MASK )
706737{
707738 define_pure_event (qdisc_event_t , event , e -> event );
708739 char * msg = malloc (1024 );
0 commit comments