On Thu, Aug 12, 2021, Paolo Bonzini wrote: > On 12/08/21 19:07, Sean Christopherson wrote: > > Yeah, I was/am on the fence too, I almost included a blurb in the cover letter > > saying as much. I'll do that for v2 and let Paolo decide. > > I think it makes sense to have it. You can even use the ternary operator Hah, yeah, I almost used a ternary op. Honestly don't know why I didn't, guess my brain flipped a coin. > > /* > * When zapping everything, all entries at the top level > * ultimately go away, and the levels below go down with them. > * So do not bother iterating all the way down to the leaves. The subtle part is that try_step_down() won't actually iterate down because it explicitly rereads and rechecks the SPTE. if (iter->level == iter->min_level) return false; /* * Reread the SPTE before stepping down to avoid traversing into page * tables that are no longer linked from this entry. */ iter->old_spte = READ_ONCE(*rcu_dereference(iter->sptep)); \ ---> this is the code that is avoided child_pt = spte_to_child_pt(iter->old_spte, iter->level); / if (!child_pt) return false; My comment wasn't all that accurate either. Maybe this? /* * No need to try to step down in the iterator when zapping all SPTEs, * zapping the top-level non-leaf SPTEs will recurse on their children. */ int min_level = zap_all ? root->role.level : PG_LEVEL_4K; > */ > int min_level = zap_all ? root->role.level : PG_LEVEL_4K; > > Paolo >