EXPORT_SYMBOL(force_evtchn_callback);
static DEFINE_PER_CPU(unsigned int, upcall_count) = { 0 };
+static DEFINE_PER_CPU(unsigned int, last_processed_l1i) = { BITS_PER_LONG - 1 };
+static DEFINE_PER_CPU(unsigned int, last_processed_l2i) = { BITS_PER_LONG - 1 };
/* NB. Interrupts are disabled on entry. */
asmlinkage void evtchn_do_upcall(struct pt_regs *regs)
unsigned long l1, l2;
unsigned long masked_l1, masked_l2;
unsigned int l1i, l2i, port, count;
- static unsigned int last_processed_l1i = BITS_PER_LONG - 1, last_processed_l2i = BITS_PER_LONG - 1;
int irq, cpu = smp_processor_id();
shared_info_t *s = HYPERVISOR_shared_info;
vcpu_info_t *vcpu_info = &s->vcpu_info[cpu];
#endif
l1 = xchg(&vcpu_info->evtchn_pending_sel, 0);
- l1i = last_processed_l1i;
- l2i = last_processed_l2i;
+ l1i = per_cpu(last_processed_l1i, cpu);
+ l2i = per_cpu(last_processed_l2i, cpu);
while (l1 != 0) {
}
/* if this is the final port processed, we'll pick up here+1 next time */
- last_processed_l1i = l1i;
- last_processed_l2i = l2i;
+ per_cpu(last_processed_l1i, cpu) = l1i;
+ per_cpu(last_processed_l2i, cpu) = l2i;
} while (l2i != BITS_PER_LONG - 1);