kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Maxim Levitsky <mlevitsk@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	 Peter Xu <peterx@redhat.com>
Subject: Re: [PATCH 14/20] KVM: selftests: Collect *all* dirty entries in each dirty_log_test iteration
Date: Wed, 18 Dec 2024 18:13:53 -0800	[thread overview]
Message-ID: <Z2OBYYQq6cwptSws@google.com> (raw)
In-Reply-To: <fb179759bdc224431f6b031eaa9747c1897d296b.camel@redhat.com>

On Tue, Dec 17, 2024, Maxim Levitsky wrote:
> On Fri, 2024-12-13 at 17:07 -0800, Sean Christopherson wrote:
> > Collect all dirty entries during each iteration of dirty_log_test by
> > doing a final collection after the vCPU has been stopped.  To deal with
> > KVM's destructive approach to getting the dirty bitmaps, use a second
> > bitmap for the post-stop collection.
> > 
> > Collecting all entries that were dirtied during an iteration simplifies
> > the verification logic *and* improves test coverage.
> > 
> >   - If a page is written during iteration X, but not seen as dirty until
> >     X+1, the test can get a false pass if the page is also written during
> >     X+1.
> > 
> >   - If a dirty page used a stale value from a previous iteration, the test
> >     would grant a false pass.
> > 
> >   - If a missed dirty log occurs in the last iteration, the test would fail
> >     to detect the issue.
> > 
> > E.g. modifying mark_page_dirty_in_slot() to dirty an unwritten gfn:
> > 
> > 	if (memslot && kvm_slot_dirty_track_enabled(memslot)) {
> > 		unsigned long rel_gfn = gfn - memslot->base_gfn;
> > 		u32 slot = (memslot->as_id << 16) | memslot->id;
> > 
> > 		if (!vcpu->extra_dirty &&
> > 		    gfn_to_memslot(kvm, gfn + 1) == memslot) {
> > 			vcpu->extra_dirty = true;
> > 			mark_page_dirty_in_slot(kvm, memslot, gfn + 1);
> > 		}
> > 		if (kvm->dirty_ring_size && vcpu)
> > 			kvm_dirty_ring_push(vcpu, slot, rel_gfn);
> > 		else if (memslot->dirty_bitmap)
> > 			set_bit_le(rel_gfn, memslot->dirty_bitmap);
> > 	}
> > 
> > isn't detected with the current approach, even with an interval of 1ms
> > (when running nested in a VM; bare metal would be even *less* likely to
> > detect the bug due to the vCPU being able to dirty more memory).  Whereas
> > collecting all dirty entries consistently detects failures with an
> > interval of 700ms or more (the longer interval means a higher probability
> > of an actual write to the prematurely-dirtied page).
> 
> While this patch might improve coverage for this particular case,
> I think that this patch will make the test to be much more deterministic,

The verification will be more deterministic, but the actual testcase itself is
just as random as it was before.

> and thus have less chance of catching various races in the kernel that can happen.
> 
> In fact in my option I prefer moving this test in other direction by
> verifying dirty ring while the *vCPU runs* as well, in other words, not
> stopping the vCPU at all unless its dirty ring is full.

I don't see how letting verification be coincident with the vCPU running is at
all interesting for a dirty logging.  Host userspace reading guest memory while
it's being written by the guest doesn't stress KVM's dirty logging in any meaningful
way.  E.g. it exercises hardware far more than anything else.  If we want to stress
that boundary, then we should spin up another vCPU or host thread to randomly read
while the test is in-progress, and also to write to bytes 4095:8 (assuming a 4KiB
page size), e.g. to ensure that dueling writes to a cacheline that trigger false
sharing are handled correct.

But letting the vCPU-under-test keep changing the memory while it's being validated
would add significant complexity, without any benefit insofar as I can see.  As
evidenced by the bug the current approach can't detect, heavily stressing the
system is meaningless if it's impossible to separate the signal from the noise.

  reply	other threads:[~2024-12-19  2:13 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-14  1:07 [PATCH 00/20] KVM: selftests: Fixes and cleanups for dirty_log_test Sean Christopherson
2024-12-14  1:07 ` [PATCH 01/20] KVM: selftests: Support multiple write retires in dirty_log_test Sean Christopherson
2024-12-14  1:07 ` [PATCH 02/20] KVM: selftests: Sync dirty_log_test iteration to guest *before* resuming Sean Christopherson
2024-12-17 23:58   ` Maxim Levitsky
2024-12-18 21:36     ` Sean Christopherson
2024-12-19 15:11       ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 03/20] KVM: selftests: Drop signal/kick from dirty ring testcase Sean Christopherson
2024-12-14  1:07 ` [PATCH 04/20] KVM: selftests: Drop stale srandom() initialization from dirty_log_test Sean Christopherson
2024-12-17 23:59   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 05/20] KVM: selftests: Precisely track number of dirty/clear pages for each iteration Sean Christopherson
2024-12-17 23:59   ` Maxim Levitsky
2024-12-18 21:37     ` Sean Christopherson
2024-12-14  1:07 ` [PATCH 06/20] KVM: selftests: Read per-page value into local var when verifying dirty_log_test Sean Christopherson
2024-12-17 23:59   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 07/20] KVM: selftests: Continuously reap dirty ring while vCPU is running Sean Christopherson
2024-12-18  0:00   ` Maxim Levitsky
2024-12-19  1:50     ` Sean Christopherson
2024-12-14  1:07 ` [PATCH 08/20] KVM: selftests: Limit dirty_log_test's s390x workaround to s390x Sean Christopherson
2024-12-14  1:07 ` [PATCH 09/20] KVM: selftests: Honor "stop" request in dirty ring test Sean Christopherson
2024-12-18  0:00   ` Maxim Levitsky
2024-12-19  2:00     ` Sean Christopherson
2024-12-19 15:07       ` Maxim Levitsky
2024-12-19 15:23         ` Sean Christopherson
2024-12-19 15:57           ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 10/20] KVM: selftests: Keep dirty_log_test vCPU in guest until it needs to stop Sean Christopherson
2024-12-18  0:01   ` Maxim Levitsky
2024-12-19 15:59     ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 11/20] KVM: selftests: Post to sem_vcpu_stop if and only if vcpu_stop is true Sean Christopherson
2024-12-18  0:01   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 12/20] KVM: selftests: Use continue to handle all "pass" scenarios in dirty_log_test Sean Christopherson
2024-12-18  0:01   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 13/20] KVM: selftests: Print (previous) last_page on dirty page value mismatch Sean Christopherson
2024-12-18  0:01   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 14/20] KVM: selftests: Collect *all* dirty entries in each dirty_log_test iteration Sean Christopherson
2024-12-18  0:02   ` Maxim Levitsky
2024-12-19  2:13     ` Sean Christopherson [this message]
2024-12-19 12:55       ` Paolo Bonzini
2024-12-19 15:01         ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 15/20] KVM: sefltests: Verify value of dirty_log_test last page isn't bogus Sean Christopherson
2024-12-18  0:02   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 16/20] KVM: selftests: Ensure guest writes min number of pages in dirty_log_test Sean Christopherson
2024-12-18  0:02   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 17/20] KVM: selftests: Tighten checks around prev iter's last dirty page in ring Sean Christopherson
2024-12-18  0:03   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 18/20] KVM: selftests: Set per-iteration variables at the start of each iteration Sean Christopherson
2024-12-14  1:07 ` [PATCH 19/20] KVM: selftests: Fix an off-by-one in the number of dirty_log_test iterations Sean Christopherson
2024-12-18  0:03   ` Maxim Levitsky
2024-12-14  1:07 ` [PATCH 20/20] KVM: selftests: Allow running a single iteration of dirty_log_test Sean Christopherson
2024-12-18  0:03   ` Maxim Levitsky

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=Z2OBYYQq6cwptSws@google.com \
    --to=seanjc@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mlevitsk@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).