Commit 8bbe98bd authored by Alexei Starovoitov's avatar Alexei Starovoitov
Browse files

Merge branch 'fixes for bpf_prog_pack'



Song Liu says:

====================

Changes v1 => v2:
1. Rephrase comments in 2/2. (Yonghong)

Two fixes for bpf_prog_pack.
====================

Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parents 530e214c 676b2daa
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -158,7 +158,7 @@ config X86
	select HAVE_ALIGNED_STRUCT_PAGE		if SLUB
	select HAVE_ARCH_AUDITSYSCALL
	select HAVE_ARCH_HUGE_VMAP		if X86_64 || X86_PAE
	select HAVE_ARCH_HUGE_VMALLOC		if HAVE_ARCH_HUGE_VMAP
	select HAVE_ARCH_HUGE_VMALLOC		if X86_64
	select HAVE_ARCH_JUMP_LABEL
	select HAVE_ARCH_JUMP_LABEL_RELATIVE
	select HAVE_ARCH_KASAN			if X86_64
+4 −1
Original line number Diff line number Diff line
@@ -2330,8 +2330,11 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
		if (proglen <= 0) {
out_image:
			image = NULL;
			if (header)
			if (header) {
				bpf_arch_text_copy(&header->size, &rw_header->size,
						   sizeof(rw_header->size));
				bpf_jit_binary_pack_free(header, rw_header);
			}
			prog = orig_prog;
			goto out_addrs;
		}
+6 −3
Original line number Diff line number Diff line
@@ -1112,13 +1112,16 @@ int bpf_jit_binary_pack_finalize(struct bpf_prog *prog,
 *   1) when the program is freed after;
 *   2) when the JIT engine fails (before bpf_jit_binary_pack_finalize).
 * For case 2), we need to free both the RO memory and the RW buffer.
 * Also, ro_header->size in 2) is not properly set yet, so rw_header->size
 * is used for uncharge.
 *
 * bpf_jit_binary_pack_free requires proper ro_header->size. However,
 * bpf_jit_binary_pack_alloc does not set it. Therefore, ro_header->size
 * must be set with either bpf_jit_binary_pack_finalize (normal path) or
 * bpf_arch_text_copy (when jit fails).
 */
void bpf_jit_binary_pack_free(struct bpf_binary_header *ro_header,
			      struct bpf_binary_header *rw_header)
{
	u32 size = rw_header ? rw_header->size : ro_header->size;
	u32 size = ro_header->size;

	bpf_prog_pack_free(ro_header);
	kvfree(rw_header);