diff options
| -rw-r--r-- | fs/btrfs/qgroup.c | 52 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.h | 44 | ||||
| -rw-r--r-- | include/trace/events/btrfs.h | 44 |
3 files changed, 96 insertions, 44 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 1d7942c5a38a..27a229619808 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
| @@ -47,50 +47,6 @@ | |||
| 47 | * - check all ioctl parameters | 47 | * - check all ioctl parameters |
| 48 | */ | 48 | */ |
| 49 | 49 | ||
| 50 | /* | ||
| 51 | * one struct for each qgroup, organized in fs_info->qgroup_tree. | ||
| 52 | */ | ||
| 53 | struct btrfs_qgroup { | ||
| 54 | u64 qgroupid; | ||
| 55 | |||
| 56 | /* | ||
| 57 | * state | ||
| 58 | */ | ||
| 59 | u64 rfer; /* referenced */ | ||
| 60 | u64 rfer_cmpr; /* referenced compressed */ | ||
| 61 | u64 excl; /* exclusive */ | ||
| 62 | u64 excl_cmpr; /* exclusive compressed */ | ||
| 63 | |||
| 64 | /* | ||
| 65 | * limits | ||
| 66 | */ | ||
| 67 | u64 lim_flags; /* which limits are set */ | ||
| 68 | u64 max_rfer; | ||
| 69 | u64 max_excl; | ||
| 70 | u64 rsv_rfer; | ||
| 71 | u64 rsv_excl; | ||
| 72 | |||
| 73 | /* | ||
| 74 | * reservation tracking | ||
| 75 | */ | ||
| 76 | u64 reserved; | ||
| 77 | |||
| 78 | /* | ||
| 79 | * lists | ||
| 80 | */ | ||
| 81 | struct list_head groups; /* groups this group is member of */ | ||
| 82 | struct list_head members; /* groups that are members of this group */ | ||
| 83 | struct list_head dirty; /* dirty groups */ | ||
| 84 | struct rb_node node; /* tree of qgroups */ | ||
| 85 | |||
| 86 | /* | ||
| 87 | * temp variables for accounting operations | ||
| 88 | * Refer to qgroup_shared_accounting() for details. | ||
| 89 | */ | ||
| 90 | u64 old_refcnt; | ||
| 91 | u64 new_refcnt; | ||
| 92 | }; | ||
| 93 | |||
| 94 | static void btrfs_qgroup_update_old_refcnt(struct btrfs_qgroup *qg, u64 seq, | 50 | static void btrfs_qgroup_update_old_refcnt(struct btrfs_qgroup *qg, u64 seq, |
| 95 | int mod) | 51 | int mod) |
| 96 | { | 52 | { |
| @@ -1075,6 +1031,7 @@ static int __qgroup_excl_accounting(struct btrfs_fs_info *fs_info, | |||
| 1075 | qgroup->excl += sign * num_bytes; | 1031 | qgroup->excl += sign * num_bytes; |
| 1076 | qgroup->excl_cmpr += sign * num_bytes; | 1032 | qgroup->excl_cmpr += sign * num_bytes; |
| 1077 | if (sign > 0) { | 1033 | if (sign > 0) { |
| 1034 | trace_qgroup_update_reserve(fs_info, qgroup, -(s64)num_bytes); | ||
| 1078 | if (WARN_ON(qgroup->reserved < num_bytes)) | 1035 | if (WARN_ON(qgroup->reserved < num_bytes)) |
| 1079 | report_reserved_underflow(fs_info, qgroup, num_bytes); | 1036 | report_reserved_underflow(fs_info, qgroup, num_bytes); |
| 1080 | else | 1037 | else |
| @@ -1100,6 +1057,8 @@ static int __qgroup_excl_accounting(struct btrfs_fs_info *fs_info, | |||
| 1100 | WARN_ON(sign < 0 && qgroup->excl < num_bytes); | 1057 | WARN_ON(sign < 0 && qgroup->excl < num_bytes); |
| 1101 | qgroup->excl += sign * num_bytes; | 1058 | qgroup->excl += sign * num_bytes; |
| 1102 | if (sign > 0) { | 1059 | if (sign > 0) { |
| 1060 | trace_qgroup_update_reserve(fs_info, qgroup, | ||
| 1061 | -(s64)num_bytes); | ||
| 1103 | if (WARN_ON(qgroup->reserved < num_bytes)) | 1062 | if (WARN_ON(qgroup->reserved < num_bytes)) |
| 1104 | report_reserved_underflow(fs_info, qgroup, | 1063 | report_reserved_underflow(fs_info, qgroup, |
| 1105 | num_bytes); | 1064 | num_bytes); |
| @@ -2446,6 +2405,7 @@ retry: | |||
| 2446 | 2405 | ||
| 2447 | qg = unode_aux_to_qgroup(unode); | 2406 | qg = unode_aux_to_qgroup(unode); |
| 2448 | 2407 | ||
| 2408 | trace_qgroup_update_reserve(fs_info, qg, num_bytes); | ||
| 2449 | qg->reserved += num_bytes; | 2409 | qg->reserved += num_bytes; |
| 2450 | } | 2410 | } |
| 2451 | 2411 | ||
| @@ -2491,6 +2451,7 @@ void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info, | |||
| 2491 | 2451 | ||
| 2492 | qg = unode_aux_to_qgroup(unode); | 2452 | qg = unode_aux_to_qgroup(unode); |
| 2493 | 2453 | ||
| 2454 | trace_qgroup_update_reserve(fs_info, qg, -(s64)num_bytes); | ||
| 2494 | if (WARN_ON(qg->reserved < num_bytes)) | 2455 | if (WARN_ON(qg->reserved < num_bytes)) |
| 2495 | report_reserved_underflow(fs_info, qg, num_bytes); | 2456 | report_reserved_underflow(fs_info, qg, num_bytes); |
| 2496 | else | 2457 | else |
| @@ -2955,6 +2916,7 @@ int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes, | |||
| 2955 | return 0; | 2916 | return 0; |
| 2956 | 2917 | ||
| 2957 | BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); | 2918 | BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); |
| 2919 | trace_qgroup_meta_reserve(root, (s64)num_bytes); | ||
| 2958 | ret = qgroup_reserve(root, num_bytes, enforce); | 2920 | ret = qgroup_reserve(root, num_bytes, enforce); |
| 2959 | if (ret < 0) | 2921 | if (ret < 0) |
| 2960 | return ret; | 2922 | return ret; |
| @@ -2974,6 +2936,7 @@ void btrfs_qgroup_free_meta_all(struct btrfs_root *root) | |||
| 2974 | reserved = atomic64_xchg(&root->qgroup_meta_rsv, 0); | 2936 | reserved = atomic64_xchg(&root->qgroup_meta_rsv, 0); |
| 2975 | if (reserved == 0) | 2937 | if (reserved == 0) |
| 2976 | return; | 2938 | return; |
| 2939 | trace_qgroup_meta_reserve(root, -(s64)reserved); | ||
| 2977 | btrfs_qgroup_free_refroot(fs_info, root->objectid, reserved); | 2940 | btrfs_qgroup_free_refroot(fs_info, root->objectid, reserved); |
| 2978 | } | 2941 | } |
| 2979 | 2942 | ||
| @@ -2988,6 +2951,7 @@ void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes) | |||
| 2988 | BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); | 2951 | BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); |
| 2989 | WARN_ON(atomic64_read(&root->qgroup_meta_rsv) < num_bytes); | 2952 | WARN_ON(atomic64_read(&root->qgroup_meta_rsv) < num_bytes); |
| 2990 | atomic64_sub(num_bytes, &root->qgroup_meta_rsv); | 2953 | atomic64_sub(num_bytes, &root->qgroup_meta_rsv); |
| 2954 | trace_qgroup_meta_reserve(root, -(s64)num_bytes); | ||
| 2991 | btrfs_qgroup_free_refroot(fs_info, root->objectid, num_bytes); | 2955 | btrfs_qgroup_free_refroot(fs_info, root->objectid, num_bytes); |
| 2992 | } | 2956 | } |
| 2993 | 2957 | ||
diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h index 96fc56ebf55a..31e468b16175 100644 --- a/fs/btrfs/qgroup.h +++ b/fs/btrfs/qgroup.h | |||
| @@ -62,6 +62,50 @@ struct btrfs_qgroup_extent_record { | |||
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | /* | 64 | /* |
| 65 | * one struct for each qgroup, organized in fs_info->qgroup_tree. | ||
| 66 | */ | ||
| 67 | struct btrfs_qgroup { | ||
| 68 | u64 qgroupid; | ||
| 69 | |||
| 70 | /* | ||
| 71 | * state | ||
| 72 | */ | ||
| 73 | u64 rfer; /* referenced */ | ||
| 74 | u64 rfer_cmpr; /* referenced compressed */ | ||
| 75 | u64 excl; /* exclusive */ | ||
| 76 | u64 excl_cmpr; /* exclusive compressed */ | ||
| 77 | |||
| 78 | /* | ||
| 79 | * limits | ||
| 80 | */ | ||
| 81 | u64 lim_flags; /* which limits are set */ | ||
| 82 | u64 max_rfer; | ||
| 83 | u64 max_excl; | ||
| 84 | u64 rsv_rfer; | ||
| 85 | u64 rsv_excl; | ||
| 86 | |||
| 87 | /* | ||
| 88 | * reservation tracking | ||
| 89 | */ | ||
| 90 | u64 reserved; | ||
| 91 | |||
| 92 | /* | ||
| 93 | * lists | ||
| 94 | */ | ||
| 95 | struct list_head groups; /* groups this group is member of */ | ||
| 96 | struct list_head members; /* groups that are members of this group */ | ||
| 97 | struct list_head dirty; /* dirty groups */ | ||
| 98 | struct rb_node node; /* tree of qgroups */ | ||
| 99 | |||
| 100 | /* | ||
| 101 | * temp variables for accounting operations | ||
| 102 | * Refer to qgroup_shared_accounting() for details. | ||
| 103 | */ | ||
| 104 | u64 old_refcnt; | ||
| 105 | u64 new_refcnt; | ||
| 106 | }; | ||
| 107 | |||
| 108 | /* | ||
| 65 | * For qgroup event trace points only | 109 | * For qgroup event trace points only |
| 66 | */ | 110 | */ |
| 67 | #define QGROUP_RESERVE (1<<0) | 111 | #define QGROUP_RESERVE (1<<0) |
diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index cef39e2baf21..e37973526153 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h | |||
| @@ -25,6 +25,7 @@ struct extent_buffer; | |||
| 25 | struct btrfs_work; | 25 | struct btrfs_work; |
| 26 | struct __btrfs_workqueue; | 26 | struct __btrfs_workqueue; |
| 27 | struct btrfs_qgroup_extent_record; | 27 | struct btrfs_qgroup_extent_record; |
| 28 | struct btrfs_qgroup; | ||
| 28 | 29 | ||
| 29 | #define show_ref_type(type) \ | 30 | #define show_ref_type(type) \ |
| 30 | __print_symbolic(type, \ | 31 | __print_symbolic(type, \ |
| @@ -1614,6 +1615,49 @@ TRACE_EVENT(qgroup_update_counters, | |||
| 1614 | __entry->cur_new_count) | 1615 | __entry->cur_new_count) |
| 1615 | ); | 1616 | ); |
| 1616 | 1617 | ||
| 1618 | TRACE_EVENT(qgroup_update_reserve, | ||
| 1619 | |||
| 1620 | TP_PROTO(struct btrfs_fs_info *fs_info, struct btrfs_qgroup *qgroup, | ||
| 1621 | s64 diff), | ||
| 1622 | |||
| 1623 | TP_ARGS(fs_info, qgroup, diff), | ||
| 1624 | |||
| 1625 | TP_STRUCT__entry_btrfs( | ||
| 1626 | __field( u64, qgid ) | ||
| 1627 | __field( u64, cur_reserved ) | ||
| 1628 | __field( s64, diff ) | ||
| 1629 | ), | ||
| 1630 | |||
| 1631 | TP_fast_assign_btrfs(fs_info, | ||
| 1632 | __entry->qgid = qgroup->qgroupid; | ||
| 1633 | __entry->cur_reserved = qgroup->reserved; | ||
