This is wrong and will fail sometimes.  You are trying to replace code that does a read_va with a translate + read_pa, but the logic isn't the same.  The read_va function handles reading at the virtual address level, even if the data structure doesn't appear on contiguous physical pages.  Since this is an OS-level data structure, this the correct abstraction to use.  Switch to the method you have here violates this abstraction.  And, if it works at all, it is only because you got lucky ;-)