summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2023-01-06bcachefs: Btree split improvementKent Overstreet
This improves the bkey_format calculation when splitting btree nodes. Previously, we'd use a format calculated for the original node for the lower of the two new nodes. This was particularly bad on sequential insertions, where we iteratively split the last btree node, whos format has to include KEY_MAX. Now, we calculate formats precisely for the keys the two new nodes will contain. This also should make splitting a bit more efficient, since we're only copying keys once (from the original node to the new node, instead of new node, replacement node, then upper split). Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Fix return code from btree_path_traverse_one()Kent Overstreet
trans->restarted is a positive error code, not the usual negative Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Minor dio write path improvementsKent Overstreet
This switches where we take quota reservations to be per bch_wirte_op instead of per dio_write, so we can drop the quota reservation in the same place as we call i_sectors_acct(), and only take/release ei_quota_lock once. In the future we'd like ei_quota_lock to not be a mutex, so that we can avoid punting to process context before deliving write completions in nocow mode. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Quota: Don't allocate memory under lockKent Overstreet
The genradix code can handle multiple threads trying to allocate at the same time - we don't need the genradix_ptr_alloc() call to happen under a lock. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Fix a use after freeKent Overstreet
This fixes a regression from percpu freedlists in the btree key cache code: in a rare error path, we were immediately freeing a bkey_cached that had been used before and should've waited for an SRCU barrier. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Delete atomic_inc_bug()Kent Overstreet
These were wrappers around atomic operations that verified that the counter wasn't negative, but they're dead code - delete. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Fixes for building in userspaceKent Overstreet
- Marking a non-static function as inline doesn't actually work and is now causing problems - drop that - Introduce BCACHEFS_LOG_PREFIX for when we want to prefix log messages with bcachefs (filesystem name) - Userspace doesn't have real percpu variables (maybe we can get this fixed someday), put an #ifdef around bch2_disk_reservation_add() fastpath Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Factor out two_state_shared_lockKent Overstreet
We have a unique lock used for controlling adding to the pagecache: the lock has two states, where both states are shared - the lock may be held multiple times for either state - but not both states at the same time. This is exactly what we need for nocow mode locking, so this patch pulls it out of fs.c into its own file. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: bucket_alloc_stateKent Overstreet
This refactoring puts our various allocation path counters into a dedicated struct - the upcoming nocow patch is going to add another counter. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Kill BCH_WRITE_FLUSHKent Overstreet
BCH_WRITE_FLUSH is a write flag that causes a journal flush. It's only used in the direct IO path, and this will allow for some consolidation with the regular fsync path, which will help with the upcoming nocow mode. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: bch2_trans_commit_bkey_invalid()Kent Overstreet
- factor out more slowpath code into non-inline function - use bch2_print_string_as_lines(), so our error message doesn't get truncated Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Kill bch2_alloc_sectors_start()Kent Overstreet
Only used in one place, just inline it there. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Improve __bch2_btree_path_make_mut()Kent Overstreet
btree_path_copy() doesn't need to call bch2_btree_path_check_sort_fast() - the newly allocated path will always be in the correct position, post copy; also delete some redundant branches from __bch2_btree_path_make_mut(). Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Inlining improvementsKent Overstreet
- Don't call into bch2_encrypt_bio() when we're not encrypting - Pull slowpath out of trans_lock_write() - Make sure bc2h_trans_journal_res_get() gets inlined. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: DIO write path optimizationKent Overstreet
- With BCH_WRITE_SYNC, we no longer need the completion in struct dio_write - Pull out bch2_dio_write_copy_iov() into a separate non-inline function, it's code that doesn't run in the common case - Copy mapping and inode pointers into dio_write, avoiding pointer chasing at the start of bch2_dio_write_loop() - kthread_use_mm() is not needed in the common case; move it into bch2_dio_write_loop_async() - factor out various helpers from bch2_dio_write_loop() and rework control flow for better icache utilization Other small optimizations: - bch2_keylist_free() is only used in one place, at the end of the bch2_write() path - drop the reinit - in bch2_disk_reservation_put(), check if res->sectors is nonzero before touching c->online_reserved, since that will likely be a cache miss Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev> bcachefs: More DIO write path optimization Better code prefetching (?) Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: BCH_WRITE_SYNCKent Overstreet
This adds a new flag for the write path, BCH_WRITE_SYNC, and switches the O_DIRECT write path to use it when we're not running asynchronously. It runs the btree update after the write in the original thread's context instead of a kworker, cutting context switches in half. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Check for excess backpointers in alloc_ptr_invalidKent Overstreet
This adds a check to make sure that the sum of the backpointers in an alloc key isn't more than the dirty sector count. We've been seeing a rare bug where we fail to delete a backpointer - this check will help catch it when it happens. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Kill BCH_WRITE_JOURNAL_SEQ_PTRKent Overstreet
Dead code, delete. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: should_compact_all()Kent Overstreet
This factors out a properly-documented helper for deciding when we want to sort a btree node with MAX_BSETS bsets down to a single bset. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Improved btree write statisticsKent Overstreet
This replaces sysfs btree_avg_write_size with btree_write_stats, which now breaks out statistics by the source of the btree write. Btree writes that are too small are a source of inefficiency, and excessive btree resort overhead - this will let us see what's causing them. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Improve fs_usage_apply_warn() messageKent Overstreet
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Fix a spurious warningKent Overstreet
Fixes fstests generic/648 Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Skip inode unpack/pack in bch2_extent_update()Kent Overstreet
This takes advantage of the new inode type to skip the expensive pack/unpack when inode updates are required in the extent update path. Additionally, we now skip the inode update entirely when i_sectors and i_size aren't changing. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Drop old maybe_extending optimizationKent Overstreet
The extend update path had an optimization to avoid updating the inode if we knew we were definitely not extending the file. But now that we're updating inodes on every extent update - for fsync - that code can be deleted. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
2023-01-06bcachefs: Fix for allocating before backpointers have been checkedKent Overstreet
Before the backpointers phase of fsck completes - which runs while we're RW - we could have free buckets (dirty_sectors = 0) with backpointers in them - invalid backpointers that will be removed later. We don't want to allocate from these buckets, we'll get "overlapping backpointer" errors. This patch fixes this issue by explicitly checking if there's any backpointers in the candidate bucket if backpointers haven't been checked yet. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Fix buffered write path for generic/275Kent Overstreet
Per fstests generic/275, on -ENOSPC we're supposed write until the filesystem is full - i.e. do a partial write instead of failing the full write. This is a partial fix for the buffered write path: we'll still fail on a page boundary. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Journal keys overlay fixesKent Overstreet
- In the btree iterator code that overlays keys from the journal, we were incorrectly specifying level=0 instead of the btree_path's current level in a few places - When we didn't do journal replay, we shouldn't free the journal keys: this fixes cmd_list and cmd_dump, which run in norecovery mode Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Fix an out-of-bounds shiftKent Overstreet
roundup_pow_of_two() is undefined for 0 - oops. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: More style fixesKent Overstreet
Fixes for various checkpatch errors. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Make error messages more uniformKent Overstreet
Use __func__ in error messages that refer to function name, and do so more uniformly - suggested by checkpatch.pl Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Convert to __packed and __alignedKent Overstreet
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: KEY_TYPE_inode_v3, metadata_version_inode_v3Kent Overstreet
Move bi_size and bi_sectors into the non-varint portion of the inode, so that the write path can update them without going through the relatively expensive unpack/pack operations. Other changes: - Add a field for the offset of the varint section, so we can add new non-varint fields without needing a new inode type, like alloc_v3 - Move bi_mode into the flags field, so that the varint section can be u64 aligned Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: bch2_bkey_cmp_packed_inlined()Kent Overstreet
This adds an inlined version of bch2_bkey_cmp_packed(), and uses it in bch2_sort_keys(), where it's part of the inner loop. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Move bkey bkey_unpack_key() to bkey.hKent Overstreet
Long ago, bkey_unpack_key() was added to bset.h instead of bkey.h because bkey.h didn't include btree_types.h, which it needs for the compiled unpack function. This patch finally moves it to the proper location. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Optimize __bch2_btree_node_iter_advance()Kent Overstreet
This replaces an expensive memmove() call with an open-coded version. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Don't touch c->flags in bch2_trans_iter_init()Kent Overstreet
This moves the JOURNAL_REPLAY_DONE flag check from bch2_trans_iter_init() to bch2_trans_init(), where we stash a copy in btree_trans - gaining us a small performance improvement. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Cacheline align & prefetch journal reservationsKent Overstreet
Writing to the new journal entries is currently a major cacheline miss in the transaction commit path - this helps. Additionally, this patch cacheline aligns journal reservations, so that when multiple threads are doing transaction commits they won't conflict. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Optimize bch2_dev_usage_read()Kent Overstreet
- add bch2_dev_usage_read_fast(), which doesn't return by value - bch_dev_usage is big enough that we don't want the silent memcpy - tweak the allocation path to only call bch2_dev_usage_read() once per bucket allocated Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Assorted checkpatch fixesKent Overstreet
checkpatch.pl gives lots of warnings that we don't want - suggested ignore list: ASSIGN_IN_IF UNSPECIFIED_INT - bcachefs coding style prefers single token type names NEW_TYPEDEFS - typedefs are occasionally good FUNCTION_ARGUMENTS - we prefer to look at functions in .c files (hopefully with docbook documentation), not .h file prototypes MULTISTATEMENT_MACRO_USE_DO_WHILE - we have _many_ x-macros and other macros where we can't do this Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: fix bch2_write_extent() crc corruption.Daniel Hill
crc.compression_type & nouce gets reset to inside bch2_rechecksum_bio(), we set it back to the previous values calculated. This fixes incompressible extents being marked as uncompressed. Signed-off-by: Daniel Hill <daniel@gluo.nz>
2023-01-06bcachefs: fix security warning in pr_name_and_unitsDaniel B. Hill
Signed-off-by: Daniel Hill <daniel@gluo.nz>
2023-01-06bcachefs: Don't issue transaction restart on key cache reallocKent Overstreet
This shouldn't be needed anymore, since we don't rely on the pointer validity that this was guarding against anymore - we get a new good reference and save it right after this function. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Separate out flush_new_cached_update()Kent Overstreet
This separates out the slowpath of bch2_trans_update_by_path_trace() into a new non-inlined helper. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Optimize __bkey_unpack_key_format_checked()Kent Overstreet
Delete some code when CONFIG_BCACHEFS_DEBUG=n Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Inline bch2_inode_pack()Kent Overstreet
It's mainly used from bch2_inode_write(), so inline it there. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: bucket_alloc_fail tracepoint should only fire when we have to blockKent Overstreet
We don't want to fire the bucket_alloc_fail tracepoint on transaction restart, when we can retry immediately - only when we the allocation actually has to block. Also, switch from sched_clock() to local_clock(), as we've been doing elsewhere. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Start copygc when first going read-writeKent Overstreet
In the distant past, it wasn't possible to start copygc until after journal replay had finished. Now, the btree iterator code overlays keys from the journal, so there's no reason not to start it earlier - and it solves a rare deadlock. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Optimize bch2_trans_init()Kent Overstreet
Now we store the transaction's fn idx in a local variable, instead of redoing the lookup every time we call bch2_trans_init(). Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Better inlining for bch2_alloc_to_v4_mutKent Overstreet
This separates out the slowpath into a separate function, and inlines bch2_alloc_v4_mut into bch2_trans_start_alloc_update(), the main place it's called. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
2023-01-06bcachefs: Fix null ptr deref in backpointers check codeKent Overstreet
This only occured in the drop_alloc tests - when looking up a backpointer to a node that no longer exists because the btree is shorter than it was before. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>