|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/apic/x2apic: Share IRQ vector between cluster members only when no cpumask is specified
>>> Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> 07/31/17 10:03 PM >>>
>We have limited number (slightly under NR_DYNAMIC_VECTORS=192) of IRQ
>vectors that are available to each processor. Currently, when x2apic
>cluster mode is used (which is default), each vector is shared among
>all processors in the cluster. With many IRQs (as is the case on systems
>with multiple SR-IOV cards) and few clusters (e.g. single socket)
>there is a good chance that we will run out of vectors.
>
>This patch tries to decrease vector sharing between processors by
>assigning vector to a single processor if the assignment request (via
>__assign_irq_vector()) comes without explicitly specifying which
>processors are expected to share the interrupt. This typically happens
>during boot time (or possibly PCI hotplug) when create_irq(NUMA_NO_NODE)
>is called. When __assign_irq_vector() is called from
>set_desc_affinity() which provides sharing mask, vector sharing will
>continue to be performed, as before.
Wouldn't it be sufficient for people running into vector shortage due to
sharing to specify "x2apic_phys" on the command line?
>@@ -72,9 +73,13 @@ static void __init clustered_apic_check_x2apic(void)
>{
>}
>
>-static const cpumask_t *vector_allocation_cpumask_x2apic_cluster(int cpu)
>+static const cpumask_t *vector_allocation_cpumask_x2apic_cluster(int cpu,
>+ const cpumask_t *cpumask)
>{
>- return per_cpu(cluster_cpus, cpu);
>+ if ( cpumask != TARGET_CPUS )
Is a pointer comparison (rather than a content one) here really correct in
the general case?
>+ return per_cpu(cluster_cpus, cpu);
>+ else
>+ return cpumask_of(cpu);
Please avoid the "else" in cases like this.
>--- a/xen/include/asm-x86/mach-generic/mach_apic.h
>+++ b/xen/include/asm-x86/mach-generic/mach_apic.h
>@@ -13,10 +13,11 @@
>#define INT_DELIVERY_MODE (genapic->int_delivery_mode)
>#define INT_DEST_MODE (genapic->int_dest_mode)
>#define TARGET_CPUS (genapic->target_cpus())
>-#define init_apic_ldr (genapic->init_apic_ldr)
>-#define clustered_apic_check (genapic->clustered_apic_check)
>-#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
>-#define vector_allocation_cpumask(cpu)
>(genapic->vector_allocation_cpumask(cpu))
>+#define INIT_APIC_LDR (genapic->init_apic_ldr)
>+#define CLUSTERED_APIC_CHECK (genapic->clustered_apic_check)
>+#define CPU_MASK_TO_APICID (genapic->cpu_mask_to_apicid)
>+#define VECTOR_ALLOCATION_CPUMASK(cpu, mask) \
>+ (genapic->vector_allocation_cpumask(cpu, mask))
I don't see the connection of the change in case of all of these to the purpose
of this patch.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |