Commit ef1b2092 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Ratelimiting for writeback IOs

Writeback throttling is a kernel config option and not always enabled.
When it's not enabled we need a fallback, to avoid unbounded memory
pinning and work item backlogs.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent ed343411
...@@ -191,6 +191,7 @@ ...@@ -191,6 +191,7 @@
#include <linux/percpu-rwsem.h> #include <linux/percpu-rwsem.h>
#include <linux/rhashtable.h> #include <linux/rhashtable.h>
#include <linux/rwsem.h> #include <linux/rwsem.h>
#include <linux/semaphore.h>
#include <linux/seqlock.h> #include <linux/seqlock.h>
#include <linux/shrinker.h> #include <linux/shrinker.h>
#include <linux/srcu.h> #include <linux/srcu.h>
...@@ -746,6 +747,7 @@ struct bch_fs { ...@@ -746,6 +747,7 @@ struct bch_fs {
struct rw_semaphore gc_lock; struct rw_semaphore gc_lock;
/* IO PATH */ /* IO PATH */
struct semaphore io_in_flight;
struct bio_set bio_read; struct bio_set bio_read;
struct bio_set bio_read_split; struct bio_set bio_read_split;
struct bio_set bio_write; struct bio_set bio_write;
......
...@@ -997,6 +997,8 @@ static void bch2_writepage_io_done(struct closure *cl) ...@@ -997,6 +997,8 @@ static void bch2_writepage_io_done(struct closure *cl)
struct bio_vec *bvec; struct bio_vec *bvec;
unsigned i; unsigned i;
up(&io->op.c->io_in_flight);
if (io->op.error) { if (io->op.error) {
set_bit(EI_INODE_ERROR, &io->inode->ei_flags); set_bit(EI_INODE_ERROR, &io->inode->ei_flags);
...@@ -1059,6 +1061,8 @@ static void bch2_writepage_do_io(struct bch_writepage_state *w) ...@@ -1059,6 +1061,8 @@ static void bch2_writepage_do_io(struct bch_writepage_state *w)
{ {
struct bch_writepage_io *io = w->io; struct bch_writepage_io *io = w->io;
down(&io->op.c->io_in_flight);
w->io = NULL; w->io = NULL;
closure_call(&io->op.cl, bch2_write, NULL, &io->cl); closure_call(&io->op.cl, bch2_write, NULL, &io->cl);
continue_at(&io->cl, bch2_writepage_io_done, NULL); continue_at(&io->cl, bch2_writepage_io_done, NULL);
......
...@@ -717,6 +717,8 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts) ...@@ -717,6 +717,8 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts)
seqcount_init(&c->usage_lock); seqcount_init(&c->usage_lock);
sema_init(&c->io_in_flight, 128);
c->copy_gc_enabled = 1; c->copy_gc_enabled = 1;
c->rebalance.enabled = 1; c->rebalance.enabled = 1;
c->promote_whole_extents = true; c->promote_whole_extents = true;
......
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