• Marc Zyngier's avatar
    KVM: arm64: vgic-v3: Reduce common group trapping to ICV_DIR_EL1 when possible · 0924729b
    Marc Zyngier authored
    On systems that advertise ICH_VTR_EL2.SEIS, we trap all GICv3 sysreg
    accesses from the guest. From a performance perspective, this is OK
    as long as the guest doesn't hammer the GICv3 CPU interface.
    
    In most cases, this is fine, unless the guest actively uses
    priorities and switches PMR_EL1 very often. Which is exactly what
    happens when a Linux guest runs with irqchip.gicv3_pseudo_nmi=1.
    In these condition, the performance plumets as we hit PMR each time
    we mask/unmask interrupts. Not good.
    
    There is however an opportunity for improvement. Careful reading
    of the architecture specification indicates that the only GICv3
    sysreg belonging to the common group (which contains the SGI
    registers, PMR, DIR, CTLR and RPR) that is allowed to generate
    a SError is DIR. Everything else is safe.
    
    It is thus possible to substitute the trapping of all the common
    group with just that of DIR if it supported by the implementation.
    Yes, that's yet another optional bit of the architecture.
    So let's just do that, as it leads to some impressive result on
    the M1:
    
    Without this change:
    	bash-5.1# /host/home/maz/hackbench 100 process 1000
    	Running with 100*40 (== 4000) tasks.
    	Time: 56.596
    
    With this change:
    	bash-5.1# /host/home/maz/hackbench 100 process 1000
    	Running with 100*40 (== 4000) tasks.
    	Time: 8.649
    
    which is a pretty convincing result.
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Reviewed-by: default avatarAlexandru Elisei <alexandru.elisei@arm.com>
    Link: https://lore.kernel.org/r/20211010150910.2911495-4-maz@kernel.org
    0924729b
sysreg.h 44.1 KB