In current code, shadow page can become asynchronous only if one
shadow page for a gfn, this rule is too strict, in fact, we can
let all last mapping page(i.e, it's the pte page) become unsync
and sync them at invlpg or flush tlb time.
Address this thinking, a gfn may have many shadow pages, for
performance reason, when one sp need be synced, just write
protect sp->gfn and sync this sp but we keep other shadow pages
asynchronous, i.e, sp only can be synced just at their own invlpg
and flush TLB time.
patch 1 ~ 6 are bugfix/cleanup/optimization for current code
patch 7 ~ 10 implement this idea