digraph gph { /* Guest state changes on resident pages */ Ur -> Sr [ label="set stable" ]; Ur -> Vr [ label="set volatile\n(w=0)" ]; Ur -> Pr [ label="set volatile\n(w=1)" ]; Sr -> Ur [ label="set unused" ]; Sr -> Vr [ label="set volatile\n(w=0)" ]; Sr -> Pr [ label="set volatile\n(w=1)" ]; Vr -> Sr [ label="set stable(_if_present)" ]; Vr -> Ur [ label="set unused" ]; Vr -> Pr [ label="set volatile\n(w=1)" ]; Pr -> Sr [ label="set stable(_if_present)" ]; Pr -> Vr [ label="set volatile\n(w=0)" ]; Pr -> Ur [ label="set unused" ]; /* Guest state changes on zero pages */ Uz -> Sz [ label="set stable" ]; Uz -> Vz [ label="set volatile" ]; Sz -> Vz [ label="set volatile" ]; Sz -> Uz [ label="set unused" ]; Vz -> Sz [ label="set stable" ]; Vz -> Uz [ label="set unused" ]; /* Guest state changes on host-swapped pages */ Sp -> Uz [ label="set unused" ]; Sp -> Vz [ label="set volatile" ]; /* Guest touches pages */ Sz -> Sr [ label="guest write" ]; Sp -> Sr [ label="guest access" ]; Vz -> Vr [ label="guest write" ]; /* Host actions */ Sr -> Sp [ label="host swap", style=dashed ]; Ur -> Uz [ label="host discard", style=dashed ]; Vr -> Vz [ label="host discard", style=dashed ]; Pr -> Sp [ label="host discard\n(dirty)", style=dashed ]; Pr -> Vz [ label="host discard\n(clean)", style=dashed ]; }