Lines Matching refs:instance
229 struct func_instance *instance; in bpf_stack_liveness_free() local
235 hash_for_each_safe(env->liveness->func_instances, bkt, tmp, instance, hl_node) { in bpf_stack_liveness_free()
236 for (i = 0; i <= instance->callchain.curframe; i++) in bpf_stack_liveness_free()
237 kvfree(instance->frames[i]); in bpf_stack_liveness_free()
238 kvfree(instance->must_write_set); in bpf_stack_liveness_free()
239 kvfree(instance); in bpf_stack_liveness_free()
248 static int relative_idx(struct func_instance *instance, u32 insn_idx) in relative_idx() argument
250 return insn_idx - instance->callchain.sp_starts[instance->callchain.curframe]; in relative_idx()
253 static struct per_frame_masks *get_frame_masks(struct func_instance *instance, in get_frame_masks() argument
256 if (!instance->frames[frame]) in get_frame_masks()
259 return &instance->frames[frame][relative_idx(instance, insn_idx)]; in get_frame_masks()
263 struct func_instance *instance, in alloc_frame_masks() argument
268 if (!instance->frames[frame]) { in alloc_frame_masks()
269 arr = kvcalloc(instance->insn_cnt, sizeof(*arr), GFP_KERNEL_ACCOUNT); in alloc_frame_masks()
270 instance->frames[frame] = arr; in alloc_frame_masks()
274 return get_frame_masks(instance, frame, insn_idx); in alloc_frame_masks()
286 struct func_instance *instance; in ensure_cur_instance() local
291 instance = lookup_instance(env, env->cur_state, env->cur_state->curframe); in ensure_cur_instance()
292 if (IS_ERR(instance)) in ensure_cur_instance()
293 return PTR_ERR(instance); in ensure_cur_instance()
295 liveness->cur_instance = instance; in ensure_cur_instance()
301 struct func_instance *instance, u32 frame, u32 insn_idx, u64 mask) in mark_stack_read() argument
306 masks = alloc_frame_masks(env, instance, frame, insn_idx); in mark_stack_read()
312 instance->updated = true; in mark_stack_read()
327 struct func_instance *instance, u32 insn_idx) in reset_stack_write_marks() argument
333 for (i = 0; i <= instance->callchain.curframe; i++) in reset_stack_write_marks()
356 struct func_instance *instance) in commit_stack_write_marks() argument
363 if (!instance) in commit_stack_write_marks()
366 curframe = instance->callchain.curframe; in commit_stack_write_marks()
367 idx = relative_idx(instance, liveness->write_insn_idx); in commit_stack_write_marks()
371 if (mask == 0 && !instance->must_write_set[idx]) in commit_stack_write_marks()
373 masks = alloc_frame_masks(env, instance, frame, liveness->write_insn_idx); in commit_stack_write_marks()
381 if (instance->must_write_set[idx]) in commit_stack_write_marks()
385 instance->updated = true; in commit_stack_write_marks()
388 instance->must_write_dropped = true; in commit_stack_write_marks()
390 instance->must_write_set[idx] = true; in commit_stack_write_marks()
510 struct func_instance *instance) in get_outer_instance() argument
512 struct callchain callchain = instance->callchain; in get_outer_instance()
532 struct func_instance *instance) in propagate_to_outer_instance() argument
534 struct callchain *callchain = &instance->callchain; in propagate_to_outer_instance()
541 outer_instance = get_outer_instance(env, instance); in propagate_to_outer_instance()
548 insn = get_frame_masks(instance, frame, this_subprog_start); in propagate_to_outer_instance()
561 struct func_instance *instance, u32 frame, u32 insn_idx) in update_insn() argument
575 insn = get_frame_masks(instance, frame, insn_idx); in update_insn()
584 succ_insn = get_frame_masks(instance, frame, succ->items[s]); in update_insn()
598 insn_idx == callchain_subprog_start(&instance->callchain) || in update_insn()
600 log_mask_change(env, &instance->callchain, "live", in update_insn()
602 log_mask_change(env, &instance->callchain, "written", in update_insn()
611 static int update_instance(struct bpf_verifier_env *env, struct func_instance *instance) in update_instance() argument
614 struct callchain *callchain = &instance->callchain; in update_instance()
626 if (instance->must_write_dropped) { in update_instance()
628 if (!instance->frames[frame]) in update_instance()
631 for (i = 0; i < instance->insn_cnt; i++) { in update_instance()
632 insn = get_frame_masks(instance, frame, this_subprog_start + i); in update_instance()
646 for (frame = 0; frame <= instance->callchain.curframe; frame++) { in update_instance()
647 if (!instance->frames[frame]) in update_instance()
651 changed |= update_insn(env, instance, frame, insn_postorder[i]); in update_instance()
661 err = propagate_to_outer_instance(env, instance); in update_instance()
679 struct func_instance *instance; in bpf_update_live_stack() local
684 instance = lookup_instance(env, env->cur_state, frame); in bpf_update_live_stack()
685 if (IS_ERR(instance)) in bpf_update_live_stack()
686 return PTR_ERR(instance); in bpf_update_live_stack()
688 if (instance->updated) { in bpf_update_live_stack()
689 err = update_instance(env, instance); in bpf_update_live_stack()
692 instance->updated = false; in bpf_update_live_stack()
693 instance->must_write_dropped = false; in bpf_update_live_stack()
699 static bool is_live_before(struct func_instance *instance, u32 insn_idx, u32 frameno, u32 spi) in is_live_before() argument
703 masks = get_frame_masks(instance, frameno, insn_idx); in is_live_before()
710 struct func_instance *instance; in bpf_live_stack_query_init() local
715 instance = lookup_instance(env, st, frame); in bpf_live_stack_query_init()
716 if (IS_ERR(instance)) in bpf_live_stack_query_init()
717 return PTR_ERR(instance); in bpf_live_stack_query_init()
718 q->instances[frame] = instance; in bpf_live_stack_query_init()
734 struct func_instance *instance, *curframe_instance; in bpf_stack_slot_alive() local
744 instance = q->instances[i]; in bpf_stack_slot_alive()
746 ? is_live_before(instance, callsite, frameno, spi) in bpf_stack_slot_alive()
747 : is_live_before(instance, callsite + 1, frameno, spi); in bpf_stack_slot_alive()