Re: [PATCH bpf-next 02/11] bpf: add also cbpf long jump test cases with heavy expansion

2018-05-29 Thread Song Liu
On Sun, May 27, 2018 at 5:43 PM, Daniel Borkmann  wrote:
> We have one triggering on eBPF but lets also add a cBPF example to
> make sure we keep tracking them. Also add anther cBPF test running
> max number of MSH ops.
>
> Signed-off-by: Daniel Borkmann 
> Acked-by: Alexei Starovoitov 

Acked-by: Song Liu 


> ---
>  lib/test_bpf.c | 63 
> ++
>  1 file changed, 63 insertions(+)
>
> diff --git a/lib/test_bpf.c b/lib/test_bpf.c
> index 317f231..60aedc8 100644
> --- a/lib/test_bpf.c
> +++ b/lib/test_bpf.c
> @@ -356,6 +356,52 @@ static int bpf_fill_maxinsns11(struct bpf_test *self)
> return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
>  }
>
> +static int bpf_fill_maxinsns12(struct bpf_test *self)
> +{
> +   unsigned int len = BPF_MAXINSNS;
> +   struct sock_filter *insn;
> +   int i = 0;
> +
> +   insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
> +   if (!insn)
> +   return -ENOMEM;
> +
> +   insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
> +
> +   for (i = 1; i < len - 1; i++)
> +   insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
> +
> +   insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
> +
> +   self->u.ptr.insns = insn;
> +   self->u.ptr.len = len;
> +
> +   return 0;
> +}
> +
> +static int bpf_fill_maxinsns13(struct bpf_test *self)
> +{
> +   unsigned int len = BPF_MAXINSNS;
> +   struct sock_filter *insn;
> +   int i = 0;
> +
> +   insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
> +   if (!insn)
> +   return -ENOMEM;
> +
> +   for (i = 0; i < len - 3; i++)
> +   insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
> +
> +   insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab);
> +   insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0);
> +   insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
> +
> +   self->u.ptr.insns = insn;
> +   self->u.ptr.len = len;
> +
> +   return 0;
> +}
> +
>  static int bpf_fill_ja(struct bpf_test *self)
>  {
> /* Hits exactly 11 passes on x86_64 JIT. */
> @@ -5290,6 +5336,23 @@ static struct bpf_test tests[] = {
> .expected_errcode = -ENOTSUPP,
> },
> {
> +   "BPF_MAXINSNS: jump over MSH",
> +   { },
> +   CLASSIC | FLAG_EXPECTED_FAIL,
> +   { 0xfa, 0xfb, 0xfc, 0xfd, },
> +   { { 4, 0xabababab } },
> +   .fill_helper = bpf_fill_maxinsns12,
> +   .expected_errcode = -EINVAL,
> +   },
> +   {
> +   "BPF_MAXINSNS: exec all MSH",
> +   { },
> +   CLASSIC,
> +   { 0xfa, 0xfb, 0xfc, 0xfd, },
> +   { { 4, 0xababab83 } },
> +   .fill_helper = bpf_fill_maxinsns13,
> +   },
> +   {
> "BPF_MAXINSNS: ld_abs+get_processor_id",
> { },
> CLASSIC,
> --
> 2.9.5
>


[PATCH bpf-next 02/11] bpf: add also cbpf long jump test cases with heavy expansion

2018-05-27 Thread Daniel Borkmann
We have one triggering on eBPF but lets also add a cBPF example to
make sure we keep tracking them. Also add anther cBPF test running
max number of MSH ops.

Signed-off-by: Daniel Borkmann 
Acked-by: Alexei Starovoitov 
---
 lib/test_bpf.c | 63 ++
 1 file changed, 63 insertions(+)

diff --git a/lib/test_bpf.c b/lib/test_bpf.c
index 317f231..60aedc8 100644
--- a/lib/test_bpf.c
+++ b/lib/test_bpf.c
@@ -356,6 +356,52 @@ static int bpf_fill_maxinsns11(struct bpf_test *self)
return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
 }
 
+static int bpf_fill_maxinsns12(struct bpf_test *self)
+{
+   unsigned int len = BPF_MAXINSNS;
+   struct sock_filter *insn;
+   int i = 0;
+
+   insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
+   if (!insn)
+   return -ENOMEM;
+
+   insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
+
+   for (i = 1; i < len - 1; i++)
+   insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
+
+   insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
+
+   self->u.ptr.insns = insn;
+   self->u.ptr.len = len;
+
+   return 0;
+}
+
+static int bpf_fill_maxinsns13(struct bpf_test *self)
+{
+   unsigned int len = BPF_MAXINSNS;
+   struct sock_filter *insn;
+   int i = 0;
+
+   insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
+   if (!insn)
+   return -ENOMEM;
+
+   for (i = 0; i < len - 3; i++)
+   insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
+
+   insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab);
+   insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0);
+   insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
+
+   self->u.ptr.insns = insn;
+   self->u.ptr.len = len;
+
+   return 0;
+}
+
 static int bpf_fill_ja(struct bpf_test *self)
 {
/* Hits exactly 11 passes on x86_64 JIT. */
@@ -5290,6 +5336,23 @@ static struct bpf_test tests[] = {
.expected_errcode = -ENOTSUPP,
},
{
+   "BPF_MAXINSNS: jump over MSH",
+   { },
+   CLASSIC | FLAG_EXPECTED_FAIL,
+   { 0xfa, 0xfb, 0xfc, 0xfd, },
+   { { 4, 0xabababab } },
+   .fill_helper = bpf_fill_maxinsns12,
+   .expected_errcode = -EINVAL,
+   },
+   {
+   "BPF_MAXINSNS: exec all MSH",
+   { },
+   CLASSIC,
+   { 0xfa, 0xfb, 0xfc, 0xfd, },
+   { { 4, 0xababab83 } },
+   .fill_helper = bpf_fill_maxinsns13,
+   },
+   {
"BPF_MAXINSNS: ld_abs+get_processor_id",
{ },
CLASSIC,
-- 
2.9.5