Lines Matching refs:link

2337 void bpf_link_init(struct bpf_link *link, enum bpf_link_type type, const struct bpf_link_ops *ops,
2340 atomic64_set(&link->refcnt, 1);
2341 link->type = type;
2342 link->id = 0;
2343 link->ops = ops;
2344 link->prog = prog;
2367 primer->link->prog = NULL;
2373 void bpf_link_inc(struct bpf_link *link)
2375 atomic64_inc(&link->refcnt);
2379 static void bpf_link_free(struct bpf_link *link)
2381 bpf_link_free_id(link->id);
2382 if (link->prog) {
2384 link->ops->release(link);
2385 bpf_prog_put(link->prog);
2388 link->ops->dealloc(link);
2393 struct bpf_link *link = container_of(work, struct bpf_link, work);
2395 bpf_link_free(link);
2401 void bpf_link_put(struct bpf_link *link)
2403 if (!atomic64_dec_and_test(&link->refcnt)) {
2408 INIT_WORK(&link->work, bpf_link_put_deferred);
2409 schedule_work(&link->work);
2411 bpf_link_free(link);
2417 struct bpf_link *link = filp->private_data;
2419 bpf_link_put(link);
2437 const struct bpf_link *link = filp->private_data;
2438 const struct bpf_prog *prog = link->prog;
2447 bpf_link_type_strs[link->type], link->id, prog_tag, prog->aux->id);
2448 if (link->ops->show_fdinfo) {
2449 link->ops->show_fdinfo(link, m);
2463 static int bpf_link_alloc_id(struct bpf_link *link)
2469 id = idr_alloc_cyclic(&link_idr, link, 1, INT_MAX, GFP_ATOMIC);
2489 int bpf_link_prime(struct bpf_link *link, struct bpf_link_primer *primer)
2499 id = bpf_link_alloc_id(link);
2505 file = anon_inode_getfile("bpf_link", &bpf_link_fops, link, O_CLOEXEC);
2512 primer->link = link;
2523 primer->link->id = primer->id;
2531 int bpf_link_new_fd(struct bpf_link *link)
2533 return anon_inode_getfd("bpf-link", &bpf_link_fops, link, O_CLOEXEC);
2539 struct bpf_link *link;
2549 link = f.file->private_data;
2550 bpf_link_inc(link);
2553 return link;
2557 struct bpf_link link;
2563 static void bpf_tracing_link_release(struct bpf_link *link)
2565 struct bpf_tracing_link *tr_link = container_of(link, struct bpf_tracing_link, link);
2567 WARN_ON_ONCE(bpf_trampoline_unlink_prog(link->prog, tr_link->trampoline));
2577 static void bpf_tracing_link_dealloc(struct bpf_link *link)
2579 struct bpf_tracing_link *tr_link = container_of(link, struct bpf_tracing_link, link);
2584 static void bpf_tracing_link_show_fdinfo(const struct bpf_link *link, struct seq_file *seq)
2586 struct bpf_tracing_link *tr_link = container_of(link, struct bpf_tracing_link, link);
2591 static int bpf_tracing_link_fill_link_info(const struct bpf_link *link, struct bpf_link_info *info)
2593 struct bpf_tracing_link *tr_link = container_of(link, struct bpf_tracing_link, link);
2612 struct bpf_tracing_link *link;
2663 link = kzalloc(sizeof(*link), GFP_USER);
2664 if (!link) {
2668 bpf_link_init(&link->link, BPF_LINK_TYPE_TRACING, &bpf_tracing_link_lops, prog);
2669 link->attach_type = prog->expected_attach_type;
2725 err = bpf_link_prime(&link->link, &link_primer);
2733 link = NULL;
2737 link->tgt_prog = tgt_prog;
2738 link->trampoline = tr;
2763 kfree(link);
2772 struct bpf_link link;
2776 static void bpf_raw_tp_link_release(struct bpf_link *link)
2778 struct bpf_raw_tp_link *raw_tp = container_of(link, struct bpf_raw_tp_link, link);
2780 bpf_probe_unregister(raw_tp->btp, raw_tp->link.prog);
2784 static void bpf_raw_tp_link_dealloc(struct bpf_link *link)
2786 struct bpf_raw_tp_link *raw_tp = container_of(link, struct bpf_raw_tp_link, link);
2791 static void bpf_raw_tp_link_show_fdinfo(const struct bpf_link *link, struct seq_file *seq)
2793 struct bpf_raw_tp_link *raw_tp_link = container_of(link, struct bpf_raw_tp_link, link);
2798 static int bpf_raw_tp_link_fill_link_info(const struct bpf_link *link, struct bpf_link_info *info)
2800 struct bpf_raw_tp_link *raw_tp_link = container_of(link, struct bpf_raw_tp_link, link);
2847 struct bpf_raw_tp_link *link;
2903 link = kzalloc(sizeof(*link), GFP_USER);
2904 if (!link) {
2908 bpf_link_init(&link->link, BPF_LINK_TYPE_RAW_TRACEPOINT, &bpf_raw_tp_link_lops, prog);
2909 link->btp = btp;
2911 err = bpf_link_prime(&link->link, &link_primer);
2913 kfree(link);
2917 err = bpf_probe_register(link->btp, prog);
3808 static int bpf_link_get_info_by_fd(struct file *file, struct bpf_link *link, const union bpf_attr *attr,
3827 info.type = link->type;
3828 info.id = link->id;
3829 info.prog_id = link->prog->aux->id;
3831 if (link->ops->fill_link_info) {
3832 err = link->ops->fill_link_info(link, &info);
4008 struct bpf_link *link = file->private_data;
4010 if (link->ops == &bpf_raw_tp_link_lops) {
4011 struct bpf_raw_tp_link *raw_tp = container_of(link, struct bpf_raw_tp_link, link);
4014 err = bpf_task_fd_query_copy(attr, uattr, raw_tp->link.prog->aux->id, BPF_FD_TYPE_RAW_TRACEPOINT,
4180 struct bpf_link *link;
4193 link = bpf_link_get_from_fd(attr->link_update.link_fd);
4194 if (IS_ERR(link)) {
4195 return PTR_ERR(link);
4216 if (link->ops->update_prog) {
4217 ret = link->ops->update_prog(link, new_prog, old_prog);
4230 bpf_link_put(link);
4238 struct bpf_link *link;
4245 link = bpf_link_get_from_fd(attr->link_detach.link_fd);
4246 if (IS_ERR(link)) {
4247 return PTR_ERR(link);
4250 if (link->ops->detach) {
4251 ret = link->ops->detach(link);
4256 bpf_link_put(link);
4260 static struct bpf_link *bpf_link_inc_not_zero(struct bpf_link *link)
4262 return atomic64_fetch_add_unless(&link->refcnt, 1, 0) ? link : ERR_PTR(-ENOENT);
4267 struct bpf_link *link;
4274 /* before link is "settled", ID is 0, pretend it doesn't exist yet */
4275 link = idr_find(&link_idr, id);
4276 if (link) {
4277 if (link->id) {
4278 link = bpf_link_inc_not_zero(link);
4280 link = ERR_PTR(-EAGAIN);
4283 link = ERR_PTR(-ENOENT);
4286 return link;
4293 struct bpf_link *link;
4305 link = bpf_link_by_id(id);
4306 if (IS_ERR(link)) {
4307 return PTR_ERR(link);
4310 fd = bpf_link_new_fd(link);
4312 bpf_link_put(link);
4378 struct bpf_link *link;
4389 link = bpf_link_get_from_fd(attr->iter_create.link_fd);
4390 if (IS_ERR(link)) {
4391 return PTR_ERR(link);
4394 err = bpf_iter_new_fd(link);
4395 bpf_link_put(link);