parisc: Add alternative coding infrastructure
authorHelge Deller <deller@gmx.de>
Tue, 16 Oct 2018 20:38:22 +0000 (22:38 +0200)
committerHelge Deller <deller@gmx.de>
Wed, 17 Oct 2018 15:22:26 +0000 (17:22 +0200)
commit3847dab77421867fbc77faacb2f377d44e729e1b
treeac712f1c1ee3cebd0a72f11b48a68e33a8888cd8
parent34c201ae49fe9e0bf3b389da5869d810f201c740
parisc: Add alternative coding infrastructure

This patch adds the necessary code to patch a running kernel at runtime
to improve performance.

The current implementation offers a few optimizations variants:

- When running a SMP kernel on a single UP processor, unwanted assembler
  statements like locking functions are overwritten with NOPs. When
  multiple instructions shall be skipped, one branch instruction is used
  instead of multiple nop instructions.

- In the UP case, some pdtlb and pitlb instructions are patched to
  become pdtlb,l and pitlb,l which only flushes the CPU-local tlb
  entries instead of broadcasting the flush to other CPUs in the system
  and thus may improve performance.

- fic and fdc instructions are skipped if no I- or D-caches are
  installed.  This should speed up qemu emulation and cacheless systems.

- If no cache coherence is needed for IO operations, the relevant fdc
  and sync instructions in the sba and ccio drivers are replaced by
  nops.

- On systems which share I- and D-TLBs and thus don't have a seperate
  instruction TLB, the pitlb instruction is replaced by a nop.

Live-patching is done early in the boot process, just after having run
the system inventory. No drivers are running and thus no external
interrupts should arrive. So the hope is that no TLB exceptions will
occur during the patching. If this turns out to be wrong we will
probably need to do the patching in real-mode.

Signed-off-by: Helge Deller <deller@gmx.de>
14 files changed:
arch/parisc/include/asm/alternative.h [new file with mode: 0644]
arch/parisc/include/asm/cache.h
arch/parisc/include/asm/pgtable.h
arch/parisc/include/asm/sections.h
arch/parisc/include/asm/tlbflush.h
arch/parisc/kernel/cache.c
arch/parisc/kernel/entry.S
arch/parisc/kernel/pacache.S
arch/parisc/kernel/setup.c
arch/parisc/kernel/signal.c
arch/parisc/kernel/vmlinux.lds.S
arch/parisc/mm/init.c
drivers/parisc/ccio-dma.c
drivers/parisc/sba_iommu.c