diff mbox

bpf, arm64: start flushing icache range from header

Message ID 41c4a481eb665a492c3b2df16af219b1250224a0.1447446460.git.daniel@iogearbox.net (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Borkmann Nov. 14, 2015, 12:16 a.m. UTC
While recently going over ARM64's BPF code, I noticed that the icache
range we're flushing should start at header already and not at ctx.image.

Reason is that after b569c1c622c5 ("net: bpf: arm64: address randomize
and write protect JIT code"), we also want to make sure to flush the
random-sized trap in front of the start of the actual program (analogous
to x86). No operational differences from user side.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Zi Shen Lim <zlim.lnx@gmail.com>
Cc: Alexei Starovoitov <ast@kernel.org>
---
 ( As arm64 jit fixes seem to go via arm64 tree, sending them here. )

 arch/arm64/net/bpf_jit_comp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Mark Rutland Nov. 16, 2015, 11:39 a.m. UTC | #1
On Sat, Nov 14, 2015 at 01:16:18AM +0100, Daniel Borkmann wrote:
> While recently going over ARM64's BPF code, I noticed that the icache
> range we're flushing should start at header already and not at ctx.image.
> 
> Reason is that after b569c1c622c5 ("net: bpf: arm64: address randomize
> and write protect JIT code"), we also want to make sure to flush the
> random-sized trap in front of the start of the actual program (analogous
> to x86). No operational differences from user side.
> 
> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
> Acked-by: Zi Shen Lim <zlim.lnx@gmail.com>
> Cc: Alexei Starovoitov <ast@kernel.org>
> ---
>  ( As arm64 jit fixes seem to go via arm64 tree, sending them here. )
> 
>  arch/arm64/net/bpf_jit_comp.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
> index a44e529..ee06570 100644
> --- a/arch/arm64/net/bpf_jit_comp.c
> +++ b/arch/arm64/net/bpf_jit_comp.c
> @@ -740,7 +740,7 @@ void bpf_int_jit_compile(struct bpf_prog *prog)
>  	if (bpf_jit_enable > 1)
>  		bpf_jit_dump(prog->len, image_size, 2, ctx.image);
>  
> -	bpf_flush_icache(ctx.image, ctx.image + ctx.idx);
> +	bpf_flush_icache(header, ctx.image + ctx.idx);

As far as I can see, ctx.idx doesn't take into account the size of the
header, given we zero it after bpf_jit_binary_alloc, and increment it
for each instruction.

So won't this prevent us from flushing the end of the image? Or did I
miss something?

Mark.
Daniel Borkmann Nov. 16, 2015, 11:48 a.m. UTC | #2
On 11/16/2015 12:39 PM, Mark Rutland wrote:
> On Sat, Nov 14, 2015 at 01:16:18AM +0100, Daniel Borkmann wrote:
>> While recently going over ARM64's BPF code, I noticed that the icache
>> range we're flushing should start at header already and not at ctx.image.
>>
>> Reason is that after b569c1c622c5 ("net: bpf: arm64: address randomize
>> and write protect JIT code"), we also want to make sure to flush the
>> random-sized trap in front of the start of the actual program (analogous
>> to x86). No operational differences from user side.
>>
>> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
>> Acked-by: Zi Shen Lim <zlim.lnx@gmail.com>
>> Cc: Alexei Starovoitov <ast@kernel.org>
>> ---
>>   ( As arm64 jit fixes seem to go via arm64 tree, sending them here. )
>>
>>   arch/arm64/net/bpf_jit_comp.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
>> index a44e529..ee06570 100644
>> --- a/arch/arm64/net/bpf_jit_comp.c
>> +++ b/arch/arm64/net/bpf_jit_comp.c
>> @@ -740,7 +740,7 @@ void bpf_int_jit_compile(struct bpf_prog *prog)
>>   	if (bpf_jit_enable > 1)
>>   		bpf_jit_dump(prog->len, image_size, 2, ctx.image);
>>
>> -	bpf_flush_icache(ctx.image, ctx.image + ctx.idx);
>> +	bpf_flush_icache(header, ctx.image + ctx.idx);
>
> As far as I can see, ctx.idx doesn't take into account the size of the
> header, given we zero it after bpf_jit_binary_alloc, and increment it
> for each instruction.
>
> So won't this prevent us from flushing the end of the image? Or did I
> miss something?

Nope, bpf_flush_icache() takes start and end pointer ... header starts
before ctx.image on the linear buffer. Why should this prevent us from
flushing the end of the image?
Mark Rutland Nov. 16, 2015, 11:59 a.m. UTC | #3
On Mon, Nov 16, 2015 at 12:48:08PM +0100, Daniel Borkmann wrote:
> On 11/16/2015 12:39 PM, Mark Rutland wrote:
> >On Sat, Nov 14, 2015 at 01:16:18AM +0100, Daniel Borkmann wrote:
> >>While recently going over ARM64's BPF code, I noticed that the icache
> >>range we're flushing should start at header already and not at ctx.image.
> >>
> >>Reason is that after b569c1c622c5 ("net: bpf: arm64: address randomize
> >>and write protect JIT code"), we also want to make sure to flush the
> >>random-sized trap in front of the start of the actual program (analogous
> >>to x86). No operational differences from user side.
> >>
> >>Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
> >>Acked-by: Zi Shen Lim <zlim.lnx@gmail.com>
> >>Cc: Alexei Starovoitov <ast@kernel.org>
> >>---
> >>  ( As arm64 jit fixes seem to go via arm64 tree, sending them here. )
> >>
> >>  arch/arm64/net/bpf_jit_comp.c | 2 +-
> >>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >>diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
> >>index a44e529..ee06570 100644
> >>--- a/arch/arm64/net/bpf_jit_comp.c
> >>+++ b/arch/arm64/net/bpf_jit_comp.c
> >>@@ -740,7 +740,7 @@ void bpf_int_jit_compile(struct bpf_prog *prog)
> >>  	if (bpf_jit_enable > 1)
> >>  		bpf_jit_dump(prog->len, image_size, 2, ctx.image);
> >>
> >>-	bpf_flush_icache(ctx.image, ctx.image + ctx.idx);
> >>+	bpf_flush_icache(header, ctx.image + ctx.idx);
> >
> >As far as I can see, ctx.idx doesn't take into account the size of the
> >header, given we zero it after bpf_jit_binary_alloc, and increment it
> >for each instruction.
> >
> >So won't this prevent us from flushing the end of the image? Or did I
> >miss something?
> 
> Nope, bpf_flush_icache() takes start and end pointer ... header starts
> before ctx.image on the linear buffer. Why should this prevent us from
> flushing the end of the image?

I erroneously thought the second parameter was a size (which it clearly
isn't given it's bsed on the ctx.image pointer).

My bad, apologies for the noise.

Mark.
David Miller Nov. 16, 2015, 7:42 p.m. UTC | #4
From: Daniel Borkmann <daniel@iogearbox.net>
Date: Sat, 14 Nov 2015 01:16:18 +0100

> While recently going over ARM64's BPF code, I noticed that the icache
> range we're flushing should start at header already and not at ctx.image.
> 
> Reason is that after b569c1c622c5 ("net: bpf: arm64: address randomize
> and write protect JIT code"), we also want to make sure to flush the
> random-sized trap in front of the start of the actual program (analogous
> to x86). No operational differences from user side.
> 
> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
> Acked-by: Zi Shen Lim <zlim.lnx@gmail.com>
> Cc: Alexei Starovoitov <ast@kernel.org>
> ---
>  ( As arm64 jit fixes seem to go via arm64 tree, sending them here. )

I'm applying this directly, please CC: netdev on future patches
to the BPF JIT's regardless of where you think the patch will
be applied as it should be _REVIEWED_ on netdev regardless.
Daniel Borkmann Nov. 16, 2015, 7:45 p.m. UTC | #5
On 11/16/2015 08:42 PM, David Miller wrote:
...
> I'm applying this directly, please CC: netdev on future patches
> to the BPF JIT's regardless of where you think the patch will
> be applied as it should be _REVIEWED_ on netdev regardless.

Okay, sorry about that, will do in future.

Thanks, Dave!
diff mbox

Patch

diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
index a44e529..ee06570 100644
--- a/arch/arm64/net/bpf_jit_comp.c
+++ b/arch/arm64/net/bpf_jit_comp.c
@@ -740,7 +740,7 @@  void bpf_int_jit_compile(struct bpf_prog *prog)
 	if (bpf_jit_enable > 1)
 		bpf_jit_dump(prog->len, image_size, 2, ctx.image);
 
-	bpf_flush_icache(ctx.image, ctx.image + ctx.idx);
+	bpf_flush_icache(header, ctx.image + ctx.idx);
 
 	set_memory_ro((unsigned long)header, header->pages);
 	prog->bpf_func = (void *)ctx.image;