Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 93161
b: refs/heads/master
c: 229664b
h: refs/heads/master
i:
  93159: d5a8cc6
v: v3
  • Loading branch information
Jeremy Fitzhardinge authored and Ingo Molnar committed Apr 24, 2008
1 parent 0df56e2 commit b16005f
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ee8fa1c67f0b873a324960f0ca9fa1d7e49aa86b
refs/heads/master: 229664bee6126e01f8662976a5fe2e79813b77c8
46 changes: 30 additions & 16 deletions trunk/arch/x86/xen/events.c
Original file line number Diff line number Diff line change
Expand Up @@ -517,29 +517,43 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
int cpu = get_cpu();
struct shared_info *s = HYPERVISOR_shared_info;
struct vcpu_info *vcpu_info = __get_cpu_var(xen_vcpu);
unsigned long pending_words;
static DEFINE_PER_CPU(unsigned, nesting_count);
unsigned count;

vcpu_info->evtchn_upcall_pending = 0;
do {
unsigned long pending_words;

/* NB. No need for a barrier here -- XCHG is a barrier on x86. */
pending_words = xchg(&vcpu_info->evtchn_pending_sel, 0);
while (pending_words != 0) {
unsigned long pending_bits;
int word_idx = __ffs(pending_words);
pending_words &= ~(1UL << word_idx);
vcpu_info->evtchn_upcall_pending = 0;

while ((pending_bits = active_evtchns(cpu, s, word_idx)) != 0) {
int bit_idx = __ffs(pending_bits);
int port = (word_idx * BITS_PER_LONG) + bit_idx;
int irq = evtchn_to_irq[port];
if (__get_cpu_var(nesting_count)++)
goto out;

if (irq != -1) {
regs->orig_ax = ~irq;
do_IRQ(regs);
/* NB. No need for a barrier here -- XCHG is a barrier on x86. */
pending_words = xchg(&vcpu_info->evtchn_pending_sel, 0);
while (pending_words != 0) {
unsigned long pending_bits;
int word_idx = __ffs(pending_words);
pending_words &= ~(1UL << word_idx);

while ((pending_bits = active_evtchns(cpu, s, word_idx)) != 0) {
int bit_idx = __ffs(pending_bits);
int port = (word_idx * BITS_PER_LONG) + bit_idx;
int irq = evtchn_to_irq[port];

if (irq != -1) {
regs->orig_ax = ~irq;
do_IRQ(regs);
}
}
}
}

BUG_ON(!irqs_disabled());

count = __get_cpu_var(nesting_count);
__get_cpu_var(nesting_count) = 0;
} while(count != 1);

out:
put_cpu();
}

Expand Down

0 comments on commit b16005f

Please sign in to comment.