diff options
author | Josef Bacik <josef@redhat.com> | 2011-11-10 08:29:20 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2012-01-16 15:29:42 -0500 |
commit | 3f7de037fb3727b20bc27332cdcf2488b702394c (patch) | |
tree | 7e355b7e60b584ca7aaaf7c8abfa1f2408c15ff2 | |
parent | 45a8090e626ab470c91142954431a93846030b0d (diff) |
Btrfs: add allocator tracepoints
I used these tracepoints when figuring out what the cluster stuff was doing, so
add them to mainline in case we need to profile this stuff again. Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
-rw-r--r-- | fs/btrfs/extent-tree.c | 9 | ||||
-rw-r--r-- | fs/btrfs/free-space-cache.c | 12 | ||||
-rw-r--r-- | include/trace/events/btrfs.h | 173 |
3 files changed, 193 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index a44072a692ab..ad1a20bc834d 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -5256,6 +5256,8 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, | |||
5256 | ins->objectid = 0; | 5256 | ins->objectid = 0; |
5257 | ins->offset = 0; | 5257 | ins->offset = 0; |
5258 | 5258 | ||
5259 | trace_find_free_extent(orig_root, num_bytes, empty_size, data); | ||
5260 | |||
5259 | space_info = __find_space_info(root->fs_info, data); | 5261 | space_info = __find_space_info(root->fs_info, data); |
5260 | if (!space_info) { | 5262 | if (!space_info) { |
5261 | printk(KERN_ERR "No space info for %llu\n", data); | 5263 | printk(KERN_ERR "No space info for %llu\n", data); |
@@ -5432,6 +5434,8 @@ alloc: | |||
5432 | if (offset) { | 5434 | if (offset) { |
5433 | /* we have a block, we're done */ | 5435 | /* we have a block, we're done */ |
5434 | spin_unlock(&last_ptr->refill_lock); | 5436 | spin_unlock(&last_ptr->refill_lock); |
5437 | trace_btrfs_reserve_extent_cluster(root, | ||
5438 | block_group, search_start, num_bytes); | ||
5435 | goto checks; | 5439 | goto checks; |
5436 | } | 5440 | } |
5437 | 5441 | ||
@@ -5490,6 +5494,9 @@ refill_cluster: | |||
5490 | if (offset) { | 5494 | if (offset) { |
5491 | /* we found one, proceed */ | 5495 | /* we found one, proceed */ |
5492 | spin_unlock(&last_ptr->refill_lock); | 5496 | spin_unlock(&last_ptr->refill_lock); |
5497 | trace_btrfs_reserve_extent_cluster(root, | ||
5498 | block_group, search_start, | ||
5499 | num_bytes); | ||
5493 | goto checks; | 5500 | goto checks; |
5494 | } | 5501 | } |
5495 | } else if (!cached && loop > LOOP_CACHING_NOWAIT | 5502 | } else if (!cached && loop > LOOP_CACHING_NOWAIT |
@@ -5576,6 +5583,8 @@ checks: | |||
5576 | ins->objectid = search_start; | 5583 | ins->objectid = search_start; |
5577 | ins->offset = num_bytes; | 5584 | ins->offset = num_bytes; |
5578 | 5585 | ||
5586 | trace_btrfs_reserve_extent(orig_root, block_group, | ||
5587 | search_start, num_bytes); | ||
5579 | if (offset < search_start) | 5588 | if (offset < search_start) |
5580 | btrfs_add_free_space(used_block_group, offset, | 5589 | btrfs_add_free_space(used_block_group, offset, |
5581 | search_start - offset); | 5590 | search_start - offset); |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 6c7887a7770c..efe20032e4a1 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -2346,6 +2346,8 @@ again: | |||
2346 | &entry->offset_index, 1); | 2346 | &entry->offset_index, 1); |
2347 | BUG_ON(ret); | 2347 | BUG_ON(ret); |
2348 | 2348 | ||
2349 | trace_btrfs_setup_cluster(block_group, cluster, | ||
2350 | total_found * block_group->sectorsize, 1); | ||
2349 | return 0; | 2351 | return 0; |
2350 | } | 2352 | } |
2351 | 2353 | ||
@@ -2368,6 +2370,7 @@ setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group, | |||
2368 | u64 window_start; | 2370 | u64 window_start; |
2369 | u64 window_free; | 2371 | u64 window_free; |
2370 | u64 max_extent; | 2372 | u64 max_extent; |
2373 | u64 total_size = 0; | ||
2371 | 2374 | ||
2372 | entry = tree_search_offset(ctl, offset, 0, 1); | 2375 | entry = tree_search_offset(ctl, offset, 0, 1); |
2373 | if (!entry) | 2376 | if (!entry) |
@@ -2433,11 +2436,12 @@ setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group, | |||
2433 | rb_erase(&entry->offset_index, &ctl->free_space_offset); | 2436 | rb_erase(&entry->offset_index, &ctl->free_space_offset); |
2434 | ret = tree_insert_offset(&cluster->root, entry->offset, | 2437 | ret = tree_insert_offset(&cluster->root, entry->offset, |
2435 | &entry->offset_index, 0); | 2438 | &entry->offset_index, 0); |
2439 | total_size += entry->bytes; | ||
2436 | BUG_ON(ret); | 2440 | BUG_ON(ret); |
2437 | } while (node && entry != last); | 2441 | } while (node && entry != last); |
2438 | 2442 | ||
2439 | cluster->max_size = max_extent; | 2443 | cluster->max_size = max_extent; |
2440 | 2444 | trace_btrfs_setup_cluster(block_group, cluster, total_size, 0); | |
2441 | return 0; | 2445 | return 0; |
2442 | } | 2446 | } |
2443 | 2447 | ||
@@ -2542,6 +2546,10 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans, | |||
2542 | goto out; | 2546 | goto out; |
2543 | } | 2547 | } |
2544 | 2548 | ||
2549 | trace_btrfs_find_cluster(block_group, offset, bytes, empty_size, | ||
2550 | min_bytes); | ||
2551 | |||
2552 | INIT_LIST_HEAD(&bitmaps); | ||
2545 | ret = setup_cluster_no_bitmap(block_group, cluster, &bitmaps, offset, | 2553 | ret = setup_cluster_no_bitmap(block_group, cluster, &bitmaps, offset, |
2546 | bytes + empty_size, | 2554 | bytes + empty_size, |
2547 | cont1_bytes, min_bytes); | 2555 | cont1_bytes, min_bytes); |
@@ -2559,6 +2567,8 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans, | |||
2559 | list_add_tail(&cluster->block_group_list, | 2567 | list_add_tail(&cluster->block_group_list, |
2560 | &block_group->cluster_list); | 2568 | &block_group->cluster_list); |
2561 | cluster->block_group = block_group; | 2569 | cluster->block_group = block_group; |
2570 | } else { | ||
2571 | trace_btrfs_failed_cluster_setup(block_group); | ||
2562 | } | 2572 | } |
2563 | out: | 2573 | out: |
2564 | spin_unlock(&cluster->lock); | 2574 | spin_unlock(&cluster->lock); |
diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index b31702ac15be..1750c0e6660c 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h | |||
@@ -16,6 +16,8 @@ struct btrfs_delayed_ref_node; | |||
16 | struct btrfs_delayed_tree_ref; | 16 | struct btrfs_delayed_tree_ref; |
17 | struct btrfs_delayed_data_ref; | 17 | struct btrfs_delayed_data_ref; |
18 | struct btrfs_delayed_ref_head; | 18 | struct btrfs_delayed_ref_head; |
19 | struct btrfs_block_group_cache; | ||
20 | struct btrfs_free_cluster; | ||
19 | struct map_lookup; | 21 | struct map_lookup; |
20 | struct extent_buffer; | 22 | struct extent_buffer; |
21 | 23 | ||
@@ -44,6 +46,15 @@ struct extent_buffer; | |||
44 | obj, ((obj >= BTRFS_DATA_RELOC_TREE_OBJECTID) || \ | 46 | obj, ((obj >= BTRFS_DATA_RELOC_TREE_OBJECTID) || \ |
45 | (obj <= BTRFS_CSUM_TREE_OBJECTID )) ? __show_root_type(obj) : "-" | 47 | (obj <= BTRFS_CSUM_TREE_OBJECTID )) ? __show_root_type(obj) : "-" |
46 | 48 | ||
49 | #define BTRFS_GROUP_FLAGS \ | ||
50 | { BTRFS_BLOCK_GROUP_DATA, "DATA"}, \ | ||
51 | { BTRFS_BLOCK_GROUP_SYSTEM, "SYSTEM"}, \ | ||
52 | { BTRFS_BLOCK_GROUP_METADATA, "METADATA"}, \ | ||
53 | { BTRFS_BLOCK_GROUP_RAID0, "RAID0"}, \ | ||
54 | { BTRFS_BLOCK_GROUP_RAID1, "RAID1"}, \ | ||
55 | { BTRFS_BLOCK_GROUP_DUP, "DUP"}, \ | ||
56 | { BTRFS_BLOCK_GROUP_RAID10, "RAID10"} | ||
57 | |||
47 | TRACE_EVENT(btrfs_transaction_commit, | 58 | TRACE_EVENT(btrfs_transaction_commit, |
48 | 59 | ||
49 | TP_PROTO(struct btrfs_root *root), | 60 | TP_PROTO(struct btrfs_root *root), |
@@ -659,6 +670,168 @@ DEFINE_EVENT(btrfs__reserved_extent, btrfs_reserved_extent_free, | |||
659 | TP_ARGS(root, start, len) | 670 | TP_ARGS(root, start, len) |
660 | ); | 671 | ); |
661 | 672 | ||
673 | TRACE_EVENT(find_free_extent, | ||
674 | |||
675 | TP_PROTO(struct btrfs_root *root, u64 num_bytes, u64 empty_size, | ||
676 | u64 data), | ||
677 | |||
678 | TP_ARGS(root, num_bytes, empty_size, data), | ||
679 | |||
680 | TP_STRUCT__entry( | ||
681 | __field( u64, root_objectid ) | ||
682 | __field( u64, num_bytes ) | ||
683 | __field( u64, empty_size ) | ||
684 | __field( u64, data ) | ||
685 | ), | ||
686 | |||
687 | TP_fast_assign( | ||
688 | __entry->root_objectid = root->root_key.objectid; | ||
689 | __entry->num_bytes = num_bytes; | ||
690 | __entry->empty_size = empty_size; | ||
691 | __entry->data = data; | ||
692 | ), | ||
693 | |||
694 | TP_printk("root = %Lu(%s), len = %Lu, empty_size = %Lu, " | ||
695 | "flags = %Lu(%s)", show_root_type(__entry->root_objectid), | ||
696 | __entry->num_bytes, __entry->empty_size, __entry->data, | ||
697 | __print_flags((unsigned long)__entry->data, "|", | ||
698 | BTRFS_GROUP_FLAGS)) | ||
699 | ); | ||
700 | |||
701 | DECLARE_EVENT_CLASS(btrfs__reserve_extent, | ||
702 | |||
703 | TP_PROTO(struct btrfs_root *root, | ||
704 | struct btrfs_block_group_cache *block_group, u64 start, | ||
705 | u64 len), | ||
706 | |||
707 | TP_ARGS(root, block_group, start, len), | ||
708 | |||
709 | TP_STRUCT__entry( | ||
710 | __field( u64, root_objectid ) | ||
711 | __field( u64, bg_objectid ) | ||
712 | __field( u64, flags ) | ||
713 | __field( u64, start ) | ||
714 | __field( u64, len ) | ||
715 | ), | ||
716 | |||
717 | TP_fast_assign( | ||
718 | __entry->root_objectid = root->root_key.objectid; | ||
719 | __entry->bg_objectid = block_group->key.objectid; | ||
720 | __entry->flags = block_group->flags; | ||
721 | __entry->start = start; | ||
722 | __entry->len = len; | ||
723 | ), | ||
724 | |||
725 | TP_printk("root = %Lu(%s), block_group = %Lu, flags = %Lu(%s), " | ||
726 | "start = %Lu, len = %Lu", | ||
727 | show_root_type(__entry->root_objectid), __entry->bg_objectid, | ||
728 | __entry->flags, __print_flags((unsigned long)__entry->flags, | ||
729 | "|", BTRFS_GROUP_FLAGS), | ||
730 | __entry->start, __entry->len) | ||
731 | ); | ||
732 | |||
733 | DEFINE_EVENT(btrfs__reserve_extent, btrfs_reserve_extent, | ||
734 | |||
735 | TP_PROTO(struct btrfs_root *root, | ||
736 | struct btrfs_block_group_cache *block_group, u64 start, | ||
737 | u64 len), | ||
738 | |||
739 | TP_ARGS(root, block_group, start, len) | ||
740 | ); | ||
741 | |||
742 | DEFINE_EVENT(btrfs__reserve_extent, btrfs_reserve_extent_cluster, | ||
743 | |||
744 | TP_PROTO(struct btrfs_root *root, | ||
745 | struct btrfs_block_group_cache *block_group, u64 start, | ||
746 | u64 len), | ||
747 | |||
748 | TP_ARGS(root, block_group, start, len) | ||
749 | ); | ||
750 | |||
751 | TRACE_EVENT(btrfs_find_cluster, | ||
752 | |||
753 | TP_PROTO(struct btrfs_block_group_cache *block_group, u64 start, | ||
754 | u64 bytes, u64 empty_size, u64 min_bytes), | ||
755 | |||
756 | TP_ARGS(block_group, start, bytes, empty_size, min_bytes), | ||
757 | |||
758 | TP_STRUCT__entry( | ||
759 | __field( u64, bg_objectid ) | ||
760 | __field( u64, flags ) | ||
761 | __field( u64, start ) | ||
762 | __field( u64, bytes ) | ||
763 | __field( u64, empty_size ) | ||
764 | __field( u64, min_bytes ) | ||
765 | ), | ||
766 | |||
767 | TP_fast_assign( | ||
768 | __entry->bg_objectid = block_group->key.objectid; | ||
769 | __entry->flags = block_group->flags; | ||
770 | __entry->start = start; | ||
771 | __entry->bytes = bytes; | ||
772 | __entry->empty_size = empty_size; | ||
773 | __entry->min_bytes = min_bytes; | ||
774 | ), | ||
775 | |||
776 | TP_printk("block_group = %Lu, flags = %Lu(%s), start = %Lu, len = %Lu," | ||
777 | " empty_size = %Lu, min_bytes = %Lu", __entry->bg_objectid, | ||
778 | __entry->flags, | ||
779 | __print_flags((unsigned long)__entry->flags, "|", | ||
780 | BTRFS_GROUP_FLAGS), __entry->start, | ||
781 | __entry->bytes, __entry->empty_size, __entry->min_bytes) | ||
782 | ); | ||
783 | |||
784 | TRACE_EVENT(btrfs_failed_cluster_setup, | ||
785 | |||
786 | TP_PROTO(struct btrfs_block_group_cache *block_group), | ||
787 | |||
788 | TP_ARGS(block_group), | ||
789 | |||
790 | TP_STRUCT__entry( | ||
791 | __field( u64, bg_objectid ) | ||
792 | ), | ||
793 | |||
794 | TP_fast_assign( | ||
795 | __entry->bg_objectid = block_group->key.objectid; | ||
796 | ), | ||
797 | |||
798 | TP_printk("block_group = %Lu", __entry->bg_objectid) | ||
799 | ); | ||
800 | |||
801 | TRACE_EVENT(btrfs_setup_cluster, | ||
802 | |||
803 | TP_PROTO(struct btrfs_block_group_cache *block_group, | ||
804 | struct btrfs_free_cluster *cluster, u64 size, int bitmap), | ||
805 | |||
806 | TP_ARGS(block_group, cluster, size, bitmap), | ||
807 | |||
808 | TP_STRUCT__entry( | ||
809 | __field( u64, bg_objectid ) | ||
810 | __field( u64, flags ) | ||
811 | __field( u64, start ) | ||
812 | __field( u64, max_size ) | ||
813 | __field( u64, size ) | ||
814 | __field( int, bitmap ) | ||
815 | ), | ||
816 | |||
817 | TP_fast_assign( | ||
818 | __entry->bg_objectid = block_group->key.objectid; | ||
819 | __entry->flags = block_group->flags; | ||
820 | __entry->start = cluster->window_start; | ||
821 | __entry->max_size = cluster->max_size; | ||
822 | __entry->size = size; | ||
823 | __entry->bitmap = bitmap; | ||
824 | ), | ||
825 | |||
826 | TP_printk("block_group = %Lu, flags = %Lu(%s), window_start = %Lu, " | ||
827 | "size = %Lu, max_size = %Lu, bitmap = %d", | ||
828 | __entry->bg_objectid, | ||
829 | __entry->flags, | ||
830 | __print_flags((unsigned long)__entry->flags, "|", | ||
831 | BTRFS_GROUP_FLAGS), __entry->start, | ||
832 | __entry->size, __entry->max_size, __entry->bitmap) | ||
833 | ); | ||
834 | |||
662 | #endif /* _TRACE_BTRFS_H */ | 835 | #endif /* _TRACE_BTRFS_H */ |
663 | 836 | ||
664 | /* This part must be outside protection */ | 837 | /* This part must be outside protection */ |