• Thomas Gleixner's avatar
    x86/vector: Use matrix allocator for vector assignment · 69cde000
    Thomas Gleixner authored
    Replace the magic vector allocation code by a simple bitmap matrix
    allocator. This avoids loops and hoops over CPUs and vector arrays, so in
    case of densly used vector spaces it's way faster.
    
    This also gets rid of the magic 'spread the vectors accross priority
    levels' heuristics in the current allocator:
    
    The comment in __asign_irq_vector says:
    
       * NOTE! The local APIC isn't very good at handling
       * multiple interrupts at the same interrupt level.
       * As the interrupt level is determined by taking the
       * vector number and shifting that right by 4, we
       * want to spread these out a bit so that they don't
       * all fall in the same interrupt level.                         
    
    After doing some palaeontological research the following was found the
    following in the PPro Developer Manual Volume 3:
    
         "7.4.2. Valid Interrupts
    
         The local and I/O APICs support 240 distinct vectors in the range of 16
         to 255. Interrupt priority is implied by its vector, according to the
         following relationship: priority = vector / 16
    
         One is the lowest priority and 15 is the highest. Vectors 16 through
         31 are reserved for exclusive use by the processor. The remaining
         vectors are for general use. The processor's local APIC includes an
         in-service entry and a holding entry for each priority level. To avoid
         losing inter- rupts, software should allocate no more than 2 interrupt
         vectors per priority."
    
    The current SDM tells nothing about that, instead it states:
    
         "If more than one interrupt is generated with the same vector number,
          the local APIC can set the bit for the vector both in the IRR and the
          ISR. This means that for the Pentium 4 and Intel Xeon processors, the
          IRR and ISR can queue two interrupts for each interrupt vector: one
          in the IRR and one in the ISR. Any additional interrupts issued for
          the same interrupt vector are collapsed into the single bit in the
          IRR.
    
          For the P6 family and Pentium processors, the IRR and ISR registers
          can queue no more than two interrupts per interrupt vector and will
          reject other interrupts that are received within the same vector."
    
       Which means, that on P6/Pentium the APIC will reject a new message and
       tell the sender to retry, which increases the load on the APIC bus and
       nothing more.
    
    There is no affirmative answer from Intel on that, but it's a sane approach
    to remove that for the following reasons:
    
        1) No other (relevant Open Source) operating systems bothers to
           implement this or mentiones this at all.
    
        2) The current allocator has no enforcement for this and especially the
           legacy interrupts, which are the main source of interrupts on these
           P6 and older systmes, are allocated linearly in the same priority
           level and just work.
    
        3) The current machines have no problem with that at all as verified
           with some experiments.
    
        4) AMD at least confirmed that such an issue is unknown.
    
        5) P6 and older are dinosaurs almost 20 years EOL, so there is really
           no reason to worry about that too much.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarJuergen Gross <jgross@suse.com>
    Tested-by: default avatarYu Chen <yu.c.chen@intel.com>
    Acked-by: default avatarJuergen Gross <jgross@suse.com>
    Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Cc: Alok Kataria <akataria@vmware.com>
    Cc: Joerg Roedel <joro@8bytes.org>
    Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Rui Zhang <rui.zhang@intel.com>
    Cc: "K. Y. Srinivasan" <kys@microsoft.com>
    Cc: Arjan van de Ven <arjan@linux.intel.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Len Brown <lenb@kernel.org>
    Link: https://lkml.kernel.org/r/20170913213155.443678104@linutronix.de
    69cde000
vector.c 23.9 KB