mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
bpf: Refactor mark_{dynptr,iter}_read
There is possibility of sharing code between mark_dynptr_read and mark_iter_read for updating liveness information of their stack slots. Consolidate common logic into mark_stack_slot_obj_read function in preparation for the next patch which needs the same logic for its own stack slots. Acked-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Link: https://lore.kernel.org/r/20241204030400.208005-4-memxor@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
769b0f1c82
commit
b79f5f54e1
|
|
@ -3191,10 +3191,27 @@ static int mark_reg_read(struct bpf_verifier_env *env,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mark_dynptr_read(struct bpf_verifier_env *env, struct bpf_reg_state *reg)
|
||||
static int mark_stack_slot_obj_read(struct bpf_verifier_env *env, struct bpf_reg_state *reg,
|
||||
int spi, int nr_slots)
|
||||
{
|
||||
struct bpf_func_state *state = func(env, reg);
|
||||
int spi, ret;
|
||||
int err, i;
|
||||
|
||||
for (i = 0; i < nr_slots; i++) {
|
||||
struct bpf_reg_state *st = &state->stack[spi - i].spilled_ptr;
|
||||
|
||||
err = mark_reg_read(env, st, st->parent, REG_LIVE_READ64);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mark_stack_slot_scratched(env, spi - i);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mark_dynptr_read(struct bpf_verifier_env *env, struct bpf_reg_state *reg)
|
||||
{
|
||||
int spi;
|
||||
|
||||
/* For CONST_PTR_TO_DYNPTR, it must have already been done by
|
||||
* check_reg_arg in check_helper_call and mark_btf_func_reg_size in
|
||||
|
|
@ -3209,31 +3226,13 @@ static int mark_dynptr_read(struct bpf_verifier_env *env, struct bpf_reg_state *
|
|||
* bounds and spi is the first dynptr slot. Simply mark stack slot as
|
||||
* read.
|
||||
*/
|
||||
ret = mark_reg_read(env, &state->stack[spi].spilled_ptr,
|
||||
state->stack[spi].spilled_ptr.parent, REG_LIVE_READ64);
|
||||
if (ret)
|
||||
return ret;
|
||||
return mark_reg_read(env, &state->stack[spi - 1].spilled_ptr,
|
||||
state->stack[spi - 1].spilled_ptr.parent, REG_LIVE_READ64);
|
||||
return mark_stack_slot_obj_read(env, reg, spi, BPF_DYNPTR_NR_SLOTS);
|
||||
}
|
||||
|
||||
static int mark_iter_read(struct bpf_verifier_env *env, struct bpf_reg_state *reg,
|
||||
int spi, int nr_slots)
|
||||
{
|
||||
struct bpf_func_state *state = func(env, reg);
|
||||
int err, i;
|
||||
|
||||
for (i = 0; i < nr_slots; i++) {
|
||||
struct bpf_reg_state *st = &state->stack[spi - i].spilled_ptr;
|
||||
|
||||
err = mark_reg_read(env, st, st->parent, REG_LIVE_READ64);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mark_stack_slot_scratched(env, spi - i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return mark_stack_slot_obj_read(env, reg, spi, nr_slots);
|
||||
}
|
||||
|
||||
/* This function is supposed to be used by the following 32-bit optimization
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user