[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v1 19/28] x86/hvm: avic: enable SVM AVIC statistics reporting


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: dmukhin@xxxxxxxx
  • Date: Wed, 4 Nov 2026 17:33:36 -0800
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 148.163.138.245) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=ford.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=ford.com; dkim=pass (signature was verified) header.d=saarlouis.ford.com; dkim=pass (signature was verified) header.d=ford.com; arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wKwxSCddw3N6g1jdEGFy2Ei+Ah8bdjLIK81kbPqdH28=; b=PXaLOubTMpOkq+Oy8xsHEIQO3dhP29IVjSqmUUQzmGJ5nJ5xycT2THdVC/zLTg50S/mowrRL/rdqVlgxnA22aU4/z4mvgrm9QVAn1j+BCl4PbP1J+h9u1MrRGJhjZN4EMLQRLDiNqIQ9bIQurlPcuHhSaTrI6fdr6tArmZxtYHm0S/rW4s/GcGHxHzCyUNlUy1Q+oYQjqtcladBAa6U8LbW6I/lWpY4zZKACTbLuzzXWsKS/zrmDPOVIgG+4V2RTq4YxJ8r1xUcrTKxke58Nx/psk35ddBMdkQ1s2dl/sg0BWb4uCkT/Me5BXc51cVP+tlvyRzVqhhHFiSB/ALsZNw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qHzM4fuo69yaBHBcRKydFy04Tqna1brjS8wbPmhFtVPHO6iB2BWoGLgEKqPQFcOWIodEYe6DvOUO7vpu9rwnSE9FujOmzHbC112mCDY5DMBXGXjA00LxrQ1hQQRvp5B7TONlsH6mYEx4LxElC3gpOMUiIb4GFudBowW59zmnI6f34GGX7jEjAefLessjKpcn/knNnv8A/E1Ul8if7EBT1DxcTDSTyG4odQwjRsn1aLhr8UUDm9pUTNbWZ6FcBmyZ7pPjLeXunwDTFWncgJMShR5//6Z1G9P+C4piLml/b4yDFiazXOzc67/g1Zkmbbw92ajOWNVhNd8SU1B7Z+1GTw==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=ppford header.d=ford.com header.i="@ford.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=selector2-azureford-onmicrosoft-com header.d=azureford.onmicrosoft.com header.i="@azureford.onmicrosoft.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"; dkim=pass header.s=ppserprodsaar header.d=saarlouis.ford.com header.i="@saarlouis.ford.com" header.h="Cc:Content-Transfer-Encoding:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=ppfserpocford header.d=ford.com header.i="@ford.com" header.h="Cc:Content-Transfer-Encoding:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"
  • Cc: andrew.cooper3@xxxxxxxxxx, jason.andryuk@xxxxxxx, jbeulich@xxxxxxxx, roger@xxxxxxxxxxxxxx, teddy.astie@xxxxxxxxxx, dmukhin@xxxxxxx, Denis Mukhin <dmukhin@xxxxxxxx>
  • Delivery-date: Thu, 05 Nov 2026 01:35:05 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Pser-m365-app: SER-APP

From: Denis Mukhin <dmukhin@xxxxxxxx>

Introduce performance counters for AVIC.

Enable statistics reporing via new 'dump_posted_intr' mechanism.

Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
 xen/arch/x86/hvm/svm/avic.c              | 50 ++++++++++++++++++++++++
 xen/arch/x86/hvm/svm/avic.h              |  1 +
 xen/arch/x86/hvm/svm/svm.c               |  1 +
 xen/arch/x86/include/asm/hvm/svm-types.h |  5 +++
 4 files changed, 57 insertions(+)

diff --git a/xen/arch/x86/hvm/svm/avic.c b/xen/arch/x86/hvm/svm/avic.c
index 0bcab0465227..4dcd2c94ea87 100644
--- a/xen/arch/x86/hvm/svm/avic.c
+++ b/xen/arch/x86/hvm/svm/avic.c
@@ -201,6 +201,17 @@ static void avic_vcpu_enable(const struct vcpu *v, bool 
enable)
            v->domain->max_vcpus);
 }
 
+static void avic_stats_reset(struct vcpu *v)
+{
+    struct svm_vcpu *sv = &v->arch.hvm.svm;
+
+    memset(sv->avic_cnt_incomp_ipi, 0, sizeof(sv->avic_cnt_incomp_ipi));
+    sv->avic_cnt_noaccel = 0;
+    sv->avic_cnt_post_intr = 0;
+    sv->avic_cnt_doorbell = 0;
+    sv->avic_cnt_kick = 0;
+}
+
 int svm_avic_vmcb_create(struct vcpu *v)
 {
     struct domain *d = v->domain;
@@ -237,6 +248,8 @@ int svm_avic_vmcb_create(struct vcpu *v)
     ACCESS_ONCE(*sv->avic_physical_id) = entry;
     ACCESS_ONCE(sv->avic_shadow_id) = entry;
 
+    avic_stats_reset(v);
+
     avic_vcpu_enable(v, true);
 
     return 0;
@@ -380,6 +393,8 @@ void svm_avic_vmexit_incomp_ipi(struct cpu_user_regs *regs)
 
     BUG_ON(sv->avic_physical_id == NULL);
 
+    sv->avic_cnt_incomp_ipi[id]++;
+
     switch ( id )
     {
     case AVIC_IPI_FAILURE_INVALID_INT_TYPE:
@@ -627,6 +642,8 @@ void svm_avic_vmexit_noaccel(struct cpu_user_regs *regs)
     uint32_t offset = vmcb->exitinfo1 & AVIC_UNACCEL_ACCESS_OFFSET_MASK;
     uint32_t rw = (vmcb->exitinfo1 >> 32) & AVIC_UNACCEL_ACCESS_WRITE_MASK;
 
+    sv->avic_cnt_noaccel++;
+
     if ( is_svm_avic_vmexit_noaccel_trap(offset) )
     {
         /* Handle AVIC Trap (intercept right after the access). */
@@ -675,6 +692,8 @@ static void avic_deliver_posted_intr(struct vcpu *v)
         /* Ensure the pending interrupt wakes vCPU. */
         vcpu_unblock(v);
 
+        sv->avic_cnt_doorbell++;
+
         /*
          * AMD APM, 5.29.8.2 Doorbell Mechanism
          * The serializing semantics of WRMSR are relaxed when writing to
@@ -684,24 +703,55 @@ static void avic_deliver_posted_intr(struct vcpu *v)
     }
     else
     {
+        sv->avic_cnt_kick++;
+
         vcpu_kick(v);
     }
 }
 
 void cf_check svm_avic_hvm_deliver_posted_intr(struct vcpu *v, uint8_t vector)
 {
+    struct svm_vcpu *sv = &v->arch.hvm.svm;
+
     ASSERT(v != current);
 
     if ( svm_avic_vcpu_enabled(v) )
     {
+        sv->avic_cnt_post_intr++;
+
         avic_deliver_posted_intr(v);
     }
     else
     {
+        sv->avic_cnt_kick++;
+
         vcpu_kick(v);
     }
 }
 
+void cf_check svm_avic_hvm_dump_posted_intr(const struct vcpu *v)
+{
+    const struct svm_vcpu *sv = &v->arch.hvm.svm;
+
+    /* NB: Do not gate with svm_avic_vcpu_enabled() check for tests */
+    printk("%pv: AVIC: incomp_ipi = 
%"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64""
+                     " noaccel = %"PRIu64""
+                     " post_intr = %"PRIu64""
+                     " doorbell = %"PRIu64""
+                     " kick = %"PRIu64""
+                     "\n",
+           v,
+           sv->avic_cnt_incomp_ipi[AVIC_IPI_FAILURE_INVALID_INT_TYPE],
+           sv->avic_cnt_incomp_ipi[AVIC_IPI_FAILURE_TARGET_NOT_RUNNING],
+           sv->avic_cnt_incomp_ipi[AVIC_IPI_FAILURE_INVALID_TARGET],
+           sv->avic_cnt_incomp_ipi[AVIC_IPI_FAILURE_INVALID_BACKING_PAGE],
+           sv->avic_cnt_incomp_ipi[AVIC_IPI_FAILURE_INVALID_IPI_VECTOR],
+           sv->avic_cnt_noaccel,
+           sv->avic_cnt_post_intr,
+           sv->avic_cnt_doorbell,
+           sv->avic_cnt_kick);
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/xen/arch/x86/hvm/svm/avic.h b/xen/arch/x86/hvm/svm/avic.h
index 098924925e89..24d5fab59b29 100644
--- a/xen/arch/x86/hvm/svm/avic.h
+++ b/xen/arch/x86/hvm/svm/avic.h
@@ -33,5 +33,6 @@ void svm_avic_vcpu_switch_to(struct vcpu *v);
 void svm_avic_vcpu_switch_from(struct vcpu *v);
 
 void cf_check svm_avic_hvm_deliver_posted_intr(struct vcpu *v, uint8_t vector);
+void cf_check svm_avic_hvm_dump_posted_intr(const struct vcpu *v);
 
 #endif /* __SVM_AVIC_H__ */
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 2fac76725c4f..83977d411b0a 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -2519,6 +2519,7 @@ static void __init svm_avic_start(void)
         return;
 
     svm_function_table.deliver_posted_intr = svm_avic_hvm_deliver_posted_intr;
+    svm_function_table.dump_posted_intr = svm_avic_hvm_dump_posted_intr;
 
     svm_function_table.caps.virtual_intr_delivery = true;
 }
diff --git a/xen/arch/x86/include/asm/hvm/svm-types.h 
b/xen/arch/x86/include/asm/hvm/svm-types.h
index cc40b1b02095..ac411f781ed4 100644
--- a/xen/arch/x86/include/asm/hvm/svm-types.h
+++ b/xen/arch/x86/include/asm/hvm/svm-types.h
@@ -53,6 +53,11 @@ struct svm_vcpu {
     uint32_t avic_dfr;
     uint64_t *avic_physical_id;
     uint64_t avic_shadow_id;
+    uint64_t avic_cnt_incomp_ipi[AVIC_IPI_FAILURE_MAX];
+    uint64_t avic_cnt_noaccel;
+    uint64_t avic_cnt_post_intr;
+    uint64_t avic_cnt_doorbell;
+    uint64_t avic_cnt_kick;
 };
 
 struct nestedsvm {
-- 
2.55.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.