diff options
3 files changed, 28 insertions, 30 deletions
diff --git a/patches/0001-io-wq-remove-GFP_ATOMIC-allocation-off-schedule-out-.patch b/patches/0001-io-wq-remove-GFP_ATOMIC-allocation-off-schedule-out-.patch index 893a0b0163d2..e07fe498e02c 100644 --- a/patches/0001-io-wq-remove-GFP_ATOMIC-allocation-off-schedule-out-.patch +++ b/patches/0001-io-wq-remove-GFP_ATOMIC-allocation-off-schedule-out-.patch @@ -52,8 +52,8 @@ Tested-by: Daniel Wagner <dwagner@suse.de> Link: https://lore.kernel.org/r/a673a130-e0e4-5aa8-4165-f35d1262fc6a@kernel.dk Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- - fs/io-wq.c | 75 ++++++++++++++++++++++++++++++++++--------------------------- - 1 file changed, 42 insertions(+), 33 deletions(-) + fs/io-wq.c | 73 ++++++++++++++++++++++++++++++++++--------------------------- + 1 file changed, 41 insertions(+), 32 deletions(-) --- a/fs/io-wq.c +++ b/fs/io-wq.c @@ -68,7 +68,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> struct rcu_head rcu; }; -@@ -270,50 +274,54 @@ static void io_wqe_inc_running(struct io +@@ -272,24 +276,18 @@ static void io_wqe_inc_running(struct io atomic_inc(&acct->nr_running); } @@ -85,29 +85,36 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> struct io_wq *wq; struct io_wqe *wqe; struct io_wqe_acct *acct; + bool do_create = false, first = false; - cwd = container_of(cb, struct create_worker_data, work); - wqe = cwd->wqe; -- wq = wqe->wq; -- acct = &wqe->acct[cwd->index]; + worker = container_of(cb, struct io_worker, create_work); + wqe = worker->wqe; -+ wq = worker->wq; + wq = wqe->wq; +- acct = &wqe->acct[cwd->index]; + acct = &wqe->acct[worker->create_index]; raw_spin_lock_irq(&wqe->lock); - if (acct->nr_workers < acct->max_workers) - acct->nr_workers++; + if (acct->nr_workers < acct->max_workers) { + if (!acct->nr_workers) +@@ -299,33 +297,43 @@ static void create_worker_cb(struct call + } raw_spin_unlock_irq(&wqe->lock); -- create_io_worker(wq, cwd->wqe, cwd->index); + if (do_create) { +- create_io_worker(wq, wqe, cwd->index, first); ++ create_io_worker(wq, wqe, worker->create_index, first); + } else { + atomic_dec(&acct->nr_running); + io_worker_ref_put(wq); + } - kfree(cwd); -+ create_io_worker(wq, wqe, worker->create_index); + clear_bit_unlock(0, &worker->create_state); + io_worker_release(worker); } -static void io_queue_worker_create(struct io_wqe *wqe, struct io_wqe_acct *acct) -+static void io_queue_worker_create(struct io_wqe *wqe, struct io_worker -+ *worker, struct io_wqe_acct *acct) ++static void io_queue_worker_create(struct io_wqe *wqe, struct io_worker *worker, ++ struct io_wqe_acct *acct) { - struct create_worker_data *cwd; struct io_wq *wq = wqe->wq; @@ -148,7 +155,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> fail: atomic_dec(&acct->nr_running); io_worker_ref_put(wq); -@@ -331,7 +339,7 @@ static void io_wqe_dec_running(struct io +@@ -343,7 +351,7 @@ static void io_wqe_dec_running(struct io if (atomic_dec_and_test(&acct->nr_running) && io_wqe_run_queue(wqe)) { atomic_inc(&acct->nr_running); atomic_inc(&wqe->wq->worker_refs); @@ -157,7 +164,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> } } -@@ -992,12 +1000,12 @@ struct io_wq *io_wq_create(unsigned boun +@@ -1004,12 +1012,12 @@ struct io_wq *io_wq_create(unsigned boun static bool io_task_work_match(struct callback_head *cb, void *data) { @@ -173,7 +180,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> } void io_wq_exit_start(struct io_wq *wq) -@@ -1014,12 +1022,13 @@ static void io_wq_exit_workers(struct io +@@ -1026,12 +1034,13 @@ static void io_wq_exit_workers(struct io return; while ((cb = task_work_cancel_match(wq->task, io_task_work_match, wq)) != NULL) { diff --git a/patches/0002-io-wq-Don-t-mix-raw_spinlock_irq-spin_lock_irq.patch b/patches/0002-io-wq-Don-t-mix-raw_spinlock_irq-spin_lock_irq.patch index 67f36e9fe4ca..84d9ebdea7d6 100644 --- a/patches/0002-io-wq-Don-t-mix-raw_spinlock_irq-spin_lock_irq.patch +++ b/patches/0002-io-wq-Don-t-mix-raw_spinlock_irq-spin_lock_irq.patch @@ -5,21 +5,12 @@ Subject: [PATCH] io-wq: Don't mix raw_spinlock_irq() & spin_lock_irq(). https://lkml.kernel.org/r/7c946918-ae0d-6195-6a78-b019f9bc1fd3@kernel.dk Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- - fs/io-wq.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) + fs/io-wq.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) --- a/fs/io-wq.c +++ b/fs/io-wq.c -@@ -283,7 +283,7 @@ static void create_worker_cb(struct call - - worker = container_of(cb, struct io_worker, create_work); - wqe = worker->wqe; -- wq = worker->wq; -+ wq = worker->wqe->wq; - acct = &wqe->acct[worker->create_index]; - raw_spin_lock_irq(&wqe->lock); - if (acct->nr_workers < acct->max_workers) -@@ -401,7 +401,7 @@ static void io_wait_on_hash(struct io_wq +@@ -414,7 +414,7 @@ static void io_wait_on_hash(struct io_wq { struct io_wq *wq = wqe->wq; @@ -28,7 +19,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> if (list_empty(&wqe->wait.entry)) { __add_wait_queue(&wq->hash->wait, &wqe->wait); if (!test_bit(hash, &wq->hash->map)) { -@@ -409,7 +409,7 @@ static void io_wait_on_hash(struct io_wq +@@ -422,7 +422,7 @@ static void io_wait_on_hash(struct io_wq list_del_init(&wqe->wait.entry); } } @@ -37,7 +28,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> } static struct io_wq_work *io_get_next_work(struct io_wqe *wqe) -@@ -447,9 +447,9 @@ static struct io_wq_work *io_get_next_wo +@@ -460,9 +460,9 @@ static struct io_wq_work *io_get_next_wo } if (stall_hash != -1U) { diff --git a/patches/Add_localversion_for_-RT_release.patch b/patches/Add_localversion_for_-RT_release.patch index c8061e5a5d82..8b36fd73f91a 100644 --- a/patches/Add_localversion_for_-RT_release.patch +++ b/patches/Add_localversion_for_-RT_release.patch @@ -15,4 +15,4 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- /dev/null +++ b/localversion-rt @@ -0,0 +1 @@ -+-rt8 ++-rt9 |