From: Chao Gao <chao.gao@intel.com>
To: xen-devel@lists.xen.org
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
Kevin Tian <kevin.tian@intel.com>,
Jun Nakajima <jun.nakajima@intel.com>,
Jan Beulich <jbeulich@suse.com>, Chao Gao <chao.gao@intel.com>
Subject: [PATCH v5 1/4] VT-d PI: track the number of vcpus on pi blocking list
Date: Wed, 16 Aug 2017 13:14:35 +0800 [thread overview]
Message-ID: <1502860478-84512-2-git-send-email-chao.gao@intel.com> (raw)
In-Reply-To: <1502860478-84512-1-git-send-email-chao.gao@intel.com>
This patch adds a field, counter, in struct vmx_pi_blocking_vcpu to track
how many entries are on the pi blocking list.
Signed-off-by: Chao Gao <chao.gao@intel.com>
---
v5:
- introduce two functions for adding or removing vcpus from pi blocking list.
- check the sanity of vcpu count on pi blocking list
v4:
- non-trace part of Patch 1 in v3
---
xen/arch/x86/hvm/vmx/vmx.c | 42 ++++++++++++++++++++++++++++++++----------
1 file changed, 32 insertions(+), 10 deletions(-)
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index 67fc85b..bf17988 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -83,6 +83,7 @@ static int vmx_vmfunc_intercept(struct cpu_user_regs *regs);
struct vmx_pi_blocking_vcpu {
struct list_head list;
spinlock_t lock;
+ unsigned int counter;
};
/*
@@ -100,6 +101,24 @@ void vmx_pi_per_cpu_init(unsigned int cpu)
spin_lock_init(&per_cpu(vmx_pi_blocking, cpu).lock);
}
+static void vmx_pi_add_vcpu(struct pi_blocking_vcpu *pbv,
+ struct vmx_pi_blocking_vcpu *vpbv)
+{
+ ASSERT(spin_is_locked(&vpbv->lock));
+ add_sized(&vpbv->counter, 1);
+ ASSERT(read_atomic(&vpbv->counter));
+ list_add_tail(&pbv->list, &vpbv->list);
+}
+
+static void vmx_pi_del_vcpu(struct pi_blocking_vcpu *pbv,
+ struct vmx_pi_blocking_vcpu *vpbv)
+{
+ ASSERT(spin_is_locked(&vpbv->lock));
+ ASSERT(read_atomic(&vpbv->counter));
+ list_del(&pbv->list);
+ add_sized(&vpbv->counter, -1);
+}
+
static void vmx_vcpu_block(struct vcpu *v)
{
unsigned long flags;
@@ -120,8 +139,8 @@ static void vmx_vcpu_block(struct vcpu *v)
*/
ASSERT(old_lock == NULL);
- list_add_tail(&v->arch.hvm_vmx.pi_blocking.list,
- &per_cpu(vmx_pi_blocking, v->processor).list);
+ vmx_pi_add_vcpu(&v->arch.hvm_vmx.pi_blocking,
+ &per_cpu(vmx_pi_blocking, v->processor));
spin_unlock_irqrestore(pi_blocking_list_lock, flags);
ASSERT(!pi_test_sn(pi_desc));
@@ -186,7 +205,9 @@ static void vmx_pi_unblock_vcpu(struct vcpu *v)
if ( v->arch.hvm_vmx.pi_blocking.lock != NULL )
{
ASSERT(v->arch.hvm_vmx.pi_blocking.lock == pi_blocking_list_lock);
- list_del(&v->arch.hvm_vmx.pi_blocking.list);
+ vmx_pi_del_vcpu(&v->arch.hvm_vmx.pi_blocking,
+ container_of(pi_blocking_list_lock,
+ struct vmx_pi_blocking_vcpu, lock));
v->arch.hvm_vmx.pi_blocking.lock = NULL;
}
@@ -234,7 +255,7 @@ void vmx_pi_desc_fixup(unsigned int cpu)
*/
if ( pi_test_on(&vmx->pi_desc) )
{
- list_del(&vmx->pi_blocking.list);
+ vmx_pi_del_vcpu(&vmx->pi_blocking, &per_cpu(vmx_pi_blocking, cpu));
vmx->pi_blocking.lock = NULL;
vcpu_unblock(container_of(vmx, struct vcpu, arch.hvm_vmx));
}
@@ -257,8 +278,9 @@ void vmx_pi_desc_fixup(unsigned int cpu)
write_atomic(&vmx->pi_desc.ndst,
x2apic_enabled ? dest : MASK_INSR(dest, PI_xAPIC_NDST_MASK));
- list_move(&vmx->pi_blocking.list,
- &per_cpu(vmx_pi_blocking, new_cpu).list);
+ vmx_pi_del_vcpu(&vmx->pi_blocking, &per_cpu(vmx_pi_blocking, cpu));
+ vmx_pi_add_vcpu(&vmx->pi_blocking, &per_cpu(vmx_pi_blocking,
+ new_cpu));
vmx->pi_blocking.lock = new_lock;
spin_unlock(new_lock);
@@ -2351,9 +2373,9 @@ static struct hvm_function_table __initdata vmx_function_table = {
static void pi_wakeup_interrupt(struct cpu_user_regs *regs)
{
struct arch_vmx_struct *vmx, *tmp;
- spinlock_t *lock = &per_cpu(vmx_pi_blocking, smp_processor_id()).lock;
- struct list_head *blocked_vcpus =
- &per_cpu(vmx_pi_blocking, smp_processor_id()).list;
+ unsigned int cpu = smp_processor_id();
+ spinlock_t *lock = &per_cpu(vmx_pi_blocking, cpu).lock;
+ struct list_head *blocked_vcpus = &per_cpu(vmx_pi_blocking, cpu).list;
ack_APIC_irq();
this_cpu(irq_count)++;
@@ -2369,7 +2391,7 @@ static void pi_wakeup_interrupt(struct cpu_user_regs *regs)
{
if ( pi_test_on(&vmx->pi_desc) )
{
- list_del(&vmx->pi_blocking.list);
+ vmx_pi_del_vcpu(&vmx->pi_blocking, &per_cpu(vmx_pi_blocking, cpu));
ASSERT(vmx->pi_blocking.lock == lock);
vmx->pi_blocking.lock = NULL;
vcpu_unblock(container_of(vmx, struct vcpu, arch.hvm_vmx));
--
1.8.3.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-08-16 5:14 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-16 5:14 [PATCH v5 0/4] mitigate the per-pCPU blocking list may be too long Chao Gao
2017-08-16 5:14 ` Chao Gao [this message]
2017-08-30 16:00 ` [PATCH v5 1/4] VT-d PI: track the number of vcpus on pi blocking list Jan Beulich
2017-08-30 22:57 ` Chao Gao
2017-08-31 7:42 ` Jan Beulich
2017-08-31 7:15 ` Chao Gao
2017-08-31 8:33 ` Jan Beulich
2017-08-31 7:53 ` Chao Gao
2017-09-01 1:39 ` Chao Gao
2017-09-01 8:24 ` Jan Beulich
2017-09-01 7:55 ` Chao Gao
2017-09-01 9:13 ` Jan Beulich
2017-09-01 8:37 ` Chao Gao
2017-09-01 9:55 ` Jan Beulich
2017-09-01 10:04 ` Jan Beulich
2017-08-16 5:14 ` [PATCH v5 2/4] x86/vcpu: track hvm vcpu number on the system Chao Gao
2017-08-16 5:14 ` [PATCH v5 3/4] VT-d PI: restrict the number of vcpus in a given pcpu's PI blocking list Chao Gao
2017-08-31 16:01 ` Jan Beulich
2017-08-16 5:14 ` [PATCH v5 4/4] xentrace: add support for HVM's PI blocking list operation Chao Gao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1502860478-84512-2-git-send-email-chao.gao@intel.com \
--to=chao.gao@intel.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=jun.nakajima@intel.com \
--cc=kevin.tian@intel.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).