linux/arch/mips
Paul Burton 36366e367e
MIPS: BPF: Restore MIPS32 cBPF JIT
Commit 716850ab10 ("MIPS: eBPF: Initial eBPF support for MIPS32
architecture.") enabled our eBPF JIT for MIPS32 kernels, whereas it has
previously only been availailable for MIPS64. It was my understanding at
the time that the BPF test suite was passing & JITing a comparable
number of tests to our cBPF JIT [1], but it turns out that was not the
case.

The eBPF JIT has a number of problems on MIPS32:

- Most notably various code paths still result in emission of MIPS64
  instructions which will cause reserved instruction exceptions & kernel
  panics when run on MIPS32 CPUs.

- The eBPF JIT doesn't account for differences between the O32 ABI used
  by MIPS32 kernels versus the N64 ABI used by MIPS64 kernels. Notably
  arguments beyond the first 4 are passed on the stack in O32, and this
  is entirely unhandled when JITing a BPF_CALL instruction. Stack space
  must be reserved for arguments even if they all fit in registers, and
  the callee is free to assume that stack space has been reserved for
  its use - with the eBPF JIT this is not the case, so calling any
  function can result in clobbering values on the stack & unpredictable
  behaviour. Function arguments in eBPF are always 64-bit values which
  is also entirely unhandled - the JIT still uses a single (32-bit)
  register per argument. As a result all function arguments are always
  passed incorrectly when JITing a BPF_CALL instruction, leading to
  kernel crashes or strange behavior.

- The JIT attempts to bail our on use of ALU64 instructions or 64-bit
  memory access instructions. The code doing this at the start of
  build_one_insn() incorrectly checks whether BPF_OP() equals BPF_DW,
  when it should really be checking BPF_SIZE() & only doing so when
  BPF_CLASS() is one of BPF_{LD,LDX,ST,STX}. This results in false
  positives that cause more bailouts than intended, and that in turns
  hides some of the problems described above.

- The kernel's cBPF->eBPF translation makes heavy use of 64-bit eBPF
  instructions that the MIPS32 eBPF JIT bails out on, leading to most
  cBPF programs not being JITed at all.

Until these problems are resolved, revert the removal of the cBPF JIT
performed by commit 716850ab10 ("MIPS: eBPF: Initial eBPF support for
MIPS32 architecture."). Together with commit f8fffebdea ("MIPS: BPF:
Disable MIPS32 eBPF JIT") this restores MIPS32 BPF JIT behavior back to
the same state it was prior to the introduction of the broken eBPF JIT
support.

[1] https://lore.kernel.org/linux-mips/MWHPR2201MB13583388481F01A422CE7D66D4410@MWHPR2201MB1358.namprd22.prod.outlook.com/

Signed-off-by: Paul Burton <paulburton@kernel.org>
Fixes: 716850ab10 ("MIPS: eBPF: Initial eBPF support for MIPS32 architecture.")
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Hassan Naveed <hnaveed@wavecomp.com>
Cc: Tony Ambardar <itugrok@yahoo.com>
Cc: bpf@vger.kernel.org
Cc: netdev@vger.kernel.org
Cc: linux-mips@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
2020-01-09 15:02:30 -08:00
..
alchemy
ar7 The main MIPS changes for a pretty light v5.3 cycle, including: 2019-07-17 09:42:03 -07:00
ath25
ath79 The main MIPS changes for a pretty light v5.3 cycle, including: 2019-07-17 09:42:03 -07:00
bcm47xx MIPS: BCM47XX: Add support for Netgear R6200 V1 2019-07-25 22:10:05 -07:00
bcm63xx MIPS: bmips: mark exception vectors as char arrays 2019-10-23 21:07:28 -07:00
bmips dma-mapping: drop the dev argument to arch_sync_dma_for_* 2019-11-20 20:31:38 +01:00
boot MIPS: Ingenic: Add YSH & ATIL CU Neo board support. 2020-01-09 09:44:10 -08:00
cavium-octeon MIPS: OCTEON: Replace SIZEOF_FIELD() macro 2019-12-09 10:33:50 -08:00
cobalt
configs MIPS: Ingenic: Add YSH & ATIL CU Neo board support. 2020-01-09 09:44:10 -08:00
crypto crypto: arch - conditionalize crypto api in arch glue for lib code 2019-11-27 13:08:49 +08:00
dec
emma
fw A few MIPS fixes: 2019-11-01 14:36:44 -07:00
generic MIPS: generic: Use __initconst for const init data 2019-10-08 10:54:44 -07:00
include MIPS: X1830: Add X1830 system type. 2020-01-09 09:48:42 -08:00
jazz dma-mapping: drop the dev argument to arch_sync_dma_for_* 2019-11-20 20:31:38 +01:00
jz4740 MIPS: X1830: Add X1830 system type. 2020-01-09 09:48:42 -08:00
kernel MIPS: X1830: Add X1830 system type. 2020-01-09 09:48:42 -08:00
kvm mips: add support for folded p4d page tables 2019-11-22 10:51:22 -08:00
lantiq MIPS: lantiq: update the clock alias' for the mainline PCIe PHY driver 2019-08-24 15:13:22 +01:00
lasat
lib MIPS: Loongson64: Rename CPU TYPES 2019-10-31 15:03:10 -07:00
loongson2ef MIPS: Loongson2ef: drop pointless static qualifier in loongson_suspend_enter() 2020-01-09 09:57:07 -08:00
loongson32 MIPS: Loongson{2ef, 32, 64} convert to generic fw cmdline 2019-11-11 10:44:56 -08:00
loongson64 MIPS: Loongson64: Fix node_distance() 2020-01-09 09:54:29 -08:00
math-emu MIPS: math-emu: Reuse name array in debugfs_fpuemu() 2019-11-11 10:56:14 -08:00
mm MIPS: mm: Place per_cpu on different nodes, if NUMA is enabled 2020-01-09 09:54:30 -08:00
mti-malta MIPS: malta: Drop prom_free_prom_memory 2019-08-23 14:47:13 +01:00
net MIPS: BPF: Restore MIPS32 cBPF JIT 2020-01-09 15:02:30 -08:00
netlogic MIPS: xlp: Drop boot_mem_map 2019-08-23 14:47:21 +01:00
oprofile MIPS: Loongson: Rename LOONGSON1 to LOONGSON32 2019-11-11 10:43:13 -08:00
paravirt
pci dma-mapping updates for 5.5-rc1 2019-11-28 11:16:43 -08:00
pic32
pistachio
pmcs-msp71xx MIPS: pmcs-msp71xx: Remove unused addr variable 2019-10-03 15:47:17 -07:00
pnx833x
power mips: check for dsp presence only once before save/restore 2019-10-07 10:58:53 -07:00
ralink MIPS: ralink: add missing put_device in ill_acc_of_setup 2020-01-09 09:40:47 -08:00
rb532
sgi-ip22 MIPS: SGI-IP22/28: Use PROM for memory detection 2019-10-09 14:55:57 -07:00
sgi-ip27 MIPS: SGI-IP27: Fix node_distance 2020-01-09 09:54:27 -08:00
sgi-ip30 MIPS: add support for SGI Octane (IP30) 2019-11-01 14:58:56 -07:00
sgi-ip32 rtc: ds1685: add indirect access method and remove plat_read/plat_write 2019-10-16 10:39:00 +02:00
sibyte
sni
tools MIPS: Check Loongson3 LL/SC errata workaround correctness 2019-10-07 09:43:13 -07:00
txx9
vdso mips: Fix gettimeofday() in the vdso library 2019-12-02 10:50:37 -08:00
vr41xx
Kbuild
Kbuild.platforms MIPS: add support for SGI Octane (IP30) 2019-11-01 14:58:56 -07:00
Kconfig MIPS: BPF: Restore MIPS32 cBPF JIT 2020-01-09 15:02:30 -08:00
Kconfig.debug MIPS: cmdline: Remove redundant Kconfig defaults 2019-10-09 15:53:16 -07:00
Makefile Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 2019-11-25 19:49:58 -08:00
Makefile.postlink MIPS: Check Loongson3 LL/SC errata workaround correctness 2019-10-07 09:43:13 -07:00