30 Jul, 2015

1 commit

  • Allow eBPF programs attached to TC qdiscs call skb_vlan_push/pop
    via helper functions. These functions may change skb->data/hlen.
    This data is cached by s390 JIT to improve performance of ld_abs/ld_ind
    instructions. Therefore after a change we have to reload the data.

    In case of usage of skb_vlan_push/pop, in the prologue we store
    the SKB pointer on the stack and restore it after BPF_JMP_CALL
    to skb_vlan_push/pop.

    Signed-off-by: Michael Holzheu
    Signed-off-by: David S. Miller

    Michael Holzheu
     

10 Jun, 2015

1 commit

  • bpf_tail_call() arguments:

    - ctx......: Context pointer
    - jmp_table: One of BPF_MAP_TYPE_PROG_ARRAY maps used as the jump table
    - index....: Index in the jump table

    In this implementation s390x JIT does stack unwinding and jumps into the
    callee program prologue. Caller and callee use the same stack.

    With this patch a tail call generates the following code on s390x:

    if (index >= array->map.max_entries)
    goto out
    000003ff8001c7e4: e31030100016 llgf %r1,16(%r3)
    000003ff8001c7ea: ec41001fa065 clgrj %r4,%r1,10,3ff8001c828

    if (tail_call_cnt++ > MAX_TAIL_CALL_CNT)
    goto out;
    000003ff8001c7f0: a7080001 lhi %r0,1
    000003ff8001c7f4: eb10f25000fa laal %r1,%r0,592(%r15)
    000003ff8001c7fa: ec120017207f clij %r1,32,2,3ff8001c828

    prog = array->prog[index];
    if (prog == NULL)
    goto out;
    000003ff8001c800: eb140003000d sllg %r1,%r4,3
    000003ff8001c806: e31310800004 lg %r1,128(%r3,%r1)
    000003ff8001c80c: ec18000e007d clgij %r1,0,8,3ff8001c828

    Restore registers before calling function
    000003ff8001c812: eb68f2980004 lmg %r6,%r8,664(%r15)
    000003ff8001c818: ebbff2c00004 lmg %r11,%r15,704(%r15)

    goto *(prog->bpf_func + tail_call_start);
    000003ff8001c81e: e31100200004 lg %r1,32(%r1,%r0)
    000003ff8001c824: 47f01006 bc 15,6(%r1)

    Reviewed-by: Martin Schwidefsky
    Signed-off-by: Michael Holzheu
    Acked-by: Heiko Carstens
    Signed-off-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    Michael Holzheu
     

04 Jun, 2015

1 commit

  • On s390x we have to provide 160 bytes stack space before we can call
    the next function. From the 160 bytes that we got from the previous
    function we only use 11 * 8 bytes and have 160 - 11 * 8 bytes left.
    Currently for BPF we allocate additional 160 - 11 * 8 bytes for the
    next function. This is wrong because then the next function only gets:

    (160 - 11 * 8) + (160 - 11 * 8) = 2 * 72 = 144 bytes

    Fix this and allocate enough memory for the next function.

    Fixes: 054623105728 ("s390/bpf: Add s390x eBPF JIT compiler backend")
    Signed-off-by: Michael Holzheu
    Acked-by: Heiko Carstens
    Signed-off-by: Alexei Starovoitov
    Signed-off-by: David S. Miller

    Michael Holzheu
     

15 Apr, 2015

1 commit