* [patch]block: revert a patch
@ 2011-08-11 7:11 Shaohua Li
2011-08-11 8:39 ` Jens Axboe
2011-08-11 22:21 ` Williams, Dan J
0 siblings, 2 replies; 3+ messages in thread
From: Shaohua Li @ 2011-08-11 7:11 UTC (permalink / raw)
To: Jens Axboe; +Cc: boyu.mt, Christoph Hellwig, dan.j.williams, lkml
This patch reverts commit 35ae66e0a09ab70ed(block: Make rq_affinity = 1
work as expected). The purpose is to avoid an unnecessary IPI.
Let's take an example. My test box has cpu 0-7, one socket. Say request is
added from CPU 1, blk_complete_request() occurs at CPU 7. Without the reverted
patch, softirq will be done at CPU 7. With it, an IPI will be directed to CPU
0, and softirq will be done at CPU 0. In this case, doing softirq at CPU 0 and
CPU 7 have no difference from cache sharing point view and we can avoid an
ipi if doing it in CPU 7.
An immediate concern is this is just like QUEUE_FLAG_SAME_FORCE, but actually
not. blk_complete_request() is running in interrupt handler, and currently
I/O controller doesn't support multiple interrupts (I checked several LSI
cards and AHCI), so only one CPU can run blk_complete_request(). This is
still quite different as QUEUE_FLAG_SAME_FORCE.
Since only one CPU runs softirq, the only difference with below patch is
softirq not always runs at the first CPU of a group.
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
diff --git a/block/blk-softirq.c b/block/blk-softirq.c
index 487addc..58340d0 100644
--- a/block/blk-softirq.c
+++ b/block/blk-softirq.c
@@ -103,7 +103,7 @@ static struct notifier_block __cpuinitdata blk_cpu_notifier = {
void __blk_complete_request(struct request *req)
{
- int ccpu, cpu;
+ int ccpu, cpu, group_cpu = NR_CPUS;
struct request_queue *q = req->q;
unsigned long flags;
@@ -117,12 +117,22 @@ void __blk_complete_request(struct request *req)
*/
if (test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags) && req->cpu != -1) {
ccpu = req->cpu;
- if (!test_bit(QUEUE_FLAG_SAME_FORCE, &q->queue_flags))
+ if (!test_bit(QUEUE_FLAG_SAME_FORCE, &q->queue_flags)) {
ccpu = blk_cpu_to_group(ccpu);
+ group_cpu = blk_cpu_to_group(cpu);
+ }
} else
ccpu = cpu;
- if (ccpu == cpu) {
+ /*
+ * If current CPU and requested CPU are in the same group, running
+ * softirq in current CPU. One might concern this is just like
+ * QUEUE_FLAG_SAME_FORCE, but actually not. blk_complete_request() is
+ * running in interrupt handler, and currently I/O controller doesn't
+ * support multiple interrupts, so current CPU is unique actually. This
+ * avoids IPI sending from current CPU to the first CPU of a group.
+ */
+ if (ccpu == cpu || ccpu == group_cpu) {
struct list_head *list;
do_local:
list = &__get_cpu_var(blk_cpu_done);
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [patch]block: revert a patch
2011-08-11 7:11 [patch]block: revert a patch Shaohua Li
@ 2011-08-11 8:39 ` Jens Axboe
2011-08-11 22:21 ` Williams, Dan J
1 sibling, 0 replies; 3+ messages in thread
From: Jens Axboe @ 2011-08-11 8:39 UTC (permalink / raw)
To: Shaohua Li
Cc: boyu.mt@taobao.com, Christoph Hellwig, dan.j.williams@intel.com,
lkml
On 2011-08-11 09:11, Shaohua Li wrote:
> This patch reverts commit 35ae66e0a09ab70ed(block: Make rq_affinity = 1
> work as expected). The purpose is to avoid an unnecessary IPI.
> Let's take an example. My test box has cpu 0-7, one socket. Say request is
> added from CPU 1, blk_complete_request() occurs at CPU 7. Without the reverted
> patch, softirq will be done at CPU 7. With it, an IPI will be directed to CPU
> 0, and softirq will be done at CPU 0. In this case, doing softirq at CPU 0 and
> CPU 7 have no difference from cache sharing point view and we can avoid an
> ipi if doing it in CPU 7.
> An immediate concern is this is just like QUEUE_FLAG_SAME_FORCE, but actually
> not. blk_complete_request() is running in interrupt handler, and currently
> I/O controller doesn't support multiple interrupts (I checked several LSI
> cards and AHCI), so only one CPU can run blk_complete_request(). This is
> still quite different as QUEUE_FLAG_SAME_FORCE.
> Since only one CPU runs softirq, the only difference with below patch is
> softirq not always runs at the first CPU of a group.
Thanks, I applied this but fixed up your subject line. You can't just
call it 'revert a patch', does not carry a lot of meaning!
--
Jens Axboe
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [patch]block: revert a patch
2011-08-11 7:11 [patch]block: revert a patch Shaohua Li
2011-08-11 8:39 ` Jens Axboe
@ 2011-08-11 22:21 ` Williams, Dan J
1 sibling, 0 replies; 3+ messages in thread
From: Williams, Dan J @ 2011-08-11 22:21 UTC (permalink / raw)
To: Shaohua Li; +Cc: Jens Axboe, boyu.mt, Christoph Hellwig, lkml, Dave Jiang
On Thu, Aug 11, 2011 at 12:11 AM, Shaohua Li <shaohua.li@intel.com> wrote:
> This patch reverts commit 35ae66e0a09ab70ed(block: Make rq_affinity = 1
> work as expected). The purpose is to avoid an unnecessary IPI.
> Let's take an example. My test box has cpu 0-7, one socket. Say request is
> added from CPU 1, blk_complete_request() occurs at CPU 7. Without the reverted
> patch, softirq will be done at CPU 7. With it, an IPI will be directed to CPU
> 0, and softirq will be done at CPU 0. In this case, doing softirq at CPU 0 and
> CPU 7 have no difference from cache sharing point view and we can avoid an
> ipi if doing it in CPU 7.
> An immediate concern is this is just like QUEUE_FLAG_SAME_FORCE, but actually
> not. blk_complete_request() is running in interrupt handler, and currently
> I/O controller doesn't support multiple interrupts (I checked several LSI
> cards and AHCI), so only one CPU can run blk_complete_request(). This is
> still quite different as QUEUE_FLAG_SAME_FORCE.
> Since only one CPU runs softirq, the only difference with below patch is
> softirq not always runs at the first CPU of a group.
Ah, so I misinterpreted the initial implementation in a beneficial way.
I suspect this might be the real root cause of the iops bump in the
rq_affinity=1 case that we saw when testing this patch set [1].
Because the hack [2] of looking at the state of ksoftirqd on 'ccpu'
missed the 'waking' state of ksoftirqd, and when that was added
performance did not improve it actually went down a bit.
--
Dan
[1]: https://lkml.org/lkml/2011/7/22/294
[2]: https://lkml.org/lkml/2011/7/22/296
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-08-11 22:21 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-11 7:11 [patch]block: revert a patch Shaohua Li
2011-08-11 8:39 ` Jens Axboe
2011-08-11 22:21 ` Williams, Dan J
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox