@@ -928,20 +928,20 @@ void *bpf_prog_pack_alloc(u32 size, bpf_jit_fill_hole_t bpf_fill_ill_insns)
928
928
return ptr ;
929
929
}
930
930
931
- void bpf_prog_pack_free (struct bpf_binary_header * hdr )
931
+ void bpf_prog_pack_free (void * ptr , u32 size )
932
932
{
933
933
struct bpf_prog_pack * pack = NULL , * tmp ;
934
934
unsigned int nbits ;
935
935
unsigned long pos ;
936
936
937
937
mutex_lock (& pack_mutex );
938
- if (hdr -> size > BPF_PROG_PACK_SIZE ) {
939
- bpf_jit_free_exec (hdr );
938
+ if (size > BPF_PROG_PACK_SIZE ) {
939
+ bpf_jit_free_exec (ptr );
940
940
goto out ;
941
941
}
942
942
943
943
list_for_each_entry (tmp , & pack_list , list ) {
944
- if (( void * ) hdr >= tmp -> ptr && (tmp -> ptr + BPF_PROG_PACK_SIZE ) > ( void * ) hdr ) {
944
+ if (ptr >= tmp -> ptr && (tmp -> ptr + BPF_PROG_PACK_SIZE ) > ptr ) {
945
945
pack = tmp ;
946
946
break ;
947
947
}
@@ -950,10 +950,10 @@ void bpf_prog_pack_free(struct bpf_binary_header *hdr)
950
950
if (WARN_ONCE (!pack , "bpf_prog_pack bug\n" ))
951
951
goto out ;
952
952
953
- nbits = BPF_PROG_SIZE_TO_NBITS (hdr -> size );
954
- pos = ((unsigned long )hdr - (unsigned long )pack -> ptr ) >> BPF_PROG_CHUNK_SHIFT ;
953
+ nbits = BPF_PROG_SIZE_TO_NBITS (size );
954
+ pos = ((unsigned long )ptr - (unsigned long )pack -> ptr ) >> BPF_PROG_CHUNK_SHIFT ;
955
955
956
- WARN_ONCE (bpf_arch_text_invalidate (hdr , hdr -> size ),
956
+ WARN_ONCE (bpf_arch_text_invalidate (ptr , size ),
957
957
"bpf_prog_pack bug: missing bpf_arch_text_invalidate?\n" );
958
958
959
959
bitmap_clear (pack -> bitmap , pos , nbits );
@@ -1100,8 +1100,7 @@ bpf_jit_binary_pack_alloc(unsigned int proglen, u8 **image_ptr,
1100
1100
1101
1101
* rw_header = kvmalloc (size , GFP_KERNEL );
1102
1102
if (!* rw_header ) {
1103
- bpf_arch_text_copy (& ro_header -> size , & size , sizeof (size ));
1104
- bpf_prog_pack_free (ro_header );
1103
+ bpf_prog_pack_free (ro_header , size );
1105
1104
bpf_jit_uncharge_modmem (size );
1106
1105
return NULL ;
1107
1106
}
@@ -1132,7 +1131,7 @@ int bpf_jit_binary_pack_finalize(struct bpf_prog *prog,
1132
1131
kvfree (rw_header );
1133
1132
1134
1133
if (IS_ERR (ptr )) {
1135
- bpf_prog_pack_free (ro_header );
1134
+ bpf_prog_pack_free (ro_header , ro_header -> size );
1136
1135
return PTR_ERR (ptr );
1137
1136
}
1138
1137
return 0 ;
@@ -1153,7 +1152,7 @@ void bpf_jit_binary_pack_free(struct bpf_binary_header *ro_header,
1153
1152
{
1154
1153
u32 size = ro_header -> size ;
1155
1154
1156
- bpf_prog_pack_free (ro_header );
1155
+ bpf_prog_pack_free (ro_header , size );
1157
1156
kvfree (rw_header );
1158
1157
bpf_jit_uncharge_modmem (size );
1159
1158
}
0 commit comments