scoutfs: remove item granular work from forest

Now that the item cache is bearing the load of high frequency item
calls, we can remove all the item granular work that the forest was
trying to do.  The item cache amortizes the cost of the forest so its
remaining methods can go straight to the btrees and don't need
complicated state to reduce the overhead of item calls.

Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
Zach Brown
2020-08-19 10:02:33 -07:00
committed by Zach Brown
parent 6bacd95aea
commit 12067e99ab
6 changed files with 43 additions and 1511 deletions

View File

@@ -56,27 +56,11 @@
EXPAND_COUNTER(dentry_revalidate_root) \
EXPAND_COUNTER(dentry_revalidate_valid) \
EXPAND_COUNTER(dir_backref_excessive_retries) \
EXPAND_COUNTER(forest_add_root) \
EXPAND_COUNTER(forest_bloom_fail) \
EXPAND_COUNTER(forest_bloom_pass) \
EXPAND_COUNTER(forest_clear_lock) \
EXPAND_COUNTER(forest_delete) \
EXPAND_COUNTER(forest_insert) \
EXPAND_COUNTER(forest_iter) \
EXPAND_COUNTER(forest_lookup) \
EXPAND_COUNTER(forest_read_lock_log) \
EXPAND_COUNTER(forest_read_lock_rotated) \
EXPAND_COUNTER(forest_refresh_bloom_roots) \
EXPAND_COUNTER(forest_refresh_dirty_log) \
EXPAND_COUNTER(forest_refresh_skip_log) \
EXPAND_COUNTER(forest_read_items) \
EXPAND_COUNTER(forest_roots_next_hint) \
EXPAND_COUNTER(forest_roots_lock) \
EXPAND_COUNTER(forest_roots_server) \
EXPAND_COUNTER(forest_saw_stale) \
EXPAND_COUNTER(forest_set_bloom_bits) \
EXPAND_COUNTER(forest_set_dirtied) \
EXPAND_COUNTER(forest_trigger_refresh) \
EXPAND_COUNTER(item_clear_dirty) \
EXPAND_COUNTER(item_create) \
EXPAND_COUNTER(item_delete) \

File diff suppressed because it is too large Load Diff

View File

@@ -13,41 +13,8 @@ typedef int (*scoutfs_forest_item_cb)(struct super_block *sb,
struct scoutfs_log_item_value *liv,
void *val, int val_len, void *arg);
int scoutfs_forest_lookup(struct super_block *sb, struct scoutfs_key *key,
struct kvec *val, struct scoutfs_lock *lock);
int scoutfs_forest_lookup_exact(struct super_block *sb,
struct scoutfs_key *key, struct kvec *val,
struct scoutfs_lock *lock);
int scoutfs_forest_next(struct super_block *sb, struct scoutfs_key *key,
struct scoutfs_key *last, struct kvec *val,
struct scoutfs_lock *lock);
int scoutfs_forest_next_hint(struct super_block *sb, struct scoutfs_key *key,
struct scoutfs_key *next);
int scoutfs_forest_prev(struct super_block *sb, struct scoutfs_key *key,
struct scoutfs_key *first, struct kvec *val,
struct scoutfs_lock *lock);
int scoutfs_forest_create(struct super_block *sb, struct scoutfs_key *key,
struct kvec *val, struct scoutfs_lock *lock);
int scoutfs_forest_create_force(struct super_block *sb,
struct scoutfs_key *key, struct kvec *val,
struct scoutfs_lock *lock);
int scoutfs_forest_update(struct super_block *sb, struct scoutfs_key *key,
struct kvec *val, struct scoutfs_lock *lock);
int scoutfs_forest_delete_dirty(struct super_block *sb,
struct scoutfs_key *key);
int scoutfs_forest_delete(struct super_block *sb, struct scoutfs_key *key,
struct scoutfs_lock *lock);
int scoutfs_forest_delete_force(struct super_block *sb,
struct scoutfs_key *key,
struct scoutfs_lock *lock);
int scoutfs_forest_delete_save(struct super_block *sb,
struct scoutfs_key *key,
struct list_head *list,
struct scoutfs_lock *lock);
int scoutfs_forest_restore(struct super_block *sb, struct list_head *list,
struct scoutfs_lock *lock);
void scoutfs_forest_free_batch(struct super_block *sb, struct list_head *list);
int scoutfs_forest_read_items(struct super_block *sb,
struct scoutfs_lock *lock,
struct scoutfs_key *key,
@@ -67,9 +34,6 @@ void scoutfs_forest_init_btrees(struct super_block *sb,
void scoutfs_forest_get_btrees(struct super_block *sb,
struct scoutfs_log_trees *lt);
void scoutfs_forest_clear_lock(struct super_block *sb,
struct scoutfs_lock *lock);
int scoutfs_forest_setup(struct super_block *sb);
void scoutfs_forest_destroy(struct super_block *sb);

View File

@@ -21,7 +21,6 @@
#include "super.h"
#include "lock.h"
#include "forest.h"
#include "scoutfs_trace.h"
#include "msg.h"
#include "cmp.h"
@@ -230,7 +229,6 @@ static void lock_free(struct lock_info *linfo, struct scoutfs_lock *lock)
BUG_ON(!list_empty(&lock->shrink_head));
BUG_ON(!list_empty(&lock->cov_list));
scoutfs_forest_clear_lock(sb, lock);
kfree(lock);
}
@@ -265,6 +263,8 @@ static struct scoutfs_lock *lock_alloc(struct super_block *sb,
init_waitqueue_head(&lock->waitq);
lock->mode = SCOUTFS_LOCK_NULL;
atomic64_set(&lock->forest_bloom_nr, 0);
trace_scoutfs_lock_alloc(sb, lock);
return lock;

View File

@@ -46,8 +46,8 @@ struct scoutfs_lock {
struct scoutfs_tseq_entry tseq_entry;
/* the forest btree code stores data per lock */
struct forest_lock_private *forest_private;
/* the forest tracks which log tree last saw bloom bit updates */
atomic64_t forest_bloom_nr;
};
struct scoutfs_lock_coverage {

View File

@@ -2104,138 +2104,15 @@ TRACE_EVENT(scoutfs_forest_using_roots,
__entry->logs_blkno, __entry->logs_seq)
);
TRACE_EVENT(scoutfs_forest_add_root,
TP_PROTO(struct super_block *sb, struct scoutfs_key *key, u64 rid,
u64 nr, u64 blkno, u64 seq),
TP_ARGS(sb, key, rid, nr, blkno, seq),
TP_STRUCT__entry(
SCSB_TRACE_FIELDS
sk_trace_define(key)
__field(__u64, b_rid)
__field(__u64, nr)
__field(__u64, blkno)
__field(__u64, seq)
),
TP_fast_assign(
SCSB_TRACE_ASSIGN(sb);
sk_trace_assign(key, key);
__entry->b_rid = rid;
__entry->nr = nr;
__entry->blkno = blkno;
__entry->seq = seq;
),
TP_printk(SCSBF" key "SK_FMT" rid %016llx nr %llu blkno %llu seq %llx",
SCSB_TRACE_ARGS, sk_trace_args(key),
__entry->b_rid, __entry->nr, __entry->blkno, __entry->seq)
);
TRACE_EVENT(scoutfs_forest_set_dirtied,
TP_PROTO(struct super_block *sb, struct scoutfs_key *key, u64 rid,
u64 nr, u64 cseq),
TP_ARGS(sb, key, rid, nr, cseq),
TP_STRUCT__entry(
SCSB_TRACE_FIELDS
sk_trace_define(key)
__field(__u64, b_rid)
__field(__u64, nr)
__field(__u64, cseq)
),
TP_fast_assign(
SCSB_TRACE_ASSIGN(sb);
sk_trace_assign(key, key);
__entry->b_rid = rid;
__entry->nr = nr;
__entry->cseq = cseq;
),
TP_printk(SCSBF" key "SK_FMT" rid %016llx nr %llu cseq %llu",
SCSB_TRACE_ARGS, sk_trace_args(key),
__entry->b_rid, __entry->nr, __entry->cseq)
);
TRACE_EVENT(scoutfs_forest_trigger_refresh,
TP_PROTO(struct super_block *sb, struct scoutfs_key *key,
bool empty_roots, u64 refresh_gen, u64 last_refreshed,
u64 dirtied_cseq, u64 refreshed_dirtied,
u64 commit_seq, u64 refreshed_cseq),
TP_ARGS(sb, key, empty_roots, refresh_gen, last_refreshed,
dirtied_cseq, refreshed_dirtied, commit_seq, refreshed_cseq),
TP_STRUCT__entry(
SCSB_TRACE_FIELDS
sk_trace_define(key)
__field(int, empty_roots)
__field(__u64, refresh_gen)
__field(__u64, last_refreshed)
__field(__u64, dirtied_cseq)
__field(__u64, refreshed_dirtied)
__field(__u64, commit_seq)
__field(__u64, refreshed_cseq)
),
TP_fast_assign(
SCSB_TRACE_ASSIGN(sb);
sk_trace_assign(key, key);
__entry->empty_roots = !!empty_roots;
__entry->refresh_gen = refresh_gen;
__entry->last_refreshed = last_refreshed;
__entry->dirtied_cseq = dirtied_cseq;
__entry->refreshed_dirtied = refreshed_dirtied;
__entry->commit_seq = commit_seq;
__entry->refreshed_cseq = refreshed_cseq;
),
TP_printk(SCSBF" key "SK_FMT" empty %u refg %llu last_refg %llu dirt %llu refdir %llu cseq %llu refcseq %llu",
SCSB_TRACE_ARGS, sk_trace_args(key),
__entry->empty_roots,
__entry->refresh_gen,
__entry->last_refreshed,
__entry->dirtied_cseq,
__entry->refreshed_dirtied,
__entry->commit_seq,
__entry->refreshed_cseq)
);
TRACE_EVENT(scoutfs_forest_refresh_seqs,
TP_PROTO(struct super_block *sb, struct scoutfs_key *key, u64 rid,
u64 nr, u64 dirtied_cseq, u64 refreshed_dirtied,
u64 commit_seq, u64 refreshed_cseq),
TP_ARGS(sb, key, rid, nr, dirtied_cseq, refreshed_dirtied, commit_seq,
refreshed_cseq),
TP_STRUCT__entry(
SCSB_TRACE_FIELDS
sk_trace_define(key)
__field(__u64, b_rid)
__field(__u64, nr)
__field(__u64, dirtied_cseq)
__field(__u64, refreshed_dirtied)
__field(__u64, commit_seq)
__field(__u64, refreshed_cseq)
),
TP_fast_assign(
SCSB_TRACE_ASSIGN(sb);
sk_trace_assign(key, key);
__entry->b_rid = rid;
__entry->nr = nr;
__entry->dirtied_cseq = dirtied_cseq;
__entry->refreshed_dirtied = refreshed_dirtied;
__entry->commit_seq = commit_seq;
__entry->refreshed_cseq = refreshed_cseq;
),
TP_printk(SCSBF" key "SK_FMT" rid %016llx nr %llu dirt %llu refdir %llu cseq %llu refcseq %llu",
SCSB_TRACE_ARGS, sk_trace_args(key), __entry->b_rid,
__entry->nr, __entry->dirtied_cseq,
__entry->refreshed_dirtied, __entry->commit_seq,
__entry->refreshed_cseq)
);
TRACE_EVENT(scoutfs_forest_init_our_log,
TP_PROTO(struct super_block *sb, u64 rid, u64 nr, u64 blkno, u64 seq,
u64 cseq),
TP_ARGS(sb, rid, nr, blkno, seq, cseq),
TP_PROTO(struct super_block *sb, u64 rid, u64 nr, u64 blkno, u64 seq),
TP_ARGS(sb, rid, nr, blkno, seq),
TP_STRUCT__entry(
SCSB_TRACE_FIELDS
__field(__u64, b_rid)
__field(__u64, nr)
__field(__u64, blkno)
__field(__u64, seq)
__field(__u64, cseq)
),
TP_fast_assign(
SCSB_TRACE_ASSIGN(sb);
@@ -2243,67 +2120,10 @@ TRACE_EVENT(scoutfs_forest_init_our_log,
__entry->nr = nr;
__entry->blkno = blkno;
__entry->seq = seq;
__entry->cseq = cseq;
),
TP_printk(SCSBF" rid %016llx nr %llu blkno %llu seq %llx cseq %llu",
TP_printk(SCSBF" rid %016llx nr %llu blkno %llu seq %llx",
SCSB_TRACE_ARGS, __entry->b_rid, __entry->nr,
__entry->blkno, __entry->seq, __entry->cseq)
);
TRACE_EVENT(scoutfs_forest_iter_search,
TP_PROTO(struct super_block *sb, u64 rid, u64 nr, u64 vers,
u8 flags, struct scoutfs_key *key),
TP_ARGS(sb, rid, nr, vers, flags, key),
TP_STRUCT__entry(
SCSB_TRACE_FIELDS
__field(__u64, b_rid)
__field(__u64, nr)
__field(__u64, vers)
__field(__u8, flags)
sk_trace_define(key)
),
TP_fast_assign(
SCSB_TRACE_ASSIGN(sb);
__entry->b_rid = rid;
__entry->nr = nr;
__entry->vers = vers;
__entry->flags = flags;
sk_trace_assign(key, key);
),
TP_printk(SCSBF" rid %016llx nr %llu vers %llu flags %x key "SK_FMT,
SCSB_TRACE_ARGS, __entry->b_rid, __entry->nr,
__entry->vers, __entry->flags, sk_trace_args(key))
);
TRACE_EVENT(scoutfs_forest_iter_ret,
TP_PROTO(struct super_block *sb, struct scoutfs_key *key,
struct scoutfs_key *end, bool forward, int ret,
u64 found_vers, int found_ret, struct scoutfs_key *found),
TP_ARGS(sb, key, end, forward, ret, found_vers, found_ret, found),
TP_STRUCT__entry(
SCSB_TRACE_FIELDS
sk_trace_define(key)
sk_trace_define(end)
__field(char, forward)
__field(int, ret)
__field(__u64, found_vers)
__field(int, found_ret)
sk_trace_define(found)
),
TP_fast_assign(
SCSB_TRACE_ASSIGN(sb);
sk_trace_assign(key, key);
sk_trace_assign(end, end);
__entry->forward = !!forward;
__entry->ret = ret;
__entry->found_vers = found_vers;
__entry->found_ret = found_ret;
sk_trace_assign(found, found);
),
TP_printk(SCSBF" key "SK_FMT" end "SK_FMT" fwd %u ret %d fv %llu fc %d f "SK_FMT,
SCSB_TRACE_ARGS, sk_trace_args(key), sk_trace_args(end),
__entry->forward, __entry->ret, __entry->found_vers,
__entry->found_ret, sk_trace_args(found))
__entry->blkno, __entry->seq)
);
DECLARE_EVENT_CLASS(scoutfs_block_class,