@@ -594,6 +594,9 @@ def uat_page_mapped(self, iova, pte, ctx=0):
594594 paddr = paddr ,
595595 ctx = ctx )
596596
597+ if ctx == 0 :
598+ self .clear_stats_tracers ()
599+
597600 def event_gpuvm (self , evt , iova , paddr , name = None , base = None , ctx = None ):
598601 off = evt .addr - paddr
599602 iova += off
@@ -1208,6 +1211,33 @@ def add_mon_regions(self):
12081211 self .mon_addva (0 , initdata .unkptr_20 .unkptr_0 , 0x40 , "unkptr_20.unkptr_0" )
12091212 self .mon_addva (0 , initdata .unkptr_20 .unkptr_8 , 0x40 , "unkptr_20.unkptr_8" )
12101213
1214+ def clear_gpuvm_range (self , ctx , iova , length ):
1215+ while length > 0 :
1216+ page = iova & ~ 0x3fff
1217+ off = iova & 0x3fff
1218+ block = min (0x4000 - off , length )
1219+ page &= 0xfffffffffff
1220+ print (f"Clear { ctx } { page :#x} { block :#x} " )
1221+ paddr = self .va_to_pa .get ((ctx , page ), None )
1222+ if paddr :
1223+ print (f" pa { paddr + off :#x} " )
1224+ self .hv .del_tracer (irange (paddr + off , block ), f"GPUVM/{ ctx } " )
1225+ length -= block
1226+ iova += block
1227+
1228+ def clear_stats_tracers (self ):
1229+ if not self .state .initdata :
1230+ return
1231+
1232+ self .clear_gpuvm_range (
1233+ 0 ,
1234+ self .state .initdata .regionB .channels .Stats .state_addr ,
1235+ 0x30 )
1236+ self .clear_gpuvm_range (
1237+ 0 ,
1238+ self .state .initdata .regionB .channels .Stats .ringbuffer_addr ,
1239+ 0x100 * StatsSize )
1240+
12111241 def pong_init (self , addr ):
12121242 self .log ("UAT at init time:" )
12131243 self .uat .invalidate_cache ()
@@ -1219,6 +1249,7 @@ def pong_init(self, addr):
12191249 self .log (initdata )
12201250
12211251 self .add_mon_regions ()
1252+ self .clear_stats_tracers ()
12221253
12231254 #self.initdata.regionB.mon(lambda addr, size, name: self.mon_addva(0, addr, size, name))
12241255
0 commit comments