Lines Matching full:im
258 static void bpf_tramp_image_free(struct bpf_tramp_image *im) in bpf_tramp_image_free() argument
260 bpf_image_ksym_del(&im->ksym); in bpf_tramp_image_free()
261 arch_free_bpf_trampoline(im->image, im->size); in bpf_tramp_image_free()
262 bpf_jit_uncharge_modmem(im->size); in bpf_tramp_image_free()
263 percpu_ref_exit(&im->pcref); in bpf_tramp_image_free()
264 kfree_rcu(im, rcu); in bpf_tramp_image_free()
269 struct bpf_tramp_image *im; in __bpf_tramp_image_put_deferred() local
271 im = container_of(work, struct bpf_tramp_image, work); in __bpf_tramp_image_put_deferred()
272 bpf_tramp_image_free(im); in __bpf_tramp_image_put_deferred()
278 struct bpf_tramp_image *im; in __bpf_tramp_image_put_rcu() local
280 im = container_of(rcu, struct bpf_tramp_image, rcu); in __bpf_tramp_image_put_rcu()
281 INIT_WORK(&im->work, __bpf_tramp_image_put_deferred); in __bpf_tramp_image_put_rcu()
282 schedule_work(&im->work); in __bpf_tramp_image_put_rcu()
288 struct bpf_tramp_image *im; in __bpf_tramp_image_release() local
290 im = container_of(pcref, struct bpf_tramp_image, pcref); in __bpf_tramp_image_release()
291 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu); in __bpf_tramp_image_release()
297 struct bpf_tramp_image *im; in __bpf_tramp_image_put_rcu_tasks() local
299 im = container_of(rcu, struct bpf_tramp_image, rcu); in __bpf_tramp_image_put_rcu_tasks()
300 if (im->ip_after_call) in __bpf_tramp_image_put_rcu_tasks()
302 percpu_ref_kill(&im->pcref); in __bpf_tramp_image_put_rcu_tasks()
305 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu); in __bpf_tramp_image_put_rcu_tasks()
308 static void bpf_tramp_image_put(struct bpf_tramp_image *im) in bpf_tramp_image_put() argument
336 if (im->ip_after_call) { in bpf_tramp_image_put()
337 int err = bpf_arch_text_poke(im->ip_after_call, BPF_MOD_JUMP, in bpf_tramp_image_put()
338 NULL, im->ip_epilogue); in bpf_tramp_image_put()
341 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu_tasks); in bpf_tramp_image_put()
343 percpu_ref_kill(&im->pcref); in bpf_tramp_image_put()
353 call_rcu_tasks_trace(&im->rcu, __bpf_tramp_image_put_rcu_tasks); in bpf_tramp_image_put()
358 struct bpf_tramp_image *im; in bpf_tramp_image_alloc() local
363 im = kzalloc(sizeof(*im), GFP_KERNEL); in bpf_tramp_image_alloc()
364 if (!im) in bpf_tramp_image_alloc()
370 im->size = size; in bpf_tramp_image_alloc()
373 im->image = image = arch_alloc_bpf_trampoline(size); in bpf_tramp_image_alloc()
377 err = percpu_ref_init(&im->pcref, __bpf_tramp_image_release, 0, GFP_KERNEL); in bpf_tramp_image_alloc()
381 ksym = &im->ksym; in bpf_tramp_image_alloc()
386 return im; in bpf_tramp_image_alloc()
389 arch_free_bpf_trampoline(im->image, im->size); in bpf_tramp_image_alloc()
393 kfree(im); in bpf_tramp_image_alloc()
400 struct bpf_tramp_image *im; in bpf_trampoline_update() local
452 im = bpf_tramp_image_alloc(tr->key, size); in bpf_trampoline_update()
453 if (IS_ERR(im)) { in bpf_trampoline_update()
454 err = PTR_ERR(im); in bpf_trampoline_update()
458 err = arch_prepare_bpf_trampoline(im, im->image, im->image + size, in bpf_trampoline_update()
464 err = arch_protect_bpf_trampoline(im->image, im->size); in bpf_trampoline_update()
471 err = modify_fentry(tr, tr->cur_image->image, im->image, lock_direct_mutex); in bpf_trampoline_update()
474 err = register_fentry(tr, im->image); in bpf_trampoline_update()
486 /* free im memory and reallocate later */ in bpf_trampoline_update()
487 bpf_tramp_image_free(im); in bpf_trampoline_update()
496 tr->cur_image = im; in bpf_trampoline_update()
505 bpf_tramp_image_free(im); in bpf_trampoline_update()
1089 arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *image_end, in arch_prepare_bpf_trampoline() argument