Lines Matching full:im

254 static void bpf_tramp_image_free(struct bpf_tramp_image *im)  in bpf_tramp_image_free()  argument
256 bpf_image_ksym_del(&im->ksym); in bpf_tramp_image_free()
257 bpf_jit_free_exec(im->image); in bpf_tramp_image_free()
259 percpu_ref_exit(&im->pcref); in bpf_tramp_image_free()
260 kfree_rcu(im, rcu); in bpf_tramp_image_free()
265 struct bpf_tramp_image *im; in __bpf_tramp_image_put_deferred() local
267 im = container_of(work, struct bpf_tramp_image, work); in __bpf_tramp_image_put_deferred()
268 bpf_tramp_image_free(im); in __bpf_tramp_image_put_deferred()
274 struct bpf_tramp_image *im; in __bpf_tramp_image_put_rcu() local
276 im = container_of(rcu, struct bpf_tramp_image, rcu); in __bpf_tramp_image_put_rcu()
277 INIT_WORK(&im->work, __bpf_tramp_image_put_deferred); in __bpf_tramp_image_put_rcu()
278 schedule_work(&im->work); in __bpf_tramp_image_put_rcu()
284 struct bpf_tramp_image *im; in __bpf_tramp_image_release() local
286 im = container_of(pcref, struct bpf_tramp_image, pcref); in __bpf_tramp_image_release()
287 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu); in __bpf_tramp_image_release()
293 struct bpf_tramp_image *im; in __bpf_tramp_image_put_rcu_tasks() local
295 im = container_of(rcu, struct bpf_tramp_image, rcu); in __bpf_tramp_image_put_rcu_tasks()
296 if (im->ip_after_call) in __bpf_tramp_image_put_rcu_tasks()
298 percpu_ref_kill(&im->pcref); in __bpf_tramp_image_put_rcu_tasks()
301 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu); in __bpf_tramp_image_put_rcu_tasks()
304 static void bpf_tramp_image_put(struct bpf_tramp_image *im) in bpf_tramp_image_put() argument
332 if (im->ip_after_call) { in bpf_tramp_image_put()
333 int err = bpf_arch_text_poke(im->ip_after_call, BPF_MOD_JUMP, in bpf_tramp_image_put()
334 NULL, im->ip_epilogue); in bpf_tramp_image_put()
337 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu_tasks); in bpf_tramp_image_put()
339 percpu_ref_kill(&im->pcref); in bpf_tramp_image_put()
349 call_rcu_tasks_trace(&im->rcu, __bpf_tramp_image_put_rcu_tasks); in bpf_tramp_image_put()
354 struct bpf_tramp_image *im; in bpf_tramp_image_alloc() local
359 im = kzalloc(sizeof(*im), GFP_KERNEL); in bpf_tramp_image_alloc()
360 if (!im) in bpf_tramp_image_alloc()
368 im->image = image = bpf_jit_alloc_exec(PAGE_SIZE); in bpf_tramp_image_alloc()
373 err = percpu_ref_init(&im->pcref, __bpf_tramp_image_release, 0, GFP_KERNEL); in bpf_tramp_image_alloc()
377 ksym = &im->ksym; in bpf_tramp_image_alloc()
381 return im; in bpf_tramp_image_alloc()
384 bpf_jit_free_exec(im->image); in bpf_tramp_image_alloc()
388 kfree(im); in bpf_tramp_image_alloc()
395 struct bpf_tramp_image *im; in bpf_trampoline_update() local
412 im = bpf_tramp_image_alloc(tr->key); in bpf_trampoline_update()
413 if (IS_ERR(im)) { in bpf_trampoline_update()
414 err = PTR_ERR(im); in bpf_trampoline_update()
441 err = arch_prepare_bpf_trampoline(im, im->image, im->image + PAGE_SIZE, in bpf_trampoline_update()
447 set_memory_rox((long)im->image, 1); in bpf_trampoline_update()
452 err = modify_fentry(tr, tr->cur_image->image, im->image, lock_direct_mutex); in bpf_trampoline_update()
455 err = register_fentry(tr, im->image); in bpf_trampoline_update()
467 /* reset im->image memory attr for arch_prepare_bpf_trampoline */ in bpf_trampoline_update()
468 set_memory_nx((long)im->image, 1); in bpf_trampoline_update()
469 set_memory_rw((long)im->image, 1); in bpf_trampoline_update()
478 tr->cur_image = im; in bpf_trampoline_update()
487 bpf_tramp_image_free(im); in bpf_trampoline_update()