From c057db2f8897e22e5af79ea19f1c0795ad7d90e9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 5 Sep 2023 09:37:47 +0000 Subject: [PATCH] Revert "bpf: Remove bpf trampoline selector" This reverts commit 8ea165e1f89d7ddd9a16046809013f9792bb33c3 which is commit 47e79cbeea4b3891ad476047f4c68543eb51c8e0 upstream. It breaks the Android ABI and can be brought back in an abi-safe way in the future if it is still needed. Bug: 161946584 Change-Id: I6b0b4846d8ec26e44c6627b8b4cbb2c46cc01a13 Signed-off-by: Greg Kroah-Hartman --- include/linux/bpf.h | 1 + kernel/bpf/trampoline.c | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 508f84dd0a44..590ee37174db 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -942,6 +942,7 @@ struct bpf_trampoline { int progs_cnt[BPF_TRAMP_MAX]; /* Executable image of trampoline */ struct bpf_tramp_image *cur_image; + u64 selector; struct module *mod; ANDROID_KABI_RESERVE(1); }; diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c index 30af8f66e17b..70e2b99d537a 100644 --- a/kernel/bpf/trampoline.c +++ b/kernel/bpf/trampoline.c @@ -377,7 +377,7 @@ static void bpf_tramp_image_put(struct bpf_tramp_image *im) call_rcu_tasks_trace(&im->rcu, __bpf_tramp_image_put_rcu_tasks); } -static struct bpf_tramp_image *bpf_tramp_image_alloc(u64 key) +static struct bpf_tramp_image *bpf_tramp_image_alloc(u64 key, u32 idx) { struct bpf_tramp_image *im; struct bpf_ksym *ksym; @@ -404,7 +404,7 @@ static struct bpf_tramp_image *bpf_tramp_image_alloc(u64 key) ksym = &im->ksym; INIT_LIST_HEAD_RCU(&ksym->lnode); - snprintf(ksym->name, KSYM_NAME_LEN, "bpf_trampoline_%llu", key); + snprintf(ksym->name, KSYM_NAME_LEN, "bpf_trampoline_%llu_%u", key, idx); bpf_image_ksym_add(image, ksym); return im; @@ -434,10 +434,11 @@ static int bpf_trampoline_update(struct bpf_trampoline *tr, bool lock_direct_mut err = unregister_fentry(tr, tr->cur_image->image); bpf_tramp_image_put(tr->cur_image); tr->cur_image = NULL; + tr->selector = 0; goto out; } - im = bpf_tramp_image_alloc(tr->key); + im = bpf_tramp_image_alloc(tr->key, tr->selector); if (IS_ERR(im)) { err = PTR_ERR(im); goto out; @@ -475,7 +476,8 @@ static int bpf_trampoline_update(struct bpf_trampoline *tr, bool lock_direct_mut set_memory_ro((long)im->image, 1); set_memory_x((long)im->image, 1); - WARN_ON(tr->cur_image && total == 0); + WARN_ON(tr->cur_image && tr->selector == 0); + WARN_ON(!tr->cur_image && tr->selector); if (tr->cur_image) /* progs already running at this address */ err = modify_fentry(tr, tr->cur_image->image, im->image, lock_direct_mutex); @@ -505,6 +507,7 @@ static int bpf_trampoline_update(struct bpf_trampoline *tr, bool lock_direct_mut if (tr->cur_image) bpf_tramp_image_put(tr->cur_image); tr->cur_image = im; + tr->selector++; out: /* If any error happens, restore previous flags */ if (err)