From: Marcelo Tosatti on
On Tue, Jul 13, 2010 at 05:45:27PM +0800, Xiao Guangrong wrote:
> In speculative path, the page is not real write-access, no need mark it
> dirty, so clear dirty bit in this path and later examine this bit when
> we release the page
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong(a)cn.fujitsu.com>
> ---
> arch/x86/kvm/mmu.c | 24 +++++++++++-------------
> 1 files changed, 11 insertions(+), 13 deletions(-)

Unfortunately all pages that kvm creates translations for are marked
dirty due to get_user_pages(w=1), except KSM which makes them read-only
later.


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Marcelo Tosatti on
On Wed, Jul 14, 2010 at 09:24:22AM +0800, Xiao Guangrong wrote:
>
>
> Marcelo Tosatti wrote:
> > On Tue, Jul 13, 2010 at 05:45:27PM +0800, Xiao Guangrong wrote:
> >> In speculative path, the page is not real write-access, no need mark it
> >> dirty, so clear dirty bit in this path and later examine this bit when
> >> we release the page
> >>
> >> Signed-off-by: Xiao Guangrong <xiaoguangrong(a)cn.fujitsu.com>
> >> ---
> >> arch/x86/kvm/mmu.c | 24 +++++++++++-------------
> >> 1 files changed, 11 insertions(+), 13 deletions(-)
> >
> > Unfortunately all pages that kvm creates translations for are marked
> > dirty due to get_user_pages(w=1), except KSM which makes them read-only
> > later.
>
> Marcelo, i have looked into get_user_pages() function, but not catch where
> to make page dirty, could you point it out for me? :-)

See set_page_dirty call in mm/memory.c::follow_page.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Marcelo Tosatti on
On Wed, Jul 14, 2010 at 09:18:58PM +0800, Xiao Guangrong wrote:
>
>
> Marcelo Tosatti wrote:
> > On Wed, Jul 14, 2010 at 09:24:22AM +0800, Xiao Guangrong wrote:
> >>
> >> Marcelo Tosatti wrote:
> >>> On Tue, Jul 13, 2010 at 05:45:27PM +0800, Xiao Guangrong wrote:
> >>>> In speculative path, the page is not real write-access, no need mark it
> >>>> dirty, so clear dirty bit in this path and later examine this bit when
> >>>> we release the page
> >>>>
> >>>> Signed-off-by: Xiao Guangrong <xiaoguangrong(a)cn.fujitsu.com>
> >>>> ---
> >>>> arch/x86/kvm/mmu.c | 24 +++++++++++-------------
> >>>> 1 files changed, 11 insertions(+), 13 deletions(-)
> >>> Unfortunately all pages that kvm creates translations for are marked
> >>> dirty due to get_user_pages(w=1), except KSM which makes them read-only
> >>> later.
> >> Marcelo, i have looked into get_user_pages() function, but not catch where
> >> to make page dirty, could you point it out for me? :-)
> >
> > See set_page_dirty call in mm/memory.c::follow_page.
>
> Yeah, you are right, and i want to use another way to do it since track dirty bit
> is too heavy, also it's dangerous if we miss to set page dirty.
>
> How about just track access bit for speculative path, we set page both accessed and
> dirty(if it's writable) only if the access bit is set?

A useful thing to do would be to allow read-only mappings, in the fault
path (Lai sent a few patches in that direction sometime ago but there
was no follow up).

So in the case of a read-only fault from the guest, you'd inform
get_user_pages() that read-only access is acceptable (so swapcache pages
can be mapped, or qemu can mprotect(PROT_READ) guest memory).

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Marcelo Tosatti on
On Thu, Jul 15, 2010 at 03:44:48PM +0800, Xiao Guangrong wrote:
>
>
> Marcelo Tosatti wrote:
>
> >> How about just track access bit for speculative path, we set page both accessed and
> >> dirty(if it's writable) only if the access bit is set?
> >
> > A useful thing to do would be to allow read-only mappings, in the fault
> > path (Lai sent a few patches in that direction sometime ago but there
> > was no follow up).
> >
> > So in the case of a read-only fault from the guest, you'd inform
> > get_user_pages() that read-only access is acceptable (so swapcache pages
> > can be mapped, or qemu can mprotect(PROT_READ) guest memory).
> >
>
> Yeah, it's a great work, i guess Lai will post the new version soon.
>
> And, even we do this, i think the page dirty track is still needed, right?
> Then, how about my new idea to track page dirty for speculative path, just
> as below draft patch does:
>
> @@ -687,10 +687,11 @@ static void drop_spte(struct kvm *kvm, u64 *sptep, u64 new_spte)
> if (!is_rmap_spte(old_spte))
> return;
> pfn = spte_to_pfn(old_spte);
> - if (old_spte & shadow_accessed_mask)
> + if (old_spte & shadow_accessed_mask) {
> kvm_set_pfn_accessed(pfn);
> - if (is_writable_pte(old_spte))
> - kvm_set_pfn_dirty(pfn);
> + if (is_writable_pte(old_spte))
> + kvm_set_pfn_dirty(pfn);
> + }
> rmap_remove(kvm, sptep);
> }
>
> @@ -1920,8 +1921,11 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
> * demand paging).
> */
> spte = shadow_base_present_pte | shadow_dirty_mask;
> - if (!speculative)
> + if (!speculative) {
> spte |= shadow_accessed_mask;
> + if (is_writable_pte(*sptep))
> + kvm_set_pfn_dirty(pfn);
> + }
> if (!dirty)
> pte_access &= ~ACC_WRITE_MASK;
> if (pte_access & ACC_EXEC_MASK)
>
> It uses access bit to track both page accessed and page dirty, and it's rather cheap...

Xiao,

I don't understand it. What are you trying to achieve?
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/