@@ -606,6 +606,7 @@ static inline phys_addr_t topa_pfn(struct topa *topa)
606
606
607
607
static void pt_config_buffer (struct pt_buffer * buf )
608
608
{
609
+ struct pt * pt = this_cpu_ptr (& pt_ctx );
609
610
u64 reg , mask ;
610
611
void * base ;
611
612
@@ -617,11 +618,17 @@ static void pt_config_buffer(struct pt_buffer *buf)
617
618
mask = (u64 )buf -> cur_idx ;
618
619
}
619
620
620
- wrmsrl (MSR_IA32_RTIT_OUTPUT_BASE , virt_to_phys (base ));
621
+ reg = virt_to_phys (base );
622
+ if (pt -> output_base != reg ) {
623
+ pt -> output_base = reg ;
624
+ wrmsrl (MSR_IA32_RTIT_OUTPUT_BASE , reg );
625
+ }
621
626
622
627
reg = 0x7f | (mask << 7 ) | ((u64 )buf -> output_off << 32 );
623
-
624
- wrmsrl (MSR_IA32_RTIT_OUTPUT_MASK , reg );
628
+ if (pt -> output_mask != reg ) {
629
+ pt -> output_mask = reg ;
630
+ wrmsrl (MSR_IA32_RTIT_OUTPUT_MASK , reg );
631
+ }
625
632
}
626
633
627
634
/**
@@ -930,21 +937,21 @@ static void pt_handle_status(struct pt *pt)
930
937
*/
931
938
static void pt_read_offset (struct pt_buffer * buf )
932
939
{
933
- u64 offset , base ;
940
+ struct pt * pt = this_cpu_ptr ( & pt_ctx ) ;
934
941
struct topa_page * tp ;
935
942
936
943
if (!buf -> single ) {
937
- rdmsrl (MSR_IA32_RTIT_OUTPUT_BASE , base );
938
- tp = phys_to_virt (base );
944
+ rdmsrl (MSR_IA32_RTIT_OUTPUT_BASE , pt -> output_base );
945
+ tp = phys_to_virt (pt -> output_base );
939
946
buf -> cur = & tp -> topa ;
940
947
}
941
948
942
- rdmsrl (MSR_IA32_RTIT_OUTPUT_MASK , offset );
949
+ rdmsrl (MSR_IA32_RTIT_OUTPUT_MASK , pt -> output_mask );
943
950
/* offset within current output region */
944
- buf -> output_off = offset >> 32 ;
951
+ buf -> output_off = pt -> output_mask >> 32 ;
945
952
/* index of current output region within this table */
946
953
if (!buf -> single )
947
- buf -> cur_idx = (offset & 0xffffff80 ) >> 7 ;
954
+ buf -> cur_idx = (pt -> output_mask & 0xffffff80 ) >> 7 ;
948
955
}
949
956
950
957
static struct topa_entry *
0 commit comments