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 = kvzalloc_objs(*arr, instance->insn_cnt, in alloc_frame_masks()
271 instance->frames[frame] = arr; in alloc_frame_masks()
275 return get_frame_masks(instance, frame, insn_idx); in alloc_frame_masks()
287 struct func_instance *instance; in ensure_cur_instance() local
292 instance = lookup_instance(env, env->cur_state, env->cur_state->curframe); in ensure_cur_instance()
293 if (IS_ERR(instance)) in ensure_cur_instance()
294 return PTR_ERR(instance); in ensure_cur_instance()
296 liveness->cur_instance = instance; in ensure_cur_instance()
302 struct func_instance *instance, u32 frame, u32 insn_idx, u64 mask) in mark_stack_read() argument
307 masks = alloc_frame_masks(env, instance, frame, insn_idx); in mark_stack_read()
313 instance->updated = true; in mark_stack_read()
328 struct func_instance *instance, u32 insn_idx) in reset_stack_write_marks() argument
334 for (i = 0; i <= instance->callchain.curframe; i++) in reset_stack_write_marks()
357 struct func_instance *instance) in commit_stack_write_marks() argument
364 if (!instance) in commit_stack_write_marks()
367 curframe = instance->callchain.curframe; in commit_stack_write_marks()
368 idx = relative_idx(instance, liveness->write_insn_idx); in commit_stack_write_marks()
372 if (mask == 0 && !instance->must_write_set[idx]) in commit_stack_write_marks()
374 masks = alloc_frame_masks(env, instance, frame, liveness->write_insn_idx); in commit_stack_write_marks()
382 if (instance->must_write_set[idx]) in commit_stack_write_marks()
386 instance->updated = true; in commit_stack_write_marks()
389 instance->must_write_dropped = true; in commit_stack_write_marks()
391 instance->must_write_set[idx] = true; in commit_stack_write_marks()
511 struct func_instance *instance) in get_outer_instance() argument
513 struct callchain callchain = instance->callchain; in get_outer_instance()
533 struct func_instance *instance) in propagate_to_outer_instance() argument
535 struct callchain *callchain = &instance->callchain; in propagate_to_outer_instance()
542 outer_instance = get_outer_instance(env, instance); in propagate_to_outer_instance()
549 insn = get_frame_masks(instance, frame, this_subprog_start); in propagate_to_outer_instance()
562 struct func_instance *instance, u32 frame, u32 insn_idx) in update_insn() argument
576 insn = get_frame_masks(instance, frame, insn_idx); in update_insn()
585 succ_insn = get_frame_masks(instance, frame, succ->items[s]); in update_insn()
599 insn_idx == callchain_subprog_start(&instance->callchain) || in update_insn()
601 log_mask_change(env, &instance->callchain, "live", in update_insn()
603 log_mask_change(env, &instance->callchain, "written", in update_insn()
612 static int update_instance(struct bpf_verifier_env *env, struct func_instance *instance) in update_instance() argument
615 struct callchain *callchain = &instance->callchain; in update_instance()
627 if (instance->must_write_dropped) { in update_instance()
629 if (!instance->frames[frame]) in update_instance()
632 for (i = 0; i < instance->insn_cnt; i++) { in update_instance()
633 insn = get_frame_masks(instance, frame, this_subprog_start + i); in update_instance()
647 for (frame = 0; frame <= instance->callchain.curframe; frame++) { in update_instance()
648 if (!instance->frames[frame]) in update_instance()
652 changed |= update_insn(env, instance, frame, insn_postorder[i]); in update_instance()
662 err = propagate_to_outer_instance(env, instance); in update_instance()
680 struct func_instance *instance; in bpf_update_live_stack() local
685 instance = lookup_instance(env, env->cur_state, frame); in bpf_update_live_stack()
686 if (IS_ERR(instance)) in bpf_update_live_stack()
687 return PTR_ERR(instance); in bpf_update_live_stack()
689 if (instance->updated) { in bpf_update_live_stack()
690 err = update_instance(env, instance); in bpf_update_live_stack()
693 instance->updated = false; in bpf_update_live_stack()
694 instance->must_write_dropped = false; in bpf_update_live_stack()
700 static bool is_live_before(struct func_instance *instance, u32 insn_idx, u32 frameno, u32 spi) in is_live_before() argument
704 masks = get_frame_masks(instance, frameno, insn_idx); in is_live_before()
711 struct func_instance *instance; in bpf_live_stack_query_init() local
716 instance = lookup_instance(env, st, frame); in bpf_live_stack_query_init()
717 if (IS_ERR(instance)) in bpf_live_stack_query_init()
718 return PTR_ERR(instance); in bpf_live_stack_query_init()
719 q->instances[frame] = instance; in bpf_live_stack_query_init()
735 struct func_instance *instance, *curframe_instance; in bpf_stack_slot_alive() local
745 instance = q->instances[i]; in bpf_stack_slot_alive()
747 ? is_live_before(instance, callsite, frameno, spi) in bpf_stack_slot_alive()
748 : is_live_before(instance, callsite + 1, frameno, spi); in bpf_stack_slot_alive()