[PATCH] KVM: arm/arm64: The GIC is dead, long live the GIC
Christoffer Dall
christoffer.dall at linaro.org
Sun Jul 3 14:10:04 PDT 2016
Hi Marc,
On Fri, Jul 01, 2016 at 06:38:33PM +0100, Marc Zyngier wrote:
> I don't think any single piece of the KVM/ARM code ever generated
> as much hatred as the GIC emulation.
>
> It was written by someone who had zero experience in modeling
> hardware (me), was riddled with design flaws, should have been
> scrapped and rewritten from scratch long before having a remote
> chance of reaching mainline, and yet we supported it for a good
> three years. No need to mention the names of those who suffered,
> the git log is singing their praises.
>
> Thankfully, we now have a much more maintainable implementation,
> and we can safely put the grumpy old GIC to rest.
>
> Fellow hackers, please raise your glass in memory of the GIC:
>
> The GIC is dead, long live the GIC!
Hear hear!
Applied to queue.
Thanks,
-Christoffer
>
> Signed-off-by: Marc Zyngier <marc.zyngier at arm.com>
> ---
> arch/arm/kvm/Kconfig | 7 -
> arch/arm/kvm/Makefile | 6 -
> arch/arm64/kvm/Kconfig | 7 -
> arch/arm64/kvm/Makefile | 8 -
> include/kvm/{vgic/vgic.h => arm_vgic.h} | 6 +-
> virt/kvm/arm/hyp/vgic-v2-sr.c | 15 +-
> virt/kvm/arm/vgic-v2-emul.c | 856 -----------
> virt/kvm/arm/vgic-v2.c | 274 ----
> virt/kvm/arm/vgic-v3-emul.c | 1074 --------------
> virt/kvm/arm/vgic-v3.c | 279 ----
> virt/kvm/arm/vgic.c | 2440 -------------------------------
> virt/kvm/arm/vgic.h | 140 --
> 12 files changed, 7 insertions(+), 5105 deletions(-)
> rename include/kvm/{vgic/vgic.h => arm_vgic.h} (98%)
> delete mode 100644 virt/kvm/arm/vgic-v2-emul.c
> delete mode 100644 virt/kvm/arm/vgic-v2.c
> delete mode 100644 virt/kvm/arm/vgic-v3-emul.c
> delete mode 100644 virt/kvm/arm/vgic-v3.c
> delete mode 100644 virt/kvm/arm/vgic.c
> delete mode 100644 virt/kvm/arm/vgic.h
>
> diff --git a/arch/arm/kvm/Kconfig b/arch/arm/kvm/Kconfig
> index 02abfff..95a0005 100644
> --- a/arch/arm/kvm/Kconfig
> +++ b/arch/arm/kvm/Kconfig
> @@ -46,13 +46,6 @@ config KVM_ARM_HOST
> ---help---
> Provides host support for ARM processors.
>
> -config KVM_NEW_VGIC
> - bool "New VGIC implementation"
> - depends on KVM
> - default y
> - ---help---
> - uses the new VGIC implementation
> -
> source drivers/vhost/Kconfig
>
> endif # VIRTUALIZATION
> diff --git a/arch/arm/kvm/Makefile b/arch/arm/kvm/Makefile
> index a596b58..5e28df8 100644
> --- a/arch/arm/kvm/Makefile
> +++ b/arch/arm/kvm/Makefile
> @@ -22,7 +22,6 @@ obj-y += kvm-arm.o init.o interrupts.o
> obj-y += arm.o handle_exit.o guest.o mmu.o emulate.o reset.o
> obj-y += coproc.o coproc_a15.o coproc_a7.o mmio.o psci.o perf.o
>
> -ifeq ($(CONFIG_KVM_NEW_VGIC),y)
> obj-y += $(KVM)/arm/vgic/vgic.o
> obj-y += $(KVM)/arm/vgic/vgic-init.o
> obj-y += $(KVM)/arm/vgic/vgic-irqfd.o
> @@ -30,9 +29,4 @@ obj-y += $(KVM)/arm/vgic/vgic-v2.o
> obj-y += $(KVM)/arm/vgic/vgic-mmio.o
> obj-y += $(KVM)/arm/vgic/vgic-mmio-v2.o
> obj-y += $(KVM)/arm/vgic/vgic-kvm-device.o
> -else
> -obj-y += $(KVM)/arm/vgic.o
> -obj-y += $(KVM)/arm/vgic-v2.o
> -obj-y += $(KVM)/arm/vgic-v2-emul.o
> -endif
> obj-y += $(KVM)/arm/arch_timer.o
> diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig
> index c4f26ef..aa2e34e 100644
> --- a/arch/arm64/kvm/Kconfig
> +++ b/arch/arm64/kvm/Kconfig
> @@ -54,13 +54,6 @@ config KVM_ARM_PMU
> Adds support for a virtual Performance Monitoring Unit (PMU) in
> virtual machines.
>
> -config KVM_NEW_VGIC
> - bool "New VGIC implementation"
> - depends on KVM
> - default y
> - ---help---
> - uses the new VGIC implementation
> -
> source drivers/vhost/Kconfig
>
> endif # VIRTUALIZATION
> diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
> index a7a958c..f00b2cd 100644
> --- a/arch/arm64/kvm/Makefile
> +++ b/arch/arm64/kvm/Makefile
> @@ -20,7 +20,6 @@ kvm-$(CONFIG_KVM_ARM_HOST) += emulate.o inject_fault.o regmap.o
> kvm-$(CONFIG_KVM_ARM_HOST) += hyp.o hyp-init.o handle_exit.o
> kvm-$(CONFIG_KVM_ARM_HOST) += guest.o debug.o reset.o sys_regs.o sys_regs_generic_v8.o
>
> -ifeq ($(CONFIG_KVM_NEW_VGIC),y)
> kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic.o
> kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-init.o
> kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-irqfd.o
> @@ -30,12 +29,5 @@ kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-mmio.o
> kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-mmio-v2.o
> kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-mmio-v3.o
> kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-kvm-device.o
> -else
> -kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic.o
> -kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic-v2.o
> -kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic-v2-emul.o
> -kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic-v3.o
> -kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic-v3-emul.o
> -endif
> kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/arch_timer.o
> kvm-$(CONFIG_KVM_ARM_PMU) += $(KVM)/arm/pmu.o
> diff --git a/include/kvm/vgic/vgic.h b/include/kvm/arm_vgic.h
> similarity index 98%
> rename from include/kvm/vgic/vgic.h
> rename to include/kvm/arm_vgic.h
> index 3fbd175..1264037 100644
> --- a/include/kvm/vgic/vgic.h
> +++ b/include/kvm/arm_vgic.h
> @@ -13,8 +13,8 @@
> * You should have received a copy of the GNU General Public License
> * along with this program. If not, see <http://www.gnu.org/licenses/>.
> */
> -#ifndef __ASM_ARM_KVM_VGIC_VGIC_H
> -#define __ASM_ARM_KVM_VGIC_VGIC_H
> +#ifndef __KVM_ARM_VGIC_H
> +#define __KVM_ARM_VGIC_H
>
> #include <linux/kernel.h>
> #include <linux/kvm.h>
> @@ -243,4 +243,4 @@ static inline int kvm_vgic_get_max_vcpus(void)
> return kvm_vgic_global_state.max_gic_vcpus;
> }
>
> -#endif /* __ASM_ARM_KVM_VGIC_VGIC_H */
> +#endif /* __KVM_ARM_VGIC_H */
> diff --git a/virt/kvm/arm/hyp/vgic-v2-sr.c b/virt/kvm/arm/hyp/vgic-v2-sr.c
> index 3a3a699..7cffd93 100644
> --- a/virt/kvm/arm/hyp/vgic-v2-sr.c
> +++ b/virt/kvm/arm/hyp/vgic-v2-sr.c
> @@ -21,18 +21,11 @@
>
> #include <asm/kvm_hyp.h>
>
> -#ifdef CONFIG_KVM_NEW_VGIC
> -extern struct vgic_global kvm_vgic_global_state;
> -#define vgic_v2_params kvm_vgic_global_state
> -#else
> -extern struct vgic_params vgic_v2_params;
> -#endif
> -
> static void __hyp_text save_maint_int_state(struct kvm_vcpu *vcpu,
> void __iomem *base)
> {
> struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2;
> - int nr_lr = (kern_hyp_va(&vgic_v2_params))->nr_lr;
> + int nr_lr = (kern_hyp_va(&kvm_vgic_global_state))->nr_lr;
> u32 eisr0, eisr1;
> int i;
> bool expect_mi;
> @@ -74,7 +67,7 @@ static void __hyp_text save_maint_int_state(struct kvm_vcpu *vcpu,
> static void __hyp_text save_elrsr(struct kvm_vcpu *vcpu, void __iomem *base)
> {
> struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2;
> - int nr_lr = (kern_hyp_va(&vgic_v2_params))->nr_lr;
> + int nr_lr = (kern_hyp_va(&kvm_vgic_global_state))->nr_lr;
> u32 elrsr0, elrsr1;
>
> elrsr0 = readl_relaxed(base + GICH_ELRSR0);
> @@ -93,7 +86,7 @@ static void __hyp_text save_elrsr(struct kvm_vcpu *vcpu, void __iomem *base)
> static void __hyp_text save_lrs(struct kvm_vcpu *vcpu, void __iomem *base)
> {
> struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2;
> - int nr_lr = (kern_hyp_va(&vgic_v2_params))->nr_lr;
> + int nr_lr = (kern_hyp_va(&kvm_vgic_global_state))->nr_lr;
> int i;
>
> for (i = 0; i < nr_lr; i++) {
> @@ -147,7 +140,7 @@ void __hyp_text __vgic_v2_restore_state(struct kvm_vcpu *vcpu)
> struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2;
> struct vgic_dist *vgic = &kvm->arch.vgic;
> void __iomem *base = kern_hyp_va(vgic->vctrl_base);
> - int nr_lr = (kern_hyp_va(&vgic_v2_params))->nr_lr;
> + int nr_lr = (kern_hyp_va(&kvm_vgic_global_state))->nr_lr;
> int i;
> u64 live_lrs = 0;
>
> diff --git a/virt/kvm/arm/vgic-v2-emul.c b/virt/kvm/arm/vgic-v2-emul.c
> deleted file mode 100644
> index 1b0bee0..0000000
> diff --git a/virt/kvm/arm/vgic-v2.c b/virt/kvm/arm/vgic-v2.c
> deleted file mode 100644
> index 334cd7a..0000000
> diff --git a/virt/kvm/arm/vgic-v3-emul.c b/virt/kvm/arm/vgic-v3-emul.c
> deleted file mode 100644
> index e661e7f..0000000
> diff --git a/virt/kvm/arm/vgic-v3.c b/virt/kvm/arm/vgic-v3.c
> deleted file mode 100644
> index 75b02fa..0000000
> diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
> deleted file mode 100644
> index c3bfbb9..0000000
> diff --git a/virt/kvm/arm/vgic.h b/virt/kvm/arm/vgic.h
> deleted file mode 100644
> index 0df74cb..0000000
> --
> 2.1.4
>
More information about the linux-arm-kernel
mailing list