x86/irq: limit the maximum number of domain PIRQs

c/s 7e73a6e "have architectures specify the number of PIRQs a hardware domain
gets" increased the default number of pirqs for dom0, as 256 was found to be
too low in some cases.

However, it didn't account for the upper bound presented by the domains EOI
bitmap, registered with the PHYSDEVOP_pirq_eoi_gmfn_v* hypercall.

On a server with 240 cpus, Xen was observed to be attempting to clear the EOI
bit for dom0's pirq 0xb40f, which hit a pagefault.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Andrew Cooper authored and Jan Beulich committed 2015-05-22 10:13:04 +02:00
1 parent fbeef5570c
commit 75d28c9170
2 files changed
+10

No files matched your search

+4
View File
@@ -2614,6 +2614,10 @@ unsigned int arch_hwdom_irqs(domid_t domid)
if ( !domid )
n = min(n, dom0_max_vcpus());
n = min(nr_irqs_gsi + n * NR_DYNAMIC_VECTORS, nr_irqs);
/* Bounded by the domain pirq eoi bitmap gfn. */
n = min_t(unsigned int, n, PAGE_SIZE * BITS_PER_BYTE);
printk("Dom%d has maximum %u PIRQs\n", domid, n);
return n;
+6
View File
@@ -1073,13 +1073,19 @@ bool_t cpu_has_pending_apic_eoi(void)
static inline void set_pirq_eoi(struct domain *d, unsigned int irq)
{
if ( d->arch.pirq_eoi_map )
{
ASSERT(irq < PAGE_SIZE * BITS_PER_BYTE);
set_bit(irq, d->arch.pirq_eoi_map);
}
}
static inline void clear_pirq_eoi(struct domain *d, unsigned int irq)
{
if ( d->arch.pirq_eoi_map )
{
ASSERT(irq < PAGE_SIZE * BITS_PER_BYTE);
clear_bit(irq, d->arch.pirq_eoi_map);
}
}
static void set_eoi_ready(void *data);
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.