|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 4/6] x86/irq: fix setting irq limits
On 30.06.2022 10:54, Roger Pau Monne wrote:
> Current code to calculate nr_irqs assumes the APIC destination mode to
> be physical, so all vectors on each possible CPU is available for use
> by a different interrupt source. This is not true when using Logical
> (Cluster) destination mode, where CPUs in the same cluster share the
> vector space.
>
> Fix by calculating the maximum Cluster ID and use it to derive the
> number of clusters in the system. Note the code assumes Cluster IDs to
> be contiguous, or else we will set nr_irqs to a number higher than the
> real amount of vectors (still not fatal).
While not fatal, it could be (pretty) wasteful. Iirc discontiguous
cluster numbers aren't unusual. It shouldn't be that difficult to
actually count clusters.
> The number of clusters is then used instead of the number of present
> CPUs when calculating the value of nr_irqs.
This takes care of x2APIC clustered mode, but leaves xAPIC flat mode
still as broken as before. vec_spaces should be 1 in that case,
shouldn't it?
> --- a/xen/arch/x86/include/asm/apic.h
> +++ b/xen/arch/x86/include/asm/apic.h
> @@ -27,6 +27,8 @@ enum apic_mode {
> extern bool iommu_x2apic_enabled;
> extern u8 apic_verbosity;
> extern bool directed_eoi_enabled;
> +extern uint16_t x2apic_max_cluster_id;
I don't see a need to use a fixed width type here; unsigned int will
be quite fine afaict (and be in line with ./CODING_STYLE). Or if you
want to save space, then it still would better be "unsigned short".
> @@ -199,6 +201,9 @@ static int MP_processor_info_x(struct
> mpc_config_processor *m,
> def_to_bigsmp = true;
> }
>
> + x2apic_max_cluster_id = max(x2apic_max_cluster_id,
> + (uint16_t)(apicid >> 4));
> +
> return cpu;
> }
I assume you don't mean to also account for hotplug CPUs? If so,
please add a respective statement to the description.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |