linux/drivers/net/ethernet
Jiong Wang 854dc87d1a nfp: bpf: support backward jump
This patch adds support for backward jump on NFP.

  - restrictions on backward jump in various functions have been removed.
  - nfp_fixup_branches now supports backward jump.

There is one thing to note, currently an input eBPF JMP insn may generate
several NFP insns, for example,

  NFP imm move insn A \
  NFP compare insn  B  --> 3 NFP insn jited from eBPF JMP insn M
  NFP branch insn   C /
  ---
  NFP insn X           --> 1 NFP insn jited from eBPF insn N
  ---
  ...

therefore, we are doing sanity check to make sure the last jited insn from
an eBPF JMP is a NFP branch instruction.

Once backward jump is allowed, it is possible an eBPF JMP insn is at the
end of the program. This is however causing trouble for the sanity check.
Because the sanity check requires the end index of the NFP insns jited from
one eBPF insn while only the start index is recorded before this patch that
we can only get the end index by:

  start_index_of_the_next_eBPF_insn - 1

or for the above example:

  start_index_of_eBPF_insn_N (which is the index of NFP insn X) - 1

nfp_fixup_branches was using nfp_for_each_insn_walk2 to expose *next* insn
to each iteration during the traversal so the last index could be
calculated from which. Now, it needs some extra code to handle the last
insn. Meanwhile, the use of walk2 is actually unnecessary, we could simply
use generic single instruction walk to do this, the next insn could be
easily calculated using list_next_entry.

So, this patch migrates the jump fixup traversal method to
*list_for_each_entry*, this simplifies the code logic a little bit.

The other thing to note is a new state variable "last_bpf_off" is
introduced to track the index of the last jited NFP insn. This is necessary
because NFP is generating special purposes epilogue sequences, so the index
of the last jited NFP insn is *not* always nfp_prog->prog_len - 1.

Suggested-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
2017-12-01 20:59:19 +01:00
..
3com net: 3com: 3c574_cs: mark expected switch fall-through 2017-11-11 19:10:06 +09:00
8390 net: 8390: pcnet_cs: mark expected switch fall-through 2017-11-11 19:10:06 +09:00
adaptec
adi treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
aeroflex License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
agere treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
alacritech Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
allwinner
alteon License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
altera
amazon treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
amd Merge branch 'akpm' (patches from Andrew) 2017-11-15 19:42:40 -08:00
apm
apple
aquantia treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
arc License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
atheros treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
aurora License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
broadcom Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-29 13:10:25 -08:00
brocade
cadence net: macb: add of_node_put to error paths 2017-11-11 15:27:44 +09:00
calxeda
cavium net: thunderx: Set max queue count taking XDP_TX into account 2017-11-30 09:24:07 -05:00
chelsio Updates for 4.15 kernel merge window 2017-11-15 14:54:53 -08:00
cirrus
cisco treewide: setup_timer() -> timer_setup() (2 field) 2017-11-21 15:57:09 -08:00
davicom License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
dec Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
dlink net: dl2k: remove redundant re-assignment to np 2017-11-02 15:52:19 +09:00
emulex
ezchip
faraday
freescale fsl/fman_port: mark expected switch fall-throughs 2017-11-11 18:50:33 +09:00
fujitsu
hisilicon Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2017-11-15 11:56:19 -08:00
hp
huawei
i825xx License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ibm ibmvnic: fix dma_mapping_error call 2017-11-18 10:37:00 +09:00
intel e1000: Fix off-by-one in debug message 2017-11-27 14:31:24 -08:00
marvell Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-29 13:10:25 -08:00
mediatek
mellanox mlxsw: spectrum_router: Update nexthop RIF on update 2017-11-28 09:55:48 -05:00
micrel Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
microchip License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
moxa
myricom treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
natsemi Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
neterion net: vxge: Fix some indentation issues 2017-11-20 11:36:30 +09:00
netronome nfp: bpf: support backward jump 2017-12-01 20:59:19 +01:00
nuvoton
nvidia forcedeth: optimize the xmit with unlikely 2017-11-30 09:35:03 -05:00
nxp
oki-semi treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
packetengines
pasemi treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
qlogic netxen: remove timespec usage 2017-11-30 09:26:31 -05:00
qualcomm Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
rdc
realtek net: realtek: r8169: implement set_link_ksettings() 2017-11-24 01:36:31 +09:00
renesas
rocker treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
samsung
seeq Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
sfc Merge branch 'akpm' (patches from Andrew) 2017-11-15 19:42:40 -08:00
sgi
silan
sis Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
smsc Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-04 09:26:51 +09:00
stmicro Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-11-29 13:10:25 -08:00
sun Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2017-11-15 11:56:19 -08:00
synopsys treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
tehuti
ti net: ethernet: davinci_emac: Deduplicate bus_find_device() by name matching 2017-11-30 09:24:08 -05:00
tile Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2017-11-13 17:56:58 -08:00
toshiba treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
tundra drivers/net: tundra: Convert timers to use timer_setup() 2017-11-01 12:38:45 +09:00
via net: via: via-rhine: use %p to format void * address instead of %x 2017-11-29 09:45:24 -05:00
wiznet
xilinx net: ethernet: xilinx: Mark XILINX_LL_TEMAC broken on 64-bit 2017-11-29 09:43:24 -05:00
xircom
xscale
dnet.c
dnet.h
ec_bhf.c
ethoc.c
fealnx.c fealnx: Fix building error on MIPS 2017-11-16 22:58:12 +09:00
jme.c
jme.h
Kconfig
korina.c
lantiq_etop.c
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
netx-eth.c