@@ -7023,6 +7023,29 @@ void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs)
7023
7023
EXPORT_SYMBOL_GPL (perf_unregister_guest_info_callbacks );
7024
7024
#endif
7025
7025
7026
+ static bool should_sample_guest (struct perf_event * event )
7027
+ {
7028
+ return !event -> attr .exclude_guest && perf_guest_state ();
7029
+ }
7030
+
7031
+ unsigned long perf_misc_flags (struct perf_event * event ,
7032
+ struct pt_regs * regs )
7033
+ {
7034
+ if (should_sample_guest (event ))
7035
+ return perf_arch_guest_misc_flags (regs );
7036
+
7037
+ return perf_arch_misc_flags (regs );
7038
+ }
7039
+
7040
+ unsigned long perf_instruction_pointer (struct perf_event * event ,
7041
+ struct pt_regs * regs )
7042
+ {
7043
+ if (should_sample_guest (event ))
7044
+ return perf_guest_get_ip ();
7045
+
7046
+ return perf_arch_instruction_pointer (regs );
7047
+ }
7048
+
7026
7049
static void
7027
7050
perf_output_sample_regs (struct perf_output_handle * handle ,
7028
7051
struct pt_regs * regs , u64 mask )
@@ -7840,7 +7863,7 @@ void perf_prepare_sample(struct perf_sample_data *data,
7840
7863
__perf_event_header__init_id (data , event , filtered_sample_type );
7841
7864
7842
7865
if (filtered_sample_type & PERF_SAMPLE_IP ) {
7843
- data -> ip = perf_instruction_pointer (regs );
7866
+ data -> ip = perf_instruction_pointer (event , regs );
7844
7867
data -> sample_flags |= PERF_SAMPLE_IP ;
7845
7868
}
7846
7869
@@ -8004,7 +8027,7 @@ void perf_prepare_header(struct perf_event_header *header,
8004
8027
{
8005
8028
header -> type = PERF_RECORD_SAMPLE ;
8006
8029
header -> size = perf_sample_data_size (data , event );
8007
- header -> misc = perf_misc_flags (regs );
8030
+ header -> misc = perf_misc_flags (event , regs );
8008
8031
8009
8032
/*
8010
8033
* If you're adding more sample types here, you likely need to do
0 commit comments