• Keir Fraser's avatar
    x86: eliminate hard-coded NR_IRQS · cf5e6f2d
    Keir Fraser authored
    ... splitting it into global nr_irqs (determined at boot time) and
    per- domain nr_pirqs (derived from nr_irqs and a possibly command line
    specified value, which probably should later become a per-domain
    config setting).
    This has the (desirable imo) side effect of reducing the size of
    struct hvm_irq_dpci from requiring an order-3 page to order-2 (on
    x86-64), which nevertheless still is too large.
    However, there is now a variable size bit array on the stack in
    pt_irq_time_out() - while for the moment this probably is okay, it
    certainly doesn't look nice. However, replacing this with a static
    (pre-)allocation also seems less than ideal, because that would
    require at least min(d->nr_pirqs, NR_VECTORS) bit arrays of
    d->nr_pirqs bits, since this bit array is used outside of the
    serialized code region in that function, and keeping the domain's
    event lock acquired across pirq_guest_eoi() doesn't look like a good
    idea either.
    The IRQ- and vector-indexed arrays hanging off struct hvm_irq_dpci
    could in fact be changed further to dynamically use the smaller of the
    two ranges for indexing, since there are other assumptions about a
    one-to-one relationship between IRQs and vectors here and elsewhere.
    Additionally, it seems to me that struct hvm_mirq_dpci_mapping's
    digl_list and gmsi fields could really be overlayed, which would yield
    significant savings since this structure gets always instanciated in
    form of d->nr_pirqs (as per the above could also be the smaller of
    this and NR_VECTORS) dimensioned arrays.
    Signed-off-by: default avatarJan Beulich <jbeulich@novell.com>
io.c 17.8 KB