1 // SPDX-License-Identifier: GPL-2.0-only 2 /* Copyright (c) 2019 Facebook */ 3 #include <linux/hash.h> 4 #include <linux/bpf.h> 5 #include <linux/filter.h> 6 #include <linux/ftrace.h> 7 #include <linux/rbtree_latch.h> 8 #include <linux/perf_event.h> 9 #include <linux/btf.h> 10 #include <linux/rcupdate_trace.h> 11 #include <linux/rcupdate_wait.h> 12 #include <linux/static_call.h> 13 #include <linux/bpf_verifier.h> 14 #include <linux/bpf_lsm.h> 15 #include <linux/delay.h> 16 17 /* dummy _ops. The verifier will operate on target program's ops. */ 18 const struct bpf_verifier_ops bpf_extension_verifier_ops = { 19 }; 20 const struct bpf_prog_ops bpf_extension_prog_ops = { 21 }; 22 23 /* btf_vmlinux has ~22k attachable functions. 1k htab is enough. */ 24 #define TRAMPOLINE_HASH_BITS 10 25 #define TRAMPOLINE_TABLE_SIZE (1 << TRAMPOLINE_HASH_BITS) 26 27 static struct hlist_head trampoline_key_table[TRAMPOLINE_TABLE_SIZE]; 28 static struct hlist_head trampoline_ip_table[TRAMPOLINE_TABLE_SIZE]; 29 30 /* serializes access to trampoline tables */ 31 static DEFINE_MUTEX(trampoline_mutex); 32 33 /* 34 * Keep 32 trampoline locks (5 bits) in the pool so trampoline_lock_all() 35 * stays below MAX_LOCK_DEPTH. Each pool slot has a distinct lockdep 36 * class because trampoline_lock_all() takes all pool mutexes at once; 37 * otherwise lockdep would report recursive locking on same-class mutexes. 38 */ 39 #define TRAMPOLINE_LOCKS_BITS 5 40 #define TRAMPOLINE_LOCKS_TABLE_SIZE (1 << TRAMPOLINE_LOCKS_BITS) 41 42 static struct { 43 struct mutex mutex; 44 struct lock_class_key key; 45 } trampoline_locks[TRAMPOLINE_LOCKS_TABLE_SIZE]; 46 47 static struct mutex *select_trampoline_lock(struct bpf_trampoline *tr) 48 { 49 return &trampoline_locks[hash_ptr(tr, TRAMPOLINE_LOCKS_BITS)].mutex; 50 } 51 52 static void trampoline_lock(struct bpf_trampoline *tr) 53 { 54 mutex_lock(select_trampoline_lock(tr)); 55 } 56 57 static void trampoline_unlock(struct bpf_trampoline *tr) 58 { 59 mutex_unlock(select_trampoline_lock(tr)); 60 } 61 62 struct bpf_trampoline_ops { 63 int (*register_fentry)(struct bpf_trampoline *tr, struct bpf_tramp_image *im, void *data); 64 int (*unregister_fentry)(struct bpf_trampoline *tr, u32 orig_flags, void *data); 65 int (*modify_fentry)(struct bpf_trampoline *tr, u32 orig_flags, struct bpf_tramp_image *im, 66 bool lock_direct_mutex, void *data); 67 }; 68 69 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS 70 static int bpf_trampoline_update(struct bpf_trampoline *tr, bool lock_direct_mutex, 71 const struct bpf_trampoline_ops *ops, void *data); 72 static const struct bpf_trampoline_ops trampoline_ops; 73 74 #ifdef CONFIG_HAVE_SINGLE_FTRACE_DIRECT_OPS 75 static struct bpf_trampoline *direct_ops_ip_lookup(struct ftrace_ops *ops, unsigned long ip) 76 { 77 struct hlist_head *head_ip; 78 struct bpf_trampoline *tr; 79 80 mutex_lock(&trampoline_mutex); 81 head_ip = &trampoline_ip_table[hash_64(ip, TRAMPOLINE_HASH_BITS)]; 82 hlist_for_each_entry(tr, head_ip, hlist_ip) { 83 if (tr->ip == ip) 84 goto out; 85 } 86 tr = NULL; 87 out: 88 mutex_unlock(&trampoline_mutex); 89 return tr; 90 } 91 #else 92 static struct bpf_trampoline *direct_ops_ip_lookup(struct ftrace_ops *ops, unsigned long ip) 93 { 94 return ops->private; 95 } 96 #endif /* CONFIG_HAVE_SINGLE_FTRACE_DIRECT_OPS */ 97 98 static int bpf_tramp_ftrace_ops_func(struct ftrace_ops *ops, unsigned long ip, 99 enum ftrace_ops_cmd cmd) 100 { 101 struct bpf_trampoline *tr; 102 int ret = 0; 103 104 tr = direct_ops_ip_lookup(ops, ip); 105 if (!tr) 106 return -EINVAL; 107 108 if (cmd == FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_SELF) { 109 /* This is called inside register_ftrace_direct_multi(), so 110 * trampoline's mutex is already locked. 111 */ 112 lockdep_assert_held_once(select_trampoline_lock(tr)); 113 114 /* Instead of updating the trampoline here, we propagate 115 * -EAGAIN to register_ftrace_direct(). Then we can 116 * retry register_ftrace_direct() after updating the 117 * trampoline. 118 */ 119 if ((tr->flags & BPF_TRAMP_F_CALL_ORIG) && 120 !(tr->flags & BPF_TRAMP_F_ORIG_STACK)) { 121 if (WARN_ON_ONCE(tr->flags & BPF_TRAMP_F_SHARE_IPMODIFY)) 122 return -EBUSY; 123 124 tr->flags |= BPF_TRAMP_F_SHARE_IPMODIFY; 125 return -EAGAIN; 126 } 127 128 return 0; 129 } 130 131 /* The normal locking order is 132 * select_trampoline_lock(tr) => direct_mutex (ftrace.c) => ftrace_lock (ftrace.c) 133 * 134 * The following two commands are called from 135 * 136 * prepare_direct_functions_for_ipmodify 137 * cleanup_direct_functions_after_ipmodify 138 * 139 * In both cases, direct_mutex is already locked. Use 140 * mutex_trylock(select_trampoline_lock(tr)) to avoid deadlock in race condition 141 * (something else holds the same pool lock). 142 */ 143 if (!mutex_trylock(select_trampoline_lock(tr))) { 144 /* sleep 1 ms to make sure whatever holding select_trampoline_lock(tr) 145 * makes some progress. 146 */ 147 msleep(1); 148 return -EAGAIN; 149 } 150 151 switch (cmd) { 152 case FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_PEER: 153 tr->flags |= BPF_TRAMP_F_SHARE_IPMODIFY; 154 155 if ((tr->flags & BPF_TRAMP_F_CALL_ORIG) && 156 !(tr->flags & BPF_TRAMP_F_ORIG_STACK)) 157 ret = bpf_trampoline_update(tr, false /* lock_direct_mutex */, 158 &trampoline_ops, NULL); 159 break; 160 case FTRACE_OPS_CMD_DISABLE_SHARE_IPMODIFY_PEER: 161 tr->flags &= ~BPF_TRAMP_F_SHARE_IPMODIFY; 162 163 if (tr->flags & BPF_TRAMP_F_ORIG_STACK) 164 ret = bpf_trampoline_update(tr, false /* lock_direct_mutex */, 165 &trampoline_ops, NULL); 166 break; 167 default: 168 ret = -EINVAL; 169 break; 170 } 171 172 trampoline_unlock(tr); 173 return ret; 174 } 175 #endif 176 177 bool bpf_prog_has_trampoline(const struct bpf_prog *prog) 178 { 179 enum bpf_attach_type eatype = prog->expected_attach_type; 180 enum bpf_prog_type ptype = prog->type; 181 182 switch (ptype) { 183 case BPF_PROG_TYPE_TRACING: 184 if (eatype == BPF_TRACE_FENTRY || eatype == BPF_TRACE_FEXIT || 185 eatype == BPF_MODIFY_RETURN || eatype == BPF_TRACE_FSESSION || 186 eatype == BPF_TRACE_FENTRY_MULTI || eatype == BPF_TRACE_FEXIT_MULTI || 187 eatype == BPF_TRACE_FSESSION_MULTI) 188 return true; 189 return false; 190 case BPF_PROG_TYPE_LSM: 191 return eatype == BPF_LSM_MAC; 192 default: 193 return false; 194 } 195 } 196 197 void bpf_image_ksym_init(void *data, unsigned int size, struct bpf_ksym *ksym) 198 { 199 ksym->start = (unsigned long) data; 200 ksym->end = ksym->start + size; 201 } 202 203 void bpf_image_ksym_add(struct bpf_ksym *ksym) 204 { 205 bpf_ksym_add(ksym); 206 perf_event_ksymbol(PERF_RECORD_KSYMBOL_TYPE_BPF, ksym->start, 207 PAGE_SIZE, false, ksym->name); 208 } 209 210 void bpf_image_ksym_del(struct bpf_ksym *ksym) 211 { 212 bpf_ksym_del(ksym); 213 perf_event_ksymbol(PERF_RECORD_KSYMBOL_TYPE_BPF, ksym->start, 214 PAGE_SIZE, true, ksym->name); 215 } 216 217 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS 218 #ifdef CONFIG_HAVE_SINGLE_FTRACE_DIRECT_OPS 219 /* 220 * We have only single direct_ops which contains all the direct call 221 * sites and is the only global ftrace_ops for all trampolines. 222 * 223 * We use 'update_ftrace_direct_*' api for attachment. 224 */ 225 struct ftrace_ops direct_ops = { 226 .ops_func = bpf_tramp_ftrace_ops_func, 227 }; 228 229 static int direct_ops_alloc(struct bpf_trampoline *tr) 230 { 231 tr->fops = &direct_ops; 232 return 0; 233 } 234 235 static void direct_ops_free(struct bpf_trampoline *tr) { } 236 237 static struct ftrace_hash *hash_from_ip(struct bpf_trampoline *tr, void *ptr) 238 { 239 unsigned long ip, addr = (unsigned long) ptr; 240 struct ftrace_hash *hash; 241 242 ip = ftrace_location(tr->ip); 243 if (!ip) 244 return NULL; 245 hash = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS); 246 if (!hash) 247 return NULL; 248 if (bpf_trampoline_use_jmp(tr->flags)) 249 addr = ftrace_jmp_set(addr); 250 if (!add_ftrace_hash_entry_direct(hash, ip, addr)) { 251 free_ftrace_hash(hash); 252 return NULL; 253 } 254 return hash; 255 } 256 257 static int direct_ops_add(struct bpf_trampoline *tr, void *addr) 258 { 259 struct ftrace_hash *hash = hash_from_ip(tr, addr); 260 int err; 261 262 if (!hash) 263 return -ENOMEM; 264 err = update_ftrace_direct_add(tr->fops, hash); 265 free_ftrace_hash(hash); 266 return err; 267 } 268 269 static int direct_ops_del(struct bpf_trampoline *tr, void *addr) 270 { 271 struct ftrace_hash *hash = hash_from_ip(tr, addr); 272 int err; 273 274 if (!hash) 275 return -ENOMEM; 276 err = update_ftrace_direct_del(tr->fops, hash); 277 free_ftrace_hash(hash); 278 return err; 279 } 280 281 static int direct_ops_mod(struct bpf_trampoline *tr, void *addr, bool lock_direct_mutex) 282 { 283 struct ftrace_hash *hash = hash_from_ip(tr, addr); 284 int err; 285 286 if (!hash) 287 return -ENOMEM; 288 err = update_ftrace_direct_mod(tr->fops, hash, lock_direct_mutex); 289 free_ftrace_hash(hash); 290 return err; 291 } 292 #else 293 /* 294 * We allocate ftrace_ops object for each trampoline and it contains 295 * call site specific for that trampoline. 296 * 297 * We use *_ftrace_direct api for attachment. 298 */ 299 static int direct_ops_alloc(struct bpf_trampoline *tr) 300 { 301 tr->fops = kzalloc_obj(struct ftrace_ops); 302 if (!tr->fops) 303 return -ENOMEM; 304 tr->fops->private = tr; 305 tr->fops->ops_func = bpf_tramp_ftrace_ops_func; 306 return 0; 307 } 308 309 static void direct_ops_free(struct bpf_trampoline *tr) 310 { 311 if (!tr->fops) 312 return; 313 ftrace_free_filter(tr->fops); 314 kfree(tr->fops); 315 } 316 317 static int direct_ops_add(struct bpf_trampoline *tr, void *ptr) 318 { 319 unsigned long addr = (unsigned long) ptr; 320 struct ftrace_ops *ops = tr->fops; 321 int ret; 322 323 if (bpf_trampoline_use_jmp(tr->flags)) 324 addr = ftrace_jmp_set(addr); 325 326 ret = ftrace_set_filter_ip(ops, tr->ip, 0, 1); 327 if (ret) 328 return ret; 329 return register_ftrace_direct(ops, addr); 330 } 331 332 static int direct_ops_del(struct bpf_trampoline *tr, void *addr) 333 { 334 return unregister_ftrace_direct(tr->fops, (long)addr, false); 335 } 336 337 static int direct_ops_mod(struct bpf_trampoline *tr, void *ptr, bool lock_direct_mutex) 338 { 339 unsigned long addr = (unsigned long) ptr; 340 struct ftrace_ops *ops = tr->fops; 341 342 if (bpf_trampoline_use_jmp(tr->flags)) 343 addr = ftrace_jmp_set(addr); 344 if (lock_direct_mutex) 345 return modify_ftrace_direct(ops, addr); 346 return modify_ftrace_direct_nolock(ops, addr); 347 } 348 #endif /* CONFIG_HAVE_SINGLE_FTRACE_DIRECT_OPS */ 349 #else 350 static void direct_ops_free(struct bpf_trampoline *tr) { } 351 352 static int direct_ops_alloc(struct bpf_trampoline *tr) 353 { 354 return 0; 355 } 356 357 static int direct_ops_add(struct bpf_trampoline *tr, void *addr) 358 { 359 return -ENODEV; 360 } 361 362 static int direct_ops_del(struct bpf_trampoline *tr, void *addr) 363 { 364 return -ENODEV; 365 } 366 367 static int direct_ops_mod(struct bpf_trampoline *tr, void *ptr, bool lock_direct_mutex) 368 { 369 return -ENODEV; 370 } 371 #endif /* CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS */ 372 373 static struct bpf_trampoline *bpf_trampoline_lookup(u64 key, unsigned long ip) 374 { 375 struct bpf_trampoline *tr; 376 struct hlist_head *head; 377 int i; 378 379 mutex_lock(&trampoline_mutex); 380 head = &trampoline_key_table[hash_64(key, TRAMPOLINE_HASH_BITS)]; 381 hlist_for_each_entry(tr, head, hlist_key) { 382 if (tr->key == key) { 383 refcount_inc(&tr->refcnt); 384 goto out; 385 } 386 } 387 tr = kzalloc_obj(*tr); 388 if (!tr) 389 goto out; 390 if (direct_ops_alloc(tr)) { 391 kfree(tr); 392 tr = NULL; 393 goto out; 394 } 395 396 tr->key = key; 397 tr->ip = ftrace_location(ip); 398 INIT_HLIST_NODE(&tr->hlist_key); 399 INIT_HLIST_NODE(&tr->hlist_ip); 400 hlist_add_head(&tr->hlist_key, head); 401 head = &trampoline_ip_table[hash_64(tr->ip, TRAMPOLINE_HASH_BITS)]; 402 hlist_add_head(&tr->hlist_ip, head); 403 refcount_set(&tr->refcnt, 1); 404 for (i = 0; i < BPF_TRAMP_MAX; i++) 405 INIT_HLIST_HEAD(&tr->progs_hlist[i]); 406 out: 407 mutex_unlock(&trampoline_mutex); 408 return tr; 409 } 410 411 static int bpf_trampoline_update_fentry(struct bpf_trampoline *tr, u32 orig_flags, 412 void *old_addr, void *new_addr) 413 { 414 enum bpf_text_poke_type new_t = BPF_MOD_CALL, old_t = BPF_MOD_CALL; 415 void *ip = tr->func.addr; 416 417 if (!new_addr) 418 new_t = BPF_MOD_NOP; 419 else if (bpf_trampoline_use_jmp(tr->flags)) 420 new_t = BPF_MOD_JUMP; 421 422 if (!old_addr) 423 old_t = BPF_MOD_NOP; 424 else if (bpf_trampoline_use_jmp(orig_flags)) 425 old_t = BPF_MOD_JUMP; 426 427 return bpf_arch_text_poke(ip, old_t, new_t, old_addr, new_addr); 428 } 429 430 static void bpf_tramp_image_put(struct bpf_tramp_image *im); 431 432 static int unregister_fentry(struct bpf_trampoline *tr, u32 orig_flags, void *data __maybe_unused) 433 { 434 void *old_addr = tr->cur_image->image; 435 int ret; 436 437 if (tr->func.ftrace_managed) 438 ret = direct_ops_del(tr, old_addr); 439 else 440 ret = bpf_trampoline_update_fentry(tr, orig_flags, old_addr, NULL); 441 442 if (ret) 443 return ret; 444 445 bpf_tramp_image_put(tr->cur_image); 446 tr->cur_image = NULL; 447 return 0; 448 } 449 450 static int modify_fentry(struct bpf_trampoline *tr, u32 orig_flags, struct bpf_tramp_image *im, 451 bool lock_direct_mutex, void *data __maybe_unused) 452 { 453 void *old_addr = tr->cur_image->image; 454 void *new_addr = im->image; 455 int ret; 456 457 if (tr->func.ftrace_managed) { 458 ret = direct_ops_mod(tr, new_addr, lock_direct_mutex); 459 } else { 460 ret = bpf_trampoline_update_fentry(tr, orig_flags, old_addr, 461 new_addr); 462 } 463 464 if (ret) 465 return ret; 466 467 bpf_tramp_image_put(tr->cur_image); 468 tr->cur_image = im; 469 return 0; 470 } 471 472 /* first time registering */ 473 static int register_fentry(struct bpf_trampoline *tr, struct bpf_tramp_image *im, 474 void *data __maybe_unused) 475 { 476 void *new_addr = im->image; 477 void *ip = tr->func.addr; 478 unsigned long faddr; 479 int ret; 480 481 faddr = ftrace_location((unsigned long)ip); 482 if (faddr) { 483 if (!tr->fops) 484 return -ENOTSUPP; 485 tr->func.ftrace_managed = true; 486 } 487 488 if (tr->func.ftrace_managed) { 489 ret = direct_ops_add(tr, new_addr); 490 } else { 491 ret = bpf_trampoline_update_fentry(tr, 0, NULL, new_addr); 492 } 493 494 if (ret) 495 return ret; 496 497 tr->cur_image = im; 498 return 0; 499 } 500 501 static const struct bpf_trampoline_ops trampoline_ops = { 502 .register_fentry = register_fentry, 503 .unregister_fentry = unregister_fentry, 504 .modify_fentry = modify_fentry, 505 }; 506 507 static struct bpf_tramp_nodes * 508 bpf_trampoline_get_progs(const struct bpf_trampoline *tr, int *total, bool *ip_arg) 509 { 510 struct bpf_tramp_node *node, **nodes; 511 struct bpf_tramp_nodes *tnodes; 512 int kind; 513 514 *total = 0; 515 tnodes = kzalloc_objs(*tnodes, BPF_TRAMP_MAX); 516 if (!tnodes) 517 return ERR_PTR(-ENOMEM); 518 519 for (kind = 0; kind < BPF_TRAMP_MAX; kind++) { 520 tnodes[kind].nr_nodes = tr->progs_cnt[kind]; 521 *total += tr->progs_cnt[kind]; 522 nodes = tnodes[kind].nodes; 523 524 hlist_for_each_entry(node, &tr->progs_hlist[kind], tramp_hlist) { 525 *ip_arg |= node->link->prog->call_get_func_ip; 526 *nodes++ = node; 527 } 528 } 529 return tnodes; 530 } 531 532 /* 533 * The arena base against which save_args() converts the arguments marked 534 * with BTF_FMODEL_ARENA_ARG. Only the struct_ops indirect trampoline 535 * converts: it dispatches to a single prog whose arena is known at 536 * generation time. Return 0 when there is nothing to convert. 537 */ 538 u64 bpf_tramp_arena_base(const struct btf_func_model *m, 539 struct bpf_tramp_nodes *tnodes, u32 flags) 540 { 541 const struct bpf_prog *prog; 542 int i; 543 544 if (!(flags & BPF_TRAMP_F_INDIRECT) || 545 tnodes[BPF_TRAMP_FENTRY].nr_nodes != 1) 546 return 0; 547 548 for (i = 0; i < m->nr_args; i++) 549 if (m->arg_flags[i] & BTF_FMODEL_ARENA_ARG) 550 break; 551 if (i == m->nr_args) 552 return 0; 553 554 /* Verification rejects an arena argument without an arena. */ 555 prog = tnodes[BPF_TRAMP_FENTRY].nodes[0]->link->prog; 556 if (WARN_ON_ONCE(!prog->aux->arena)) 557 return 0; 558 559 return bpf_arena_get_kern_vm_start(prog->aux->arena); 560 } 561 562 static void bpf_tramp_image_free(struct bpf_tramp_image *im) 563 { 564 bpf_image_ksym_del(&im->ksym); 565 arch_free_bpf_trampoline(im->image, im->size); 566 bpf_jit_uncharge_modmem(im->size); 567 percpu_ref_exit(&im->pcref); 568 kfree_rcu(im, rcu); 569 } 570 571 static void __bpf_tramp_image_put_deferred(struct work_struct *work) 572 { 573 struct bpf_tramp_image *im; 574 575 im = container_of(work, struct bpf_tramp_image, work); 576 bpf_tramp_image_free(im); 577 } 578 579 /* callback, fexit step 3 or fentry step 2 */ 580 static void __bpf_tramp_image_put_rcu(struct rcu_head *rcu) 581 { 582 struct bpf_tramp_image *im; 583 584 im = container_of(rcu, struct bpf_tramp_image, rcu); 585 INIT_WORK(&im->work, __bpf_tramp_image_put_deferred); 586 schedule_work(&im->work); 587 } 588 589 /* callback, fexit step 2. Called after percpu_ref_kill confirms. */ 590 static void __bpf_tramp_image_release(struct percpu_ref *pcref) 591 { 592 struct bpf_tramp_image *im; 593 594 im = container_of(pcref, struct bpf_tramp_image, pcref); 595 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu); 596 } 597 598 /* callback, fexit or fentry step 1 */ 599 static void __bpf_tramp_image_put_rcu_tasks(struct rcu_head *rcu) 600 { 601 struct bpf_tramp_image *im; 602 603 im = container_of(rcu, struct bpf_tramp_image, rcu); 604 if (im->ip_after_call) 605 /* the case of fmod_ret/fexit trampoline and CONFIG_PREEMPTION=y */ 606 percpu_ref_kill(&im->pcref); 607 else 608 /* the case of fentry trampoline */ 609 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu); 610 } 611 612 static void bpf_tramp_image_put(struct bpf_tramp_image *im) 613 { 614 /* The trampoline image that calls original function is using: 615 * rcu_read_lock_trace to protect sleepable bpf progs 616 * rcu_read_lock to protect normal bpf progs 617 * percpu_ref to protect trampoline itself 618 * rcu tasks to protect trampoline asm not covered by percpu_ref 619 * (which are few asm insns before __bpf_tramp_enter and 620 * after __bpf_tramp_exit) 621 * 622 * The trampoline is unreachable before bpf_tramp_image_put(). 623 * 624 * First, patch the trampoline to avoid calling into fexit progs. 625 * The progs will be freed even if the original function is still 626 * executing or sleeping. 627 * In case of CONFIG_PREEMPT=y use call_rcu_tasks() to wait on 628 * first few asm instructions to execute and call into 629 * __bpf_tramp_enter->percpu_ref_get. 630 * Then use percpu_ref_kill to wait for the trampoline and the original 631 * function to finish. 632 * Then use call_rcu_tasks() to make sure few asm insns in 633 * the trampoline epilogue are done as well. 634 * 635 * In !PREEMPT case the task that got interrupted in the first asm 636 * insns won't go through an RCU quiescent state which the 637 * percpu_ref_kill will be waiting for. Hence the first 638 * call_rcu_tasks() is not necessary. 639 */ 640 if (im->ip_after_call) { 641 int err = bpf_arch_text_poke(im->ip_after_call, BPF_MOD_NOP, 642 BPF_MOD_JUMP, NULL, 643 im->ip_epilogue); 644 WARN_ON(err); 645 if (IS_ENABLED(CONFIG_TASKS_RCU)) 646 call_rcu_tasks(&im->rcu, __bpf_tramp_image_put_rcu_tasks); 647 else 648 percpu_ref_kill(&im->pcref); 649 return; 650 } 651 652 /* The trampoline without fexit and fmod_ret progs doesn't call original 653 * function and doesn't use percpu_ref. 654 * Use call_rcu_tasks_trace() to wait for sleepable progs to finish. 655 * Then use call_rcu_tasks() to wait for the rest of trampoline asm 656 * and normal progs. 657 */ 658 call_rcu_tasks_trace(&im->rcu, __bpf_tramp_image_put_rcu_tasks); 659 } 660 661 static struct bpf_tramp_image *bpf_tramp_image_alloc(u64 key, int size) 662 { 663 struct bpf_tramp_image *im; 664 struct bpf_ksym *ksym; 665 void *image; 666 int err = -ENOMEM; 667 668 im = kzalloc_obj(*im); 669 if (!im) 670 goto out; 671 672 err = bpf_jit_charge_modmem(size); 673 if (err) 674 goto out_free_im; 675 im->size = size; 676 677 err = -ENOMEM; 678 im->image = image = arch_alloc_bpf_trampoline(size); 679 if (!image) 680 goto out_uncharge; 681 682 err = percpu_ref_init(&im->pcref, __bpf_tramp_image_release, 0, GFP_KERNEL); 683 if (err) 684 goto out_free_image; 685 686 ksym = &im->ksym; 687 INIT_LIST_HEAD_RCU(&ksym->lnode); 688 snprintf(ksym->name, KSYM_NAME_LEN, "bpf_trampoline_%llu", key); 689 bpf_image_ksym_init(image, size, ksym); 690 bpf_image_ksym_add(ksym); 691 return im; 692 693 out_free_image: 694 arch_free_bpf_trampoline(im->image, im->size); 695 out_uncharge: 696 bpf_jit_uncharge_modmem(size); 697 out_free_im: 698 kfree(im); 699 out: 700 return ERR_PTR(err); 701 } 702 703 void bpf_trampoline_set_flags(struct bpf_trampoline *tr, u32 flags) 704 { 705 trampoline_lock(tr); 706 tr->flags |= flags; 707 trampoline_unlock(tr); 708 } 709 710 static int bpf_trampoline_update(struct bpf_trampoline *tr, bool lock_direct_mutex, 711 const struct bpf_trampoline_ops *ops, void *data) 712 { 713 struct bpf_tramp_image *im; 714 struct bpf_tramp_nodes *tnodes; 715 u32 orig_flags = tr->flags; 716 bool ip_arg = false; 717 int err, total, size; 718 719 tnodes = bpf_trampoline_get_progs(tr, &total, &ip_arg); 720 if (IS_ERR(tnodes)) 721 return PTR_ERR(tnodes); 722 723 if (total == 0) { 724 err = ops->unregister_fentry(tr, orig_flags, data); 725 goto out; 726 } 727 728 /* clear all bits except SHARE_IPMODIFY and TAIL_CALL_CTX */ 729 tr->flags &= (BPF_TRAMP_F_SHARE_IPMODIFY | BPF_TRAMP_F_TAIL_CALL_CTX); 730 731 if (tnodes[BPF_TRAMP_FEXIT].nr_nodes || 732 tnodes[BPF_TRAMP_MODIFY_RETURN].nr_nodes) { 733 /* NOTE: BPF_TRAMP_F_RESTORE_REGS and BPF_TRAMP_F_SKIP_FRAME 734 * should not be set together. 735 */ 736 tr->flags |= BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_SKIP_FRAME; 737 } else { 738 tr->flags |= BPF_TRAMP_F_RESTORE_REGS; 739 } 740 741 if (ip_arg) 742 tr->flags |= BPF_TRAMP_F_IP_ARG; 743 744 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS 745 again: 746 if (tr->flags & BPF_TRAMP_F_CALL_ORIG) { 747 if (tr->flags & BPF_TRAMP_F_SHARE_IPMODIFY) { 748 /* The BPF_TRAMP_F_SKIP_FRAME can be cleared in the 749 * first try, reset it in the second try. 750 */ 751 tr->flags |= BPF_TRAMP_F_ORIG_STACK | BPF_TRAMP_F_SKIP_FRAME; 752 } else if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE_WITH_JMP)) { 753 /* Use "jmp" instead of "call" for the trampoline 754 * in the origin call case, and we don't need to 755 * skip the frame. 756 */ 757 tr->flags &= ~BPF_TRAMP_F_SKIP_FRAME; 758 } 759 } 760 #endif 761 762 size = arch_bpf_trampoline_size(&tr->func.model, tr->flags, 763 tnodes, tr->func.addr); 764 if (size < 0) { 765 err = size; 766 goto out; 767 } 768 769 if (size > PAGE_SIZE) { 770 err = -E2BIG; 771 goto out; 772 } 773 774 im = bpf_tramp_image_alloc(tr->key, size); 775 if (IS_ERR(im)) { 776 err = PTR_ERR(im); 777 goto out; 778 } 779 780 err = arch_prepare_bpf_trampoline(im, im->image, im->image + size, 781 &tr->func.model, tr->flags, tnodes, 782 tr->func.addr); 783 if (err < 0) 784 goto out_free; 785 786 err = arch_protect_bpf_trampoline(im->image, im->size); 787 if (err) 788 goto out_free; 789 790 if (tr->cur_image) 791 /* progs already running at this address */ 792 err = ops->modify_fentry(tr, orig_flags, im, lock_direct_mutex, data); 793 else 794 /* first time registering */ 795 err = ops->register_fentry(tr, im, data); 796 797 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS 798 if (err == -EAGAIN) { 799 /* -EAGAIN from bpf_tramp_ftrace_ops_func. Now 800 * BPF_TRAMP_F_SHARE_IPMODIFY is set, we can generate the 801 * trampoline again, and retry register. 802 */ 803 bpf_tramp_image_free(im); 804 goto again; 805 } 806 #endif 807 808 out_free: 809 if (err) 810 bpf_tramp_image_free(im); 811 out: 812 /* If any error happens, restore previous flags */ 813 if (err) 814 tr->flags = orig_flags; 815 kfree(tnodes); 816 return err; 817 } 818 819 static enum bpf_tramp_prog_type bpf_attach_type_to_tramp(struct bpf_prog *prog) 820 { 821 switch (prog->expected_attach_type) { 822 case BPF_TRACE_FENTRY: 823 case BPF_TRACE_FENTRY_MULTI: 824 return BPF_TRAMP_FENTRY; 825 case BPF_MODIFY_RETURN: 826 return BPF_TRAMP_MODIFY_RETURN; 827 case BPF_TRACE_FEXIT: 828 case BPF_TRACE_FEXIT_MULTI: 829 return BPF_TRAMP_FEXIT; 830 case BPF_TRACE_FSESSION: 831 case BPF_TRACE_FSESSION_MULTI: 832 return BPF_TRAMP_FSESSION; 833 case BPF_LSM_MAC: 834 if (!prog->aux->attach_func_proto->type) 835 /* The function returns void, we cannot modify its 836 * return value. 837 */ 838 return BPF_TRAMP_FEXIT; 839 else 840 return BPF_TRAMP_MODIFY_RETURN; 841 default: 842 return BPF_TRAMP_REPLACE; 843 } 844 } 845 846 static int bpf_freplace_check_tgt_prog(struct bpf_prog *tgt_prog) 847 { 848 struct bpf_prog_aux *aux = tgt_prog->aux; 849 850 guard(mutex)(&aux->ext_mutex); 851 if (aux->prog_array_member_cnt) 852 /* Program extensions can not extend target prog when the target 853 * prog has been updated to any prog_array map as tail callee. 854 * It's to prevent a potential infinite loop like: 855 * tgt prog entry -> tgt prog subprog -> freplace prog entry 856 * --tailcall-> tgt prog entry. 857 */ 858 return -EBUSY; 859 860 aux->is_extended = true; 861 return 0; 862 } 863 864 static struct bpf_tramp_node *fsession_exit(struct bpf_tramp_node *node) 865 { 866 if (node->link->type == BPF_LINK_TYPE_TRACING) { 867 struct bpf_tracing_link *link; 868 869 link = container_of(node->link, struct bpf_tracing_link, link.link); 870 return &link->fexit; 871 } else if (node->link->type == BPF_LINK_TYPE_TRACING_MULTI) { 872 struct bpf_tracing_multi_link *link; 873 struct bpf_tracing_multi_node *mnode; 874 875 link = container_of(node->link, struct bpf_tracing_multi_link, link); 876 mnode = container_of(node, struct bpf_tracing_multi_node, node); 877 return &link->fexits[mnode - link->nodes]; 878 } 879 return NULL; 880 } 881 882 static int bpf_trampoline_add_prog(struct bpf_trampoline *tr, 883 struct bpf_tramp_node *node, 884 int cnt) 885 { 886 enum bpf_tramp_prog_type kind; 887 struct bpf_tramp_node *node_existing, *fexit; 888 struct hlist_head *prog_list; 889 890 kind = bpf_attach_type_to_tramp(node->link->prog); 891 if (kind == BPF_TRAMP_FSESSION) { 892 prog_list = &tr->progs_hlist[BPF_TRAMP_FENTRY]; 893 cnt++; 894 } else { 895 prog_list = &tr->progs_hlist[kind]; 896 } 897 if (cnt >= BPF_MAX_TRAMP_LINKS) 898 return -E2BIG; 899 if (!hlist_unhashed(&node->tramp_hlist)) 900 /* prog already linked */ 901 return -EBUSY; 902 hlist_for_each_entry(node_existing, prog_list, tramp_hlist) { 903 if (node_existing->link->prog != node->link->prog) 904 continue; 905 /* prog already linked */ 906 return -EBUSY; 907 } 908 909 hlist_add_head(&node->tramp_hlist, prog_list); 910 if (kind == BPF_TRAMP_FSESSION) { 911 tr->progs_cnt[BPF_TRAMP_FENTRY]++; 912 fexit = fsession_exit(node); 913 if (WARN_ON_ONCE(!fexit)) 914 return -EINVAL; 915 hlist_add_head(&fexit->tramp_hlist, &tr->progs_hlist[BPF_TRAMP_FEXIT]); 916 tr->progs_cnt[BPF_TRAMP_FEXIT]++; 917 } else { 918 tr->progs_cnt[kind]++; 919 } 920 return 0; 921 } 922 923 static void bpf_trampoline_remove_prog(struct bpf_trampoline *tr, 924 struct bpf_tramp_node *node) 925 { 926 enum bpf_tramp_prog_type kind; 927 struct bpf_tramp_node *fexit; 928 929 kind = bpf_attach_type_to_tramp(node->link->prog); 930 if (kind == BPF_TRAMP_FSESSION) { 931 fexit = fsession_exit(node); 932 if (WARN_ON_ONCE(!fexit)) 933 return; 934 hlist_del_init(&fexit->tramp_hlist); 935 tr->progs_cnt[BPF_TRAMP_FEXIT]--; 936 kind = BPF_TRAMP_FENTRY; 937 } 938 hlist_del_init(&node->tramp_hlist); 939 tr->progs_cnt[kind]--; 940 } 941 942 static int __bpf_trampoline_link_prog(struct bpf_tramp_node *node, 943 struct bpf_trampoline *tr, 944 struct bpf_prog *tgt_prog, 945 const struct bpf_trampoline_ops *ops, 946 void *data) 947 { 948 enum bpf_tramp_prog_type kind; 949 int err = 0; 950 int cnt = 0, i; 951 952 kind = bpf_attach_type_to_tramp(node->link->prog); 953 /* 954 * Arena ctx args are converted only by struct_ops indirect 955 * trampolines. They must never be attached to a generic trampoline. 956 */ 957 if (WARN_ON_ONCE(bpf_prog_has_arena_ctx_arg(node->link->prog))) 958 return -ENOTSUPP; 959 960 if (tr->extension_prog) 961 /* cannot attach fentry/fexit if extension prog is attached. 962 * cannot overwrite extension prog either. 963 */ 964 return -EBUSY; 965 966 for (i = 0; i < BPF_TRAMP_MAX; i++) 967 cnt += tr->progs_cnt[i]; 968 969 if (kind == BPF_TRAMP_REPLACE) { 970 /* Cannot attach extension if fentry/fexit are in use. */ 971 if (cnt) 972 return -EBUSY; 973 err = bpf_freplace_check_tgt_prog(tgt_prog); 974 if (err) 975 return err; 976 tr->extension_prog = node->link->prog; 977 return bpf_arch_text_poke(tr->func.addr, BPF_MOD_NOP, 978 BPF_MOD_JUMP, NULL, 979 node->link->prog->bpf_func); 980 } 981 err = bpf_trampoline_add_prog(tr, node, cnt); 982 if (err) 983 return err; 984 err = bpf_trampoline_update(tr, true /* lock_direct_mutex */, ops, data); 985 if (err) 986 bpf_trampoline_remove_prog(tr, node); 987 return err; 988 } 989 990 int bpf_trampoline_link_prog(struct bpf_tramp_node *node, 991 struct bpf_trampoline *tr, 992 struct bpf_prog *tgt_prog) 993 { 994 int err; 995 996 trampoline_lock(tr); 997 err = __bpf_trampoline_link_prog(node, tr, tgt_prog, &trampoline_ops, NULL); 998 trampoline_unlock(tr); 999 return err; 1000 } 1001 1002 static int __bpf_trampoline_unlink_prog(struct bpf_tramp_node *node, 1003 struct bpf_trampoline *tr, 1004 struct bpf_prog *tgt_prog, 1005 const struct bpf_trampoline_ops *ops, 1006 void *data) 1007 { 1008 enum bpf_tramp_prog_type kind; 1009 int err; 1010 1011 kind = bpf_attach_type_to_tramp(node->link->prog); 1012 if (kind == BPF_TRAMP_REPLACE) { 1013 WARN_ON_ONCE(!tr->extension_prog); 1014 err = bpf_arch_text_poke(tr->func.addr, BPF_MOD_JUMP, 1015 BPF_MOD_NOP, 1016 tr->extension_prog->bpf_func, NULL); 1017 tr->extension_prog = NULL; 1018 guard(mutex)(&tgt_prog->aux->ext_mutex); 1019 tgt_prog->aux->is_extended = false; 1020 return err; 1021 } 1022 bpf_trampoline_remove_prog(tr, node); 1023 return bpf_trampoline_update(tr, true /* lock_direct_mutex */, ops, data); 1024 } 1025 1026 /* bpf_trampoline_unlink_prog() should never fail. */ 1027 int bpf_trampoline_unlink_prog(struct bpf_tramp_node *node, 1028 struct bpf_trampoline *tr, 1029 struct bpf_prog *tgt_prog) 1030 { 1031 int err; 1032 1033 trampoline_lock(tr); 1034 err = __bpf_trampoline_unlink_prog(node, tr, tgt_prog, &trampoline_ops, NULL); 1035 trampoline_unlock(tr); 1036 return err; 1037 } 1038 1039 #if defined(CONFIG_CGROUP_BPF) && defined(CONFIG_BPF_LSM) 1040 static void bpf_shim_tramp_link_release(struct bpf_link *link) 1041 { 1042 struct bpf_shim_tramp_link *shim_link = 1043 container_of(link, struct bpf_shim_tramp_link, link.link); 1044 int err; 1045 1046 /* paired with 'shim_link->trampoline = tr' in bpf_trampoline_link_cgroup_shim */ 1047 if (!shim_link->trampoline) 1048 return; 1049 1050 err = bpf_trampoline_unlink_prog(&shim_link->link.node, shim_link->trampoline, NULL); 1051 WARN_ONCE(err, "bpf_trampoline_unlink_prog failed: %d\n", err); 1052 1053 bpf_trampoline_put(shim_link->trampoline); 1054 } 1055 1056 static void bpf_shim_tramp_link_dealloc(struct bpf_link *link) 1057 { 1058 struct bpf_shim_tramp_link *shim_link = 1059 container_of(link, struct bpf_shim_tramp_link, link.link); 1060 1061 kfree(shim_link); 1062 } 1063 1064 static const struct bpf_link_ops bpf_shim_tramp_link_lops = { 1065 .release = bpf_shim_tramp_link_release, 1066 .dealloc = bpf_shim_tramp_link_dealloc, 1067 }; 1068 1069 static struct bpf_shim_tramp_link *cgroup_shim_alloc(const struct bpf_prog *prog, 1070 bpf_func_t bpf_func, 1071 int cgroup_atype, 1072 enum bpf_attach_type attach_type) 1073 { 1074 struct bpf_shim_tramp_link *shim_link = NULL; 1075 struct bpf_prog *p; 1076 1077 shim_link = kzalloc_obj(*shim_link, GFP_USER); 1078 if (!shim_link) 1079 return NULL; 1080 1081 p = bpf_prog_alloc(1, 0); 1082 if (!p) { 1083 kfree(shim_link); 1084 return NULL; 1085 } 1086 1087 p->jited = false; 1088 p->bpf_func = bpf_func; 1089 1090 p->aux->cgroup_atype = cgroup_atype; 1091 p->aux->attach_func_proto = prog->aux->attach_func_proto; 1092 p->aux->attach_btf_id = prog->aux->attach_btf_id; 1093 p->aux->attach_btf = prog->aux->attach_btf; 1094 btf_get(p->aux->attach_btf); 1095 p->type = BPF_PROG_TYPE_LSM; 1096 p->expected_attach_type = BPF_LSM_MAC; 1097 bpf_prog_inc(p); 1098 bpf_tramp_link_init(&shim_link->link, BPF_LINK_TYPE_UNSPEC, 1099 &bpf_shim_tramp_link_lops, p, attach_type, 0); 1100 bpf_cgroup_atype_get(p->aux->attach_btf_id, cgroup_atype); 1101 1102 return shim_link; 1103 } 1104 1105 static struct bpf_shim_tramp_link *cgroup_shim_find(struct bpf_trampoline *tr, 1106 bpf_func_t bpf_func) 1107 { 1108 struct bpf_tramp_node *node; 1109 int kind; 1110 1111 for (kind = 0; kind < BPF_TRAMP_MAX; kind++) { 1112 hlist_for_each_entry(node, &tr->progs_hlist[kind], tramp_hlist) { 1113 struct bpf_prog *p = node->link->prog; 1114 1115 if (p->bpf_func == bpf_func) 1116 return container_of(node, struct bpf_shim_tramp_link, link.node); 1117 } 1118 } 1119 1120 return NULL; 1121 } 1122 1123 int bpf_trampoline_link_cgroup_shim(struct bpf_prog *prog, 1124 int cgroup_atype, 1125 enum bpf_attach_type attach_type) 1126 { 1127 struct bpf_shim_tramp_link *shim_link = NULL; 1128 struct bpf_attach_target_info tgt_info = {}; 1129 struct bpf_trampoline *tr; 1130 bpf_func_t bpf_func; 1131 u64 key; 1132 int err; 1133 1134 err = bpf_check_attach_target(NULL, prog, NULL, 1135 prog->aux->attach_btf_id, 1136 &tgt_info); 1137 if (err) 1138 return err; 1139 1140 key = bpf_trampoline_compute_key(NULL, prog->aux->attach_btf, 1141 prog->aux->attach_btf_id); 1142 1143 bpf_lsm_find_cgroup_shim(prog, &bpf_func); 1144 tr = bpf_trampoline_get(key, &tgt_info); 1145 if (!tr) 1146 return -ENOMEM; 1147 1148 trampoline_lock(tr); 1149 1150 shim_link = cgroup_shim_find(tr, bpf_func); 1151 if (shim_link && !IS_ERR(bpf_link_inc_not_zero(&shim_link->link.link))) { 1152 /* Reusing existing shim attached by the other program. */ 1153 trampoline_unlock(tr); 1154 bpf_trampoline_put(tr); /* bpf_trampoline_get above */ 1155 return 0; 1156 } 1157 1158 /* Allocate and install new shim. */ 1159 1160 shim_link = cgroup_shim_alloc(prog, bpf_func, cgroup_atype, attach_type); 1161 if (!shim_link) { 1162 err = -ENOMEM; 1163 goto err; 1164 } 1165 1166 err = __bpf_trampoline_link_prog(&shim_link->link.node, tr, NULL, &trampoline_ops, NULL); 1167 if (err) 1168 goto err; 1169 1170 shim_link->trampoline = tr; 1171 /* note, we're still holding tr refcnt from above */ 1172 1173 trampoline_unlock(tr); 1174 1175 return 0; 1176 err: 1177 trampoline_unlock(tr); 1178 1179 if (shim_link) 1180 bpf_link_put(&shim_link->link.link); 1181 1182 /* have to release tr while _not_ holding pool mutex for trampoline */ 1183 bpf_trampoline_put(tr); /* bpf_trampoline_get above */ 1184 1185 return err; 1186 } 1187 1188 void bpf_trampoline_unlink_cgroup_shim(struct bpf_prog *prog) 1189 { 1190 struct bpf_shim_tramp_link *shim_link = NULL; 1191 struct bpf_trampoline *tr; 1192 bpf_func_t bpf_func; 1193 u64 key; 1194 1195 key = bpf_trampoline_compute_key(NULL, prog->aux->attach_btf, 1196 prog->aux->attach_btf_id); 1197 1198 bpf_lsm_find_cgroup_shim(prog, &bpf_func); 1199 tr = bpf_trampoline_lookup(key, 0); 1200 if (WARN_ON_ONCE(!tr)) 1201 return; 1202 1203 trampoline_lock(tr); 1204 shim_link = cgroup_shim_find(tr, bpf_func); 1205 trampoline_unlock(tr); 1206 1207 if (shim_link) 1208 bpf_link_put(&shim_link->link.link); 1209 1210 bpf_trampoline_put(tr); /* bpf_trampoline_lookup above */ 1211 } 1212 #endif 1213 1214 struct bpf_trampoline *bpf_trampoline_get(u64 key, 1215 struct bpf_attach_target_info *tgt_info) 1216 { 1217 struct bpf_trampoline *tr; 1218 1219 tr = bpf_trampoline_lookup(key, tgt_info->tgt_addr); 1220 if (!tr) 1221 return NULL; 1222 1223 trampoline_lock(tr); 1224 if (tr->func.addr) 1225 goto out; 1226 1227 memcpy(&tr->func.model, &tgt_info->fmodel, sizeof(tgt_info->fmodel)); 1228 tr->func.addr = (void *)tgt_info->tgt_addr; 1229 out: 1230 trampoline_unlock(tr); 1231 return tr; 1232 } 1233 1234 void bpf_trampoline_put(struct bpf_trampoline *tr) 1235 { 1236 int i; 1237 1238 if (!tr) 1239 return; 1240 mutex_lock(&trampoline_mutex); 1241 if (!refcount_dec_and_test(&tr->refcnt)) 1242 goto out; 1243 1244 for (i = 0; i < BPF_TRAMP_MAX; i++) 1245 if (WARN_ON_ONCE(!hlist_empty(&tr->progs_hlist[i]))) 1246 goto out; 1247 1248 /* This code will be executed even when the last bpf_tramp_image 1249 * is alive. All progs are detached from the trampoline and the 1250 * trampoline image is patched with jmp into epilogue to skip 1251 * fexit progs. The fentry-only trampoline will be freed via 1252 * multiple rcu callbacks. 1253 */ 1254 hlist_del(&tr->hlist_key); 1255 hlist_del(&tr->hlist_ip); 1256 direct_ops_free(tr); 1257 kfree(tr); 1258 out: 1259 mutex_unlock(&trampoline_mutex); 1260 } 1261 1262 #define NO_START_TIME 1 1263 static __always_inline u64 notrace bpf_prog_start_time(void) 1264 { 1265 u64 start = NO_START_TIME; 1266 1267 if (static_branch_unlikely(&bpf_stats_enabled_key)) { 1268 start = sched_clock(); 1269 if (unlikely(!start)) 1270 start = NO_START_TIME; 1271 } 1272 return start; 1273 } 1274 1275 /* The logic is similar to bpf_prog_run(), but with an explicit 1276 * rcu_read_lock() and migrate_disable() which are required 1277 * for the trampoline. The macro is split into 1278 * call __bpf_prog_enter 1279 * call prog->bpf_func 1280 * call __bpf_prog_exit 1281 * 1282 * __bpf_prog_enter returns: 1283 * 0 - skip execution of the bpf prog 1284 * 1 - execute bpf prog 1285 * [2..MAX_U64] - execute bpf prog and record execution time. 1286 * This is start time. 1287 */ 1288 static u64 notrace __bpf_prog_enter_recur(struct bpf_prog *prog, struct bpf_tramp_run_ctx *run_ctx) 1289 __acquires(RCU) 1290 { 1291 rcu_read_lock_dont_migrate(); 1292 1293 run_ctx->saved_run_ctx = bpf_set_run_ctx(&run_ctx->run_ctx); 1294 1295 if (unlikely(!bpf_prog_get_recursion_context(prog))) { 1296 bpf_prog_inc_misses_counter(prog); 1297 if (prog->aux->recursion_detected) 1298 prog->aux->recursion_detected(prog); 1299 return 0; 1300 } 1301 return bpf_prog_start_time(); 1302 } 1303 1304 static void notrace __update_prog_stats(struct bpf_prog *prog, u64 start) 1305 { 1306 struct bpf_prog_stats *stats; 1307 unsigned long flags; 1308 u64 duration; 1309 1310 /* 1311 * static_key could be enabled in __bpf_prog_enter* and disabled in 1312 * __bpf_prog_exit*. And vice versa. Check that 'start' is valid. 1313 */ 1314 if (start <= NO_START_TIME) 1315 return; 1316 1317 duration = sched_clock() - start; 1318 stats = this_cpu_ptr(prog->stats); 1319 flags = u64_stats_update_begin_irqsave(&stats->syncp); 1320 u64_stats_inc(&stats->cnt); 1321 u64_stats_add(&stats->nsecs, duration); 1322 u64_stats_update_end_irqrestore(&stats->syncp, flags); 1323 } 1324 1325 static __always_inline void notrace update_prog_stats(struct bpf_prog *prog, 1326 u64 start) 1327 { 1328 if (static_branch_unlikely(&bpf_stats_enabled_key)) 1329 __update_prog_stats(prog, start); 1330 } 1331 1332 static void notrace __bpf_prog_exit_recur(struct bpf_prog *prog, u64 start, 1333 struct bpf_tramp_run_ctx *run_ctx) 1334 __releases(RCU) 1335 { 1336 bpf_reset_run_ctx(run_ctx->saved_run_ctx); 1337 1338 update_prog_stats(prog, start); 1339 bpf_prog_put_recursion_context(prog); 1340 rcu_read_unlock_migrate(); 1341 } 1342 1343 static u64 notrace __bpf_prog_enter_lsm_cgroup(struct bpf_prog *prog, 1344 struct bpf_tramp_run_ctx *run_ctx) 1345 __acquires(RCU) 1346 { 1347 /* Runtime stats are exported via actual BPF_LSM_CGROUP 1348 * programs, not the shims. 1349 */ 1350 rcu_read_lock_dont_migrate(); 1351 1352 run_ctx->saved_run_ctx = bpf_set_run_ctx(&run_ctx->run_ctx); 1353 1354 return NO_START_TIME; 1355 } 1356 1357 static void notrace __bpf_prog_exit_lsm_cgroup(struct bpf_prog *prog, u64 start, 1358 struct bpf_tramp_run_ctx *run_ctx) 1359 __releases(RCU) 1360 { 1361 bpf_reset_run_ctx(run_ctx->saved_run_ctx); 1362 1363 rcu_read_unlock_migrate(); 1364 } 1365 1366 u64 notrace __bpf_prog_enter_sleepable_recur(struct bpf_prog *prog, 1367 struct bpf_tramp_run_ctx *run_ctx) 1368 { 1369 rcu_read_lock_trace(); 1370 migrate_disable(); 1371 might_fault(); 1372 1373 run_ctx->saved_run_ctx = bpf_set_run_ctx(&run_ctx->run_ctx); 1374 1375 if (unlikely(!bpf_prog_get_recursion_context(prog))) { 1376 bpf_prog_inc_misses_counter(prog); 1377 if (prog->aux->recursion_detected) 1378 prog->aux->recursion_detected(prog); 1379 return 0; 1380 } 1381 return bpf_prog_start_time(); 1382 } 1383 1384 void notrace __bpf_prog_exit_sleepable_recur(struct bpf_prog *prog, u64 start, 1385 struct bpf_tramp_run_ctx *run_ctx) 1386 { 1387 bpf_reset_run_ctx(run_ctx->saved_run_ctx); 1388 1389 update_prog_stats(prog, start); 1390 bpf_prog_put_recursion_context(prog); 1391 migrate_enable(); 1392 rcu_read_unlock_trace(); 1393 } 1394 1395 static u64 notrace __bpf_prog_enter_sleepable(struct bpf_prog *prog, 1396 struct bpf_tramp_run_ctx *run_ctx) 1397 { 1398 rcu_read_lock_trace(); 1399 migrate_disable(); 1400 might_fault(); 1401 1402 run_ctx->saved_run_ctx = bpf_set_run_ctx(&run_ctx->run_ctx); 1403 1404 return bpf_prog_start_time(); 1405 } 1406 1407 static void notrace __bpf_prog_exit_sleepable(struct bpf_prog *prog, u64 start, 1408 struct bpf_tramp_run_ctx *run_ctx) 1409 { 1410 bpf_reset_run_ctx(run_ctx->saved_run_ctx); 1411 1412 update_prog_stats(prog, start); 1413 migrate_enable(); 1414 rcu_read_unlock_trace(); 1415 } 1416 1417 static u64 notrace __bpf_prog_enter(struct bpf_prog *prog, 1418 struct bpf_tramp_run_ctx *run_ctx) 1419 __acquires(RCU) 1420 { 1421 rcu_read_lock_dont_migrate(); 1422 1423 run_ctx->saved_run_ctx = bpf_set_run_ctx(&run_ctx->run_ctx); 1424 1425 return bpf_prog_start_time(); 1426 } 1427 1428 static void notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start, 1429 struct bpf_tramp_run_ctx *run_ctx) 1430 __releases(RCU) 1431 { 1432 bpf_reset_run_ctx(run_ctx->saved_run_ctx); 1433 1434 update_prog_stats(prog, start); 1435 rcu_read_unlock_migrate(); 1436 } 1437 1438 void notrace __bpf_tramp_enter(struct bpf_tramp_image *tr) 1439 { 1440 percpu_ref_get(&tr->pcref); 1441 } 1442 1443 void notrace __bpf_tramp_exit(struct bpf_tramp_image *tr) 1444 { 1445 percpu_ref_put(&tr->pcref); 1446 } 1447 1448 bpf_trampoline_enter_t bpf_trampoline_enter(const struct bpf_prog *prog) 1449 { 1450 bool sleepable = prog->sleepable; 1451 1452 if (bpf_prog_check_recur(prog)) 1453 return sleepable ? __bpf_prog_enter_sleepable_recur : 1454 __bpf_prog_enter_recur; 1455 1456 if (resolve_prog_type(prog) == BPF_PROG_TYPE_LSM && 1457 prog->expected_attach_type == BPF_LSM_CGROUP) 1458 return __bpf_prog_enter_lsm_cgroup; 1459 1460 return sleepable ? __bpf_prog_enter_sleepable : __bpf_prog_enter; 1461 } 1462 1463 bpf_trampoline_exit_t bpf_trampoline_exit(const struct bpf_prog *prog) 1464 { 1465 bool sleepable = prog->sleepable; 1466 1467 if (bpf_prog_check_recur(prog)) 1468 return sleepable ? __bpf_prog_exit_sleepable_recur : 1469 __bpf_prog_exit_recur; 1470 1471 if (resolve_prog_type(prog) == BPF_PROG_TYPE_LSM && 1472 prog->expected_attach_type == BPF_LSM_CGROUP) 1473 return __bpf_prog_exit_lsm_cgroup; 1474 1475 return sleepable ? __bpf_prog_exit_sleepable : __bpf_prog_exit; 1476 } 1477 1478 int __weak 1479 arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image, void *image_end, 1480 const struct btf_func_model *m, u32 flags, 1481 struct bpf_tramp_nodes *tnodes, 1482 void *func_addr) 1483 { 1484 return -ENOTSUPP; 1485 } 1486 1487 void * __weak arch_alloc_bpf_trampoline(unsigned int size) 1488 { 1489 void *image; 1490 1491 if (WARN_ON_ONCE(size > PAGE_SIZE)) 1492 return NULL; 1493 image = bpf_jit_alloc_exec(PAGE_SIZE); 1494 if (image) 1495 set_vm_flush_reset_perms(image); 1496 return image; 1497 } 1498 1499 void __weak arch_free_bpf_trampoline(void *image, unsigned int size) 1500 { 1501 WARN_ON_ONCE(size > PAGE_SIZE); 1502 /* bpf_jit_free_exec doesn't need "size", but 1503 * bpf_prog_pack_free() needs it. 1504 */ 1505 bpf_jit_free_exec(image); 1506 } 1507 1508 int __weak arch_protect_bpf_trampoline(void *image, unsigned int size) 1509 { 1510 WARN_ON_ONCE(size > PAGE_SIZE); 1511 return set_memory_rox((long)image, 1); 1512 } 1513 1514 int __weak arch_bpf_trampoline_size(const struct btf_func_model *m, u32 flags, 1515 struct bpf_tramp_nodes *tnodes, void *func_addr) 1516 { 1517 return -ENOTSUPP; 1518 } 1519 1520 #if defined(CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS) && \ 1521 defined(CONFIG_HAVE_SINGLE_FTRACE_DIRECT_OPS) && \ 1522 defined(CONFIG_BPF_SYSCALL) 1523 1524 static void trampoline_lock_all(void) 1525 { 1526 int i; 1527 1528 for (i = 0; i < TRAMPOLINE_LOCKS_TABLE_SIZE; i++) 1529 mutex_lock(&trampoline_locks[i].mutex); 1530 } 1531 1532 static void trampoline_unlock_all(void) 1533 { 1534 int i; 1535 1536 for (i = 0; i < TRAMPOLINE_LOCKS_TABLE_SIZE; i++) 1537 mutex_unlock(&trampoline_locks[i].mutex); 1538 } 1539 1540 static void remove_tracing_multi_data(struct bpf_tracing_multi_data *data) 1541 { 1542 ftrace_hash_remove(data->reg); 1543 ftrace_hash_remove(data->unreg); 1544 ftrace_hash_remove(data->modify); 1545 } 1546 1547 static void clear_tracing_multi_data(struct bpf_tracing_multi_data *data) 1548 { 1549 remove_tracing_multi_data(data); 1550 1551 free_ftrace_hash(data->reg); 1552 free_ftrace_hash(data->unreg); 1553 free_ftrace_hash(data->modify); 1554 } 1555 1556 static int init_tracing_multi_data(struct bpf_tracing_multi_data *data) 1557 { 1558 data->reg = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS); 1559 data->unreg = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS); 1560 data->modify = alloc_ftrace_hash(FTRACE_HASH_DEFAULT_BITS); 1561 1562 if (!data->reg || !data->unreg || !data->modify) { 1563 clear_tracing_multi_data(data); 1564 return -ENOMEM; 1565 } 1566 return 0; 1567 } 1568 1569 static void ftrace_hash_add(struct ftrace_hash *hash, struct ftrace_func_entry *entry, 1570 unsigned long ip, unsigned long direct) 1571 { 1572 entry->ip = ip; 1573 entry->direct = direct; 1574 add_ftrace_hash_entry(hash, entry); 1575 } 1576 1577 static int register_fentry_multi(struct bpf_trampoline *tr, struct bpf_tramp_image *im, void *ptr) 1578 { 1579 unsigned long addr = (unsigned long) im->image; 1580 unsigned long ip = ftrace_location(tr->ip); 1581 struct bpf_tracing_multi_data *data = ptr; 1582 1583 if (bpf_trampoline_use_jmp(tr->flags)) 1584 addr = ftrace_jmp_set(addr); 1585 1586 tr->func.ftrace_managed = true; 1587 ftrace_hash_add(data->reg, data->entry, ip, addr); 1588 tr->cur_image = im; 1589 return 0; 1590 } 1591 1592 static int unregister_fentry_multi(struct bpf_trampoline *tr, u32 orig_flags, void *ptr) 1593 { 1594 unsigned long addr = (unsigned long) tr->cur_image->image; 1595 unsigned long ip = ftrace_location(tr->ip); 1596 struct bpf_tracing_multi_data *data = ptr; 1597 1598 if (bpf_trampoline_use_jmp(tr->flags)) 1599 addr = ftrace_jmp_set(addr); 1600 1601 ftrace_hash_add(data->unreg, data->entry, ip, addr); 1602 tr->cur_image = NULL; 1603 return 0; 1604 } 1605 1606 static int modify_fentry_multi(struct bpf_trampoline *tr, u32 orig_flags, struct bpf_tramp_image *im, 1607 bool lock_direct_mutex, void *ptr) 1608 { 1609 unsigned long addr = (unsigned long) im->image; 1610 unsigned long ip = ftrace_location(tr->ip); 1611 struct bpf_tracing_multi_data *data = ptr; 1612 1613 if (bpf_trampoline_use_jmp(tr->flags)) 1614 addr = ftrace_jmp_set(addr); 1615 1616 ftrace_hash_add(data->modify, data->entry, ip, addr); 1617 tr->cur_image = im; 1618 return 0; 1619 } 1620 1621 static const struct bpf_trampoline_ops trampoline_multi_ops = { 1622 .register_fentry = register_fentry_multi, 1623 .unregister_fentry = unregister_fentry_multi, 1624 .modify_fentry = modify_fentry_multi, 1625 }; 1626 1627 static void bpf_trampoline_multi_attach_init(struct bpf_trampoline *tr) 1628 { 1629 tr->multi_attach.old_image = tr->cur_image; 1630 tr->multi_attach.old_flags = tr->flags; 1631 } 1632 1633 static void bpf_trampoline_multi_attach_free(struct bpf_trampoline *tr) 1634 { 1635 /* 1636 * Only free old_image if it is no longer the active image. 1637 * When bpf_trampoline_update() fails before modify_fentry_multi()/ 1638 * unregister_fentry_multi() is called, cur_image is unchanged 1639 * (cur_image == old_image) and ftrace still points to it. Freeing 1640 * it would cause a UAF when ftrace calls into the freed memory. 1641 * On success, cur_image is either a new image or NULL, so 1642 * old_image != cur_image means the image is stale. 1643 */ 1644 if (tr->multi_attach.old_image && 1645 tr->multi_attach.old_image != tr->cur_image) 1646 bpf_tramp_image_put(tr->multi_attach.old_image); 1647 1648 tr->multi_attach.old_image = NULL; 1649 tr->multi_attach.old_flags = 0; 1650 } 1651 1652 static void bpf_trampoline_multi_attach_rollback(struct bpf_trampoline *tr) 1653 { 1654 if (tr->cur_image) 1655 bpf_tramp_image_put(tr->cur_image); 1656 tr->cur_image = tr->multi_attach.old_image; 1657 tr->flags = tr->multi_attach.old_flags; 1658 1659 tr->multi_attach.old_image = NULL; 1660 tr->multi_attach.old_flags = 0; 1661 } 1662 1663 #define for_each_mnode_cnt(mnode, link, cnt) \ 1664 for (i = 0, mnode = &link->nodes[i]; i < cnt; i++, mnode = &link->nodes[i]) 1665 1666 #define for_each_mnode(mnode, link) \ 1667 for_each_mnode_cnt(mnode, link, link->nodes_cnt) 1668 1669 int bpf_trampoline_multi_attach(struct bpf_prog *prog, u32 *ids, 1670 struct bpf_tracing_multi_link *link) 1671 { 1672 struct bpf_tracing_multi_data *data = &link->data; 1673 struct bpf_attach_target_info tgt_info = {}; 1674 struct btf *btf = prog->aux->attach_btf; 1675 struct bpf_tracing_multi_node *mnode; 1676 struct bpf_trampoline *tr; 1677 int i, err, rollback_cnt; 1678 u64 key; 1679 1680 for_each_mnode(mnode, link) { 1681 rollback_cnt = i; 1682 1683 err = bpf_check_attach_btf_id_multi(btf, prog, ids[i], &tgt_info); 1684 if (err) 1685 goto rollback_put; 1686 1687 key = bpf_trampoline_compute_key(NULL, btf, ids[i]); 1688 1689 tr = bpf_trampoline_get(key, &tgt_info); 1690 if (!tr) { 1691 err = -ENOMEM; 1692 goto rollback_put; 1693 } 1694 1695 mnode->trampoline = tr; 1696 mnode->node.link = &link->link; 1697 mnode->node.cookie = link->cookies ? link->cookies[i] : 0; 1698 1699 if (prog->expected_attach_type == BPF_TRACE_FSESSION_MULTI) { 1700 link->fexits[i].link = &link->link; 1701 link->fexits[i].cookie = link->cookies ? link->cookies[i] : 0; 1702 } 1703 1704 cond_resched(); 1705 } 1706 1707 err = init_tracing_multi_data(data); 1708 if (err) { 1709 rollback_cnt = link->nodes_cnt; 1710 goto rollback_put; 1711 } 1712 1713 trampoline_lock_all(); 1714 1715 for_each_mnode(mnode, link) { 1716 bpf_trampoline_multi_attach_init(mnode->trampoline); 1717 1718 data->entry = &mnode->entry; 1719 err = __bpf_trampoline_link_prog(&mnode->node, mnode->trampoline, NULL, 1720 &trampoline_multi_ops, data); 1721 if (err) { 1722 rollback_cnt = i; 1723 goto rollback_unlink; 1724 } 1725 } 1726 1727 rollback_cnt = link->nodes_cnt; 1728 if (ftrace_hash_count(data->reg)) { 1729 err = update_ftrace_direct_add(&direct_ops, data->reg); 1730 if (err) 1731 goto rollback_unlink; 1732 } 1733 1734 if (ftrace_hash_count(data->modify)) { 1735 err = update_ftrace_direct_mod(&direct_ops, data->modify, true); 1736 if (err) { 1737 if (ftrace_hash_count(data->reg)) 1738 WARN_ON_ONCE(update_ftrace_direct_del(&direct_ops, data->reg)); 1739 goto rollback_unlink; 1740 } 1741 } 1742 1743 for_each_mnode(mnode, link) 1744 bpf_trampoline_multi_attach_free(mnode->trampoline); 1745 1746 trampoline_unlock_all(); 1747 1748 remove_tracing_multi_data(data); 1749 return 0; 1750 1751 rollback_unlink: 1752 for_each_mnode_cnt(mnode, link, rollback_cnt) { 1753 bpf_trampoline_remove_prog(mnode->trampoline, &mnode->node); 1754 bpf_trampoline_multi_attach_rollback(mnode->trampoline); 1755 } 1756 1757 trampoline_unlock_all(); 1758 1759 clear_tracing_multi_data(data); 1760 rollback_cnt = link->nodes_cnt; 1761 1762 rollback_put: 1763 for_each_mnode_cnt(mnode, link, rollback_cnt) 1764 bpf_trampoline_put(mnode->trampoline); 1765 1766 return err; 1767 } 1768 1769 void bpf_trampoline_multi_detach(struct bpf_prog *prog, 1770 struct bpf_tracing_multi_link *link) 1771 { 1772 struct bpf_tracing_multi_data *data = &link->data; 1773 struct bpf_tracing_multi_node *mnode; 1774 int i, err; 1775 1776 trampoline_lock_all(); 1777 1778 for_each_mnode(mnode, link) { 1779 data->entry = &mnode->entry; 1780 bpf_trampoline_multi_attach_init(mnode->trampoline); 1781 err = __bpf_trampoline_unlink_prog(&mnode->node, mnode->trampoline, NULL, 1782 &trampoline_multi_ops, data); 1783 WARN_ONCE(err, "__bpf_trampoline_unlink_prog failed: %d\n", err); 1784 } 1785 1786 if (ftrace_hash_count(data->unreg)) 1787 WARN_ON_ONCE(update_ftrace_direct_del(&direct_ops, data->unreg)); 1788 if (ftrace_hash_count(data->modify)) 1789 WARN_ON_ONCE(update_ftrace_direct_mod(&direct_ops, data->modify, true)); 1790 1791 for_each_mnode(mnode, link) 1792 bpf_trampoline_multi_attach_free(mnode->trampoline); 1793 1794 trampoline_unlock_all(); 1795 1796 for_each_mnode(mnode, link) 1797 bpf_trampoline_put(mnode->trampoline); 1798 1799 clear_tracing_multi_data(data); 1800 } 1801 1802 #undef for_each_mnode_cnt 1803 #undef for_each_mnode 1804 1805 #endif /* CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS && 1806 CONFIG_HAVE_SINGLE_FTRACE_DIRECT_OPS && 1807 CONFIG_BPF_SYSCALL */ 1808 1809 static int __init init_trampolines(void) 1810 { 1811 int i; 1812 1813 for (i = 0; i < TRAMPOLINE_TABLE_SIZE; i++) 1814 INIT_HLIST_HEAD(&trampoline_key_table[i]); 1815 for (i = 0; i < TRAMPOLINE_TABLE_SIZE; i++) 1816 INIT_HLIST_HEAD(&trampoline_ip_table[i]); 1817 for (i = 0; i < TRAMPOLINE_LOCKS_TABLE_SIZE; i++) 1818 __mutex_init(&trampoline_locks[i].mutex, "trampoline_lock", &trampoline_locks[i].key); 1819 return 0; 1820 } 1821 late_initcall(init_trampolines); 1822