summaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
diff options
context:
space:
mode:
authorJakub Kicinski2018-03-29 02:48:36 +0200
committerAlexei Starovoitov2018-03-29 04:36:14 +0200
commit41aed09cf61c00ef6c3b2648d5a193cbaf2a74d0 (patch)
tree7ba8625d79f116af1aca358f991d9b7fb1fcdfb4 /drivers/net/ethernet/netronome/nfp/bpf/verifier.c
parentnfp: bpf: expose command delay slots (diff)
downloadkernel-qcow2-linux-41aed09cf61c00ef6c3b2648d5a193cbaf2a74d0.tar.gz
kernel-qcow2-linux-41aed09cf61c00ef6c3b2648d5a193cbaf2a74d0.tar.xz
kernel-qcow2-linux-41aed09cf61c00ef6c3b2648d5a193cbaf2a74d0.zip
nfp: bpf: add support for atomic add of unknown values
Allow atomic add to be used even when the value is not guaranteed to fit into a 16 bit immediate. This requires the value to be pulled as data, and therefore use of a transfer register and a context swap. Track the information about possible lengths of the value, if it's guaranteed to be larger than 16bits don't generate the code for the optimized case at all. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com> Reviewed-by: Jiong Wang <jiong.wang@netronome.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'drivers/net/ethernet/netronome/nfp/bpf/verifier.c')
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/verifier.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
index 40619efea77d..486ffd1d5913 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
@@ -414,16 +414,16 @@ nfp_bpf_check_xadd(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
dreg->type);
return -EOPNOTSUPP;
}
- if (sreg->type != SCALAR_VALUE ||
- sreg->var_off.value > 0xffff || sreg->var_off.mask > 0xffff) {
- char tn_buf[48];
-
- tnum_strn(tn_buf, sizeof(tn_buf), sreg->var_off);
- pr_vlog(env, "atomic add not of a small constant scalar: %s\n",
- tn_buf);
+ if (sreg->type != SCALAR_VALUE) {
+ pr_vlog(env, "atomic add not of a scalar: %d\n", sreg->type);
return -EOPNOTSUPP;
}
+ meta->xadd_over_16bit |=
+ sreg->var_off.value > 0xffff || sreg->var_off.mask > 0xffff;
+ meta->xadd_maybe_16bit |=
+ (sreg->var_off.value & ~sreg->var_off.mask) <= 0xffff;
+
return nfp_bpf_check_ptr(nfp_prog, meta, env, meta->insn.dst_reg);
}