Commit c782c583 authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: Add max nr of IOs in flight to the move path

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 01efebd8
...@@ -74,6 +74,7 @@ static void move_write_done(struct bch_write_op *op) ...@@ -74,6 +74,7 @@ static void move_write_done(struct bch_write_op *op)
ctxt->write_error = true; ctxt->write_error = true;
atomic_sub(io->write_sectors, &io->write.ctxt->write_sectors); atomic_sub(io->write_sectors, &io->write.ctxt->write_sectors);
atomic_dec(&io->write.ctxt->write_ios);
move_free(io); move_free(io);
closure_put(&ctxt->cl); closure_put(&ctxt->cl);
} }
...@@ -87,6 +88,7 @@ static void move_write(struct moving_io *io) ...@@ -87,6 +88,7 @@ static void move_write(struct moving_io *io)
closure_get(&io->write.ctxt->cl); closure_get(&io->write.ctxt->cl);
atomic_add(io->write_sectors, &io->write.ctxt->write_sectors); atomic_add(io->write_sectors, &io->write.ctxt->write_sectors);
atomic_inc(&io->write.ctxt->write_ios);
bch2_data_update_read_done(&io->write, io->rbio.pick.crc); bch2_data_update_read_done(&io->write, io->rbio.pick.crc);
} }
...@@ -105,6 +107,7 @@ static void move_read_endio(struct bio *bio) ...@@ -105,6 +107,7 @@ static void move_read_endio(struct bio *bio)
struct moving_context *ctxt = io->write.ctxt; struct moving_context *ctxt = io->write.ctxt;
atomic_sub(io->read_sectors, &ctxt->read_sectors); atomic_sub(io->read_sectors, &ctxt->read_sectors);
atomic_dec(&ctxt->read_ios);
io->read_completed = true; io->read_completed = true;
wake_up(&ctxt->wait); wake_up(&ctxt->wait);
...@@ -139,7 +142,11 @@ void bch2_moving_ctxt_exit(struct moving_context *ctxt) ...@@ -139,7 +142,11 @@ void bch2_moving_ctxt_exit(struct moving_context *ctxt)
{ {
move_ctxt_wait_event(ctxt, NULL, list_empty(&ctxt->reads)); move_ctxt_wait_event(ctxt, NULL, list_empty(&ctxt->reads));
closure_sync(&ctxt->cl); closure_sync(&ctxt->cl);
EBUG_ON(atomic_read(&ctxt->write_sectors)); EBUG_ON(atomic_read(&ctxt->write_sectors));
EBUG_ON(atomic_read(&ctxt->write_ios));
EBUG_ON(atomic_read(&ctxt->read_sectors));
EBUG_ON(atomic_read(&ctxt->read_ios));
if (ctxt->stats) { if (ctxt->stats) {
progress_list_del(ctxt->c, ctxt->stats); progress_list_del(ctxt->c, ctxt->stats);
...@@ -314,6 +321,7 @@ static int bch2_move_extent(struct btree_trans *trans, ...@@ -314,6 +321,7 @@ static int bch2_move_extent(struct btree_trans *trans,
trace_move_extent_read(k.k); trace_move_extent_read(k.k);
atomic_add(io->read_sectors, &ctxt->read_sectors); atomic_add(io->read_sectors, &ctxt->read_sectors);
atomic_inc(&ctxt->read_ios);
list_add_tail(&io->list, &ctxt->reads); list_add_tail(&io->list, &ctxt->reads);
/* /*
...@@ -403,13 +411,15 @@ static int move_ratelimit(struct btree_trans *trans, ...@@ -403,13 +411,15 @@ static int move_ratelimit(struct btree_trans *trans,
} }
} while (delay); } while (delay);
/*
* XXX: these limits really ought to be per device, SSDs and hard drives
* will want different limits
*/
move_ctxt_wait_event(ctxt, trans, move_ctxt_wait_event(ctxt, trans,
atomic_read(&ctxt->write_sectors) < atomic_read(&ctxt->write_sectors) < c->opts.move_bytes_in_flight >> 9 &&
c->opts.move_bytes_in_flight >> 9); atomic_read(&ctxt->read_sectors) < c->opts.move_bytes_in_flight >> 9 &&
atomic_read(&ctxt->write_ios) < c->opts.move_ios_in_flight &&
move_ctxt_wait_event(ctxt, trans, atomic_read(&ctxt->read_ios) < c->opts.move_ios_in_flight);
atomic_read(&ctxt->read_sectors) <
c->opts.move_bytes_in_flight >> 9);
return 0; return 0;
} }
......
...@@ -24,6 +24,8 @@ struct moving_context { ...@@ -24,6 +24,8 @@ struct moving_context {
/* in flight sectors: */ /* in flight sectors: */
atomic_t read_sectors; atomic_t read_sectors;
atomic_t write_sectors; atomic_t write_sectors;
atomic_t read_ios;
atomic_t write_ios;
wait_queue_head_t wait; wait_queue_head_t wait;
}; };
......
...@@ -299,7 +299,12 @@ enum opt_type { ...@@ -299,7 +299,12 @@ enum opt_type {
OPT_HUMAN_READABLE|OPT_FS|OPT_MOUNT|OPT_RUNTIME, \ OPT_HUMAN_READABLE|OPT_FS|OPT_MOUNT|OPT_RUNTIME, \
OPT_UINT(1024, U32_MAX), \ OPT_UINT(1024, U32_MAX), \
BCH2_NO_SB_OPT, 1U << 20, \ BCH2_NO_SB_OPT, 1U << 20, \
NULL, "Amount of IO in flight to keep in flight by the move path")\ NULL, "Maximum Amount of IO to keep in flight by the move path")\
x(move_ios_in_flight, u32, \
OPT_FS|OPT_MOUNT|OPT_RUNTIME, \
OPT_UINT(1, 1024), \
BCH2_NO_SB_OPT, 32, \
NULL, "Maximum number of IOs to keep in flight by the move path")\
x(fsck, u8, \ x(fsck, u8, \
OPT_FS|OPT_MOUNT, \ OPT_FS|OPT_MOUNT, \
OPT_BOOL(), \ OPT_BOOL(), \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment