All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Christopherson <sean.j.christopherson@intel.com>
To: contact@kevinloughlin.org
Cc: kvm@vger.kernel.org
Subject: Re: x86 MMU: RMap Interface
Date: Mon, 20 Jul 2020 08:49:01 -0700	[thread overview]
Message-ID: <20200720154901.GB20375@linux.intel.com> (raw)
In-Reply-To: <d49ad8fb155e2ebc6e54d8b83c335926@kevinloughlin.org>

On Sun, Jul 19, 2020 at 06:32:22PM -0400, contact@kevinloughlin.org wrote:
> Hi,
> 
> I'm a bit confused by the interface for interacting with the page rmap. For
> context, on a TDP-enabled x86-64 host, I'm logging each time a GFN->PFN
> mapping is created/modified/removed for a non-MMIO page (kernel version
> 5.4).
> 
> First, my understanding is that the page rmap is a mapping of non-MMIO PFNs
> back to the GFNs that use them. The interface for creating an rmap entry
> (and thus, a new GFN->PFN mapping) appears to be rmap_add() and is quite
> straightforward. However, rmap_remove() does not appear to be the (only)
> function for removing an entry from the page rmap. For instance,
> kvm_zap_rmapp()---used by the mmu_notifier for invalidations---jumps
> straight to pte_list_remove(), while drop_spte() uses rmap_remove().

The rmaps are associated with the memslot, the drop_spte() path allows KVM
to clean up SPTEs without having to guarantee the validity of the memslot
that was used to create the SPTE.

> Would it be fair to say that mmu_spte_clear_track_bits() is found on all
> paths for removing an entry from the page rmap?

Yes, that should hold true.
 
> Second, for updates to the frame numbers in an existing SPTE, there are both
> mmu_set_spte() and mmu_spte_set(). Could someone please clarify the
> difference between these functions?

mmu_set_spte() is the higher level helper that is used during a page fault
or prefetch to convert a host PFN and basic access permissions into a SPTE
value, handle large/huge page interactions and accounting, add the rmap,
etc..., and of course eventually update the SPTE.

mmu_spte_set() is a low level helper that does nothing more than write a
SPTE.  It's just a wrapper to __set_spte() that also WARNs if the old SPTE
is present.

> Finally, much of the logic between the page rmap and parent PTE rmaps
> (understandably) overlaps. However, with TDP-enabled, I'm not entirely sure
> what the role of the parent PTE rmaps is relative to the page rmap. Could
> someone possibly clarify?

KVM needs the backpointers to remove the SPTE for a shadow page, which
exists in the parent shadow page, when the child is zapped, e.g. if a L2 SP
is removed, its SPTE in a L3 SP needs to be updated.

  reply	other threads:[~2020-07-20 16:39 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-19 22:32 x86 MMU: RMap Interface contact
2020-07-20 15:49 ` Sean Christopherson [this message]
2020-08-15 21:08   ` Kevin Loughlin
     [not found]   ` <b7f5d039b4e4b12697ee5e65cf03d25b@kevinloughlin.org>
2020-08-17 16:54     ` Sean Christopherson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200720154901.GB20375@linux.intel.com \
    --to=sean.j.christopherson@intel.com \
    --cc=contact@kevinloughlin.org \
    --cc=kvm@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.