* [PATCH 0/3] Improve block layer scheduling fairness
@ 2016-03-28 21:48 Bart Van Assche
2016-03-28 21:48 ` [PATCH 1/3] kernel/kthread.c: Avoid CPU lockups Bart Van Assche
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Bart Van Assche @ 2016-03-28 21:48 UTC (permalink / raw)
To: Tejun Heo, Jens Axboe, James Bottomley, Martin K. Petersen, Mike Snitzer
Cc: linux-scsi
Recent tests revealed that on kernels with CONFIG_PREEMPT disabled and
with kernel debugging options like CONFIG_PROVE_LOCKING enabled that
block/SCSI/dm workloads with a high queue depth cause soft lockup
complaints to appear. Avoid this by voluntarily giving up the CPU in
time for such workloads. The patches in this series are:
0001-kernel-kthread.c-Avoid-CPU-lockups.patch
0002-block-Limit-work-processed-in-softirq-context.patch
0003-Avoid-that-I-O-completion-processing-triggers-lockup.patch
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] kernel/kthread.c: Avoid CPU lockups
2016-03-28 21:48 [PATCH 0/3] Improve block layer scheduling fairness Bart Van Assche
@ 2016-03-28 21:48 ` Bart Van Assche
2016-03-28 21:49 ` [PATCH 2/3] block: Limit work processed in softirq context Bart Van Assche
2016-03-28 21:50 ` [PATCH 3/3] Avoid that I/O completion processing triggers lockup complaints Bart Van Assche
2 siblings, 0 replies; 4+ messages in thread
From: Bart Van Assche @ 2016-03-28 21:48 UTC (permalink / raw)
To: Tejun Heo
Cc: Jens Axboe, James Bottomley, Martin K. Petersen, Mike Snitzer,
linux-scsi
Avoid that complaints similar to the one below are reported against
a debug kernel:
NMI watchdog: BUG: soft lockup - CPU#1 stuck for 22s! [kdmwork-25 4:2:23313]
irq event stamp: 16320042
hardirqs last enabled at (16320041): [<ffffffff815992c7>] _raw_spin_unlock_irq+0x27/0x40
hardirqs last disabled at (16320042): [<ffff8803ffbe3cd8>] 0xffff8803ffbe3cd8
softirqs last enabled at (16319960): [<ffffffff8105bcdb>] __do_softirq+0x1cb/0x230
softirqs last disabled at (16319715): [<ffffffff8105bec8>] irq_exit+0xa8/0xb0
CPU: 1 PID: 23313 Comm: kdmwork-254:2
RIP: 0010:[<ffffffff815992cf>] [<ffffffff815992cf>] _raw_spin_unlock_irq+0x2f/0x40
Call Trace:
[<ffffffff813f702f>] scsi_request_fn+0x11f/0x630
[<ffffffff812977fe>] __blk_run_queue+0x2e/0x40
[<ffffffff81297065>] __elv_add_request+0x75/0x1f0
[<ffffffff8129ba91>] blk_insert_cloned_request+0x101/0x190
[<ffffffffa0189f1a>] map_request+0x16a/0x1b0 [dm_mod]
[<ffffffffa0189f7d>] map_tio_request+0x1d/0x40 [dm_mod]
[<ffffffff81077812>] kthread_worker_fn+0x82/0x1a0
[<ffffffff8107771a>] kthread+0xea/0x100
[<ffffffff81599b72>] ret_from_fork+0x22/0x40
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
---
kernel/kthread.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/kthread.c b/kernel/kthread.c
index 9ff173d..516ca6b 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -593,6 +593,7 @@ repeat:
if (work) {
__set_current_state(TASK_RUNNING);
work->func(work);
+ cond_resched_rcu_qs();
} else if (!freezing(current))
schedule();
--
2.7.3
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] block: Limit work processed in softirq context
2016-03-28 21:48 [PATCH 0/3] Improve block layer scheduling fairness Bart Van Assche
2016-03-28 21:48 ` [PATCH 1/3] kernel/kthread.c: Avoid CPU lockups Bart Van Assche
@ 2016-03-28 21:49 ` Bart Van Assche
2016-03-28 21:50 ` [PATCH 3/3] Avoid that I/O completion processing triggers lockup complaints Bart Van Assche
2 siblings, 0 replies; 4+ messages in thread
From: Bart Van Assche @ 2016-03-28 21:49 UTC (permalink / raw)
To: Jens Axboe
Cc: Tejun Heo, James Bottomley, Martin K. Petersen, Mike Snitzer, linux-scsi
Avoid that complaints like the one below are reported against a
debug kernel:
NMI watchdog: BUG: soft lockup - CPU#1 stuck for 22s! [disk11_0:2708]
irq event stamp: 17120809
hardirqs last enabled at (17120808): [<ffffffff81599191>] _raw_spin_unlock_irqrestore+0x31/0x50
hardirqs last disabled at (17120809): [<ffff88046f223bd0>] 0xffff88046f223bd0
softirqs last enabled at (17120794): [<ffffffffa060aa67>] scst_check_blocked_dev+0x77/0x1c0 [scst]
softirqs last disabled at (17120795): [<ffffffff8159acbc>] do_softirq_own_stack+0x1c/0x30
RIP: 0010:[<ffffffff81599193>] [<ffffffff81599193>] _raw_spin_unlock_irqrestore+0x33/0x50
Call Trace:
<IRQ>
[<ffffffff81171450>] free_debug_processing+0x270/0x3a0
[<ffffffff8117277a>] __slab_free+0x17a/0x2c0
[<ffffffff81172a74>] kmem_cache_free+0x1b4/0x1d0
[<ffffffff8111a6c2>] mempool_free_slab+0x12/0x20
[<ffffffff8111a846>] mempool_free+0x26/0x80
[<ffffffff81294cb9>] bio_free+0x49/0x60
[<ffffffff81294cee>] bio_put+0x1e/0x30
[<ffffffffa0199d31>] end_clone_bio+0x21/0x70 [dm_mod]
[<ffffffff81294d52>] bio_endio+0x52/0x60
[<ffffffff8129aaec>] blk_update_request+0x7c/0x2a0
[<ffffffff813f4a8e>] scsi_end_request+0x2e/0x1d0
[<ffffffff813f7674>] scsi_io_completion+0xb4/0x610
[<ffffffff813ee79a>] scsi_finish_command+0xca/0x120
[<ffffffff813f6ef0>] scsi_softirq_done+0x120/0x140
[<ffffffff812a26e6>] blk_done_softirq+0x76/0x90
[<ffffffff8105bc1f>] __do_softirq+0x10f/0x230
[<ffffffff8159acbc>] do_softirq_own_stack+0x1c/0x30
<EOI>
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
---
block/blk-softirq.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/block/blk-softirq.c b/block/blk-softirq.c
index 53b1737..d4d2fe4 100644
--- a/block/blk-softirq.c
+++ b/block/blk-softirq.c
@@ -21,10 +21,22 @@ static DEFINE_PER_CPU(struct list_head, blk_cpu_done);
static void blk_done_softirq(struct softirq_action *h)
{
struct list_head *cpu_list, local_list;
+ struct request *e;
+ bool reraise = false;
+ int i = 0;
local_irq_disable();
cpu_list = this_cpu_ptr(&blk_cpu_done);
+ list_for_each_entry(e, cpu_list, ipi_list) {
+ if (++i < 256)
+ continue;
+ list_cut_position(&local_list, cpu_list, &e->ipi_list);
+ reraise = true;
+ goto enable_irq;
+ }
list_replace_init(cpu_list, &local_list);
+
+enable_irq:
local_irq_enable();
while (!list_empty(&local_list)) {
@@ -34,6 +46,14 @@ static void blk_done_softirq(struct softirq_action *h)
list_del_init(&rq->ipi_list);
rq->q->softirq_done_fn(rq);
}
+
+ if (!reraise)
+ return;
+
+ local_irq_disable();
+ if (!list_empty(cpu_list))
+ raise_softirq_irqoff(BLOCK_SOFTIRQ);
+ local_irq_enable();
}
#ifdef CONFIG_SMP
--
2.7.3
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] Avoid that I/O completion processing triggers lockup complaints
2016-03-28 21:48 [PATCH 0/3] Improve block layer scheduling fairness Bart Van Assche
2016-03-28 21:48 ` [PATCH 1/3] kernel/kthread.c: Avoid CPU lockups Bart Van Assche
2016-03-28 21:49 ` [PATCH 2/3] block: Limit work processed in softirq context Bart Van Assche
@ 2016-03-28 21:50 ` Bart Van Assche
2 siblings, 0 replies; 4+ messages in thread
From: Bart Van Assche @ 2016-03-28 21:50 UTC (permalink / raw)
To: James Bottomley, Martin K. Petersen
Cc: Mike Snitzer, Tejun Heo, Jens Axboe, linux-scsi
Avoid that I/O completion processing triggers the following complaints
if kernel debug options that slow down the kernel significantly are
enabled:
NMI watchdog: BUG: soft lockup - CPU#3 stuck for 22s! [kdmwork-254:2:358]
irq event stamp: 15233868
hardirqs last enabled at (15233867): [<ffffffff81578167>] _raw_spin_unlock_irq+0x27/0x40
hardirqs last disabled at (15233868): [<ffffffff81579664>] apic_timer_interrupt+0x84/0x90
softirqs last enabled at (15233850): [<ffffffff8105a55b>] __do_softirq+0x1cb/0x230
softirqs last disabled at (15233743): [<ffffffff8105a748>] irq_exit+0xa8/0xb0
CPU: 3 PID: 358 Comm: kdmwork-254:2
RIP: 0010:[<ffffffff8157816f>] [<ffffffff8157816f>] _raw_spin_unlock_irq+0x2f/0x40
Call Trace:
[<ffffffff813dbe28>] scsi_request_fn+0x118/0x600
[<ffffffff8128190e>] __blk_run_queue+0x2e/0x40
[<ffffffff81281175>] __elv_add_request+0x75/0x1f0
[<ffffffff81285b11>] blk_insert_cloned_request+0x101/0x190
[<ffffffffa0170eee>] map_request+0x18e/0x210 [dm_mod]
[<ffffffffa0170f8d>] map_tio_request+0x1d/0x40 [dm_mod]
[<ffffffff81075a0d>] kthread_worker_fn+0x7d/0x1a0
[<ffffffff8107591a>] kthread+0xea/0x100
[<ffffffff81578c7f>] ret_from_fork+0x3f/0x70
INFO: rcu_sched self-detected stall on CPU
3-...: (6497 ticks this GP) idle=fb9/140000000000002/0 softirq=2044956/2045037 fqs=5414
(t=6500 jiffies g=219289 c=219288 q=7233211)
Task dump for CPU 3:
kdmwork-254:2 R running task 0 358 2 0x00000008
Call Trace:
<IRQ> [<ffffffff8108195f>] sched_show_task+0xbf/0x150
[<ffffffff81084742>] dump_cpu_task+0x32/0x40
[<ffffffff810b5e79>] rcu_dump_cpu_stacks+0x89/0xe0
[<ffffffff810b9999>] rcu_check_callbacks+0x439/0x730
[<ffffffff810bc1c4>] update_process_times+0x34/0x60
[<ffffffff810caaa0>] tick_sched_handle.isra.18+0x20/0x50
[<ffffffff810cb148>] tick_sched_timer+0x38/0x70
[<ffffffff810bc865>] __hrtimer_run_queues+0xa5/0x1c0
[<ffffffff810bcef6>] hrtimer_interrupt+0xa6/0x1b0
[<ffffffff81038ba3>] smp_trace_apic_timer_interrupt+0x63/0x90
[<ffffffff81038bd9>] smp_apic_timer_interrupt+0x9/0x10
[<ffffffff81579669>] apic_timer_interrupt+0x89/0x90
[<ffffffff811640d6>] __slab_free+0xc6/0x270
[<ffffffff811643d9>] kmem_cache_free+0x159/0x160
[<ffffffff811d0a12>] kiocb_free+0x32/0x40
[<ffffffff811d1b75>] aio_complete+0x1e5/0x3c0
[<ffffffff811bef45>] dio_complete+0x75/0x1d0
[<ffffffff811bf11a>] dio_bio_end_aio+0x7a/0x130
[<ffffffff812800da>] bio_endio+0x3a/0x60
[<ffffffff81284b7c>] blk_update_request+0x7c/0x2a0
[<ffffffffa016fcc1>] end_clone_bio+0x41/0x70 [dm_mod]
[<ffffffff812800da>] bio_endio+0x3a/0x60
[<ffffffff81284b7c>] blk_update_request+0x7c/0x2a0
[<ffffffff813da01e>] scsi_end_request+0x2e/0x1d0
[<ffffffff813dc444>] scsi_io_completion+0xb4/0x610
[<ffffffff813d3e0a>] scsi_finish_command+0xca/0x120
[<ffffffff813dbcf0>] scsi_softirq_done+0x120/0x140
[<ffffffff8128c742>] blk_done_softirq+0x72/0x90
[<ffffffff8105a49f>] __do_softirq+0x10f/0x230
[<ffffffff8105a748>] irq_exit+0xa8/0xb0
[<ffffffff810065a5>] do_IRQ+0x65/0x110
[<ffffffff815793c9>] common_interrupt+0x89/0x89
<EOI>
[<ffffffffa010f815>] __multipath_map.isra.16+0x145/0x260 [dm_multipath]
[<ffffffffa010f962>] multipath_map+0x12/0x20 [dm_multipath]
[<ffffffffa0170da3>] map_request+0x43/0x210 [dm_mod]
[<ffffffffa0170f8d>] map_tio_request+0x1d/0x40 [dm_mod]
[<ffffffff81075a0d>] kthread_worker_fn+0x7d/0x1a0
[<ffffffff8107591a>] kthread+0xea/0x100
[<ffffffff81578c7f>] ret_from_fork+0x3f/0x70
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
---
drivers/scsi/scsi_lib.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 8106515..3bf6c33 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1770,13 +1770,14 @@ static void scsi_request_fn(struct request_queue *q)
struct Scsi_Host *shost;
struct scsi_cmnd *cmd;
struct request *req;
+ int i;
/*
- * To start with, we keep looping until the queue is empty, or until
- * the host is no longer able to accept any more requests.
+ * Loop until the queue is empty, until the host is no longer able to
+ * accept any more requests or until 256 requests have been processed.
*/
shost = sdev->host;
- for (;;) {
+ for (i = 256; i > 0; i--) {
int rtn;
/*
* get next queueable request. We do this early to make sure
@@ -1861,6 +1862,9 @@ static void scsi_request_fn(struct request_queue *q)
spin_lock_irq(q->queue_lock);
}
+ if (unlikely(i == 0))
+ blk_delay_queue(q, 0);
+
return;
host_not_ready:
--
2.7.3
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-03-28 21:50 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-28 21:48 [PATCH 0/3] Improve block layer scheduling fairness Bart Van Assche
2016-03-28 21:48 ` [PATCH 1/3] kernel/kthread.c: Avoid CPU lockups Bart Van Assche
2016-03-28 21:49 ` [PATCH 2/3] block: Limit work processed in softirq context Bart Van Assche
2016-03-28 21:50 ` [PATCH 3/3] Avoid that I/O completion processing triggers lockup complaints Bart Van Assche
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.