xen: Remove {nmi_pending,nmi_masked,paused} vcpu bitflags.

Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
kfraser@localhost.localdomain committed 2007-03-29 18:07:33 +01:00
1 parent 09c1cd6992
commit b5179d4756
13 files changed
+52 -81

No files matched your search

+7 -7
View File
@@ -445,18 +445,18 @@ static void do_nmi_stats(unsigned char key)
int i;
struct domain *d;
struct vcpu *v;
printk("CPU\tNMI\n");
for_each_cpu(i)
for_each_cpu ( i )
printk("%3d\t%3d\n", i, nmi_count(i));
if ((d = dom0) == NULL)
if ( ((d = dom0) == NULL) || ((v = d->vcpu[0]) == NULL) )
return;
if ((v = d->vcpu[0]) == NULL)
return;
if (v->vcpu_flags & (VCPUF_nmi_pending|VCPUF_nmi_masked))
if ( v->nmi_pending || v->nmi_masked )
printk("dom0 vpu0: NMI %s%s\n",
v->vcpu_flags & VCPUF_nmi_pending ? "pending " : "",
v->vcpu_flags & VCPUF_nmi_masked ? "masked " : "");
v->nmi_pending ? "pending " : "",
v->nmi_masked ? "masked " : "");
else
printk("dom0 vcpu0: NMI neither pending nor masked\n");
}
+1 -1
View File
@@ -1859,7 +1859,7 @@ static void nmi_dom0_report(unsigned int reason_idx)
set_bit(reason_idx, nmi_reason(d));
if ( !test_and_set_bit(_VCPUF_nmi_pending, &v->vcpu_flags) )
if ( !xchg(&v->nmi_pending, 1) )
raise_softirq(NMI_SOFTIRQ); /* not safe to wake up a vcpu here */
}
+2 -2
View File
@@ -68,8 +68,8 @@ void __dummy__(void)
OFFSET(VCPU_arch_guest_fpu_ctxt, struct vcpu, arch.guest_context.fpu_ctxt);
OFFSET(VCPU_flags, struct vcpu, vcpu_flags);
OFFSET(VCPU_nmi_addr, struct vcpu, nmi_addr);
DEFINE(_VCPUF_nmi_pending, _VCPUF_nmi_pending);
DEFINE(_VCPUF_nmi_masked, _VCPUF_nmi_masked);
OFFSET(VCPU_nmi_pending, struct vcpu, nmi_pending);
OFFSET(VCPU_nmi_masked, struct vcpu, nmi_masked);
DEFINE(_VGCF_failsafe_disables_events, _VGCF_failsafe_disables_events);
BLANK();
+7 -7
View File
@@ -232,8 +232,8 @@ test_all_events:
shl $IRQSTAT_shift,%eax
test %ecx,irq_stat(%eax,1)
jnz process_softirqs
btr $_VCPUF_nmi_pending,VCPU_flags(%ebx)
jc process_nmi
testb $1,VCPU_nmi_pending(%ebx)
jnz process_nmi
test_guest_events:
movl VCPU_vcpu_info(%ebx),%eax
testb $0xFF,VCPUINFO_upcall_mask(%eax)
@@ -259,11 +259,13 @@ process_softirqs:
ALIGN
process_nmi:
testb $1,VCPU_nmi_masked(%ebx)
jnz test_guest_events
movb $0,VCPU_nmi_pending(%ebx)
movl VCPU_nmi_addr(%ebx),%eax
test %eax,%eax
jz test_all_events
bts $_VCPUF_nmi_masked,VCPU_flags(%ebx)
jc 1f
jz test_guest_events
movb $1,VCPU_nmi_masked(%ebx)
sti
leal VCPU_trap_bounce(%ebx),%edx
movl %eax,TRAPBOUNCE_eip(%edx)
@@ -271,8 +273,6 @@ process_nmi:
movw $TBF_INTERRUPT,TRAPBOUNCE_flags(%edx)
call create_bounce_frame
jmp test_all_events
1: bts $_VCPUF_nmi_pending,VCPU_flags(%ebx)
jmp test_guest_events
bad_hypercall:
movl $-ENOSYS,UREGS_eax(%esp)
+1 -1
View File
@@ -218,7 +218,7 @@ unsigned long do_iret(void)
}
/* No longer in NMI context. */
clear_bit(_VCPUF_nmi_masked, &current->vcpu_flags);
current->nmi_masked = 0;
/* Restore upcall mask from supplied EFLAGS.IF. */
current->vcpu_info->evtchn_upcall_mask = !(eflags & X86_EFLAGS_IF);
+2 -2
View File
@@ -77,8 +77,8 @@ void __dummy__(void)
OFFSET(VCPU_arch_guest_fpu_ctxt, struct vcpu, arch.guest_context.fpu_ctxt);
OFFSET(VCPU_flags, struct vcpu, vcpu_flags);
OFFSET(VCPU_nmi_addr, struct vcpu, nmi_addr);
DEFINE(_VCPUF_nmi_pending, _VCPUF_nmi_pending);
DEFINE(_VCPUF_nmi_masked, _VCPUF_nmi_masked);
OFFSET(VCPU_nmi_pending, struct vcpu, nmi_pending);
OFFSET(VCPU_nmi_masked, struct vcpu, nmi_masked);
DEFINE(_VGCF_failsafe_disables_events, _VGCF_failsafe_disables_events);
DEFINE(_VGCF_syscall_disables_events, _VGCF_syscall_disables_events);
BLANK();
+7 -8
View File
@@ -87,8 +87,8 @@ ENTRY(compat_test_all_events)
leaq irq_stat(%rip),%rcx
testl $~0,(%rcx,%rax,1)
jnz compat_process_softirqs
btrq $_VCPUF_nmi_pending,VCPU_flags(%rbx)
jc compat_process_nmi
testb $1,VCPU_nmi_pending(%rbx)
jnz compat_process_nmi
compat_test_guest_events:
movq VCPU_vcpu_info(%rbx),%rax
testb $0xFF,COMPAT_VCPUINFO_upcall_mask(%rax)
@@ -116,11 +116,13 @@ compat_process_softirqs:
ALIGN
/* %rbx: struct vcpu */
compat_process_nmi:
testb $1,VCPU_nmi_masked(%rbx)
jnz compat_test_guest_events
movb $0,VCPU_nmi_pending(%rbx)
movl VCPU_nmi_addr(%rbx),%eax
testl %eax,%eax
jz compat_test_all_events
btsq $_VCPUF_nmi_masked,VCPU_flags(%rbx)
jc 1f
jz compat_test_guest_events
movb $1,VCPU_nmi_masked(%rbx)
sti
leaq VCPU_trap_bounce(%rbx),%rdx
movl %eax,TRAPBOUNCE_eip(%rdx)
@@ -128,9 +130,6 @@ compat_process_nmi:
movw $TBF_INTERRUPT,TRAPBOUNCE_flags(%rdx)
call compat_create_bounce_frame
jmp compat_test_all_events
1:
btsq $_VCPUF_nmi_pending,VCPU_flags(%rbx)
jmp compat_test_guest_events
compat_bad_hypercall:
movl $-ENOSYS,UREGS_rax(%rsp)
+1 -1
View File
@@ -118,7 +118,7 @@ unsigned int compat_iret(void)
regs->_esp += 16;
/* No longer in NMI context. */
clear_bit(_VCPUF_nmi_masked, &current->vcpu_flags);
current->nmi_masked = 0;
/* Restore upcall mask from supplied EFLAGS.IF. */
vcpu_info(current, evtchn_upcall_mask) = !(eflags & X86_EFLAGS_IF);
+7 -7
View File
@@ -177,8 +177,8 @@ test_all_events:
leaq irq_stat(%rip),%rcx
testl $~0,(%rcx,%rax,1)
jnz process_softirqs
btr $_VCPUF_nmi_pending,VCPU_flags(%rbx)
jc process_nmi
testb $1,VCPU_nmi_pending(%rbx)
jnz process_nmi
test_guest_events:
movq VCPU_vcpu_info(%rbx),%rax
testb $0xFF,VCPUINFO_upcall_mask(%rax)
@@ -204,19 +204,19 @@ process_softirqs:
ALIGN
/* %rbx: struct vcpu */
process_nmi:
testb $1,VCPU_nmi_masked(%rbx)
jnz test_guest_events
movb $0,VCPU_nmi_pending(%rbx)
movq VCPU_nmi_addr(%rbx),%rax
test %rax,%rax
jz test_all_events
bts $_VCPUF_nmi_masked,VCPU_flags(%rbx)
jc 1f
jz test_guest_events
movb $1,VCPU_nmi_masked(%rbx)
sti
leaq VCPU_trap_bounce(%rbx),%rdx
movq %rax,TRAPBOUNCE_eip(%rdx)
movw $TBF_INTERRUPT,TRAPBOUNCE_flags(%rdx)
call create_bounce_frame
jmp test_all_events
1: bts $_VCPUF_nmi_pending,VCPU_flags(%rbx)
jmp test_guest_events
bad_hypercall:
movq $-ENOSYS,UREGS_rax(%rsp)
+1 -1
View File
@@ -231,7 +231,7 @@ unsigned long do_iret(void)
}
/* No longer in NMI context. */
clear_bit(_VCPUF_nmi_masked, &current->vcpu_flags);
current->nmi_masked = 0;
/* Restore upcall mask from supplied EFLAGS.IF. */
vcpu_info(current, evtchn_upcall_mask) = !(iret_saved.rflags & EF_IE);
+5 -23
View File
@@ -95,7 +95,6 @@ struct vcpu *alloc_vcpu(
v->domain = d;
v->vcpu_id = vcpu_id;
spin_lock_init(&v->pause_lock);
v->runstate.state = is_idle_vcpu(v) ? RUNSTATE_running : RUNSTATE_offline;
v->runstate.state_entry_time = NOW();
@@ -407,40 +406,23 @@ void domain_destroy(struct domain *d)
call_rcu(&d->rcu, complete_domain_destroy);
}
static void vcpu_pause_setup(struct vcpu *v)
{
spin_lock(&v->pause_lock);
if ( v->pause_count++ == 0 )
set_bit(_VCPUF_paused, &v->vcpu_flags);
spin_unlock(&v->pause_lock);
}
void vcpu_pause(struct vcpu *v)
{
ASSERT(v != current);
vcpu_pause_setup(v);
atomic_inc(&v->pause_count);
vcpu_sleep_sync(v);
}
void vcpu_pause_nosync(struct vcpu *v)
{
vcpu_pause_setup(v);
atomic_inc(&v->pause_count);
vcpu_sleep_nosync(v);
}
void vcpu_unpause(struct vcpu *v)
{
int wake;
ASSERT(v != current);
spin_lock(&v->pause_lock);
wake = (--v->pause_count == 0);
if ( wake )
clear_bit(_VCPUF_paused, &v->vcpu_flags);
spin_unlock(&v->pause_lock);
if ( wake )
if ( atomic_dec_and_test(&v->pause_count) )
vcpu_wake(v);
}
@@ -507,9 +489,9 @@ int vcpu_reset(struct vcpu *v)
v->fpu_dirtied = 0;
v->is_polling = 0;
v->is_initialised = 0;
v->nmi_pending = 0;
v->nmi_masked = 0;
clear_bit(_VCPUF_blocked, &v->vcpu_flags);
clear_bit(_VCPUF_nmi_pending, &v->vcpu_flags);
clear_bit(_VCPUF_nmi_masked, &v->vcpu_flags);
out:
UNLOCK_BIGLOCK(v->domain);
+1 -1
View File
@@ -256,7 +256,7 @@ long register_guest_nmi_callback(unsigned long address)
* now.
*/
if ( arch_get_nmi_reason(d) != 0 )
set_bit(_VCPUF_nmi_pending, &v->vcpu_flags);
v->nmi_pending = 1;
#endif
return 0;
+10 -20
View File
@@ -110,11 +110,14 @@ struct vcpu
bool_t is_initialised;
/* Currently running on a CPU? */
bool_t is_running;
/* NMI callback pending for this VCPU? */
bool_t nmi_pending;
/* Avoid NMI reentry by allowing NMIs to be masked for short periods. */
bool_t nmi_masked;
unsigned long vcpu_flags;
spinlock_t pause_lock;
unsigned int pause_count;
atomic_t pause_count;
u16 virq_to_evtchn[NR_VIRQS];
@@ -440,31 +443,18 @@ extern struct domain *domain_list;
/* VCPU is offline. */
#define _VCPUF_down 1
#define VCPUF_down (1UL<<_VCPUF_down)
/* NMI callback pending for this VCPU? */
#define _VCPUF_nmi_pending 2
#define VCPUF_nmi_pending (1UL<<_VCPUF_nmi_pending)
/* Avoid NMI reentry by allowing NMIs to be masked for short periods. */
#define _VCPUF_nmi_masked 3
#define VCPUF_nmi_masked (1UL<<_VCPUF_nmi_masked)
/* VCPU is paused by the hypervisor? */
#define _VCPUF_paused 4
#define VCPUF_paused (1UL<<_VCPUF_paused)
/* VCPU is blocked awaiting an event to be consumed by Xen. */
#define _VCPUF_blocked_in_xen 5
#define _VCPUF_blocked_in_xen 2
#define VCPUF_blocked_in_xen (1UL<<_VCPUF_blocked_in_xen)
/* VCPU affinity has changed: migrating to a new CPU. */
#define _VCPUF_migrating 6
#define _VCPUF_migrating 3
#define VCPUF_migrating (1UL<<_VCPUF_migrating)
static inline int vcpu_runnable(struct vcpu *v)
{
return ( !(v->vcpu_flags &
( VCPUF_blocked |
VCPUF_down |
VCPUF_paused |
VCPUF_blocked_in_xen |
VCPUF_migrating )) &&
(atomic_read(&v->domain->pause_count) == 0) );
return (!v->vcpu_flags &&
!atomic_read(&v->pause_count) &&
!atomic_read(&v->domain->pause_count));
}
void vcpu_pause(struct vcpu *v);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.