|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 1/2] x86/IRQ: make max number of guests for a shared IRQ configurable
On 06.12.2020 18:43, Igor Druzhinin wrote:
> ... and increase the default to 16.
>
> Current limit of 7 is too restrictive for modern systems where one GSI
> could be shared by potentially many PCI INTx sources where each of them
> corresponds to a device passed through to its own guest. Some systems do not
> apply due dilligence in swizzling INTx links in case e.g. INTA is declared as
> interrupt pin for the majority of PCI devices behind a single router,
> resulting in overuse of a GSI.
>
> Introduce a new command line option to configure that limit and dynamically
> allocate an array of the necessary size. Set the default size now to 16 which
> is higher than 7 but could later be increased even more if necessary.
>
> Signed-off-by: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx>
> ---
>
> Changes in v2:
> - introduced a command line option as suggested
> - set initial default limit to 16
>
> Changes in v3:
> - changed option name to us - instead of _
> - used uchar instead of uint to utilize integer_param overflow handling logic
Which now means rather than saturating at UINT8_MAX you'll get
-EOVERFLOW. Just as a remark, not as a strict request to change
anything.
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -42,6 +42,10 @@ integer_param("nr_irqs", nr_irqs);
> int __read_mostly opt_irq_vector_map = OPT_IRQ_VECTOR_MAP_DEFAULT;
> custom_param("irq_vector_map", parse_irq_vector_map_param);
>
> +/* Max number of guests IRQ could be shared with */
> +static unsigned char __read_mostly irq_max_guests;
> +integer_param("irq-max-guests", irq_max_guests);
There's an implied assumption now that sizeof(irq_max_guests)
<= sizeof_field(irq_guest_action_t, nr_guests). Sadly a
respective BUILD_BUG_ON() can't ...
> @@ -435,6 +439,9 @@ int __init init_irq_data(void)
> for ( ; irq < nr_irqs; irq++ )
> irq_to_desc(irq)->irq = irq;
>
> + if ( !irq_max_guests )
> + irq_max_guests = 16;
... go here, because the type gets defined only ...
> @@ -1028,7 +1035,6 @@ int __init setup_irq(unsigned int irq, unsigned int
> irqflags,
> * HANDLING OF GUEST-BOUND PHYSICAL IRQS
> */
>
> -#define IRQ_MAX_GUESTS 7
> typedef struct {
> u8 nr_guests;
> u8 in_flight;
> @@ -1039,7 +1045,7 @@ typedef struct {
> #define ACKTYPE_EOI 2 /* EOI on the CPU that was interrupted */
> cpumask_var_t cpu_eoi_map; /* CPUs that need to EOI this interrupt */
> struct timer eoi_timer;
> - struct domain *guest[IRQ_MAX_GUESTS];
> + struct domain *guest[];
> } irq_guest_action_t;
... here. The only later __init function is setup_dump_irqs(), so
it could be put there or in a new build_assertions() one.
> @@ -1633,11 +1640,12 @@ int pirq_guest_bind(struct vcpu *v, struct pirq
> *pirq, int will_share)
> goto retry;
> }
>
> - if ( action->nr_guests == IRQ_MAX_GUESTS )
> + if ( action->nr_guests == irq_max_guests )
> {
> - printk(XENLOG_G_INFO "Cannot bind IRQ%d to dom%d. "
> - "Already at max share.\n",
> - pirq->pirq, v->domain->domain_id);
> + printk(XENLOG_G_INFO
> + "Cannot bind IRQ%d to dom%pd: already at max share %u ",
> + pirq->pirq, v->domain, irq_max_guests);
> + printk("(increase with irq-max-guests= option)\n");
Now two separate printk()s are definitely worse. Then putting the
part of the format string inside the parentheses on a separate line
would still be better (and perhaps a sensible compromise with the
grep-ability desire).
With suitable adjustments, which I'd be okay making while committing
as long as you agree,
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |