Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

afs: Add tracing for cell refcount and active user count

Add a tracepoint to log the cell refcount and active user count and pass in
a reason code through various functions that manipulate these counters.

Additionally, a helper function, afs_see_cell(), is provided to log
interesting places that deal with a cell without actually doing any
accounting directly.

Signed-off-by: David Howells <dhowells@redhat.com>

+208 -55
+70 -29
fs/afs/cell.c
··· 18 18 static unsigned __read_mostly afs_cell_gc_delay = 10; 19 19 static unsigned __read_mostly afs_cell_min_ttl = 10 * 60; 20 20 static unsigned __read_mostly afs_cell_max_ttl = 24 * 60 * 60; 21 + static atomic_t cell_debug_id; 21 22 22 23 static void afs_queue_cell_manager(struct afs_net *); 23 24 static void afs_manage_cell_work(struct work_struct *); ··· 49 48 * hold net->cells_lock at least read-locked. 50 49 */ 51 50 static struct afs_cell *afs_find_cell_locked(struct afs_net *net, 52 - const char *name, unsigned int namesz) 51 + const char *name, unsigned int namesz, 52 + enum afs_cell_trace reason) 53 53 { 54 54 struct afs_cell *cell = NULL; 55 55 struct rb_node *p; ··· 89 87 return ERR_PTR(-ENOENT); 90 88 91 89 found: 92 - return afs_use_cell(cell); 90 + return afs_use_cell(cell, reason); 93 91 } 94 92 95 93 /* 96 94 * Look up and get an activation reference on a cell record. 97 95 */ 98 96 struct afs_cell *afs_find_cell(struct afs_net *net, 99 - const char *name, unsigned int namesz) 97 + const char *name, unsigned int namesz, 98 + enum afs_cell_trace reason) 100 99 { 101 100 struct afs_cell *cell; 102 101 103 102 down_read(&net->cells_lock); 104 - cell = afs_find_cell_locked(net, name, namesz); 103 + cell = afs_find_cell_locked(net, name, namesz, reason); 105 104 up_read(&net->cells_lock); 106 105 return cell; 107 106 } ··· 200 197 cell->dns_status = vllist->status; 201 198 smp_store_release(&cell->dns_lookup_count, 1); /* vs source/status */ 202 199 atomic_inc(&net->cells_outstanding); 200 + cell->debug_id = atomic_inc_return(&cell_debug_id); 201 + trace_afs_cell(cell->debug_id, 1, 0, afs_cell_trace_alloc); 203 202 204 203 _leave(" = %p", cell); 205 204 return cell; ··· 241 236 _enter("%s,%s", name, vllist); 242 237 243 238 if (!excl) { 244 - cell = afs_find_cell(net, name, namesz); 239 + cell = afs_find_cell(net, name, namesz, afs_cell_trace_use_lookup); 245 240 if (!IS_ERR(cell)) 246 241 goto wait_for_cell; 247 242 } ··· 285 280 cell = candidate; 286 281 candidate = NULL; 287 282 atomic_set(&cell->active, 2); 283 + trace_afs_cell(cell->debug_id, atomic_read(&cell->ref), 2, afs_cell_trace_insert); 288 284 rb_link_node_rcu(&cell->net_node, parent, pp); 289 285 rb_insert_color(&cell->net_node, &net->cells); 290 286 up_write(&net->cells_lock); 291 287 292 - afs_queue_cell(cell); 288 + afs_queue_cell(cell, afs_cell_trace_get_queue_new); 293 289 294 290 wait_for_cell: 291 + trace_afs_cell(cell->debug_id, atomic_read(&cell->ref), atomic_read(&cell->active), 292 + afs_cell_trace_wait); 295 293 _debug("wait_for_cell"); 296 294 wait_var_event(&cell->state, 297 295 ({ ··· 317 309 if (excl) { 318 310 ret = -EEXIST; 319 311 } else { 320 - afs_use_cell(cursor); 312 + afs_use_cell(cursor, afs_cell_trace_use_lookup); 321 313 ret = 0; 322 314 } 323 315 up_write(&net->cells_lock); 324 316 if (candidate) 325 - afs_put_cell(candidate); 317 + afs_put_cell(candidate, afs_cell_trace_put_candidate); 326 318 if (ret == 0) 327 319 goto wait_for_cell; 328 320 goto error_noput; 329 321 error: 330 - afs_unuse_cell(net, cell); 322 + afs_unuse_cell(net, cell, afs_cell_trace_unuse_lookup); 331 323 error_noput: 332 324 _leave(" = %d [error]", ret); 333 325 return ERR_PTR(ret); ··· 372 364 } 373 365 374 366 if (!test_and_set_bit(AFS_CELL_FL_NO_GC, &new_root->flags)) 375 - afs_use_cell(new_root); 367 + afs_use_cell(new_root, afs_cell_trace_use_pin); 376 368 377 369 /* install the new cell */ 378 370 down_write(&net->cells_lock); 371 + afs_see_cell(new_root, afs_cell_trace_see_ws); 379 372 old_root = net->ws_cell; 380 373 net->ws_cell = new_root; 381 374 up_write(&net->cells_lock); 382 375 383 - afs_unuse_cell(net, old_root); 376 + afs_unuse_cell(net, old_root, afs_cell_trace_unuse_ws); 384 377 _leave(" = 0"); 385 378 return 0; 386 379 } ··· 494 485 495 486 u = atomic_read(&cell->ref); 496 487 ASSERTCMP(u, ==, 0); 488 + trace_afs_cell(cell->debug_id, u, atomic_read(&cell->active), afs_cell_trace_free); 497 489 498 490 afs_put_vlserverlist(net, rcu_access_pointer(cell->vl_servers)); 499 - afs_unuse_cell(net, cell->alias_of); 491 + afs_unuse_cell(net, cell->alias_of, afs_cell_trace_unuse_alias); 500 492 key_put(cell->anonymous_key); 501 493 kfree(cell->name); 502 494 kfree(cell); ··· 535 525 /* 536 526 * Get a reference on a cell record. 537 527 */ 538 - struct afs_cell *afs_get_cell(struct afs_cell *cell) 528 + struct afs_cell *afs_get_cell(struct afs_cell *cell, enum afs_cell_trace reason) 539 529 { 530 + int u; 531 + 540 532 if (atomic_read(&cell->ref) <= 0) 541 533 BUG(); 542 534 543 - atomic_inc(&cell->ref); 535 + u = atomic_inc_return(&cell->ref); 536 + trace_afs_cell(cell->debug_id, u, atomic_read(&cell->active), reason); 544 537 return cell; 545 538 } 546 539 547 540 /* 548 541 * Drop a reference on a cell record. 549 542 */ 550 - void afs_put_cell(struct afs_cell *cell) 543 + void afs_put_cell(struct afs_cell *cell, enum afs_cell_trace reason) 551 544 { 552 545 if (cell) { 546 + unsigned int debug_id = cell->debug_id; 553 547 unsigned int u, a; 554 548 549 + a = atomic_read(&cell->active); 555 550 u = atomic_dec_return(&cell->ref); 551 + trace_afs_cell(debug_id, u, a, reason); 556 552 if (u == 0) { 557 553 a = atomic_read(&cell->active); 558 554 WARN(a != 0, "Cell active count %u > 0\n", a); ··· 570 554 /* 571 555 * Note a cell becoming more active. 572 556 */ 573 - struct afs_cell *afs_use_cell(struct afs_cell *cell) 557 + struct afs_cell *afs_use_cell(struct afs_cell *cell, enum afs_cell_trace reason) 574 558 { 559 + int u, a; 560 + 575 561 if (atomic_read(&cell->ref) <= 0) 576 562 BUG(); 577 563 578 - atomic_inc(&cell->active); 564 + u = atomic_read(&cell->ref); 565 + a = atomic_inc_return(&cell->active); 566 + trace_afs_cell(cell->debug_id, u, a, reason); 579 567 return cell; 580 568 } 581 569 ··· 587 567 * Record a cell becoming less active. When the active counter reaches 1, it 588 568 * is scheduled for destruction, but may get reactivated. 589 569 */ 590 - void afs_unuse_cell(struct afs_net *net, struct afs_cell *cell) 570 + void afs_unuse_cell(struct afs_net *net, struct afs_cell *cell, enum afs_cell_trace reason) 591 571 { 572 + unsigned int debug_id = cell->debug_id; 592 573 time64_t now, expire_delay; 593 - int a; 574 + int u, a; 594 575 595 576 if (!cell) 596 577 return; ··· 604 583 if (cell->vl_servers->nr_servers) 605 584 expire_delay = afs_cell_gc_delay; 606 585 586 + u = atomic_read(&cell->ref); 607 587 a = atomic_dec_return(&cell->active); 588 + trace_afs_cell(debug_id, u, a, reason); 608 589 WARN_ON(a == 0); 609 590 if (a == 1) 610 591 /* 'cell' may now be garbage collected. */ ··· 614 591 } 615 592 616 593 /* 594 + * Note that a cell has been seen. 595 + */ 596 + void afs_see_cell(struct afs_cell *cell, enum afs_cell_trace reason) 597 + { 598 + int u, a; 599 + 600 + u = atomic_read(&cell->ref); 601 + a = atomic_read(&cell->active); 602 + trace_afs_cell(cell->debug_id, u, a, reason); 603 + } 604 + 605 + /* 617 606 * Queue a cell for management, giving the workqueue a ref to hold. 618 607 */ 619 - void afs_queue_cell(struct afs_cell *cell) 608 + void afs_queue_cell(struct afs_cell *cell, enum afs_cell_trace reason) 620 609 { 621 - afs_get_cell(cell); 610 + afs_get_cell(cell, reason); 622 611 if (!queue_work(afs_wq, &cell->manager)) 623 - afs_put_cell(cell); 612 + afs_put_cell(cell, afs_cell_trace_put_queue_fail); 624 613 } 625 614 626 615 /* ··· 748 713 active = 1; 749 714 if (atomic_try_cmpxchg_relaxed(&cell->active, &active, 0)) { 750 715 rb_erase(&cell->net_node, &net->cells); 716 + trace_afs_cell(cell->debug_id, atomic_read(&cell->ref), 0, 717 + afs_cell_trace_unuse_delete); 751 718 smp_store_release(&cell->state, AFS_CELL_REMOVED); 752 719 } 753 720 up_write(&net->cells_lock); ··· 829 792 /* The root volume is pinning the cell */ 830 793 afs_put_volume(cell->net, cell->root_volume, afs_volume_trace_put_cell_root); 831 794 cell->root_volume = NULL; 832 - afs_put_cell(cell); 795 + afs_put_cell(cell, afs_cell_trace_put_destroy); 833 796 } 834 797 835 798 static void afs_manage_cell_work(struct work_struct *work) ··· 837 800 struct afs_cell *cell = container_of(work, struct afs_cell, manager); 838 801 839 802 afs_manage_cell(cell); 840 - afs_put_cell(cell); 803 + afs_put_cell(cell, afs_cell_trace_put_queue_work); 841 804 } 842 805 843 806 /* ··· 875 838 bool sched_cell = false; 876 839 877 840 active = atomic_read(&cell->active); 878 - _debug("manage %s %u %u", cell->name, atomic_read(&cell->ref), active); 841 + trace_afs_cell(cell->debug_id, atomic_read(&cell->ref), 842 + active, afs_cell_trace_manage); 879 843 880 844 ASSERTCMP(active, >=, 1); 881 845 882 846 if (purging) { 883 - if (test_and_clear_bit(AFS_CELL_FL_NO_GC, &cell->flags)) 884 - atomic_dec(&cell->active); 847 + if (test_and_clear_bit(AFS_CELL_FL_NO_GC, &cell->flags)) { 848 + active = atomic_dec_return(&cell->active); 849 + trace_afs_cell(cell->debug_id, atomic_read(&cell->ref), 850 + active, afs_cell_trace_unuse_pin); 851 + } 885 852 } 886 853 887 854 if (active == 1) { ··· 911 870 } 912 871 913 872 if (sched_cell) 914 - afs_queue_cell(cell); 873 + afs_queue_cell(cell, afs_cell_trace_get_queue_manage); 915 874 } 916 875 917 876 up_read(&net->cells_lock); ··· 948 907 ws = net->ws_cell; 949 908 net->ws_cell = NULL; 950 909 up_write(&net->cells_lock); 951 - afs_unuse_cell(net, ws); 910 + afs_unuse_cell(net, ws, afs_cell_trace_unuse_ws); 952 911 953 912 _debug("del timer"); 954 913 if (del_timer_sync(&net->cells_timer))
+2 -2
fs/afs/dynroot.c
··· 123 123 len--; 124 124 } 125 125 126 - cell = afs_find_cell(net, name, len); 126 + cell = afs_find_cell(net, name, len, afs_cell_trace_use_probe); 127 127 if (!IS_ERR(cell)) { 128 - afs_unuse_cell(net, cell); 128 + afs_unuse_cell(net, cell, afs_cell_trace_unuse_probe); 129 129 return 0; 130 130 } 131 131
+9 -6
fs/afs/internal.h
··· 375 375 enum dns_record_source dns_source:8; /* Latest source of data from lookup */ 376 376 enum dns_lookup_status dns_status:8; /* Latest status of data from lookup */ 377 377 unsigned int dns_lookup_count; /* Counter of DNS lookups */ 378 + unsigned int debug_id; 378 379 379 380 /* The volumes belonging to this cell */ 380 381 struct rb_root volumes; /* Tree of volumes on this server */ ··· 920 919 * cell.c 921 920 */ 922 921 extern int afs_cell_init(struct afs_net *, const char *); 923 - extern struct afs_cell *afs_find_cell(struct afs_net *, const char *, unsigned); 922 + extern struct afs_cell *afs_find_cell(struct afs_net *, const char *, unsigned, 923 + enum afs_cell_trace); 924 924 extern struct afs_cell *afs_lookup_cell(struct afs_net *, const char *, unsigned, 925 925 const char *, bool); 926 - extern struct afs_cell *afs_use_cell(struct afs_cell *); 927 - extern void afs_unuse_cell(struct afs_net *, struct afs_cell *); 928 - extern struct afs_cell *afs_get_cell(struct afs_cell *); 929 - extern void afs_put_cell(struct afs_cell *); 930 - extern void afs_queue_cell(struct afs_cell *); 926 + extern struct afs_cell *afs_use_cell(struct afs_cell *, enum afs_cell_trace); 927 + extern void afs_unuse_cell(struct afs_net *, struct afs_cell *, enum afs_cell_trace); 928 + extern struct afs_cell *afs_get_cell(struct afs_cell *, enum afs_cell_trace); 929 + extern void afs_see_cell(struct afs_cell *, enum afs_cell_trace); 930 + extern void afs_put_cell(struct afs_cell *, enum afs_cell_trace); 931 + extern void afs_queue_cell(struct afs_cell *, enum afs_cell_trace); 931 932 extern void afs_manage_cells(struct work_struct *); 932 933 extern void afs_cells_timer(struct timer_list *); 933 934 extern void __net_exit afs_cell_purge(struct afs_net *);
+2 -2
fs/afs/mntpt.c
··· 88 88 ctx->force = true; 89 89 } 90 90 if (ctx->cell) { 91 - afs_unuse_cell(ctx->net, ctx->cell); 91 + afs_unuse_cell(ctx->net, ctx->cell, afs_cell_trace_unuse_mntpt); 92 92 ctx->cell = NULL; 93 93 } 94 94 if (test_bit(AFS_VNODE_PSEUDODIR, &vnode->flags)) { ··· 124 124 char *buf; 125 125 126 126 if (src_as->cell) 127 - ctx->cell = afs_use_cell(src_as->cell); 127 + ctx->cell = afs_use_cell(src_as->cell, afs_cell_trace_use_mntpt); 128 128 129 129 if (size < 2 || size > PAGE_SIZE - 1) 130 130 return -EINVAL;
+1 -1
fs/afs/proc.c
··· 129 129 } 130 130 131 131 if (test_and_set_bit(AFS_CELL_FL_NO_GC, &cell->flags)) 132 - afs_unuse_cell(net, cell); 132 + afs_unuse_cell(net, cell, afs_cell_trace_unuse_no_pin); 133 133 } else { 134 134 goto inval; 135 135 }
+9 -7
fs/afs/super.c
··· 294 294 cellnamesz, cellnamesz, cellname ?: ""); 295 295 return PTR_ERR(cell); 296 296 } 297 - afs_unuse_cell(ctx->net, ctx->cell); 297 + afs_unuse_cell(ctx->net, ctx->cell, afs_cell_trace_unuse_parse); 298 + afs_see_cell(cell, afs_cell_trace_see_source); 298 299 ctx->cell = cell; 299 300 } 300 301 ··· 390 389 _debug("switch to alias"); 391 390 key_put(ctx->key); 392 391 ctx->key = NULL; 393 - cell = afs_use_cell(ctx->cell->alias_of); 394 - afs_unuse_cell(ctx->net, ctx->cell); 392 + cell = afs_use_cell(ctx->cell->alias_of, 393 + afs_cell_trace_use_fc_alias); 394 + afs_unuse_cell(ctx->net, ctx->cell, afs_cell_trace_unuse_fc); 395 395 ctx->cell = cell; 396 396 goto reget_key; 397 397 } ··· 510 508 if (ctx->dyn_root) { 511 509 as->dyn_root = true; 512 510 } else { 513 - as->cell = afs_use_cell(ctx->cell); 511 + as->cell = afs_use_cell(ctx->cell, afs_cell_trace_use_sbi); 514 512 as->volume = afs_get_volume(ctx->volume, 515 513 afs_volume_trace_get_alloc_sbi); 516 514 } ··· 523 521 if (as) { 524 522 struct afs_net *net = afs_net(as->net_ns); 525 523 afs_put_volume(net, as->volume, afs_volume_trace_put_destroy_sbi); 526 - afs_unuse_cell(net, as->cell); 524 + afs_unuse_cell(net, as->cell, afs_cell_trace_unuse_sbi); 527 525 put_net(as->net_ns); 528 526 kfree(as); 529 527 } ··· 609 607 610 608 afs_destroy_sbi(fc->s_fs_info); 611 609 afs_put_volume(ctx->net, ctx->volume, afs_volume_trace_put_free_fc); 612 - afs_unuse_cell(ctx->net, ctx->cell); 610 + afs_unuse_cell(ctx->net, ctx->cell, afs_cell_trace_unuse_fc); 613 611 key_put(ctx->key); 614 612 kfree(ctx); 615 613 } ··· 636 634 ctx->net = afs_net(fc->net_ns); 637 635 638 636 /* Default to the workstation cell. */ 639 - cell = afs_find_cell(ctx->net, NULL, 0); 637 + cell = afs_find_cell(ctx->net, NULL, 0, afs_cell_trace_use_fc); 640 638 if (IS_ERR(cell)) 641 639 cell = NULL; 642 640 ctx->cell = cell;
+4 -4
fs/afs/vl_alias.c
··· 177 177 178 178 is_alias: 179 179 rcu_read_unlock(); 180 - cell->alias_of = afs_use_cell(p); 180 + cell->alias_of = afs_use_cell(p, afs_cell_trace_use_alias); 181 181 return 1; 182 182 } 183 183 ··· 247 247 continue; 248 248 if (p->root_volume) 249 249 continue; /* Ignore cells that have a root.cell volume. */ 250 - afs_use_cell(p); 250 + afs_use_cell(p, afs_cell_trace_use_check_alias); 251 251 mutex_unlock(&cell->net->proc_cells_lock); 252 252 253 253 if (afs_query_for_alias_one(cell, key, p) != 0) 254 254 goto is_alias; 255 255 256 256 if (mutex_lock_interruptible(&cell->net->proc_cells_lock) < 0) { 257 - afs_unuse_cell(cell->net, p); 257 + afs_unuse_cell(cell->net, p, afs_cell_trace_unuse_check_alias); 258 258 return -ERESTARTSYS; 259 259 } 260 260 261 - afs_unuse_cell(cell->net, p); 261 + afs_unuse_cell(cell->net, p, afs_cell_trace_unuse_check_alias); 262 262 } 263 263 264 264 mutex_unlock(&cell->net->proc_cells_lock);
+1 -1
fs/afs/vl_rotate.c
··· 45 45 cell->dns_expiry <= ktime_get_real_seconds()) { 46 46 dns_lookup_count = smp_load_acquire(&cell->dns_lookup_count); 47 47 set_bit(AFS_CELL_FL_DO_LOOKUP, &cell->flags); 48 - afs_queue_cell(cell); 48 + afs_queue_cell(cell, afs_cell_trace_get_queue_dns); 49 49 50 50 if (cell->dns_source == DNS_RECORD_UNAVAILABLE) { 51 51 if (wait_var_event_interruptible(
+3 -3
fs/afs/volume.c
··· 83 83 84 84 volume->vid = vldb->vid[params->type]; 85 85 volume->update_at = ktime_get_real_seconds() + afs_volume_record_life; 86 - volume->cell = afs_get_cell(params->cell); 86 + volume->cell = afs_get_cell(params->cell, afs_cell_trace_get_vol); 87 87 volume->type = params->type; 88 88 volume->type_force = params->force; 89 89 volume->name_len = vldb->name_len; ··· 106 106 return volume; 107 107 108 108 error_1: 109 - afs_put_cell(volume->cell); 109 + afs_put_cell(volume->cell, afs_cell_trace_put_vol); 110 110 kfree(volume); 111 111 error_0: 112 112 return ERR_PTR(ret); ··· 228 228 229 229 afs_remove_volume_from_cell(volume); 230 230 afs_put_serverlist(net, rcu_access_pointer(volume->servers)); 231 - afs_put_cell(volume->cell); 231 + afs_put_cell(volume->cell, afs_cell_trace_put_vol); 232 232 trace_afs_volume(volume->vid, atomic_read(&volume->usage), 233 233 afs_volume_trace_free); 234 234 kfree_rcu(volume, rcu);
+107
include/trace/events/afs.h
··· 50 50 afs_server_trace_update, 51 51 }; 52 52 53 + 53 54 enum afs_volume_trace { 54 55 afs_volume_trace_alloc, 55 56 afs_volume_trace_free, ··· 66 65 afs_volume_trace_put_query_alias, 67 66 afs_volume_trace_put_validate_fc, 68 67 afs_volume_trace_remove, 68 + }; 69 + 70 + enum afs_cell_trace { 71 + afs_cell_trace_alloc, 72 + afs_cell_trace_free, 73 + afs_cell_trace_get_queue_dns, 74 + afs_cell_trace_get_queue_manage, 75 + afs_cell_trace_get_queue_new, 76 + afs_cell_trace_get_vol, 77 + afs_cell_trace_insert, 78 + afs_cell_trace_manage, 79 + afs_cell_trace_put_candidate, 80 + afs_cell_trace_put_destroy, 81 + afs_cell_trace_put_queue_fail, 82 + afs_cell_trace_put_queue_work, 83 + afs_cell_trace_put_vol, 84 + afs_cell_trace_see_source, 85 + afs_cell_trace_see_ws, 86 + afs_cell_trace_unuse_alias, 87 + afs_cell_trace_unuse_check_alias, 88 + afs_cell_trace_unuse_delete, 89 + afs_cell_trace_unuse_fc, 90 + afs_cell_trace_unuse_lookup, 91 + afs_cell_trace_unuse_mntpt, 92 + afs_cell_trace_unuse_no_pin, 93 + afs_cell_trace_unuse_parse, 94 + afs_cell_trace_unuse_pin, 95 + afs_cell_trace_unuse_probe, 96 + afs_cell_trace_unuse_sbi, 97 + afs_cell_trace_unuse_ws, 98 + afs_cell_trace_use_alias, 99 + afs_cell_trace_use_check_alias, 100 + afs_cell_trace_use_fc, 101 + afs_cell_trace_use_fc_alias, 102 + afs_cell_trace_use_lookup, 103 + afs_cell_trace_use_mntpt, 104 + afs_cell_trace_use_pin, 105 + afs_cell_trace_use_probe, 106 + afs_cell_trace_use_sbi, 107 + afs_cell_trace_wait, 69 108 }; 70 109 71 110 enum afs_fs_operation { ··· 336 295 EM(afs_volume_trace_put_validate_fc, "PUT fc-validat") \ 337 296 E_(afs_volume_trace_remove, "REMOVE ") 338 297 298 + #define afs_cell_traces \ 299 + EM(afs_cell_trace_alloc, "ALLOC ") \ 300 + EM(afs_cell_trace_free, "FREE ") \ 301 + EM(afs_cell_trace_get_queue_dns, "GET q-dns ") \ 302 + EM(afs_cell_trace_get_queue_manage, "GET q-mng ") \ 303 + EM(afs_cell_trace_get_queue_new, "GET q-new ") \ 304 + EM(afs_cell_trace_get_vol, "GET vol ") \ 305 + EM(afs_cell_trace_insert, "INSERT ") \ 306 + EM(afs_cell_trace_manage, "MANAGE ") \ 307 + EM(afs_cell_trace_put_candidate, "PUT candid") \ 308 + EM(afs_cell_trace_put_destroy, "PUT destry") \ 309 + EM(afs_cell_trace_put_queue_work, "PUT q-work") \ 310 + EM(afs_cell_trace_put_queue_fail, "PUT q-fail") \ 311 + EM(afs_cell_trace_put_vol, "PUT vol ") \ 312 + EM(afs_cell_trace_see_source, "SEE source") \ 313 + EM(afs_cell_trace_see_ws, "SEE ws ") \ 314 + EM(afs_cell_trace_unuse_alias, "UNU alias ") \ 315 + EM(afs_cell_trace_unuse_check_alias, "UNU chk-al") \ 316 + EM(afs_cell_trace_unuse_delete, "UNU delete") \ 317 + EM(afs_cell_trace_unuse_fc, "UNU fc ") \ 318 + EM(afs_cell_trace_unuse_lookup, "UNU lookup") \ 319 + EM(afs_cell_trace_unuse_mntpt, "UNU mntpt ") \ 320 + EM(afs_cell_trace_unuse_parse, "UNU parse ") \ 321 + EM(afs_cell_trace_unuse_pin, "UNU pin ") \ 322 + EM(afs_cell_trace_unuse_probe, "UNU probe ") \ 323 + EM(afs_cell_trace_unuse_sbi, "UNU sbi ") \ 324 + EM(afs_cell_trace_unuse_ws, "UNU ws ") \ 325 + EM(afs_cell_trace_use_alias, "USE alias ") \ 326 + EM(afs_cell_trace_use_check_alias, "USE chk-al") \ 327 + EM(afs_cell_trace_use_fc, "USE fc ") \ 328 + EM(afs_cell_trace_use_fc_alias, "USE fc-al ") \ 329 + EM(afs_cell_trace_use_lookup, "USE lookup") \ 330 + EM(afs_cell_trace_use_mntpt, "USE mntpt ") \ 331 + EM(afs_cell_trace_use_pin, "USE pin ") \ 332 + EM(afs_cell_trace_use_probe, "USE probe ") \ 333 + EM(afs_cell_trace_use_sbi, "USE sbi ") \ 334 + E_(afs_cell_trace_wait, "WAIT ") 335 + 339 336 #define afs_fs_operations \ 340 337 EM(afs_FS_FetchData, "FS.FetchData") \ 341 338 EM(afs_FS_FetchStatus, "FS.FetchStatus") \ ··· 562 483 563 484 afs_call_traces; 564 485 afs_server_traces; 486 + afs_cell_traces; 565 487 afs_fs_operations; 566 488 afs_vl_operations; 567 489 afs_edit_dir_ops; ··· 1436 1356 __entry->vid, 1437 1357 __print_symbolic(__entry->reason, afs_volume_traces), 1438 1358 __entry->ref) 1359 + ); 1360 + 1361 + TRACE_EVENT(afs_cell, 1362 + TP_PROTO(unsigned int cell_debug_id, int usage, int active, 1363 + enum afs_cell_trace reason), 1364 + 1365 + TP_ARGS(cell_debug_id, usage, active, reason), 1366 + 1367 + TP_STRUCT__entry( 1368 + __field(unsigned int, cell ) 1369 + __field(int, usage ) 1370 + __field(int, active ) 1371 + __field(int, reason ) 1372 + ), 1373 + 1374 + TP_fast_assign( 1375 + __entry->cell = cell_debug_id; 1376 + __entry->usage = usage; 1377 + __entry->active = active; 1378 + __entry->reason = reason; 1379 + ), 1380 + 1381 + TP_printk("L=%08x %s u=%d a=%d", 1382 + __entry->cell, 1383 + __print_symbolic(__entry->reason, afs_cell_traces), 1384 + __entry->usage, 1385 + __entry->active) 1439 1386 ); 1440 1387 1441 1388 #endif /* _TRACE_AFS_H */