From patchwork Sat Jan 11 00:29:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935639 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1CED8479 for ; Sat, 11 Jan 2025 00:30:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555413; cv=none; b=TWVp3jC+X1vGgrxg86KR9x7BWk3WY9F+ayZMyXtqPBwu4AruICDHCkhU44WzFhh5E0SShQI1aUL33hisXP7y++IEB33MFv7oHwSLUzQQh94zUhUUaatPBopKufIuIGG5RIgY2ycp7UxzA5b2KwPK1cSYis1ODLB2cxQn57nxVtg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555413; c=relaxed/simple; bh=cSnwUK/2rXGD+rrAuQ2cWaSYdAoHz1OuzoU7A8Ugyzw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mZvlSN/z5mCKscRcaVStjpKDNPhCL7530JrIjPWkF3OZB8r4+jkGg3MxxcWJQwRwXHa6qn4c05tzoRKsA/33mM+1ADRAeKT387tqQidssmVEo3v67weBrNzITv0qLz+cTrEH1lvsf9kJfUqroKCc4l43CXP523pHKnOYazOdbqQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fQ/mviTB; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fQ/mviTB" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ef9204f898so4595298a91.2 for ; Fri, 10 Jan 2025 16:30:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555411; x=1737160211; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=FDkeem6MqewIEXRWoJcJJSDt8+RewhtQwmeUHyoVvwQ=; b=fQ/mviTB+vc0gMRH8aZt7HJpEhBjxP3GqCHJtTA/E1bNwa61Gkum1Xkix5M0VRenYK fHIyoqb29IXLZzpUcxEUYU8rQwC/jdxsprtwRjJipQUibJoCLudZOPpBl4n4oaEaGXn9 LwBWZo6rp6kkHtgfEoAYoYwHmkasZjZ/sV2FO3PmDIylZH3xcqr0WJo21kVTandEMb2j 3RqOzUID1Hqg9SH3tK1DMaKKwW12nX7XZs00PFN6l74gA3pEln9aUTK8DPvElL1uRHpa YEidLcjS1I89kHXXn9Ekvy9gwNpwRAljkXwj3BOWOxF9oo5i+wxbpW4206e85y5aY6e+ ClZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555411; x=1737160211; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=FDkeem6MqewIEXRWoJcJJSDt8+RewhtQwmeUHyoVvwQ=; b=hfmbbvZkZxGiTUodPDJI18KVzhpzHahlyyaqs/A0uqalTiARmnZl8CA85Bz9QD4UBz HMX5LwyA5Ej0fqYbHubQf+6gA6wbN1tZfmYTaTOFyO2WfEkQrqrOM8H76uZu5p/XrNr7 xED/Pc1K0Z3CltXY/p4GonzUZ6eybrEgKzVLmq5BgUFdylPZIEdZzwqpkJgNvdWhgBrO 8W6AsSPa2zMQd7AvgDCbD0Nlqcx00JesrINBxgBFUM8amkethTigTMSplbb98gDmBUml auwHgOlGTBoCtvIFPYn0qgYHnf/Ofe4syDBnoCE37YDv15HkKGOuRBqIe01wIm7J6WVk TdLA== X-Gm-Message-State: AOJu0YwI5THW0i4maZdVjC8i4B3XRFRtAgb/SqL8uMETZFMhPNX4jv0F 6mzU4u8fndDVGL9PaJI2l+nt4AOI4OcBumLBpRdS8UXaDQ7A5bvwBIKL2PURaqXA6MTf3uM1bMG SaA== X-Google-Smtp-Source: AGHT+IFl9e/CO6aIFQMtlWws0maKnM0IkLVkQ0R6MTG560dWJ3PE9b2Z/S4xdE96ZH1JQkGfgqN+ePxlgQQ= X-Received: from pjbqi8.prod.google.com ([2002:a17:90b:2748:b0:2d8:8d32:2ea3]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5487:b0:2ee:f80c:688d with SMTP id 98e67ed59e1d1-2f5490bd537mr18660616a91.25.1736555411003; Fri, 10 Jan 2025 16:30:11 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:45 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-2-seanjc@google.com> Subject: [PATCH v2 01/20] KVM: selftests: Support multiple write retires in dirty_log_test From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson From: Maxim Levitsky If dirty_log_test is run nested, it is possible for entries in the emulated PML log to appear before the actual memory write is committed to the RAM, due to the way KVM retries memory writes as a response to a MMU fault. In addition to that in some very rare cases retry can happen more than once, which will lead to the test failure because once the write is finally committed it may have a very outdated iteration value. Detect and avoid this case. Cc: Peter Xu Signed-off-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 52 +++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index aacf80f57439..cdae103314fc 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -152,6 +152,7 @@ static atomic_t vcpu_sync_stop_requested; * sem_vcpu_stop and before vcpu continues to run. */ static bool dirty_ring_vcpu_ring_full; + /* * This is only used for verifying the dirty pages. Dirty ring has a very * tricky case when the ring just got full, kvm will do userspace exit due to @@ -166,7 +167,51 @@ static bool dirty_ring_vcpu_ring_full; * dirty gfn we've collected, so that if a mismatch of data found later in the * verifying process, we let it pass. */ -static uint64_t dirty_ring_last_page; +static uint64_t dirty_ring_last_page = -1ULL; + +/* + * In addition to the above, it is possible (especially if this + * test is run nested) for the above scenario to repeat multiple times: + * + * The following can happen: + * + * - L1 vCPU: Memory write is logged to PML but not committed. + * + * - L1 test thread: Ignores the write because its last dirty ring entry + * Resets the dirty ring which: + * - Resets the A/D bits in EPT + * - Issues tlb flush (invept), which is intercepted by L0 + * + * - L0: frees the whole nested ept mmu root as the response to invept, + * and thus ensures that when memory write is retried, it will fault again + * + * - L1 vCPU: Same memory write is logged to the PML but not committed again. + * + * - L1 test thread: Ignores the write because its last dirty ring entry (again) + * Resets the dirty ring which: + * - Resets the A/D bits in EPT (again) + * - Issues tlb flush (again) which is intercepted by L0 + * + * ... + * + * N times + * + * - L1 vCPU: Memory write is logged in the PML and then committed. + * Lots of other memory writes are logged and committed. + * ... + * + * - L1 test thread: Sees the memory write along with other memory writes + * in the dirty ring, and since the write is usually not + * the last entry in the dirty-ring and has a very outdated + * iteration, the test fails. + * + * + * Note that this is only possible when the write was the last log entry + * write during iteration N-1, thus remember last iteration last log entry + * and also don't fail when it is reported in the next iteration, together with + * an outdated iteration count. + */ +static uint64_t dirty_ring_prev_iteration_last_page; enum log_mode_t { /* Only use KVM_GET_DIRTY_LOG for logging */ @@ -316,6 +361,8 @@ static uint32_t dirty_ring_collect_one(struct kvm_dirty_gfn *dirty_gfns, struct kvm_dirty_gfn *cur; uint32_t count = 0; + dirty_ring_prev_iteration_last_page = dirty_ring_last_page; + while (true) { cur = &dirty_gfns[*fetch_index % test_dirty_ring_count]; if (!dirty_gfn_is_dirtied(cur)) @@ -613,7 +660,8 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) */ min_iter = iteration - 1; continue; - } else if (page == dirty_ring_last_page) { + } else if (page == dirty_ring_last_page || + page == dirty_ring_prev_iteration_last_page) { /* * Please refer to comments in * dirty_ring_last_page. From patchwork Sat Jan 11 00:29:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935640 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5156E4C80 for ; Sat, 11 Jan 2025 00:30:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555415; cv=none; b=bButzvuzJvJRG1y2WsWc3AE5r6MAFSUZNtt8QrVRT1r+binqM6AdrduGmEw1ttU/6fDt7EJCVpormbDB8Emao4fmd77NQVY146BUs6HSIKDJxbZAf43xOPV7pzr7Ua+y4CkY8VgjwhQ7BNJA4ct2brJuwClVtPS1EJGFm8g5DTQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555415; c=relaxed/simple; bh=kRFkQPfv0PSWUJLw1F058m2xO/VHwn24jbFbfVNRITs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=I4BeYuxAD1B8dodYth8RNHJmUBxQ81R2/hwmZO0m/vw4sohqrUx4yiU8OaFh5zElBl6mchvjb9bW7fN8MHIwbphe7ci9PrLHtpcYWDlJcjtjPfvc5hrrZmimM85HmGpuUErmMZQcERgrzRCbSdfZ/EYryrcdfj3Z5xyKtmLFR1o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=It68Rp+y; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="It68Rp+y" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-21650d4612eso66016655ad.2 for ; Fri, 10 Jan 2025 16:30:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555412; x=1737160212; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=a/SsNBrmeOL+XTcAujo8LRjEscp+rd5UoAKZNA95NGM=; b=It68Rp+yDxu/7/kCZev2rO9STwcX/eyBzG8h1wBr5LUlJyveZCnfc+3yXrTRolMLzA BRMLXWamNICP1lGr1OEDX/iO29/RM2A9n1AX1BgxJy7agZxWEjmbzt+n9kcFGKpxlByS pSP3WqHy1TqmIFum1I0hbBjLfBbq0xBiV1Kx7ZMgMtihuqHbl5Tm/2lvWNZw4gt2gE96 p4+wsiaEC0eiSFfFFY/1Tpj9sbPu7Pkh4IkhSW/ASf02BV2sSXIK5P2VjmgFvqHP1QWF ZWLBDYz9D8OFTdYfMedm3CZ+DD8qpXF8uB+j1U2ONuowsCozxfIKE+vneWhUEqGa1lio tfRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555412; x=1737160212; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=a/SsNBrmeOL+XTcAujo8LRjEscp+rd5UoAKZNA95NGM=; b=u0jYCGCGbAk+OMlawtElvxlK3owie1o4cJ6uJn6qn0lgWWzxEi4NXDIGabMs958qcG YePa7GPk5xtACdIVNoM/us12FewspUSJIWozqydEOoqdFpTEN57o1ZCzQUX7N9U5bsHJ sgMpNTgT+UbQX9y6O5s/ASk/qqQJhRZ1/o+pu/5CoyNz2eQjurNWKzF2fj1Rcn5C2YVg 0/C2MzyGX6pfMuFQB0OB3McePT6x1Jely8K9T0zKHPEr3ujD7g+2MgAA+oyah5wb7QOc Ki62rOqDO7q9a+6XjBCyJ7xf2EvJedp9+0TYeXCPY2X36IITHwPr8WV52Gj/W6ppKwvs F9Cw== X-Gm-Message-State: AOJu0Ywe54jLTF/2fZtp25SOjJ4+SeKlDsm/KuJDDzT9PNgaEu32n1oQ CivhmrcbWKQzIiPHfeYs87mHIaLrLHSyFY+BIyDrsnxZnm3gL+cJpkoQx/bp8ErCwDvTZd/LQnx cmw== X-Google-Smtp-Source: AGHT+IER8rVpMyBVqwsOrLxxaVqakEwToEI3FXRKOmF6JTF9kogaGHv2F8pSmh3aP9HQjsY+vFg7meksq5s= X-Received: from pgwc7.prod.google.com ([2002:a65:66c7:0:b0:7fd:5164:d918]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f644:b0:215:b9a7:526d with SMTP id d9443c01a7336-21a83fa210cmr212852135ad.32.1736555412578; Fri, 10 Jan 2025 16:30:12 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:46 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-3-seanjc@google.com> Subject: [PATCH v2 02/20] KVM: selftests: Sync dirty_log_test iteration to guest *before* resuming From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Sync the new iteration to the guest prior to restarting the vCPU, otherwise it's possible for the vCPU to dirty memory for the next iteration using the current iteration's value. Note, because the guest can be interrupted between the vCPU's load of the iteration and its write to memory, it's still possible for the guest to store the previous iteration to memory as the previous iteration may be cached in a CPU register (which the test accounts for). Note #2, the test's current approach of collecting dirty entries *before* stopping the vCPU also results dirty memory having the previous iteration. E.g. if page is dirtied in the previous iteration, but not the current iteration, the verification phase will observe the previous iteration's value in memory. That wart will be remedied in the near future, at which point synchronizing the iteration before restarting the vCPU will guarantee the only way for verification to observe stale iterations is due to the CPU register caching case, or due to a dirty entry being collected before the store retires. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index cdae103314fc..41c158cf5444 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -859,9 +859,9 @@ static void run_test(enum vm_guest_mode mode, void *arg) */ if (++iteration == p->iterations) WRITE_ONCE(host_quit, true); - - sem_post(&sem_vcpu_cont); sync_global_to_guest(vm, iteration); + + sem_post(&sem_vcpu_cont); } pthread_join(vcpu_thread, NULL); From patchwork Sat Jan 11 00:29:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935641 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 199A479D2 for ; Sat, 11 Jan 2025 00:30:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555417; cv=none; b=OTWLqydPHNnuq2MksCy4+cmj2Zyj7GOwH4MopOZUBh3GBSew+60y508mEm8ZvKq1uXfD2gE9NLrFhTyrF1q7hHVmgDx9EYPmsVnTblomsvyd8zaJPuR3IZBJh59rMEx0BWg01lTFCIWMrOavTvEnP1ZGtDNAEzAZ3VSQsegQCVw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555417; c=relaxed/simple; bh=VpeIAx4HgBrBdjrulL38P4sjULv3zDVf3Ct1h85Wlb0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=fSWS2vWJOzmXrjtQ6NaNwvcA/YX+yfePlj/Iu325WHIM48DPCiB7MLDx+wv5gSvMmrazL7Vt+EcBThPqUN7kMdSr04LbMp93odLi8mRjX+CXC4i7NwyDSUmdCpyzdYl19RdCyGXLFd7SANSkqwNtudm1wdI4vtKSirHFUEmpAYU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=tz8G89RD; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="tz8G89RD" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2f2a9f056a8so4800141a91.2 for ; Fri, 10 Jan 2025 16:30:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555414; x=1737160214; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=CWJNZezGcooW6XpZeQGEoIGegjFgZChrjwFhXc5Ge/w=; b=tz8G89RDGZ33CBYlpoNj0f5dUsKTYaW3dnwe5Mc3WcAMzZxVQcIHDFnHoLkE168ZDl H0nmGnBh1dBnPX80+D7WAxzsCnkljFj+U1QwDVUJfKMV3pz43SInuLQlajPFT1L22k1o wbisF7Y22dQEtbhj8RBqVAJo7XzopBQ4GpN04rH5cbIFOWYNV/l1glklt3F0O5E5o1jf Etg+omJEeu3bzd0txtgMtlvyxJh5cru1+ZYzs5X85NO2QjDue19nFNSd7Typdi+BG84E 1iT6WAXnIEfXIn6ygCvzUAmuyxIdTEADqJruky9OJqhgdPaXRS3zHEjSv1Cf1NamBesG 5tYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555414; x=1737160214; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=CWJNZezGcooW6XpZeQGEoIGegjFgZChrjwFhXc5Ge/w=; b=jFK6k8Jn2+ZeUYCD/LMdGcRxZSg5WSpvPzF+tw1zghlAopHUa2d83+olOFUFUiwCEt 5zDrC46mRRUEWQPsdtpnNOswn/W82cnuLt4ifyBPyi3HeEzf1s/8+oBftauv045Jh/QU lsl8Yx8UDJw9uA3IBhxdaPT3NYsARcnAauExA29vpYO372+Zhcj9yVeLjGXaYi3UuJqe e3JBu4EJdGkH7yCqo3A5DVZucYCPFfLqgoL2v4DTy70sxvFxjuTIOa+LFNFMMVqwVGnD dilam6V4MjSAiX9IdY2/ohLi6TyPDw0/pRuc6yxOO0QfSUYFa2YWXqEJ6vtQ6YAXtR5s Tjzw== X-Gm-Message-State: AOJu0YxF7yKFG7KcAAdlBsDfbww372Ln/kBpyG6vfCb8QTkMGy00zQKA ORBrDPZGNiIpFePdhHUVRyoJjJz8TmaXQTC7RtzrKtN59xaIYDOwsHRMIR17t1gQqBwbLWdWkmJ EzQ== X-Google-Smtp-Source: AGHT+IGbAKPfzmJX4632s4dXZRLNCWhesSvipTL7gmk5Cn1vyQsk7QDvUwvy1wSu/11M+W3IJ3hHD7SP1As= X-Received: from pfbgq35.prod.google.com ([2002:a05:6a00:3be3:b0:725:cd3b:326c]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:398b:b0:727:d55e:4be3 with SMTP id d2e1a72fcca58-72d21f315c4mr17757050b3a.7.1736555414278; Fri, 10 Jan 2025 16:30:14 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:47 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-4-seanjc@google.com> Subject: [PATCH v2 03/20] KVM: selftests: Drop signal/kick from dirty ring testcase From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Drop the signal/kick from dirty_log_test's dirty ring handling, as kicking the vCPU adds marginal value, at the cost of adding significant complexity to the test. Asynchronously interrupting the vCPU isn't novel; unless the kernel is fully tickless, the vCPU will be interrupted by IRQs for any decently large interval. And exiting to userspace mode in the middle of a sequence isn't novel either, as the vCPU will do so every time the ring becomes full. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 106 +++---------------- 1 file changed, 15 insertions(+), 91 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 41c158cf5444..d9911e20337f 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -236,24 +236,6 @@ static enum log_mode_t host_log_mode; static pthread_t vcpu_thread; static uint32_t test_dirty_ring_count = TEST_DIRTY_RING_COUNT; -static void vcpu_kick(void) -{ - pthread_kill(vcpu_thread, SIG_IPI); -} - -/* - * In our test we do signal tricks, let's use a better version of - * sem_wait to avoid signal interrupts - */ -static void sem_wait_until(sem_t *sem) -{ - int ret; - - do - ret = sem_wait(sem); - while (ret == -1 && errno == EINTR); -} - static bool clear_log_supported(void) { return kvm_has_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2); @@ -292,17 +274,14 @@ static void vcpu_handle_sync_stop(void) /* It means main thread is sleeping waiting */ atomic_set(&vcpu_sync_stop_requested, false); sem_post(&sem_vcpu_stop); - sem_wait_until(&sem_vcpu_cont); + sem_wait(&sem_vcpu_cont); } } -static void default_after_vcpu_run(struct kvm_vcpu *vcpu, int ret, int err) +static void default_after_vcpu_run(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - TEST_ASSERT(ret == 0 || (ret == -1 && err == EINTR), - "vcpu run failed: errno=%d", err); - TEST_ASSERT(get_ucall(vcpu, NULL) == UCALL_SYNC, "Invalid guest sync status: exit_reason=%s", exit_reason_str(run->exit_reason)); @@ -371,7 +350,6 @@ static uint32_t dirty_ring_collect_one(struct kvm_dirty_gfn *dirty_gfns, "%u != %u", cur->slot, slot); TEST_ASSERT(cur->offset < num_pages, "Offset overflow: " "0x%llx >= 0x%x", cur->offset, num_pages); - //pr_info("fetch 0x%x page %llu\n", *fetch_index, cur->offset); __set_bit_le(cur->offset, bitmap); dirty_ring_last_page = cur->offset; dirty_gfn_set_collected(cur); @@ -382,13 +360,6 @@ static uint32_t dirty_ring_collect_one(struct kvm_dirty_gfn *dirty_gfns, return count; } -static void dirty_ring_wait_vcpu(void) -{ - /* This makes sure that hardware PML cache flushed */ - vcpu_kick(); - sem_wait_until(&sem_vcpu_stop); -} - static void dirty_ring_continue_vcpu(void) { pr_info("Notifying vcpu to continue\n"); @@ -400,18 +371,6 @@ static void dirty_ring_collect_dirty_pages(struct kvm_vcpu *vcpu, int slot, uint32_t *ring_buf_idx) { uint32_t count = 0, cleared; - bool continued_vcpu = false; - - dirty_ring_wait_vcpu(); - - if (!dirty_ring_vcpu_ring_full) { - /* - * This is not a ring-full event, it's safe to allow - * vcpu to continue - */ - dirty_ring_continue_vcpu(); - continued_vcpu = true; - } /* Only have one vcpu */ count = dirty_ring_collect_one(vcpu_map_dirty_ring(vcpu), @@ -427,16 +386,13 @@ static void dirty_ring_collect_dirty_pages(struct kvm_vcpu *vcpu, int slot, TEST_ASSERT(cleared == count, "Reset dirty pages (%u) mismatch " "with collected (%u)", cleared, count); - if (!continued_vcpu) { - TEST_ASSERT(dirty_ring_vcpu_ring_full, - "Didn't continue vcpu even without ring full"); + if (READ_ONCE(dirty_ring_vcpu_ring_full)) dirty_ring_continue_vcpu(); - } pr_info("Iteration %ld collected %u pages\n", iteration, count); } -static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu, int ret, int err) +static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; @@ -444,17 +400,14 @@ static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu, int ret, int err) if (get_ucall(vcpu, NULL) == UCALL_SYNC) { /* We should allow this to continue */ ; - } else if (run->exit_reason == KVM_EXIT_DIRTY_RING_FULL || - (ret == -1 && err == EINTR)) { + } else if (run->exit_reason == KVM_EXIT_DIRTY_RING_FULL) { /* Update the flag first before pause */ - WRITE_ONCE(dirty_ring_vcpu_ring_full, - run->exit_reason == KVM_EXIT_DIRTY_RING_FULL); + WRITE_ONCE(dirty_ring_vcpu_ring_full, true); sem_post(&sem_vcpu_stop); - pr_info("vcpu stops because %s...\n", - dirty_ring_vcpu_ring_full ? - "dirty ring is full" : "vcpu is kicked out"); - sem_wait_until(&sem_vcpu_cont); + pr_info("Dirty ring full, waiting for it to be collected\n"); + sem_wait(&sem_vcpu_cont); pr_info("vcpu continues now.\n"); + WRITE_ONCE(dirty_ring_vcpu_ring_full, false); } else { TEST_ASSERT(false, "Invalid guest sync status: " "exit_reason=%s", @@ -473,7 +426,7 @@ struct log_mode { void *bitmap, uint32_t num_pages, uint32_t *ring_buf_idx); /* Hook to call when after each vcpu run */ - void (*after_vcpu_run)(struct kvm_vcpu *vcpu, int ret, int err); + void (*after_vcpu_run)(struct kvm_vcpu *vcpu); } log_modes[LOG_MODE_NUM] = { { .name = "dirty-log", @@ -544,47 +497,24 @@ static void log_mode_collect_dirty_pages(struct kvm_vcpu *vcpu, int slot, mode->collect_dirty_pages(vcpu, slot, bitmap, num_pages, ring_buf_idx); } -static void log_mode_after_vcpu_run(struct kvm_vcpu *vcpu, int ret, int err) +static void log_mode_after_vcpu_run(struct kvm_vcpu *vcpu) { struct log_mode *mode = &log_modes[host_log_mode]; if (mode->after_vcpu_run) - mode->after_vcpu_run(vcpu, ret, err); + mode->after_vcpu_run(vcpu); } static void *vcpu_worker(void *data) { - int ret; struct kvm_vcpu *vcpu = data; uint64_t pages_count = 0; - struct kvm_signal_mask *sigmask = alloca(offsetof(struct kvm_signal_mask, sigset) - + sizeof(sigset_t)); - sigset_t *sigset = (sigset_t *) &sigmask->sigset; - - /* - * SIG_IPI is unblocked atomically while in KVM_RUN. It causes the - * ioctl to return with -EINTR, but it is still pending and we need - * to accept it with the sigwait. - */ - sigmask->len = 8; - pthread_sigmask(0, NULL, sigset); - sigdelset(sigset, SIG_IPI); - vcpu_ioctl(vcpu, KVM_SET_SIGNAL_MASK, sigmask); - - sigemptyset(sigset); - sigaddset(sigset, SIG_IPI); while (!READ_ONCE(host_quit)) { - /* Clear any existing kick signals */ pages_count += TEST_PAGES_PER_LOOP; /* Let the guest dirty the random pages */ - ret = __vcpu_run(vcpu); - if (ret == -1 && errno == EINTR) { - int sig = -1; - sigwait(sigset, &sig); - assert(sig == SIG_IPI); - } - log_mode_after_vcpu_run(vcpu, ret, errno); + vcpu_run(vcpu); + log_mode_after_vcpu_run(vcpu); } pr_info("Dirtied %"PRIu64" pages\n", pages_count); @@ -838,7 +768,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) * we need to stop vcpu when verify data. */ atomic_set(&vcpu_sync_stop_requested, true); - sem_wait_until(&sem_vcpu_stop); + sem_wait(&sem_vcpu_stop); /* * NOTE: for dirty ring, it's possible that we didn't stop at * GUEST_SYNC but instead we stopped because ring is full; @@ -905,7 +835,6 @@ int main(int argc, char *argv[]) .interval = TEST_HOST_LOOP_INTERVAL, }; int opt, i; - sigset_t sigset; sem_init(&sem_vcpu_stop, 0, 0); sem_init(&sem_vcpu_cont, 0, 0); @@ -964,11 +893,6 @@ int main(int argc, char *argv[]) srandom(time(0)); - /* Ensure that vCPU threads start with SIG_IPI blocked. */ - sigemptyset(&sigset); - sigaddset(&sigset, SIG_IPI); - pthread_sigmask(SIG_BLOCK, &sigset, NULL); - if (host_log_mode_option == LOG_MODE_ALL) { /* Run each log mode */ for (i = 0; i < LOG_MODE_NUM; i++) { From patchwork Sat Jan 11 00:29:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935642 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7515624B240 for ; Sat, 11 Jan 2025 00:30:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555418; cv=none; b=tUN4Otkl23L4V6CRgBR+AxckMu8wyN6pA9OI1sFjX1QVJzt2FBT5P1fpE8cy5ADfJ9rlpD7fYK4DmpGGjMw40bAx5Wz2JIogwdWjKcd5BaaQzmIYctv1pMGRCMVMJAo63ny2UVCkPeb8NdsKFcsEtZgOEyhky0pKdEQnGeOWCs0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555418; c=relaxed/simple; bh=tjFdMjX6lyJjTAWqK8reLPzxs+8rAonFk59izniqoqg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=MdU20Qb0eYsWETJr0vIj4hc7tkCoxK5zxCYILUwJ9wstQZzJjNsvMlJ9Nhg58gc2lOYPvqDyxIrmRanHsKhaA5wlinP22nLOgCmiQNl3KRT4M8nSLfGjpAOVqy8+yCNG87Ux3LTcOwjhCHgI7WUdF/yp7rXpdiyiHeRAVtalmWI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=HpU5pn3a; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="HpU5pn3a" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2178115051dso47781165ad.1 for ; Fri, 10 Jan 2025 16:30:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555416; x=1737160216; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=os8abNvX6CFnZNFiWQWTmtZN80dTM1n/70vxr9R8AE8=; b=HpU5pn3aq3CgikCbov7EboM8CLqyopxxBWCSS4foGLz8QaxeAyN5TaXOL83UpEsfZV 4X4sb5Atskb3kI866/S8gWGPDCeu6C7pQ7y1OrTNPWphqABe/RK3aEjmWEw186vwJGt3 7PW12F/4yiV41ezADDvm4fK6wdnpsOpiZmTp7BL0EPdfEdpOsFUkSNI8R6JrWhHfVH1I CMaI4WT4aB7vbliAYSiv8/gdejfqu+RPipN4rXT7Zjqx58XPefsJbW7xSHp0GomKKIgS XIvSpTODYwJiH4q+1+slBrtmoTzgOwU3mxrRM5yncwO0TvhG7TbbMIX8+3jubsGQSB/2 SiJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555416; x=1737160216; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=os8abNvX6CFnZNFiWQWTmtZN80dTM1n/70vxr9R8AE8=; b=fMX82K/pnTwRhKFUL6rAB0AwYQ/PYC5xO/ZCIuk40HFajmye1ciKdihFR/C5eAI7nF n9QP5Chf4xagmpuQWfUsumidbv9pmWhXXatO+4/uI3mOHsS5mAJKmhPyzUPRJ/W4CqNT iSgPbVA67+80SDhYRFeOTJp7BcjyHL6sFr5dqyIpwT8m9NRNPegDyuO8TnfcFah2llTv 43om7LMkDo1jbn8BSiU24WG3IHcDlh5IRPshahABLcx6xdbNfp2jE3wHbXjmg0ctDSrc vjKkKgekiN704oaoLwSIW0D1Z5uVwTjJMcmex+fAESKNl0XsAf9lOHTMf1KGRsZlZUm7 qJmQ== X-Gm-Message-State: AOJu0Yx4tcJ33WwSyDKeKGkAY8hyAez4fQbBc8S+QQYFi/pED0CbJPbX /ydUMLwezBFIkpNw1/MekRwp4j57Y8MTiJUpjyXYTeS5L9XtF2u/BRoF3xgSQgXy86N/DAg7llf DAA== X-Google-Smtp-Source: AGHT+IF9IWwdflYzR8M2xWZC7N/dYo31gRYsrweOMeidToMTdrclC2+399p202NcxYC9UauowCG/8v7eQkw= X-Received: from pgmm4.prod.google.com ([2002:a05:6a02:5504:b0:7fd:4497:f282]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:3996:b0:1db:d738:f2ff with SMTP id adf61e73a8af0-1e88cf7f75dmr21580604637.2.1736555415847; Fri, 10 Jan 2025 16:30:15 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:48 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-5-seanjc@google.com> Subject: [PATCH v2 04/20] KVM: selftests: Drop stale srandom() initialization from dirty_log_test From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Drop an srandom() initialization that was leftover from the conversion to use selftests' guest_random_xxx() APIs. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index d9911e20337f..55a744373c80 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -891,8 +891,6 @@ int main(int argc, char *argv[]) pr_info("Test iterations: %"PRIu64", interval: %"PRIu64" (ms)\n", p.iterations, p.interval); - srandom(time(0)); - if (host_log_mode_option == LOG_MODE_ALL) { /* Run each log mode */ for (i = 0; i < LOG_MODE_NUM; i++) { From patchwork Sat Jan 11 00:29:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935643 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0BA4DBE65 for ; Sat, 11 Jan 2025 00:30:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555419; cv=none; b=EMZ3uSY4ZrQKa0eqsZlmUGYArt7t10dJHy2VSyWkhrVhqWJ4wI4P6aGh0yzT/KM3mTIjr4w48qXBtsIKrjARULuDP4JolzgiwFNVhhyXMWSBCH+hMhcFxQrNfZGNWcN4XuljizoejqQOEywZSa0GuM35xbIENbHJuOHKlx7ZV0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555419; c=relaxed/simple; bh=ClODUFGrnkeK47VHzL8EGhn6t9shMEOwc3unT1VlQVE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=nOy1PKIGQtALC5hdjBjBTIETmRBoyAUmcTHxgXVsGG/j8/7ZeLUlxkT/4eT2uM+/8iZS+nzUN5bggIcC2AtBNJiJn6OSJNfuIKBCV3uIz58BlDFWcJQqixWj4aez0Km70Advep0ldvOAMLua/vH4tegU+Wv1YDVyWkws5IW8lRI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=XjkINmoL; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="XjkINmoL" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2eebfd6d065so6668781a91.3 for ; Fri, 10 Jan 2025 16:30:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555417; x=1737160217; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=lND6mfK1KolGbB6fWPNpX/ljO5ryDlTwA1yXgkJjBtY=; b=XjkINmoLRu+VePp0vMNMhwi1YJKZanuuo9OwUHrDvQk5kBN8PlYWy9jXMkwo1hmH2z SW0MbPVU3yyzvi+WHqHm09Coch9U9WNg8A5wGABYg14eNKIQubm7LXEHAFrNvREOxLyy H7wSCsAgfcT6OWGPh3E87AvF2itRAgRb7937TvIBNyI8XW/nypvC4RqhGb6lxkkYgDyZ CIyF5r4ljXupE1OcvOZ+nweB9yKyg0v5r+sXLIkPr9EAekeLmKeO1quoe6j8Uin4F7+T HWBQ/8pqKuIAc6WTP5KU39IwO6cj1hyLKH6WU9ZOUF7ojHxtzipsjdyFHkpQ2+UG2N+b W7iQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555417; x=1737160217; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lND6mfK1KolGbB6fWPNpX/ljO5ryDlTwA1yXgkJjBtY=; b=JAw/ZZEXWi/pn+E44G0+/+FVbxaowG4HnU1SlWtAxKktxaB/UmYUVXbrHbn0zUXikz F5NN8Koq1YO0YsM9kpJ+o1s0W+iq6jNCufESfGB7k/MBcyM78FusSWEypZo7+urfhSE6 l91ib8GxxwAauN0sE94nR1a7jKR/KA9fAti/nHUVtNheYOTuHBByrrucr3urFMTHE8Cm 4T6xuAekhJq0CWc4vzoYTkErifcFNXXtSQ3BuBPeNxfFiCYxeRDSdf1bLjKuxZHfzv6P opwBD45KhgyMdUd8ByP/dQmci3MfFeef0YA/IUxDi/qoPr71Un2Kd59GmyVopYvQSwxG +hpw== X-Gm-Message-State: AOJu0YxOh2MksfoFbubHQm4nt9NFhuFl6DmgQj6cRv7lnGW4uxKQcUyj ygqoqN/ImUyoJTBqJyCFrb5AEdeCiKf8Yx9zgslKUa3lZ+zmmEMgIqcyQtzoRl0EWwRJmIBE3Mt jsA== X-Google-Smtp-Source: AGHT+IHNg8o7uKSRq8i9WX+D0OybaQRuZsnIXdWPpm+yNQBkTw0cagzp8N5KhO48THrkFIPMDIb2kmggOrc= X-Received: from pjuw3.prod.google.com ([2002:a17:90a:d603:b0:2ea:9d23:79a0]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:274b:b0:2ee:8427:4b02 with SMTP id 98e67ed59e1d1-2f548f5f941mr17976244a91.28.1736555417474; Fri, 10 Jan 2025 16:30:17 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:49 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-6-seanjc@google.com> Subject: [PATCH v2 05/20] KVM: selftests: Precisely track number of dirty/clear pages for each iteration From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Track and print the number of dirty and clear pages for each iteration. This provides parity between all log modes, and will allow collecting the dirty ring multiple times per iteration without spamming the console. Opportunistically drop the "Dirtied N pages" print, which is redundant and wrong. For the dirty ring testcase, the vCPU isn't guaranteed to complete a loop. And when the vCPU does complete a loot, there are no guarantees that it has *dirtied* that many pages; because the writes are to random address, the vCPU may have written the same page over and over, i.e. only dirtied one page. While the number of writes performed by the vCPU is also interesting, e.g. the pr_info() could be tweaked to use different verbiage, pages_count doesn't correctly track the number of writes either (because loops aren't guaranteed to a complete). Delete the print for now, as a future patch will precisely track the number of writes, at which point the verification phase can report the number of writes performed by each iteration. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 55a744373c80..08cbecd1a135 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -388,8 +388,6 @@ static void dirty_ring_collect_dirty_pages(struct kvm_vcpu *vcpu, int slot, if (READ_ONCE(dirty_ring_vcpu_ring_full)) dirty_ring_continue_vcpu(); - - pr_info("Iteration %ld collected %u pages\n", iteration, count); } static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu) @@ -508,24 +506,20 @@ static void log_mode_after_vcpu_run(struct kvm_vcpu *vcpu) static void *vcpu_worker(void *data) { struct kvm_vcpu *vcpu = data; - uint64_t pages_count = 0; while (!READ_ONCE(host_quit)) { - pages_count += TEST_PAGES_PER_LOOP; /* Let the guest dirty the random pages */ vcpu_run(vcpu); log_mode_after_vcpu_run(vcpu); } - pr_info("Dirtied %"PRIu64" pages\n", pages_count); - return NULL; } static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) { + uint64_t page, nr_dirty_pages = 0, nr_clean_pages = 0; uint64_t step = vm_num_host_pages(mode, 1); - uint64_t page; uint64_t *value_ptr; uint64_t min_iter = 0; @@ -544,7 +538,7 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) if (__test_and_clear_bit_le(page, bmap)) { bool matched; - host_dirty_count++; + nr_dirty_pages++; /* * If the bit is set, the value written onto @@ -605,7 +599,7 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) " incorrect (iteration=%"PRIu64")", page, *value_ptr, iteration); } else { - host_clear_count++; + nr_clean_pages++; /* * If cleared, the value written can be any * value smaller or equals to the iteration @@ -639,6 +633,12 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) } } } + + pr_info("Iteration %2ld: dirty: %-6lu clean: %-6lu\n", + iteration, nr_dirty_pages, nr_clean_pages); + + host_dirty_count += nr_dirty_pages; + host_clear_count += nr_clean_pages; } static struct kvm_vm *create_vm(enum vm_guest_mode mode, struct kvm_vcpu **vcpu, From patchwork Sat Jan 11 00:29:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935644 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 875E64A1E for ; Sat, 11 Jan 2025 00:30:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555421; cv=none; b=C8RP9Fl5sVrVr2cH29kgmM6VznX9Qf9m0uu6WjYJ4fKWI8Q2Z76+n/Mod/sYHETcWAuYgYWGwP+JpUogepnxbrGx2muqJDBNrxK1yEC5gD6yElDfNxxesvIQQvD17Urf9gO+0eteOINoRNk2cG/Uxwc3YeBhO8Qr7lIfRR0V2MM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555421; c=relaxed/simple; bh=rXm6MMpaJw1qyS71V+xzDjJly4UwYlWkG0d7xvwWsQY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mgA1VbPw8H7fKudkm6cgKVqkdMNuzgt8zXpzUkO1tp6PXlg7APg61V6eUbl8xqCBcb6h2Qaaaa62h0U9QKBBXrPx1UtrmH6PoHXUWTOlILfj3c7+KAD+rf8GWX9mgRA8yY8zic+uKmSoC7BzTe1ubyV5mc38y0gTRmqWAzvai64= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=QwBmfj0a; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="QwBmfj0a" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ef9e4c5343so6654907a91.0 for ; Fri, 10 Jan 2025 16:30:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555419; x=1737160219; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=6IhW12gqYntCz1+c2D5eBg8yPy5WGu0Pw6mNyLGrlAc=; b=QwBmfj0aX/nLbvgdBIxuKwpN3JomCHl7lT8hne1JEbhKbFG/LtH3wHityFXMvkA0zE 7ykVI/7KsstbTWD31dW1QlInBZMdZR0C4l7ENdgb1BQbm0ggPSd6D9qV5cA13vylbr1w Socwvgdzd4JERkV9vpHqMbY4qojF4GTszam29Ej6ym8peQw6ic2YTQhWT/909CPzZSg8 wz+M/ptizYuPOKQAKmEOHth/xQncpAiRCc+05nDoDj6S3ym6iOgSchH0mSwBiiPvpD46 dM6F9NAWwuAizQm59chGhiwocofoSFyCmjLKTd4JOy4oUscbecyHaMIKMh2J4bURNs+r F/SA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555419; x=1737160219; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=6IhW12gqYntCz1+c2D5eBg8yPy5WGu0Pw6mNyLGrlAc=; b=ImX1C+FyIavQWOBU+3sFBoJtZqiWnaZlIjwmwBBRAuKTeppFTTMUO3Pd0dKxfYe9ut n7ZYX8v7+ATlbIk8XSTUB3HLUYdjBqEU8sJm1KdoJIdHPw6ESR6lt6RW8QTD/ZbmJE43 2GpwWivIMMD66pMwx2Ldqw5A8F0Ioxf8/dM23Y+Y8UzSp1+Xih5j8TyRDPNK0yn13OGc 7nPe9ct79xO9+8ULaNkw6R7foriR/JZRmoFgvuGfvtERH0m7Yh5iBDHggEaqD7a3q7Kp b1/u4NsNQeLXvtWNtku6tpukrjrdT/ZJ3vMwg8bzNDUJCK1J5TzYnd6A/IDKfys5DO5W VSbw== X-Gm-Message-State: AOJu0YzE4/NIwbGEI/z19RBPtuQwFYzA5UH5Ss+pqlJccsG2teTM9kv9 RGfoH5eWZDdqSkQc7Putm9WJAqsk55fxDzKqVRvWJUJJQVJMMTlOS/45vGxgrs2RFA+Lrofr6tu cpA== X-Google-Smtp-Source: AGHT+IGBV97wTYRM8hlFr4fJkGJVU7xqzfHB/Clf/Nbfpa7h/esWcwhR69zEh8pcrRr99qn6u0ZSD0nAMiI= X-Received: from pjwx3.prod.google.com ([2002:a17:90a:c2c3:b0:2ea:931d:7ced]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2d43:b0:2ee:fdf3:390d with SMTP id 98e67ed59e1d1-2f5490ed82dmr16491422a91.31.1736555418949; Fri, 10 Jan 2025 16:30:18 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:50 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-7-seanjc@google.com> Subject: [PATCH v2 06/20] KVM: selftests: Read per-page value into local var when verifying dirty_log_test From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Cache the page's value during verification in a local variable, re-reading from the pointer is ugly and error prone, e.g. allows for bugs like checking the pointer itself instead of the value. No functional change intended. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 08cbecd1a135..5a04a7bd73e0 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -520,11 +520,10 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) { uint64_t page, nr_dirty_pages = 0, nr_clean_pages = 0; uint64_t step = vm_num_host_pages(mode, 1); - uint64_t *value_ptr; uint64_t min_iter = 0; for (page = 0; page < host_num_pages; page += step) { - value_ptr = host_test_mem + page * host_page_size; + uint64_t val = *(uint64_t *)(host_test_mem + page * host_page_size); /* If this is a special page that we were tracking... */ if (__test_and_clear_bit_le(page, host_bmap_track)) { @@ -545,11 +544,10 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) * the corresponding page should be either the * previous iteration number or the current one. */ - matched = (*value_ptr == iteration || - *value_ptr == iteration - 1); + matched = (val == iteration || val == iteration - 1); if (host_log_mode == LOG_MODE_DIRTY_RING && !matched) { - if (*value_ptr == iteration - 2 && min_iter <= iteration - 2) { + if (val == iteration - 2 && min_iter <= iteration - 2) { /* * Short answer: this case is special * only for dirty ring test where the @@ -597,7 +595,7 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) TEST_ASSERT(matched, "Set page %"PRIu64" value %"PRIu64 " incorrect (iteration=%"PRIu64")", - page, *value_ptr, iteration); + page, val, iteration); } else { nr_clean_pages++; /* @@ -619,11 +617,11 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) * we'll see that page P is cleared, with * value "iteration-1". */ - TEST_ASSERT(*value_ptr <= iteration, + TEST_ASSERT(val <= iteration, "Clear page %"PRIu64" value %"PRIu64 " incorrect (iteration=%"PRIu64")", - page, *value_ptr, iteration); - if (*value_ptr == iteration) { + page, val, iteration); + if (val == iteration) { /* * This page is _just_ modified; it * should report its dirtyness in the From patchwork Sat Jan 11 00:29:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935645 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 69B1F1EB48 for ; Sat, 11 Jan 2025 00:30:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555423; cv=none; b=Y0SxlYxqacQWV/ADd1mqGzhK5hnBvwgE9Zj8PaSzxO5B2HwblyYT/W1CPc7jfdWxn93kr3e77ia9WUNGpO8LkEHw13d0Y0HNDCqbGKacq6ItwHtiMv6vE89SKJSqatk4cW+n4IWo6+HSlBSgbG8ucQ+Q7Jd/7q4raUAM8S/uPEE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555423; c=relaxed/simple; bh=QGDCeJPchThIuDJkjyaSdj0tx8LKDXww3qbAv++T4dI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=BrzCDuRZyXkgDAX0ozUjEOapUA5BOdl6S+nc+m/g4Y5pQe1Nwh47+Jm52SM+n6qA/r7h5D/7in7pg7xy0ISQlaotMneOJxkE83sID/Pvu+6oG3rHCWA1O/fYaZ1HgdGnRQmL3emGl0ofNCw/dgQiZOMccMAnQxjsc25S9GaWZOk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=VrU+iic9; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="VrU+iic9" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ef7fbd99a6so4611643a91.1 for ; Fri, 10 Jan 2025 16:30:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555420; x=1737160220; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=dGMBXjHv8rojpdZoojt2m8NgO/lC7pQdQVMcdYyWG8c=; b=VrU+iic91IUAJqF0feegqsp7MK5gqiOe3P79sMVwCGhgtDkgcdhc/1xo8Z7ojZ3RXc h9QXREhw4nKwSz+kIRTbKiFQxmEN/7yMQf8IhnJorHq8EsYmyGGIs/R6XOqU1LSNB9Cl KcPVwB4tZ+lxUHQWBoLSjzJn1ZPcDLJL/DHrrs0Y0vSQrfMihtqr2149PFTq2PtnFn8y hkAHtJ2xhINW2iFZZB8VorLAIqkTqN4vVR8HK2fshSRJ+2NDh2EG7IIfFzBZcZLQyP49 Belh8CjeB2+5LrXSE9yr2YI4yhd2FpbkkLiPmxV91fQ41t728c+VtANdpdlHgRwhl1Q0 9N4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555420; x=1737160220; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=dGMBXjHv8rojpdZoojt2m8NgO/lC7pQdQVMcdYyWG8c=; b=eh9BZN84IKsxDvHND5m+Y2O4K0HJRlMDxGTOLPZPPtavlNNNAUEjMVY9C34yDD5nl8 mzSDSY21juUG8/Z/hLWWTCLdDyCu6oCbPNE209KHY+tgrpO8eulvS/oUtzWy0BsqIEei f3uQPpp8G+pXdrOIBHxjh0KQrTGlvnLFMTke7UEHx8k/BjVxFP2kSssJcJOw2i+OJFv9 L9N3iQyigNEPxdikgd9a3Mz/sIzJUiHHIAFlcPmmiPxHLgaSf061QMuXPI5GLR0y+7ls 6LsVoyTEoollDPM1LAE1YPT4LZfe5y/ppgyVQowEm87+OLgUyZnV3q+g4kK7Uyag1G/o Ydsw== X-Gm-Message-State: AOJu0Ywcyy6R05FFn7di0Ev+XXxeZHWRtIiZfHoOf7UGfjZlPf5Osyq0 djP9KBYdb+WXBo+hLnWUQjZdJi9ns59AXTXFOl6IJll5R5QmM23ZEvbuIZDGQ80O0zfv9lRhLo/ c+w== X-Google-Smtp-Source: AGHT+IHVaZGEEdb4svmSOuWtVIDeYOOZZPZkNbz2XRwkXTumeQwS5L4YZBF1f95KtvQzctuCleUgMd0qvMo= X-Received: from pjbrs12.prod.google.com ([2002:a17:90b:2b8c:b0:2ea:6aa8:c4ad]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2e4b:b0:2f4:465d:5c94 with SMTP id 98e67ed59e1d1-2f548ebb621mr19044455a91.11.1736555420614; Fri, 10 Jan 2025 16:30:20 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:51 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-8-seanjc@google.com> Subject: [PATCH v2 07/20] KVM: selftests: Continuously reap dirty ring while vCPU is running From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Continue collecting entries from the dirty ring for the entire time the vCPU is running. Collecting exactly once all but guarantees the vCPU will encounter a "ring full" event and stop. While testing ring full is interesting, stopping and doing nothing is not, especially for larger intervals as the test effectively does nothing for a much longer time. To balance continuous collection with letting the guest make forward progress, chunk the interval waiting into 1ms loops (which also makes the math dead simple). To maintain coverage for "ring full", collect entries on subsequent iterations if and only if the ring has been filled at least once. I.e. let the ring fill up (if the interval allows), but after that contiuously empty it so that the vCPU can keep running. Opportunistically drop unnecessary zero-initialization of "count". Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 63 ++++++++++++++------ 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 5a04a7bd73e0..2aee047b8b1c 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -340,8 +340,6 @@ static uint32_t dirty_ring_collect_one(struct kvm_dirty_gfn *dirty_gfns, struct kvm_dirty_gfn *cur; uint32_t count = 0; - dirty_ring_prev_iteration_last_page = dirty_ring_last_page; - while (true) { cur = &dirty_gfns[*fetch_index % test_dirty_ring_count]; if (!dirty_gfn_is_dirtied(cur)) @@ -360,17 +358,11 @@ static uint32_t dirty_ring_collect_one(struct kvm_dirty_gfn *dirty_gfns, return count; } -static void dirty_ring_continue_vcpu(void) -{ - pr_info("Notifying vcpu to continue\n"); - sem_post(&sem_vcpu_cont); -} - static void dirty_ring_collect_dirty_pages(struct kvm_vcpu *vcpu, int slot, void *bitmap, uint32_t num_pages, uint32_t *ring_buf_idx) { - uint32_t count = 0, cleared; + uint32_t count, cleared; /* Only have one vcpu */ count = dirty_ring_collect_one(vcpu_map_dirty_ring(vcpu), @@ -385,9 +377,6 @@ static void dirty_ring_collect_dirty_pages(struct kvm_vcpu *vcpu, int slot, */ TEST_ASSERT(cleared == count, "Reset dirty pages (%u) mismatch " "with collected (%u)", cleared, count); - - if (READ_ONCE(dirty_ring_vcpu_ring_full)) - dirty_ring_continue_vcpu(); } static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu) @@ -404,7 +393,6 @@ static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu) sem_post(&sem_vcpu_stop); pr_info("Dirty ring full, waiting for it to be collected\n"); sem_wait(&sem_vcpu_cont); - pr_info("vcpu continues now.\n"); WRITE_ONCE(dirty_ring_vcpu_ring_full, false); } else { TEST_ASSERT(false, "Invalid guest sync status: " @@ -755,11 +743,52 @@ static void run_test(enum vm_guest_mode mode, void *arg) pthread_create(&vcpu_thread, NULL, vcpu_worker, vcpu); while (iteration < p->iterations) { + bool saw_dirty_ring_full = false; + unsigned long i; + + dirty_ring_prev_iteration_last_page = dirty_ring_last_page; + /* Give the vcpu thread some time to dirty some pages */ - usleep(p->interval * 1000); - log_mode_collect_dirty_pages(vcpu, TEST_MEM_SLOT_INDEX, - bmap, host_num_pages, - &ring_buf_idx); + for (i = 0; i < p->interval; i++) { + usleep(1000); + + /* + * Reap dirty pages while the guest is running so that + * dirty ring full events are resolved, i.e. so that a + * larger interval doesn't always end up with a vCPU + * that's effectively blocked. Collecting while the + * guest is running also verifies KVM doesn't lose any + * state. + * + * For bitmap modes, KVM overwrites the entire bitmap, + * i.e. collecting the bitmaps is destructive. Collect + * the bitmap only on the first pass, otherwise this + * test would lose track of dirty pages. + */ + if (i && host_log_mode != LOG_MODE_DIRTY_RING) + continue; + + /* + * For the dirty ring, empty the ring on subsequent + * passes only if the ring was filled at least once, + * to verify KVM's handling of a full ring (emptying + * the ring on every pass would make it unlikely the + * vCPU would ever fill the fing). + */ + if (READ_ONCE(dirty_ring_vcpu_ring_full)) + saw_dirty_ring_full = true; + if (i && !saw_dirty_ring_full) + continue; + + log_mode_collect_dirty_pages(vcpu, TEST_MEM_SLOT_INDEX, + bmap, host_num_pages, + &ring_buf_idx); + + if (READ_ONCE(dirty_ring_vcpu_ring_full)) { + pr_info("Dirty ring emptied, restarting vCPU\n"); + sem_post(&sem_vcpu_cont); + } + } /* * See vcpu_sync_stop_requested definition for details on why From patchwork Sat Jan 11 00:29:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935646 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF4CA15B102 for ; Sat, 11 Jan 2025 00:30:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555424; cv=none; b=klPfbX30oPKsHfi5pbLbcqA+2vdFqhN1gAGgaDKiggxaiXRJHJvTrwV9UiJVF65MNicOp/gUq7y2j4TQZpgzBguo65Pw1dLxiEqftapjnyTZNJ9WhqHgTMdIsbAmokPAtaWHDCTcWRLKgIw7l2jM3Aod77RXQHAK9V//ifzHCZ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555424; c=relaxed/simple; bh=Inh2cv3fTNpaNX1dqJtMDaDtbEiwB1dIP0CX7Q96HQM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=luodEEG4TNVCBjyx7HUviR4FlssJcXNwb+7gMJj1iD2pY7nBx+DN5LDFMR9le6PMrH7S85znouJLGcCRl07VaghFVnke9ZLAX6BAHJ8T38Y+zGlEbf/vnp6ipF4OEljLIhYw39zSvYbfF3Gq6Y9bj2VkdIP5JzmZ6V7JHS7Ro5k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=1e8Odm9u; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="1e8Odm9u" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ef9e38b0cfso4628516a91.0 for ; Fri, 10 Jan 2025 16:30:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555422; x=1737160222; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=m1k/pYfn2qosYE12LM1QCowrsBblB7GzrYsx0S4ECrU=; b=1e8Odm9uetRkAYbkeTWrXO6P3FPGtAUW8/5mie0MDxz7syerKqvcc8XA5ZlqFoPXAw xYDlB5E95U3gGZLJ31moU+6D939g0bf5Q3dnJQfoKf2tqeV8XJfGr6mZAYcymI/qPSic Sz7oDFgAVGC5yn9rSX+BGBs3nqEKpLkQ2DsCzItRhVYVfx/Mg/13TgccBG/13sPE3pb1 NCxv52r7LzuM35to+NtSByICQao3rUD95mm7e8WpufRy0wR7V4mmZfPik3IVZTECSXaH oknHQ12X0fuSGsZcS2nI9PQ/zv65Wb8gzcr6zr8BBL4pAClPlPQJ37w67vdR23xgA0mu 7/kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555422; x=1737160222; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=m1k/pYfn2qosYE12LM1QCowrsBblB7GzrYsx0S4ECrU=; b=roYYSuPuVhR6L8XxMkxL2Ot5H1aRorV8o0NIYViJEM0xB/BAyf/zpQSVJ9rnwDzh5w rNxOOxmUmXJoFs4FoZRKhI2XkzBcIt42YHG6DCG5KgBHYBDYKqnVTL7zNuWGW/pDvyMR zVbbaVvbD+X1WbReeDTLdSKvygasGw0BAN2v/wHArBrWGO6XFMw3tl05ZxXEVY++l2f2 rvMZFUXmDk8JAe8kj7GQxruJDphZW5NnPUP+9ljEx3Gjds0Ddu5t2P6R+jJYCbqtj1+r O7flbHkpbeUUWt3ArD9VJk8XEQo9mrlUBxa/fLJaFe24L2RPlsVn+emOSEofjJdHjMrg jATA== X-Gm-Message-State: AOJu0YzyxvAoYq/zC9UWP5g0uCYt6yQcUBW5ElH6Qt59mVBgXawfC8LG ojQmznykNTHHDXQR+rgbYCfTTt7nyfT8iM/Kowrn0xVwbAFr4AOo/TCgqvttNP4VPDUsruXpfqI Zzg== X-Google-Smtp-Source: AGHT+IF17Z0yrpB50va3qb6t7bXW3sn+V7nb0UF93emvB4u3L4QeaKeeehS2VrfQSdjxuguRho8Bqf6SeSw= X-Received: from pjx13.prod.google.com ([2002:a17:90b:568d:b0:2ee:4a90:3d06]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2dc8:b0:2ee:d024:e4f7 with SMTP id 98e67ed59e1d1-2f548db6c4dmr21639527a91.0.1736555422269; Fri, 10 Jan 2025 16:30:22 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:52 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-9-seanjc@google.com> Subject: [PATCH v2 08/20] KVM: selftests: Limit dirty_log_test's s390x workaround to s390x From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson From: Maxim Levitsky s390 specific workaround causes the dirty-log mode of the test to dirty all guest memory on the first iteration, which is very slow when the test is run in a nested VM. Limit this workaround to s390x. Signed-off-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 2aee047b8b1c..55a385499434 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -98,6 +98,7 @@ static void guest_code(void) uint64_t addr; int i; +#ifdef __s390x__ /* * On s390x, all pages of a 1M segment are initially marked as dirty * when a page of the segment is written to for the very first time. @@ -108,6 +109,7 @@ static void guest_code(void) addr = guest_test_virt_mem + i * guest_page_size; vcpu_arch_put_guest(*(uint64_t *)addr, READ_ONCE(iteration)); } +#endif while (true) { for (i = 0; i < TEST_PAGES_PER_LOOP; i++) { From patchwork Sat Jan 11 00:29:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935647 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 761C6171E49 for ; Sat, 11 Jan 2025 00:30:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555426; cv=none; b=MZR04hbKRlEGHXfbOWnK6p4CsBRsBAnoqSpt9Z1LtKNwCWpPorrwV3ObxNUQKGjDQzVqCoYuGFCENevXynb31hlFgfYcNqjo30Iw762w1lHSu8J4m8iX4ZzPEm1k6x2iW7ySIQILLTuZ0KFe2SxxYlCTPWEfnNMtA4r+76OzAe4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555426; c=relaxed/simple; bh=OgTTk595VIyjaFheqBqRfYqIoPT5CZ9K1t127fuPGa4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=RWRZaETR0F7VFVtr/k3yjnYEFf61bKIHUXDfPKq95y08hOhmFYGg7Q26/NMWDYwSMMKP0TfJ929dDr9yEfv8dv2jNtPZNrKD1eaYOH6hyMA3/4UICVrNNi9dq6oUJOZhOlrzacyGYlkgveETHN3GDNSzIheCzE+YSeGyv5Hu8CY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=z1MW3Wl9; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="z1MW3Wl9" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2efa74481fdso4762415a91.1 for ; Fri, 10 Jan 2025 16:30:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555424; x=1737160224; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=FAzPo3qg+GcWGQlv0+FYKxHsP1523EqIgag6kKt+kTY=; b=z1MW3Wl9m4tzjLCOvxwXc53Nhg1IQHTxndzi4SeB20dOLzfp+mJn2tOYVhw72/qQdC iBHl8nRONVc06VQCGHK+JO7GtfajXJ4kJGd6mtDA6IOgHBLAVqw6WPiwzVqGw4oyCIA8 bQR+EaiOGl/bYl3KgRhzzzxJSI4qWIhwSOO7jOr7K8GDuPnKpv1EVXJfSJMiJm0ixj6v lDl1YG8DQG3kqX2FUIqhL/e6h3j6MXCktYvD88sgINbR4HOJoBVTwJhzpzwcyxYHsRcm DmoZ0kpPZEu1cTgjsz35g2TqscM8ZevpnUv4zfdm8ec1cIkfiAH3Bt9nRTT8yxzC2BnK UWgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555424; x=1737160224; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=FAzPo3qg+GcWGQlv0+FYKxHsP1523EqIgag6kKt+kTY=; b=jANorD2YkI2qOVkiBqA9X1GsYfnbkCnBvRfZJE2/WtCce1Vw4zEcyb27G3WLFwUjFZ 5WuT5a76xTWxrOQooiTtrOvFLo9el1uMUtMu2v6nfKYmUOGVX1S+V8CnZhFYbmeClgwQ +fWoQPPMmK82qYvHl+LN3OVgzMkCLLacMOKs7wUpwMkaaxg2xmxFXDjDXmOiZt9fdA+4 3kTSuo46/MP736Lso1MVxPEKLSU3BpyoRsccOZAn2wPOCh/WEUO9RBPpWYevZyWTNNHA ILqY9mBCIIMVni5o2IEv+ziw4SF9J0VcU+10ldL7qQdkaqD49lp9Qq0h/giwtcmktduO smlg== X-Gm-Message-State: AOJu0Yx2Zky37DXk7o/S6T4+PBWzLL664/my9PhOPOwlFswhAqMM0wVs 4C2MLEiJRq52LI8JGFprB55OMrrFIrHNDgwgXgsJ8UWXqv7PwTQm/5TqEUoEpBRNvMNGPLTJ+3d cZw== X-Google-Smtp-Source: AGHT+IFcZmNvkzAFZeqVU6HOmDlE0qdzEz5X0u8ak5y2AJn4YmqiFkSzOypX660zjNhdGKiOFPzhRq/DJvA= X-Received: from pjbee12.prod.google.com ([2002:a17:90a:fc4c:b0:2e5:5ffc:1c36]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:254e:b0:2ef:19d0:2261 with SMTP id 98e67ed59e1d1-2f548eae703mr20633108a91.16.1736555423972; Fri, 10 Jan 2025 16:30:23 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:53 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-10-seanjc@google.com> Subject: [PATCH v2 09/20] KVM: selftests: Honor "stop" request in dirty ring test From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Now that the vCPU doesn't dirty every page on the first iteration for architectures that support the dirty ring, honor vcpu_stop in the dirty ring's vCPU worker, i.e. stop when the main thread says "stop". This will allow plumbing vcpu_stop into the guest so that the vCPU doesn't need to periodically exit to userspace just to see if it should stop. Add a comment explaining that marking all pages as dirty is problematic for the dirty ring, as it results in the guest getting stuck on "ring full". This could be addressed by adding a GUEST_SYNC() in that initial loop, but it's not clear how that would interact with s390's behavior. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 55a385499434..8d31e275a23d 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -387,8 +387,7 @@ static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu) /* A ucall-sync or ring-full event is allowed */ if (get_ucall(vcpu, NULL) == UCALL_SYNC) { - /* We should allow this to continue */ - ; + vcpu_handle_sync_stop(); } else if (run->exit_reason == KVM_EXIT_DIRTY_RING_FULL) { /* Update the flag first before pause */ WRITE_ONCE(dirty_ring_vcpu_ring_full, true); @@ -697,6 +696,15 @@ static void run_test(enum vm_guest_mode mode, void *arg) #ifdef __s390x__ /* Align to 1M (segment size) */ guest_test_phys_mem = align_down(guest_test_phys_mem, 1 << 20); + + /* + * The workaround in guest_code() to write all pages prior to the first + * iteration isn't compatible with the dirty ring, as the dirty ring + * support relies on the vCPU to actually stop when vcpu_stop is set so + * that the vCPU doesn't hang waiting for the dirty ring to be emptied. + */ + TEST_ASSERT(host_log_mode != LOG_MODE_DIRTY_RING, + "Test needs to be updated to support s390 dirty ring"); #endif pr_info("guest physical test memory offset: 0x%lx\n", guest_test_phys_mem); From patchwork Sat Jan 11 00:29:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935648 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E707188734 for ; Sat, 11 Jan 2025 00:30:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555428; cv=none; b=sEplB872RhBETO3nOHBHrOMdphbWsUgb1XywW8355iBz68AiyKD1WuvahF42e3sZifCei2gMTZa+xEU6q/GJuZrQHh6YGB5wjv3FoNbOIgIf+okWjN1LtU6cQKntuhN3uKzqr51Rhr8x3nVQkpjLc6juR9T7v6zgFn9cptSPSgU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555428; c=relaxed/simple; bh=dvr0z46QuRPjeO+M3P6fjhyLCMuwGFDzgudUy3batWo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Z/qk+GWWZBoYiYnTKzU30ZpJLer6wZOX1sO9cjGiUMaunr/OyM7vrpZ4GYhrs2muAIyY+jhdTEU2TjkkqGX56DQaNMSDtfdIXnKEtFXDqQgw7rrxsa7TNlXJRfghS8wrbjqJVRjVH5qRcPKCUtzPw/JUbJk+tXgcN2t6kRlXSeo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=PnhHesvV; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PnhHesvV" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-21661949f23so75986115ad.3 for ; Fri, 10 Jan 2025 16:30:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555426; x=1737160226; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=RNK3sklc8NzNdhQ6DzodSTUjKP3FfBCZUP6CSMXfdw4=; b=PnhHesvV7HGdsBG6mqlTRZga9oRwXuNxcxm7/r2Crxv5JOPODNfCWf08fiRzONJKRM gBA0Wp6eJh4OvziUhwtRFwLe0JH360IZNTok+LBJNOYK/w/K+6kEIuxhSVgqinHNMXAH /C3WkFflewq7U6S6GXElYoQRx9ExeiFW98yPoIkHQp1nRHLcO3qjalBx9SR63XIfOZst /A7Ejp50g/VfN8Nas5xjCw631ie36RPUFrhVbDbUz1TqPGucqxBPd78GcMUZPqNMRKfr 6xawDejeyCh7nkxUxptZe1comBAH84kOkJ/caPwBRdW9h9U8S5iTyz4Dq6103TV+SYPD 0OXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555426; x=1737160226; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=RNK3sklc8NzNdhQ6DzodSTUjKP3FfBCZUP6CSMXfdw4=; b=GQCdF2X7DM0sXEXfxRa1989zP+4oG8TELL3GOhqIJhdL4NuVX9HE4Qg/17/HWZofme l9TcpiTfzWO+OgFhKsdnn+xzhwosZQ+PgfoIIgTsA940M12m9jpoVj2qC5y0f48TGlU/ seuGWCD/PAX3lEiMuhOhqAzR7l7HLCGbDVLORWNSM9xPR4gycrhMvxPzrCSWzIQjq1kq mnj/1NZiBIBKUCSN4K0lDNvCeGIHoTpSpdo3nJv0jVgbFAGRgO7hXHhgzVbJ6+l+Mqzi F5vxKnUxxKkV9fGnSU3VPZFEaGbVkSQmurK2tLZAWOBYNACbQL5x5MM+6rdqYLWJKsH9 CPuA== X-Gm-Message-State: AOJu0Yz3l2XD2ycATuK/qI6egby+YGzVk/NQsOo+Z5vPloAS1nQSWl0l +38c790miaQ6MNSATkkEJnYsz0vKcFmh6xts7ODo9pcqM7aEJBeNzISQnfnaOI8h99ZMtgg8cJl P9Q== X-Google-Smtp-Source: AGHT+IFZVo7ZKv5IRkv1HXxsi6LOVpEl2/GjPDFzkEZRkFVeRBFtcXWmAC3wo8WF/6xryaFkvYLsgqOGng8= X-Received: from plks12.prod.google.com ([2002:a17:903:2cc:b0:211:fb3b:763b]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:c941:b0:215:a179:14ca with SMTP id d9443c01a7336-21a83f3eec9mr194424425ad.2.1736555425724; Fri, 10 Jan 2025 16:30:25 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:54 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-11-seanjc@google.com> Subject: [PATCH v2 10/20] KVM: selftests: Keep dirty_log_test vCPU in guest until it needs to stop From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson In the dirty_log_test guest code, exit to userspace only when the vCPU is explicitly told to stop. Periodically exiting just to check if a flag has been set is unnecessary, weirdly complex, and wastes time handling exits that could be used to dirty memory. Opportunistically convert 'i' to a uint64_t to guard against the unlikely scenario that guest_num_pages exceeds the storage of an int. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 43 ++++++++++---------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 8d31e275a23d..40c8f5551c8e 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -31,9 +31,6 @@ /* Default guest test virtual memory offset */ #define DEFAULT_GUEST_TEST_MEM 0xc0000000 -/* How many pages to dirty for each guest loop */ -#define TEST_PAGES_PER_LOOP 1024 - /* How many host loops to run (one KVM_GET_DIRTY_LOG for each loop) */ #define TEST_HOST_LOOP_N 32UL @@ -75,6 +72,7 @@ static uint64_t host_page_size; static uint64_t guest_page_size; static uint64_t guest_num_pages; static uint64_t iteration; +static bool vcpu_stop; /* * Guest physical memory offset of the testing memory slot. @@ -96,9 +94,10 @@ static uint64_t guest_test_virt_mem = DEFAULT_GUEST_TEST_MEM; static void guest_code(void) { uint64_t addr; - int i; #ifdef __s390x__ + uint64_t i; + /* * On s390x, all pages of a 1M segment are initially marked as dirty * when a page of the segment is written to for the very first time. @@ -112,7 +111,7 @@ static void guest_code(void) #endif while (true) { - for (i = 0; i < TEST_PAGES_PER_LOOP; i++) { + while (!READ_ONCE(vcpu_stop)) { addr = guest_test_virt_mem; addr += (guest_random_u64(&guest_rng) % guest_num_pages) * guest_page_size; @@ -140,14 +139,7 @@ static uint64_t host_track_next_count; /* Whether dirty ring reset is requested, or finished */ static sem_t sem_vcpu_stop; static sem_t sem_vcpu_cont; -/* - * This is only set by main thread, and only cleared by vcpu thread. It is - * used to request vcpu thread to stop at the next GUEST_SYNC, since GUEST_SYNC - * is the only place that we'll guarantee both "dirty bit" and "dirty data" - * will match. E.g., SIG_IPI won't guarantee that if the vcpu is interrupted - * after setting dirty bit but before the data is written. - */ -static atomic_t vcpu_sync_stop_requested; + /* * This is updated by the vcpu thread to tell the host whether it's a * ring-full event. It should only be read until a sem_wait() of @@ -272,9 +264,7 @@ static void clear_log_collect_dirty_pages(struct kvm_vcpu *vcpu, int slot, /* Should only be called after a GUEST_SYNC */ static void vcpu_handle_sync_stop(void) { - if (atomic_read(&vcpu_sync_stop_requested)) { - /* It means main thread is sleeping waiting */ - atomic_set(&vcpu_sync_stop_requested, false); + if (READ_ONCE(vcpu_stop)) { sem_post(&sem_vcpu_stop); sem_wait(&sem_vcpu_cont); } @@ -801,11 +791,24 @@ static void run_test(enum vm_guest_mode mode, void *arg) } /* - * See vcpu_sync_stop_requested definition for details on why - * we need to stop vcpu when verify data. + * Stop the vCPU prior to collecting and verifying the dirty + * log. If the vCPU is allowed to run during collection, then + * pages that are written during this iteration may be missed, + * i.e. collected in the next iteration. And if the vCPU is + * writing memory during verification, pages that this thread + * sees as clean may be written with this iteration's value. */ - atomic_set(&vcpu_sync_stop_requested, true); + WRITE_ONCE(vcpu_stop, true); + sync_global_to_guest(vm, vcpu_stop); sem_wait(&sem_vcpu_stop); + + /* + * Clear vcpu_stop after the vCPU thread has acknowledge the + * stop request and is waiting, i.e. is definitely not running! + */ + WRITE_ONCE(vcpu_stop, false); + sync_global_to_guest(vm, vcpu_stop); + /* * NOTE: for dirty ring, it's possible that we didn't stop at * GUEST_SYNC but instead we stopped because ring is full; @@ -813,8 +816,6 @@ static void run_test(enum vm_guest_mode mode, void *arg) * the flush of the last page, and since we handle the last * page specially verification will succeed anyway. */ - assert(host_log_mode == LOG_MODE_DIRTY_RING || - atomic_read(&vcpu_sync_stop_requested) == false); vm_dirty_log_verify(mode, bmap); /* From patchwork Sat Jan 11 00:29:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935649 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC17D18B492 for ; Sat, 11 Jan 2025 00:30:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555430; cv=none; b=prbrvY2/7srH1FK9MUkdeaKBbX9nRkIB27ZsuLsJ6A2MX02fvaxBxY8Xcs+AjGzRMIqpfxeiZh4gy8eDGqey66CWcSQ9xrWUugKFLjLNX94AXZPDjZZm9XPzfeITm9MHGcy5PcXkEm3LcmjGSiI5n3Vqai2o3o1mn21VIWz/YDE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555430; c=relaxed/simple; bh=3sfvgMqPiGr/4hRycKbPGFa+ObbRBz+P/dL5LYIATKQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HeXSahnR21tpX3fncBiyUaLGkvbRYsi3CHtNpGNaBmqayZbPOLrJba7GMGcQRQZnaCsUEK+6XNhSLeaIFUxfNSZh9B00xZIABM6PcaQb9QkfDiQQLMFWIlKau9HMkBIr93xR7brNh6rJaIJ8IlNjoollTg06MMGDopcqel1R1CE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=uoesLNpJ; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="uoesLNpJ" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ee46799961so6672742a91.2 for ; Fri, 10 Jan 2025 16:30:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555427; x=1737160227; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=YB7ROV39Pzlxg3CsT+e1YkqRcv/fedX8ByOvnUPuqfA=; b=uoesLNpJBY02fzzlEihFEK2onjDwkXkLxXBh23o5DIxnTbN7X7s69U/MXIy/K1zU2Z BbFNuW7eSaA8GJu/O8I+LQAopz6WLf5Lyk/0GzAzgeRU+sqKz7KLRBBSgb6LkZQ+2dqE lTIffx9m0IYEsYFHf1UdzUvFJu4BXIx1KK+Y4Row8lysTKrPFaZofvCVt4yYP9ncK2m6 a63B5D8l4IWNUpCJotDMvSbO/K/eV4gTCBe4hxx3j7i1ee/992z7q30upgQ+3W29ztDE m9fp1MMwWTuzm/2fRSAAVNUz3eIyf3LVhZC0AIDRwWgS5XH8yoivGiOrwSfJFIdC+hsl EdJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555427; x=1737160227; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=YB7ROV39Pzlxg3CsT+e1YkqRcv/fedX8ByOvnUPuqfA=; b=bTIt7t3U+uf0OwDu4E+fEiNphvBCM9H0IUw8GOs6dEu+oBL1TCqPJhpSDNTrkMDs8V HzA1OqJFb3zdHLvBlRCw1xHRyyp8q9+2zR5D8b3C3YuYslGAO+YdSk8TS2z28ZhDRMDB FQlmAkOmMpedQe6ClZpqbbS1RPdyZlX99wJ++KmWsL3ukGW7hKDEMw90LKHwZl9gYDku XGNeKZDR31QwyGW+Xlk/6Z3Mq0FprPVoG7VM3UUDdL+IOXaIjb6gm4gR9iBYjeaDgSwP YQYbeWuYBNYUfv42QexgWpm4Sr9clZB89m7JkgKQ2hzusxwjYfqBqGQVK5JRuiAEZfed aVsg== X-Gm-Message-State: AOJu0YwOaz7F8N45VQdhBRlrJXHH37m9BWi4hYqSZjteQou0P+r+K9+m oCZOdsxX1pY5s3jIQptXJodf7R9nww3k/5S3J9BUs5GAOB34nvIU75uiJD4Cz8Aa0QPnlu1tiV+ 3+A== X-Google-Smtp-Source: AGHT+IF9PJIrfTvS9nj0PyfnuXky377OG3qzpuoymD5lbk2+qu0GEx0KxT0XjTWhVsB8BPQIq2rSf68CP6U= X-Received: from pjbqb10.prod.google.com ([2002:a17:90b:280a:b0:2ef:6fb0:55fb]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2dc6:b0:2ee:53b3:3f1c with SMTP id 98e67ed59e1d1-2f548e9f9ecmr17738470a91.5.1736555427225; Fri, 10 Jan 2025 16:30:27 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:55 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-12-seanjc@google.com> Subject: [PATCH v2 11/20] KVM: selftests: Post to sem_vcpu_stop if and only if vcpu_stop is true From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson When running dirty_log_test using the dirty ring, post to sem_vcpu_stop only when the main thread has explicitly requested that the vCPU stop. Synchronizing the vCPU and main thread whenever the dirty ring happens to be full is unnecessary, as KVM's ABI is to actively prevent the vCPU from running until the ring is no longer full. I.e. attempting to run the vCPU will simply result in KVM_EXIT_DIRTY_RING_FULL without ever entering the guest. And if KVM doesn't exit, e.g. let's the vCPU dirty more pages, then that's a KVM bug worth finding. Posting to sem_vcpu_stop on ring full also makes it difficult to get the test logic right, e.g. it's easy to let the vCPU keep running when it shouldn't, as a ring full can essentially happen at any given time. Opportunistically rework the handling of dirty_ring_vcpu_ring_full to leave it set for the remainder of the iteration in order to simplify the surrounding logic. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 40c8f5551c8e..8544e8425f9c 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -379,12 +379,8 @@ static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu) if (get_ucall(vcpu, NULL) == UCALL_SYNC) { vcpu_handle_sync_stop(); } else if (run->exit_reason == KVM_EXIT_DIRTY_RING_FULL) { - /* Update the flag first before pause */ WRITE_ONCE(dirty_ring_vcpu_ring_full, true); - sem_post(&sem_vcpu_stop); - pr_info("Dirty ring full, waiting for it to be collected\n"); - sem_wait(&sem_vcpu_cont); - WRITE_ONCE(dirty_ring_vcpu_ring_full, false); + vcpu_handle_sync_stop(); } else { TEST_ASSERT(false, "Invalid guest sync status: " "exit_reason=%s", @@ -743,7 +739,6 @@ static void run_test(enum vm_guest_mode mode, void *arg) pthread_create(&vcpu_thread, NULL, vcpu_worker, vcpu); while (iteration < p->iterations) { - bool saw_dirty_ring_full = false; unsigned long i; dirty_ring_prev_iteration_last_page = dirty_ring_last_page; @@ -775,19 +770,12 @@ static void run_test(enum vm_guest_mode mode, void *arg) * the ring on every pass would make it unlikely the * vCPU would ever fill the fing). */ - if (READ_ONCE(dirty_ring_vcpu_ring_full)) - saw_dirty_ring_full = true; - if (i && !saw_dirty_ring_full) + if (i && !READ_ONCE(dirty_ring_vcpu_ring_full)) continue; log_mode_collect_dirty_pages(vcpu, TEST_MEM_SLOT_INDEX, bmap, host_num_pages, &ring_buf_idx); - - if (READ_ONCE(dirty_ring_vcpu_ring_full)) { - pr_info("Dirty ring emptied, restarting vCPU\n"); - sem_post(&sem_vcpu_cont); - } } /* @@ -829,6 +817,8 @@ static void run_test(enum vm_guest_mode mode, void *arg) WRITE_ONCE(host_quit, true); sync_global_to_guest(vm, iteration); + WRITE_ONCE(dirty_ring_vcpu_ring_full, false); + sem_post(&sem_vcpu_cont); } From patchwork Sat Jan 11 00:29:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935650 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 40A0B18C002 for ; Sat, 11 Jan 2025 00:30:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555430; cv=none; b=Si0HxeJfMqrirMyHTKyFaMziq8OkMM65VfK1tZMbEf0R5HSRVdRZuS0dSMRN/mPhnHEgHYo8Bn8ostfAW98UdpPMR6In4FLP6v61FZyXoOHn0oElS9uHrL23JBcKVyo5Zv4ZUQFqOcpN5ddL3I0bnpZ+6PF+pGsFzogbDJU8HSo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555430; c=relaxed/simple; bh=Ct3FuonCRgDJp/Ui+bQ/TVeX0BiSNd/ih2pMmElS7V4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gXZYzWl4AbbLHzsDaNIFWH+4C1kOenJl20f+vyCia/JRLgBNCcnkMfR3BPTHO32b1KsZ2odawBdpl6nhB40sWjLgnLgjfIv9uKB/i6vt5OYHw9pbPHY7Dg8POiPOhneZKuV+UY+toc5OYOZ/Atirskn1QW/Ozk7Ar8ZAyL6stjo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=yPbSM8Ej; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="yPbSM8Ej" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2166e907b5eso49229075ad.3 for ; Fri, 10 Jan 2025 16:30:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555429; x=1737160229; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=y05jSkqCIR81O47S4buDh42roqUgkkPVJYIkUmCWrzY=; b=yPbSM8EjFFKFftkcwWXAmBItUdHbdwNF3ybnL5WhdGG2/71N/SLxYy2exNlx5B29SR goHvdSknV74JdavsCnAVtnxquX77kvOBqgY/cXM8NEDNh+tkorKYI/tmpI5fOKkDgbc9 cG7HDahKJDLC1i6whYU1HZFq+VU8+yVEGjJZCmAiGyQN/AAHSlgH3IOyKlVaYiITIGT8 uhNdRqJOHSxW/KedGxbDoDK0jZKLiuYDkIHNrVWBbFVAS+LUdb771U8q0el6ZOdeuiPC aAVfoKWVyyUbAgRN4Et4VIuqq4x3Qk3FNAR1w47DS9v1yCasEXUzwi5UEWipGSee/zK0 YxVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555429; x=1737160229; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=y05jSkqCIR81O47S4buDh42roqUgkkPVJYIkUmCWrzY=; b=jiC3XBmFL1G0R1T/rGBM9r5iMXVAc7pAG8wopFs8spARKazW5hd22T9L2PqwHRw1q/ WPNhy4e6IZnKI6PziwApBwCVIa2pRpIlo+6qNMGe/sBO2ujz2arKhDboUKi2Mw8uEirO bmZjzFiWAdu7EN0Ed/pclgVEww5Tkw2S9Zy1O7tZcgcH+SCDvMvSBMlknwaRinZ+hnl4 bAsCrIYa1r6a0gWh5chu73lIFzeGmDkvSbXAme5pH31E6I45XRJrSlbaDbkS19NlQk2g 69aNUOTqs6c2mVAqa+k7vl9etUdX293nPZx6jv+Nzf9viTuR+0nMKfD2sveHuI7pbYAW QPjA== X-Gm-Message-State: AOJu0YyPuFoCOeB66G4u3Vf/sGLznjR4iABRtUCubTBhNRGqz6Lr26kW ovMiywYt7cQaSNln9k9SIy85LzkrqIQmFHTCPZ9FCtel1SSxYE2TYdq8iEHz31ggFlwS9TfnGbg dDw== X-Google-Smtp-Source: AGHT+IFgrnZzIKEMTRy6t4DPba2tanrxDHSa0a90bgDXxnDvHGsIE64G7RceEr5QZnECylO0tNxGXGphF04= X-Received: from pfbfm22.prod.google.com ([2002:a05:6a00:2f96:b0:725:c96b:b1db]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:c887:b0:1e0:dc7b:4ee9 with SMTP id adf61e73a8af0-1e88cf7ba69mr21582007637.8.1736555428699; Fri, 10 Jan 2025 16:30:28 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:56 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-13-seanjc@google.com> Subject: [PATCH v2 12/20] KVM: selftests: Use continue to handle all "pass" scenarios in dirty_log_test From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson When verifying pages in dirty_log_test, immediately continue on all "pass" scenarios to make the logic consistent in how it handles pass vs. fail. No functional change intended. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 8544e8425f9c..d7cf1840bd80 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -510,8 +510,6 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) } if (__test_and_clear_bit_le(page, bmap)) { - bool matched; - nr_dirty_pages++; /* @@ -519,9 +517,10 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) * the corresponding page should be either the * previous iteration number or the current one. */ - matched = (val == iteration || val == iteration - 1); + if (val == iteration || val == iteration - 1) + continue; - if (host_log_mode == LOG_MODE_DIRTY_RING && !matched) { + if (host_log_mode == LOG_MODE_DIRTY_RING) { if (val == iteration - 2 && min_iter <= iteration - 2) { /* * Short answer: this case is special @@ -567,10 +566,8 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) } } - TEST_ASSERT(matched, - "Set page %"PRIu64" value %"PRIu64 - " incorrect (iteration=%"PRIu64")", - page, val, iteration); + TEST_FAIL("Dirty page %lu value (%lu) != iteration (%lu)", + page, val, iteration); } else { nr_clean_pages++; /* From patchwork Sat Jan 11 00:29:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935651 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16B5818F2DD for ; Sat, 11 Jan 2025 00:30:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555432; cv=none; b=CvtTTQNUszxYACUmhcAPbCVZy/cc6zMWbYCWLQqRH+1SxfNGPB86tVQWwm01KvOOS8CNAlO8XQuJb1zswz2FIie/PgIeGTcnY9k3Do9hPZKZH87N+D+1hwmREEQpTPRJsFPazl6Il3ava06Fc6FQnJLZlhwqumnI8C45S+9pt4M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555432; c=relaxed/simple; bh=X7hrJAn5Xd5/ffe52AsOh35kq+1hLy36dj+3TszD2jM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=UykIxvKebHNUnBTLLJkF5X9gnuFssOkdmA0+FUwjpOba5bF4go0IBLPF5UOYxWatbZ/3k6Y4jGMJ74qXUaXpDW+vw17Qq3UB1CZ5nHNiBk97RRU8DdXiiw65+L1ATukIKsNz/siEuSOuD7+GIcIomuxinUmp/WY8PS9rO2mylpU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=F3kdqhOo; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="F3kdqhOo" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ee8ced572eso4772439a91.0 for ; Fri, 10 Jan 2025 16:30:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555430; x=1737160230; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=xyN0UMRkk6rC6WIB3fcMIoPE8NE4GF50oCJ4Jr6Xg0Y=; b=F3kdqhOoJPU1ILmLGSbMSfJU6GKiBddLNkQpIBuzga/DrIPukoiBEIaeTFN2/cjOsO EdKislkUdig9PE0zDi2pRd4CnJ7rYm9dCJfc7R0yYKiQm9oJ1z4EWGgt3tnaKwv+v7B3 V/78b2IAY8WvIc5zsKHegWhggH/WbjEJui6F/9HZZBTi8bzNESyVcSfCuYUy9qwKryto nYxyd11M9BmPuo9S8hiqJkmCSKf/F5SqZp/qowI8gmE4Sq9/IT69v7pGJcY3kwwLpXRk E0Iq73mnxe05vw7XXIxKVzF6xZOvX2s4fDLN5r+SqZXvBVdxW8szYAsw+dKgTkUKxJVL yi1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555430; x=1737160230; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=xyN0UMRkk6rC6WIB3fcMIoPE8NE4GF50oCJ4Jr6Xg0Y=; b=Yd1kKa0bTacCzkxnVDClHOAcTMlvIUeuNi8IukadCNGvcf5DCn3GbSjS7gbcrVrPIb jy+sjeiy8Am+zP4n26eFGUcHaOKRVafOJ5mN/tECrjwJsXvORHRy4N4rwdx96I2iEtmV ZU5idS1xbyxaGco4MNWynlskiib/261eACpR2N/OTcE7Kpl6uB4W1sBtNdABkqdYn1xj dbrgzhSd6pTpdjEzjngeAgndZmBR2qN/KsW9a0jHbP3wZNMWWY4vlhuk7xM17okyYRiU bpOIToP3G0/ec+i3gB9NlWnWzw0/fgEfBDdmut+av6KybU2hsvpypHr7LfXlGCCAriNS gErg== X-Gm-Message-State: AOJu0YxrCQwWk3JemtKR3Khq7ICO3bG3A9OQJyFW8HWlul9w3AcugbIl ei09gPQUIM4QCDE96nqqJO3YJMsXSBK6k2+Lm/Vr9ACAMVMgIwyK0z/Y+mv5/fx5qQqrJi0Bkj8 lGQ== X-Google-Smtp-Source: AGHT+IEVKgEyyMYviyDeVcIm5o6jXTSkBhgMiqMrJzFk4QIbXfpDD6AKxEzcxV0qnKVdo1toVPZDgB8gkB8= X-Received: from pjbqi14.prod.google.com ([2002:a17:90b:274e:b0:2ef:d283:5089]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2509:b0:2f6:be57:49cd with SMTP id 98e67ed59e1d1-2f6be574ac9mr253754a91.25.1736555430491; Fri, 10 Jan 2025 16:30:30 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:57 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-14-seanjc@google.com> Subject: [PATCH v2 13/20] KVM: selftests: Print (previous) last_page on dirty page value mismatch From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Print out the last dirty pages from the current and previous iteration on verification failures. In many cases, bugs (especially test bugs) occur on the edges, i.e. on or near the last pages, and being able to correlate failures with the last pages can aid in debug. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index d7cf1840bd80..fe8cc7f77e22 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -566,8 +566,10 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) } } - TEST_FAIL("Dirty page %lu value (%lu) != iteration (%lu)", - page, val, iteration); + TEST_FAIL("Dirty page %lu value (%lu) != iteration (%lu) " + "(last = %lu, prev_last = %lu)", + page, val, iteration, dirty_ring_last_page, + dirty_ring_prev_iteration_last_page); } else { nr_clean_pages++; /* @@ -590,9 +592,10 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) * value "iteration-1". */ TEST_ASSERT(val <= iteration, - "Clear page %"PRIu64" value %"PRIu64 - " incorrect (iteration=%"PRIu64")", - page, val, iteration); + "Clear page %lu value (%lu) > iteration (%lu) " + "(last = %lu, prev_last = %lu)", + page, val, iteration, dirty_ring_last_page, + dirty_ring_prev_iteration_last_page); if (val == iteration) { /* * This page is _just_ modified; it From patchwork Sat Jan 11 00:29:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935652 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B626D190485 for ; Sat, 11 Jan 2025 00:30:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555434; cv=none; b=Zwi5oGKAxPjm7Bs3i00kG1bys1vRlbLqp2E5jG0oFbRybkaQdoXVol0e1weiucCwBV/4Vk2BJVI6X96jrSMSFRDmqmn2Zao2dJ+sR5SrdAqVpv3nfgG08otI1z5yl0GZXJK9oFmNLyG0l4Bi6IaPgdKz+vshwUmoeAlkgA9CF34= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555434; c=relaxed/simple; bh=uHBTQ1MR91fKk9C6yhATyFnfaltG5kAv8HeS2SlSvw8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gN9w8FPOpqOUilMqz36gP+5HuxSXXNmzv+WN8yHxxAnyBibUiliL+BqFXhfGNxryWkrl0gnpLsAEmsLuVwXSS9ABSrYgfuXlxAOu1kMM2DezUXf1jSHDUxCCt9JE4anrxch3ddY6DoZZVsW4A8Sq4XqZmdoUQMlvWX0HNlo8pIs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=MAtyv4OT; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="MAtyv4OT" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ef8c7ef51dso4674335a91.1 for ; Fri, 10 Jan 2025 16:30:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555432; x=1737160232; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=k/WoCua5rXlbcFyljn1VWee9B6n0EVLZHTgnpdWpUBU=; b=MAtyv4OTS14pbVkOSVFbLYaY73k4kwYckgsh676RMpoUfmTCS29/x7zojZWCBSTKnP w3Fse3Ru80iK5gAm/fNOAR+3Pjn+COSe3tJIshzzKfI1J2n2BWr4nNoIU503fBc/t0s7 zftLG7uPmRUd44UPMBJwmp4NBicmRES5mATq8Q4te3/+WCQrvr9zIEvj7IUV3fXK8SuY ZIcMm6ik+8WHv1z3Y/DemOVmH9R4kzc/NsE/DXyhAWC1h5CZ/8hk0B15cFYqJC+8EiSt B7BqSv0Fo1Hu29n1EPH4YIorCr6NdNAgwX6AnIMZN5Ff9tDbVz28ruwSGeokwIrZMEvs k+Og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555432; x=1737160232; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=k/WoCua5rXlbcFyljn1VWee9B6n0EVLZHTgnpdWpUBU=; b=u1NLIzD5vbmQ01bu7p6iuWbafT2w57QyUMwMZdNBblX6M4B6xrraFOwnSSrYX9vmQt Aeycq/xLFaLkOLXFEwQjRq7FCs3py6wWgT940wJ2TmQJF+a9wx0qEYjFJQNPlv15xicw l8OXanvobibZ8n3HxEHIHPRr0G2L/XteQML0hdwwdgAiJpkHSXFReD5qDvN2QTmW6T4+ 2ZKZDYN/pm4NjvNb2G8rgMsdwtEycnBPcm0dWgmFFaq/fKJwjt0Nj8LlCFCxgCjWjER8 O2hR+onCy6MDX2K+6vs3Q9y4NbOEkV3d8B7erBK13sI0A9vdFzrCY1L9cC7r0Yp5ayvZ 1l5A== X-Gm-Message-State: AOJu0YyhQ5zRVPeTwzoIiAnenh0URnlJRE00syHJGrFuqE/jZgo8eXOF 1+ILDOJ0+/nMNKGLczAyMEdjW1uKv62lYkorJUXTlw6q7pgGwca2J/xm3ZH9IavHDdbQfWitPH2 uMQ== X-Google-Smtp-Source: AGHT+IGfAsD82MPTOooMUIuLAPI+tMIahrYpTh9+mHzzcwIpUsN+dIK8wbKd4wg7pMjxdHs+5rAQwgbUyRw= X-Received: from pjbov6.prod.google.com ([2002:a17:90b:2586:b0:2ef:9b30:69d3]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:c106:b0:2ee:7e53:bfae with SMTP id 98e67ed59e1d1-2f55836e87amr12011326a91.10.1736555432128; Fri, 10 Jan 2025 16:30:32 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:58 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-15-seanjc@google.com> Subject: [PATCH v2 14/20] KVM: selftests: Collect *all* dirty entries in each dirty_log_test iteration From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson 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). Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 149 ++++++------------- 1 file changed, 45 insertions(+), 104 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index fe8cc7f77e22..3a4e411353d7 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -134,7 +134,6 @@ static uint64_t host_num_pages; /* For statistics only */ static uint64_t host_dirty_count; static uint64_t host_clear_count; -static uint64_t host_track_next_count; /* Whether dirty ring reset is requested, or finished */ static sem_t sem_vcpu_stop; @@ -422,15 +421,6 @@ struct log_mode { }, }; -/* - * We use this bitmap to track some pages that should have its dirty - * bit set in the _next_ iteration. For example, if we detected the - * page value changed to current iteration but at the same time the - * page bit is cleared in the latest bitmap, then the system must - * report that write in the next get dirty log call. - */ -static unsigned long *host_bmap_track; - static void log_modes_dump(void) { int i; @@ -491,79 +481,52 @@ static void *vcpu_worker(void *data) return NULL; } -static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) +static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long **bmap) { uint64_t page, nr_dirty_pages = 0, nr_clean_pages = 0; uint64_t step = vm_num_host_pages(mode, 1); - uint64_t min_iter = 0; for (page = 0; page < host_num_pages; page += step) { uint64_t val = *(uint64_t *)(host_test_mem + page * host_page_size); + bool bmap0_dirty = __test_and_clear_bit_le(page, bmap[0]); - /* If this is a special page that we were tracking... */ - if (__test_and_clear_bit_le(page, host_bmap_track)) { - host_track_next_count++; - TEST_ASSERT(test_bit_le(page, bmap), - "Page %"PRIu64" should have its dirty bit " - "set in this iteration but it is missing", - page); - } - - if (__test_and_clear_bit_le(page, bmap)) { + /* + * Ensure both bitmaps are cleared, as a page can be written + * multiple times per iteration, i.e. can show up in both + * bitmaps, and the dirty ring is additive, i.e. doesn't purge + * bitmap entries from previous collections. + */ + if (__test_and_clear_bit_le(page, bmap[1]) || bmap0_dirty) { nr_dirty_pages++; /* - * If the bit is set, the value written onto - * the corresponding page should be either the - * previous iteration number or the current one. + * If the page is dirty, the value written to memory + * should be the current iteration number. */ - if (val == iteration || val == iteration - 1) + if (val == iteration) continue; if (host_log_mode == LOG_MODE_DIRTY_RING) { - if (val == iteration - 2 && min_iter <= iteration - 2) { - /* - * Short answer: this case is special - * only for dirty ring test where the - * page is the last page before a kvm - * dirty ring full in iteration N-2. - * - * Long answer: Assuming ring size R, - * one possible condition is: - * - * main thr vcpu thr - * -------- -------- - * iter=1 - * write 1 to page 0~(R-1) - * full, vmexit - * collect 0~(R-1) - * kick vcpu - * write 1 to (R-1)~(2R-2) - * full, vmexit - * iter=2 - * collect (R-1)~(2R-2) - * kick vcpu - * write 1 to (2R-2) - * (NOTE!!! "1" cached in cpu reg) - * write 2 to (2R-1)~(3R-3) - * full, vmexit - * iter=3 - * collect (2R-2)~(3R-3) - * (here if we read value on page - * "2R-2" is 1, while iter=3!!!) - * - * This however can only happen once per iteration. - */ - min_iter = iteration - 1; + /* + * The last page in the ring from this iteration + * or the previous can be written with the value + * from the previous iteration (relative to the + * last page's iteration), as the value to be + * written may be cached in a CPU register. + */ + if (page == dirty_ring_last_page || + page == dirty_ring_prev_iteration_last_page) continue; - } else if (page == dirty_ring_last_page || - page == dirty_ring_prev_iteration_last_page) { - /* - * Please refer to comments in - * dirty_ring_last_page. - */ - continue; - } + } else if (!val && iteration == 1 && bmap0_dirty) { + /* + * When testing get+clear, the dirty bitmap + * starts with all bits set, and so the first + * iteration can observe a "dirty" page that + * was never written, but only in the first + * bitmap (collecting the bitmap also clears + * all dirty pages). + */ + continue; } TEST_FAIL("Dirty page %lu value (%lu) != iteration (%lu) " @@ -574,36 +537,13 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long *bmap) nr_clean_pages++; /* * If cleared, the value written can be any - * value smaller or equals to the iteration - * number. Note that the value can be exactly - * (iteration-1) if that write can happen - * like this: - * - * (1) increase loop count to "iteration-1" - * (2) write to page P happens (with value - * "iteration-1") - * (3) get dirty log for "iteration-1"; we'll - * see that page P bit is set (dirtied), - * and not set the bit in host_bmap_track - * (4) increase loop count to "iteration" - * (which is current iteration) - * (5) get dirty log for current iteration, - * we'll see that page P is cleared, with - * value "iteration-1". + * value smaller than the iteration number. */ - TEST_ASSERT(val <= iteration, - "Clear page %lu value (%lu) > iteration (%lu) " + TEST_ASSERT(val < iteration, + "Clear page %lu value (%lu) >= iteration (%lu) " "(last = %lu, prev_last = %lu)", page, val, iteration, dirty_ring_last_page, dirty_ring_prev_iteration_last_page); - if (val == iteration) { - /* - * This page is _just_ modified; it - * should report its dirtyness in the - * next run - */ - __set_bit_le(page, host_bmap_track); - } } } @@ -639,7 +579,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) struct test_params *p = arg; struct kvm_vcpu *vcpu; struct kvm_vm *vm; - unsigned long *bmap; + unsigned long *bmap[2]; uint32_t ring_buf_idx = 0; int sem_val; @@ -695,8 +635,8 @@ static void run_test(enum vm_guest_mode mode, void *arg) pr_info("guest physical test memory offset: 0x%lx\n", guest_test_phys_mem); - bmap = bitmap_zalloc(host_num_pages); - host_bmap_track = bitmap_zalloc(host_num_pages); + bmap[0] = bitmap_zalloc(host_num_pages); + bmap[1] = bitmap_zalloc(host_num_pages); /* Add an extra memory slot for testing dirty logging */ vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, @@ -723,7 +663,6 @@ static void run_test(enum vm_guest_mode mode, void *arg) WRITE_ONCE(host_quit, false); host_dirty_count = 0; host_clear_count = 0; - host_track_next_count = 0; WRITE_ONCE(dirty_ring_vcpu_ring_full, false); /* @@ -774,7 +713,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) continue; log_mode_collect_dirty_pages(vcpu, TEST_MEM_SLOT_INDEX, - bmap, host_num_pages, + bmap[0], host_num_pages, &ring_buf_idx); } @@ -804,6 +743,9 @@ static void run_test(enum vm_guest_mode mode, void *arg) * the flush of the last page, and since we handle the last * page specially verification will succeed anyway. */ + log_mode_collect_dirty_pages(vcpu, TEST_MEM_SLOT_INDEX, + bmap[1], host_num_pages, + &ring_buf_idx); vm_dirty_log_verify(mode, bmap); /* @@ -824,12 +766,11 @@ static void run_test(enum vm_guest_mode mode, void *arg) pthread_join(vcpu_thread, NULL); - pr_info("Total bits checked: dirty (%"PRIu64"), clear (%"PRIu64"), " - "track_next (%"PRIu64")\n", host_dirty_count, host_clear_count, - host_track_next_count); + pr_info("Total bits checked: dirty (%lu), clear (%lu)\n", + host_dirty_count, host_clear_count); - free(bmap); - free(host_bmap_track); + free(bmap[0]); + free(bmap[1]); kvm_vm_free(vm); } From patchwork Sat Jan 11 00:29:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935653 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D11B18E1A for ; Sat, 11 Jan 2025 00:30:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555435; cv=none; b=pv0Whnbnk6dNeT0nnjTFXuYT4/AEV5i0VRYiZW2iRPjpyb2o397O+tSaBZ7gIaVQVpfKrNr8hKfNloEku5NOt2BfIFBFOpEU255WCYQEKLdBSvAQCRM2V7lOHyWn3OCVMM2qS2Y8z5V8dTVYmEZAYZ/4if0x5GFLSRPcpVKrjcg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555435; c=relaxed/simple; bh=ZYZYkEZZBfkKU2arptoaqJUAJlhMnndiUETqebZmKlU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=IiC0fmOzhKH28nWZAyOQRNVbV1GXuznuUZ3MfEtrzRYHJH1Lum5/Ql3wKNEyJ3LGTi0NHk2PFpSGsASAgZ5qJ+RFDE8xAiH74Ra1yLnud5qKinoRI87V4JzdSS7yaaAW7Vc0l75OM1eEZRCnBA0KzE9lr8gWkTCDLdR11veyDZk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=UfJjxmiW; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="UfJjxmiW" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ee8ced572eso4772487a91.0 for ; Fri, 10 Jan 2025 16:30:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555434; x=1737160234; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Tf3ai7YM4gD3aeEXOHvspZExdducxhbkAx/Bf8bRNDM=; b=UfJjxmiWO0FYNe/Rs+Cb3mNXgGFKr2OeCfzttcWyhvEuNN3U2FNUNilKy5WZjK4goj 3SO+sFB0E4YwzhQUR4E3DhM8cVDpd3ivC4NifqgflrcK5XpYR6HodAeTtDELDfIONuOP qsOHxQaAmxSgYLgN5sFia+MGP+ChmPCnuJWH0pLOX8H4knswX9148ylRhWG3UudpeyFn Btz5GHRMWsQz+ohVDwE6ndFn50ApQ+njd18kI2vtN74H+BfMTqaXbgYLhi1IpR1wmU6G PGCAIqMTy9UYW22GyelS+iRBd1Ck18SiM/IpHcqJZNuMfRWG0Em/ItLGBhr8ljLJfHIo 0z6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555434; x=1737160234; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Tf3ai7YM4gD3aeEXOHvspZExdducxhbkAx/Bf8bRNDM=; b=kzZ53wS10p2awMz3i40aHfU3OqrRIeSXEG6RC0txzVirZ+n+RPCglfmt9RMNYCf5r/ 5uot4+BSzOdqa9Cn8SCejVyJ2u2AC7m3UUK6LhCBUIFvi2j9pnWBZM2L1uuc1wJsgOLR 085wqBj4O1lLtyhLvuO5fs+Gv4D3rlIuawWnCZlfNCwz/tEhRfZdhyHtmjc9b2ZgsD0x IiB3t+6kwU2ipcnyt2SKcpm9u6QnIETo/5R0Et5roQPjI0qrTZXPpCCCVEoUoxGZk9f5 MbOM5h6qJPClSacJ4Zt2xyl/0qnM/ibRztRjeaEsHZJ0CMcjnCy0XV7Jzpx8jwYAVxs3 TVVQ== X-Gm-Message-State: AOJu0Yxgq6ybEiAhBF+0mtnZATMpZDe6lX7IDXPqJVI4LmR/SkjRjSye E95uk/kngMlmhb/iY4emhM8vBWFC2rUdNBIf8mHErpPA2Qj7ARgbMVvwN+xnHOBAUZAwEQet1HC XQQ== X-Google-Smtp-Source: AGHT+IEOfPzQKaiEZ+lOue6bQaGOCpx2jkMD63pcudGYIIJGaMpOLZezevh69lEqfxN5HF7M5FGj/Z6+bnQ= X-Received: from pjbsw3.prod.google.com ([2002:a17:90b:2c83:b0:2f4:3ea1:9033]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:258b:b0:2f4:4500:bb4d with SMTP id 98e67ed59e1d1-2f548eca081mr18398188a91.20.1736555433836; Fri, 10 Jan 2025 16:30:33 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:29:59 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-16-seanjc@google.com> Subject: [PATCH v2 15/20] KVM: sefltests: Verify value of dirty_log_test last page isn't bogus From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Add a sanity check that a completely garbage value wasn't written to the last dirty page in the ring, e.g. that it doesn't contain the *next* iteration's value. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 3a4e411353d7..500257b712e3 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -514,8 +514,9 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long **bmap) * last page's iteration), as the value to be * written may be cached in a CPU register. */ - if (page == dirty_ring_last_page || - page == dirty_ring_prev_iteration_last_page) + if ((page == dirty_ring_last_page || + page == dirty_ring_prev_iteration_last_page) && + val < iteration) continue; } else if (!val && iteration == 1 && bmap0_dirty) { /* From patchwork Sat Jan 11 00:30:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935654 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 135C51925AF for ; Sat, 11 Jan 2025 00:30:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555437; cv=none; b=TerQgd6k4Gz7Q3atTIkf12bVdZI1Nr9jaHqcsttoTS9Yg/rTRzr4fMXYTT8yL7A5U5Y+d3fMhaSkCZHI+kTU6THBKGIeCNdaBqgyttt67pdrO3rcpRLfNinEu83/wkK85LLmhf+xgBs/mk6BSK32TRbjdZJu42069V0a1cPRFKM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555437; c=relaxed/simple; bh=AG2lZf4hql7JMLlay7hN7O3/rUWAX62xZ3g4Ko5iqVo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ZBb4NBfRL7y7t2+4+Zb6bV438SIhbTYE/i1BtdWpHclF3D91WuS/JbQ5DbcdivKLAVidC6PZJOQYD9L+6gkG5BNLAn+2r+gwpseBa2Tey4Gm7O6qtpM8GNnIE9Gv5XpA9iHW89xmOA8CcUH3SmXOrtvoR8fI6TNoaa2QfrY10ow= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=M0R3cfMh; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="M0R3cfMh" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ef79403c5eso7421089a91.0 for ; Fri, 10 Jan 2025 16:30:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555435; x=1737160235; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=0OUonYd6niVAqGjD0N5fWlc8jzGx+15I7hWbB4QzxGw=; b=M0R3cfMhlmE14YNbW8aB0FBhglLBPHWoE6jWo95A13KOWjUHF03m7m0C/nvwvUiMYt ZBuyf0KG/TdBn3wYxJQubmTVra4/5VzGC4OOCm4Yy21ID04lID8CXmvlMZot+6g4ph9O uiV/+lRonqjCEqhT11N90Qt1MaH0Zm2vzWEqGhq04+4RhZNcWh4TIrjFaQkpcx8aZrCo hA3cEQsTVU4Cz/Tj/8qpPfbZr7q2XDfeH7cPgJT0MRFnlF2AGcXtLJYS1xo8nVLuUFms uHaCv0oi0paLo5yWjWsBfpRl+uTp3P1xYzpY3WLAbJczYbEIV53wpVs93cjxtTkbJjaq C7oQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555435; x=1737160235; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=0OUonYd6niVAqGjD0N5fWlc8jzGx+15I7hWbB4QzxGw=; b=wkjRh5AxsfGMNFvkIS6bb76HBRWliUBv6zS3bCi9SLddkOgZcd/nOO2S/5j1gM1Brg BwNcFsNRL43dQmyw7J8HzANDp5JG6EGbNZwdBFXdDcWQ3BjPG8FL+M++8mpbvC9yXnrX edU6B9L8HLdfi7IP7/z2sdwTy1STTpXDTw5cDthr6RsjmChXVf+Q4Tfwcc5x7S+RbWHb Vy9UgHWOqt0ylUWsffYK2ycWXgSPsJwZvGSrL6XDT1ABkicJkltEnwBvd8ami5w4dKzM jGcjA0uEoPYlfAJnKvcDkG2GHbyv2Vpwb5WqSbl1eP2TmPZC6KplxDF/5xRFEraO3vqy 1efA== X-Gm-Message-State: AOJu0Ywrajdsu3JvVWcZ/fpC3oOb8+JbvtGEtGP0AA/67hW365pcBbW/ D8RrFCEItI0AdGx5eMT5Ww4/dijB0ysY/LvATcuW2Sq3Cj3ZuTjlxHECmx/8TSD788DRnTXB1a9 NQw== X-Google-Smtp-Source: AGHT+IHFSCYgXbnt54jfk0NUzmZPGnmPTpWpi3a7iqhyPYh9Baj/SV5EmS29ezlCSBsaMsUOuiqMn1EdHXk= X-Received: from pjbsu14.prod.google.com ([2002:a17:90b:534e:b0:2e2:9f67:1ca3]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2808:b0:2ee:ab10:c187 with SMTP id 98e67ed59e1d1-2f548f598e1mr19787131a91.18.1736555435546; Fri, 10 Jan 2025 16:30:35 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:30:00 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-17-seanjc@google.com> Subject: [PATCH v2 16/20] KVM: selftests: Ensure guest writes min number of pages in dirty_log_test From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Ensure the vCPU fully completes at least one write in each dirty_log_test iteration, as failure to dirty any pages complicates verification and forces the test to be overly conservative about possible values. E.g. verification needs to allow the last dirty page from a previous iteration to have *any* value, because the vCPU could get stuck for multiple iterations, which is unlikely but can happen in heavily overloaded and/or nested virtualization setups. Somewhat arbitrarily set the minimum to 0x100/256; high enough to be interesting, but not so high as to lead to pointlessly long runtimes. Opportunistically report the number of writes per iteration for debug purposes, and so that a human can sanity check the test. Due to each write targeting a random page, the number of dirty pages will likely be lower than the number of total writes, but it shouldn't be absurdly lower (which would suggest the pRNG is broken) Reported-by: Maxim Levitsky Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 40 ++++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 500257b712e3..c6b843ec8e0c 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -37,6 +37,12 @@ /* Interval for each host loop (ms) */ #define TEST_HOST_LOOP_INTERVAL 10UL +/* + * Ensure the vCPU is able to perform a reasonable number of writes in each + * iteration to provide a lower bound on coverage. + */ +#define TEST_MIN_WRITES_PER_ITERATION 0x100 + /* Dirty bitmaps are always little endian, so we need to swap on big endian */ #if defined(__s390x__) # define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7) @@ -72,6 +78,7 @@ static uint64_t host_page_size; static uint64_t guest_page_size; static uint64_t guest_num_pages; static uint64_t iteration; +static uint64_t nr_writes; static bool vcpu_stop; /* @@ -107,6 +114,7 @@ static void guest_code(void) for (i = 0; i < guest_num_pages; i++) { addr = guest_test_virt_mem + i * guest_page_size; vcpu_arch_put_guest(*(uint64_t *)addr, READ_ONCE(iteration)); + nr_writes++; } #endif @@ -118,6 +126,7 @@ static void guest_code(void) addr = align_down(addr, host_page_size); vcpu_arch_put_guest(*(uint64_t *)addr, READ_ONCE(iteration)); + nr_writes++; } GUEST_SYNC(1); @@ -548,8 +557,8 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long **bmap) } } - pr_info("Iteration %2ld: dirty: %-6lu clean: %-6lu\n", - iteration, nr_dirty_pages, nr_clean_pages); + pr_info("Iteration %2ld: dirty: %-6lu clean: %-6lu writes: %-6lu\n", + iteration, nr_dirty_pages, nr_clean_pages, nr_writes); host_dirty_count += nr_dirty_pages; host_clear_count += nr_clean_pages; @@ -665,6 +674,8 @@ static void run_test(enum vm_guest_mode mode, void *arg) host_dirty_count = 0; host_clear_count = 0; WRITE_ONCE(dirty_ring_vcpu_ring_full, false); + WRITE_ONCE(nr_writes, 0); + sync_global_to_guest(vm, nr_writes); /* * Ensure the previous iteration didn't leave a dangling semaphore, i.e. @@ -683,10 +694,22 @@ static void run_test(enum vm_guest_mode mode, void *arg) dirty_ring_prev_iteration_last_page = dirty_ring_last_page; - /* Give the vcpu thread some time to dirty some pages */ - for (i = 0; i < p->interval; i++) { + /* + * Let the vCPU run beyond the configured interval until it has + * performed the minimum number of writes. This verifies the + * guest is making forward progress, e.g. isn't stuck because + * of a KVM bug, and puts a firm floor on test coverage. + */ + for (i = 0; i < p->interval || nr_writes < TEST_MIN_WRITES_PER_ITERATION; i++) { + /* + * Sleep in 1ms chunks to keep the interval math simple + * and so that the test doesn't run too far beyond the + * specified interval. + */ usleep(1000); + sync_global_from_guest(vm, nr_writes); + /* * Reap dirty pages while the guest is running so that * dirty ring full events are resolved, i.e. so that a @@ -737,6 +760,12 @@ static void run_test(enum vm_guest_mode mode, void *arg) WRITE_ONCE(vcpu_stop, false); sync_global_to_guest(vm, vcpu_stop); + /* + * Sync the number of writes performed before verification, the + * info will be printed along with the dirty/clean page counts. + */ + sync_global_from_guest(vm, nr_writes); + /* * NOTE: for dirty ring, it's possible that we didn't stop at * GUEST_SYNC but instead we stopped because ring is full; @@ -760,6 +789,9 @@ static void run_test(enum vm_guest_mode mode, void *arg) WRITE_ONCE(host_quit, true); sync_global_to_guest(vm, iteration); + WRITE_ONCE(nr_writes, 0); + sync_global_to_guest(vm, nr_writes); + WRITE_ONCE(dirty_ring_vcpu_ring_full, false); sem_post(&sem_vcpu_cont); From patchwork Sat Jan 11 00:30:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935655 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C8A1919342E for ; Sat, 11 Jan 2025 00:30:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555439; cv=none; b=M9nUiG1dUlwQxZCLlPre1Nz8ptmrh9su6sZsQ4aZ9xyOtacNjx8thdgWenU6XJQYo5tnR1L5QfNq3OB+4MlK42oI3kiXOCTEPR9+/JaFOJZiZz8Iywoyz7+iCXAsNyfr/Uip3osiIzcD+xwzURLRohPsElHnNRUbcodWWQDhv1U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555439; c=relaxed/simple; bh=ffKdnt6OQ9sJ5KUQQMoYl2zuIsgzofVRC0DeXLSAMvI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=WhqO2NPLHDfYu8OH3Z45gIbknbwMD/ASO6yJSGm2ZkMinpZUWMLJbPKO9OB2BqbAbtsH61ci4Iqn4tGJC2bhRQtbCmyn+7RHap++Xy7FxgbV5fpkpNxJl7seLeCcOKaPK7SOzrg81yJVacbd/Mek8lH4bAayJeKS23IPvWwNJdE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Q3IwUtbV; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Q3IwUtbV" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2166f9f52fbso79050835ad.2 for ; Fri, 10 Jan 2025 16:30:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555437; x=1737160237; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=lA1KJSr+vieulKkZ+q7IF2xXZKzzAMoWJFf8rW49CSw=; b=Q3IwUtbVZMGYOoCiXnz9xtr6SXB+NbL86bNN1xgufd5xC9/vTxKhrzvX9dVyNKSCl4 hXkHWrmcgw1VtGES3KmXocMCBGc/Rlf17+tEv2/RBpnP4U/nWVekqxw2b8eAromR1Ydt 8qjNe2ikYuZ8A1i/XJznVU8yb+h62wRkjemvPOlK2NXdsSo1JZBgX0MS0kJaxMMOEBqM HrTxij7fI5UY1DaSysFQp1eZy3O+1iKqUIDJ17d3e4CO/E7hfIz5jQ7Wv/G+/q9BQfET +TdhGW4MsipQxnl5A8t66ChKJEf1b7ayAvpzDf4unudITUbrwibFLstzu9g6HQnFnhTf GxUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555437; x=1737160237; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lA1KJSr+vieulKkZ+q7IF2xXZKzzAMoWJFf8rW49CSw=; b=TgKtQQeiTnXfHc7pT/kFN3o/SPtqff+fkqBvq3YP+fU6hK3IVxtXy5//rMeEzEUHup gCvA8Iitf6s0nybf1riMSWVrAQbGQD3yj3mDT0GGalNTQ+zYU38v4TVmcQrouQ4QsbvN 9MeTNV7/89hVAtuaMsZ63ETuMjxxwThrn6nWigdIZVRCEsWnPhVMGYVdg0TkT64VayFg fXnUnf5TRDKAZg9Di4IPxHZuw6O+S36us4zgPIKKmHfabw9CJN35deUhHOODwSus7HnZ holjafHUDMOVszH4FB8hGsdPD5+ZuaKoIZ3rXuPQj65XbVD6+avyzx0GVHRvYvfsdAbv A/cA== X-Gm-Message-State: AOJu0YzmkVPVqRM/375pfbts4ViHWrBqawM1ri+Oeh7bA9P5vzMobIOD YhfniQLi983LKfCq5J5TBWNApK3cpzjtYxhkVFrgIR0wQXrc2EjTlAmh0hAHnEZWzGY3j8oAJz1 UdA== X-Google-Smtp-Source: AGHT+IFdUmsiFredELwAhQ4qCYzXu5e+Jrsp000dNrYBVJ5QXSlgLrbjK9TLk3bbURHzIFEBProJ78YM0dY= X-Received: from plbmq14.prod.google.com ([2002:a17:902:fd4e:b0:21a:8476:ecc3]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d482:b0:215:b058:28a5 with SMTP id d9443c01a7336-21a83f52831mr168627105ad.18.1736555437233; Fri, 10 Jan 2025 16:30:37 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:30:01 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-18-seanjc@google.com> Subject: [PATCH v2 17/20] KVM: selftests: Tighten checks around prev iter's last dirty page in ring From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Now that each iteration collects all dirty entries and ensures the guest *completes* at least one write, tighten the exemptions for the last dirty page of the previous iteration. Specifically, the only legal value (other than the current iteration) is N-1. Unlike the last page for the current iteration, the in-progress write from the previous iteration is guaranteed to have completed, otherwise the test would have hung. Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 22 +++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index c6b843ec8e0c..e9854b5a28f1 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -517,14 +517,22 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long **bmap) if (host_log_mode == LOG_MODE_DIRTY_RING) { /* - * The last page in the ring from this iteration - * or the previous can be written with the value - * from the previous iteration (relative to the - * last page's iteration), as the value to be - * written may be cached in a CPU register. + * The last page in the ring from previous + * iteration can be written with the value + * from the previous iteration, as the value to + * be written may be cached in a CPU register. */ - if ((page == dirty_ring_last_page || - page == dirty_ring_prev_iteration_last_page) && + if (page == dirty_ring_prev_iteration_last_page && + val == iteration - 1) + continue; + + /* + * Any value from a previous iteration is legal + * for the last entry, as the write may not yet + * have retired, i.e. the page may hold whatever + * it had before this iteration started. + */ + if (page == dirty_ring_last_page && val < iteration) continue; } else if (!val && iteration == 1 && bmap0_dirty) { From patchwork Sat Jan 11 00:30:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935656 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9E1328F5B for ; Sat, 11 Jan 2025 00:30:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555441; cv=none; b=jg+1PrPNPkOQ+X6AlLl80HbaCyAkabvk6xEMpNgxoSzSRD17ddSrp77DPX7JtKdAJUrMq/wltNn+Le154uPPz6Ee/IWEG/7dEHoiUcgds7AkDZ9GYYCrHCqSBqf84FN3avMxj3nUnMWbfR95ZlV6cdtkWV+oq/Edr4JSCwTfkE8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555441; c=relaxed/simple; bh=L8D0b1+KiW9ahs+qBDC4G+scCazWGnThE6lO6mNZavo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=PJdLV4XLaf87We6rUeoMJmaK8cRj35WCGwZLYxsDnGTvJT3TsCpFq8XS3CoZRBEyrnej6+SnpZddNvbDp1drCJyRssZ5AdpjqddvKavuLUKvgjiSMJYegZb92XVorlfWapNdkGB3bJ7NI44m31QHunMSK5VnO1tE+mNW8ZSUy/0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Z5JrCNUY; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Z5JrCNUY" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2f5538a2356so4534759a91.2 for ; Fri, 10 Jan 2025 16:30:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555439; x=1737160239; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=S8bBOr0/HNvEyebC3bb/WW1HKqndMpC6/ffxTDW/jVI=; b=Z5JrCNUYFVEFwq0KZ9FlqZ1Om7cI+IF/5d+hW+8qXsVFOZ+bChU3rvLHzK7CJOaQev FffoTNa/ir12uQqJW92M3KtmyXIo9xkuSG64LGFTasxAAl0yS5UGVQ2J18bR0BFYfsc2 Vv4iSm7+XLcLqfz1fiSXYzrR+XGvPP43Yxd89NXMPPbIJhB6/w9jc8si3DAvsilOPFUT fVwXfcZXQpeCy3MoIU7YZxTl8ZcmKUAgTcNveUySCH4hU0hyKwb1JTTd8q9VBivnIGD+ kLYFDjSz5Gdm6byhtV7omiS4gTEfeDhVOJTUVYFz+hiy177VGPS36WiBy4i96y/gnFmb YGpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555439; x=1737160239; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=S8bBOr0/HNvEyebC3bb/WW1HKqndMpC6/ffxTDW/jVI=; b=jfhWQf8Cu/P+g+6VAvQm764lO6B76RKzFOQ4dWSX9WMXaQY5UoM4WIAtfThHT2xwsH iLvYfq8cjMbZRQOoXEcfb+uQQEb7Fn+vQoXsMzuUjxqSk3eklBfgQv0wByY6as39nbLk y3evD7UEyVankgaSP3X9955xMVD872DDExDSx9BuWhsUHsG/OVwVgZgGpZk5tbhdBr0C g0+co+adI/T/xAUOUzmalluYrHFagGGTGD9tH76n0x9f733mxSnxXbPllA5iFZijjdoM llSf9LTv2iR3SCLf12TQnBlKtVejdQFzp12FjzvVnDYYTnHpf+TFOvuniqKqcQeTkJxW anEA== X-Gm-Message-State: AOJu0YxOmux733HHcT2q/XKslqI7J4uFGl4bZ4B17q7dTLgAXRbA7JeJ uGKcaBzNTadmTit9Unor99IZQ1o3+4FRWftddh8BU+KTfoAwKv2TRyUNhchKtp2Qb27IokwA9vK Zlw== X-Google-Smtp-Source: AGHT+IG8OJ4cGazMV/P/Pm31Fw9xdVTCsOZDWRosn8YO8BNm6aYjr7+8IBYnSgIAeh1WsD1lcKtnyJmoRDE= X-Received: from pjbnd3.prod.google.com ([2002:a17:90b:4cc3:b0:2f4:432d:250c]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1348:b0:2ee:cb5c:6c with SMTP id 98e67ed59e1d1-2f548ee54ccmr15776191a91.22.1736555439070; Fri, 10 Jan 2025 16:30:39 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:30:02 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-19-seanjc@google.com> Subject: [PATCH v2 18/20] KVM: selftests: Set per-iteration variables at the start of each iteration From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Set the per-iteration variables at the start of each iteration instead of setting them before the loop, and at the end of each iteration. To ensure the vCPU doesn't race ahead before the first iteration, simply have the vCPU worker want for sem_vcpu_cont, which conveniently avoids the need to special case posting sem_vcpu_cont from the loop. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 43 ++++++++------------ 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index e9854b5a28f1..40567257ebea 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -481,6 +481,8 @@ static void *vcpu_worker(void *data) { struct kvm_vcpu *vcpu = data; + sem_wait(&sem_vcpu_cont); + while (!READ_ONCE(host_quit)) { /* Let the guest dirty the random pages */ vcpu_run(vcpu); @@ -675,15 +677,9 @@ static void run_test(enum vm_guest_mode mode, void *arg) sync_global_to_guest(vm, guest_test_virt_mem); sync_global_to_guest(vm, guest_num_pages); - /* Start the iterations */ - iteration = 1; - sync_global_to_guest(vm, iteration); - WRITE_ONCE(host_quit, false); host_dirty_count = 0; host_clear_count = 0; - WRITE_ONCE(dirty_ring_vcpu_ring_full, false); - WRITE_ONCE(nr_writes, 0); - sync_global_to_guest(vm, nr_writes); + WRITE_ONCE(host_quit, false); /* * Ensure the previous iteration didn't leave a dangling semaphore, i.e. @@ -695,12 +691,22 @@ static void run_test(enum vm_guest_mode mode, void *arg) sem_getvalue(&sem_vcpu_cont, &sem_val); TEST_ASSERT_EQ(sem_val, 0); + TEST_ASSERT_EQ(vcpu_stop, false); + pthread_create(&vcpu_thread, NULL, vcpu_worker, vcpu); - while (iteration < p->iterations) { + for (iteration = 1; iteration < p->iterations; iteration++) { unsigned long i; + sync_global_to_guest(vm, iteration); + + WRITE_ONCE(nr_writes, 0); + sync_global_to_guest(vm, nr_writes); + dirty_ring_prev_iteration_last_page = dirty_ring_last_page; + WRITE_ONCE(dirty_ring_vcpu_ring_full, false); + + sem_post(&sem_vcpu_cont); /* * Let the vCPU run beyond the configured interval until it has @@ -785,26 +791,11 @@ static void run_test(enum vm_guest_mode mode, void *arg) bmap[1], host_num_pages, &ring_buf_idx); vm_dirty_log_verify(mode, bmap); - - /* - * Set host_quit before sem_vcpu_cont in the final iteration to - * ensure that the vCPU worker doesn't resume the guest. As - * above, the dirty ring test may stop and wait even when not - * explicitly request to do so, i.e. would hang waiting for a - * "continue" if it's allowed to resume the guest. - */ - if (++iteration == p->iterations) - WRITE_ONCE(host_quit, true); - sync_global_to_guest(vm, iteration); - - WRITE_ONCE(nr_writes, 0); - sync_global_to_guest(vm, nr_writes); - - WRITE_ONCE(dirty_ring_vcpu_ring_full, false); - - sem_post(&sem_vcpu_cont); } + WRITE_ONCE(host_quit, true); + sem_post(&sem_vcpu_cont); + pthread_join(vcpu_thread, NULL); pr_info("Total bits checked: dirty (%lu), clear (%lu)\n", From patchwork Sat Jan 11 00:30:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935657 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C4B519CC1C for ; Sat, 11 Jan 2025 00:30:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555442; cv=none; b=WPIUccvzVGBS2BcfYwOxk1Yhtka1VpkH4lxVV9Xl/yjOr4cLYYUTvIo3HrGjBaBgDJ4Sy5/W16fdKUkv2gB8cWfE78KhfhH9lDL04XVqLDPvZpdsJ86TiWimQvSbk0lXb5sXA/P/uVbhMY3RbO1zBPuoD24B5qKibm96d0r7tGM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555442; c=relaxed/simple; bh=PsjCgtsdswqiLxYs85wIVANE9O6zvdBrqZFXA8iPzxA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=qyxVAV077dtFLyDq2IRaDac+labBU37wVHm1tQI7sH4xv2RN9YRKXnOAvn8mKjiNS1VDBaQoZ3R9CBgw3oK4NJx4emq6XK3XyMbVW+FdZnkdb4phm97xYPQwImrSSh2R1WjVXfMoLKyq9azgyWXycxNkigYaQQMVy1fHviw/iNE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=eeaGOH+B; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="eeaGOH+B" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2f46b7851fcso7396315a91.1 for ; Fri, 10 Jan 2025 16:30:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555440; x=1737160240; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=CTB969N3z4oSgV+Wd1f59dXC53zHA3ksCR5erFyv7TI=; b=eeaGOH+BFltafHSMS64WFiJUxn04s1sHRWbP4yhnWATCPsNwp4lrpf+eWRutbmoMXv zNp7GeFsxC5c2JJOYE/VS5kNNLeO6joMCJOl1S6kjGjqe0xjsvK8Xec2qxJgc816kJCy Kfy2x1pCtTfi4CV4gM+mD3jbIQetwHsZMCoB8CQcuAecKtxLjZKoZ3uz3cUIaSAnY5pG yA6fZo4B1yYh8Id4jeRckHiPlixZ0H947puWV2CYLx4R8NQ5hi7QOc2LebtCVnt4br/S NJVWXjhhnXWH727lT4u4JrwYgUWPSIvNZKDUtLuOeJ9BDnkIkbWYq3DGSpzug78NwgGt a6iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555441; x=1737160241; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=CTB969N3z4oSgV+Wd1f59dXC53zHA3ksCR5erFyv7TI=; b=kspa/58R7B+FPTDIxldfdFRJ+WnsU6/rN5kUB9ngSIOZ9Z3+OCMAFwpmqvPjg878KC kkGiG/x+frIGuPAMcWq/TXRIkHZHAd9cMmZfds9746D2iJYg9/I8sAWvbP913utFZ63O n/p1LGOE2Bm7tr5r/x721A9N9+J6jxTBPX28wpyCblnCn+mwp78hyszxottjU9KytA0n G1wJ5qbcmv/zzctbb1/2/Y10njJR6V9WyawADC8D6kdzyeKFbaHFDontZrKT9cP/baX4 OpbuBqEhgBgmY2QU6Pfuy2KsjhJMxR5IO15R6F+ge5eZ8OeqTiki6BxwU7gpSqFMuQa2 VDDg== X-Gm-Message-State: AOJu0YyGofkDSB0vMva0mkR0hEmyT2OdzT/3nqqXvQbrs02dBQ1PNL9N kEX3LgdrVNVeug/sR5cHN9gMtRDlFZ4NvFOxFmqO7ANPucNd/qOQM/puimHLf0nrkCWHubX9Pjq 3UA== X-Google-Smtp-Source: AGHT+IGvUD6mfMIH0QjQvbQ1pO3vfOtc0UNk2rtfvTC5l9ZKmUXTAlFim5JHKHRdjCL5vQj+KstFEZdygEk= X-Received: from pjbso18.prod.google.com ([2002:a17:90b:1f92:b0:2ef:701e:21c1]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4c88:b0:2ee:5958:828 with SMTP id 98e67ed59e1d1-2f548f2a01emr19478940a91.9.1736555440704; Fri, 10 Jan 2025 16:30:40 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:30:03 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-20-seanjc@google.com> Subject: [PATCH v2 19/20] KVM: selftests: Fix an off-by-one in the number of dirty_log_test iterations From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Actually run all requested iterations, instead of iterations-1 (the count starts at '1' due to the need to avoid '0' as an in-memory value for a dirty page). Reviewed-by: Maxim Levitsky Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 40567257ebea..79a7ee189f28 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -695,7 +695,7 @@ static void run_test(enum vm_guest_mode mode, void *arg) pthread_create(&vcpu_thread, NULL, vcpu_worker, vcpu); - for (iteration = 1; iteration < p->iterations; iteration++) { + for (iteration = 1; iteration <= p->iterations; iteration++) { unsigned long i; sync_global_to_guest(vm, iteration); From patchwork Sat Jan 11 00:30:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 13935658 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4D631A4AAA for ; Sat, 11 Jan 2025 00:30:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555444; cv=none; b=XMZfLytsUGvLHEOV02lPoGY9uKtGCxE4DrhFp408OLdqUWdQg+7IsxQkIt0iuUY/HeJclV6PH/gJPDpAd+CaMm9z9t/1kienesyAP6+zU15WRnKvdA3Zh02nJ+GzwI7YhZFHcVBHoVwasCB2qH4NRsuxPnlWS+CLLPyMtnaxjiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736555444; c=relaxed/simple; bh=CgCTnbjfFNnVKpFKwg84z0FvtEtLBmL4OxVK5kbQct8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dsO5BSkFAG2Q3i0ZkoF4tMGMu44mU+lMIRZcmxyq5asFxhm22xzvpApChMV7RpJLxnG7eZWffbEJMPunQI3sMtcJPCtMJTwooLsLjXJxen7OJRvS009SQDOIWlh+Zg+yuEr+Da7YTbFPiUHEwvZStIPn1EwhlpZ8k9N48HPmCk8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fE1zz00A; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fE1zz00A" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2ef9864e006so7379957a91.2 for ; Fri, 10 Jan 2025 16:30:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736555442; x=1737160242; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=ocaylAF5hSvVSunY3A5I2NKvvF78/qIR/+EQce5KeF0=; b=fE1zz00AV27g3pTM9/VarL6mXqUsbrhdMvhYYQP80cBk8n66CU6FKoAOenHXeSzt70 5dHUxttqZ2A2pVVqaR8PbP/WyHEEOb40KDmygp7n990SKrzlITOD4Kv1XLLlnldFfLHo 7hBop3NgUOv+W+3t8DKJ5ONp1/XP4I/dynB7D3ZYulCIoSlr8xtXI0s1vJxiPFhM1gRX Cyb5sSKmMbbc5xU9cb+odY3MpqtuyUjhAgaicqJ4YrYh34u+Q/2rCBYCsfwGgg88js43 Cn5i+hW0g1kMSOJKVun3vK93kvR5TLyMUX4Wy4fZyWihZNdQWgk1nB3ZcmA68mQTYL8L FThQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736555442; x=1737160242; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ocaylAF5hSvVSunY3A5I2NKvvF78/qIR/+EQce5KeF0=; b=bLIA5Z68b8H2X5yzGJTLQp7No5J69/Y7D4ynZw2/P0OXBUktNr329xMbV4npx0jepR axRC1uz9Gq3ng5nkGw5Cx7X1I1UW7aVGMaua51Gee2KomxmAuLdfEXqs3vJeN1OqrvQs yd80Kk2/JTq1n2VN6R6a9oNVFcDTPw4OjXBhWxGsH/monSZ5BWyV4nQxQAmkXMH0gTq3 ERJMVZliDVRD1iWEECq1Ey8kcQZohvoFkfeIk/4srj6Oqdtggr7B48+8DQSuevk/xlAn Yu07hzhkXw4isRy/6Nch020lUh1aYdBmKAJCWBnsSlgZvk1Q6nGWFIrTwdpq1zoIZODD hpTA== X-Gm-Message-State: AOJu0Yzti/P/tQm0P020Q3RxdKEvwrKThqKZApC/7wfVwiA5mVdSUBFm 0H2hhUbRG+0QRDsPmgswB3mk83UGn/FNOjDTkt92Fl9Y9QEHZ7qYbJxcmK5z8oyFBkDVcdmYO6D NQw== X-Google-Smtp-Source: AGHT+IGOOC+AbNNc0zQxpJQQyZielrn+6dpDffyNQ8EiCkz3fAyLcXYEPD0T1b2cpF01xoTFHd4VcJ7W2aI= X-Received: from pjbtb12.prod.google.com ([2002:a17:90b:53cc:b0:2ea:756d:c396]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2808:b0:2ee:ab10:c187 with SMTP id 98e67ed59e1d1-2f548f598e1mr19787698a91.18.1736555442230; Fri, 10 Jan 2025 16:30:42 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 10 Jan 2025 16:30:04 -0800 In-Reply-To: <20250111003004.1235645-1-seanjc@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250111003004.1235645-1-seanjc@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111003004.1235645-21-seanjc@google.com> Subject: [PATCH v2 20/20] KVM: selftests: Allow running a single iteration of dirty_log_test From: Sean Christopherson To: Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Xu , Maxim Levitsky , Sean Christopherson Now that dirty_log_test doesn't require running multiple iterations to verify dirty pages, and actually runs the requested number of iterations, drop the requirement that the test run at least "3" (which was really "2" at the time the test was written) iterations. Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/dirty_log_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c index 79a7ee189f28..23593d9eeba9 100644 --- a/tools/testing/selftests/kvm/dirty_log_test.c +++ b/tools/testing/selftests/kvm/dirty_log_test.c @@ -886,7 +886,7 @@ int main(int argc, char *argv[]) } } - TEST_ASSERT(p.iterations > 2, "Iterations must be greater than two"); + TEST_ASSERT(p.iterations > 0, "Iterations must be greater than zero"); TEST_ASSERT(p.interval > 0, "Interval must be greater than zero"); pr_info("Test iterations: %"PRIu64", interval: %"PRIu64" (ms)\n",