From: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
To: Ingo Molnar <mingo@elte.hu>
Cc: Jeff Garzik <jeff@garzik.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Steven Rostedt <rostedt@goodmis.org>,
LKML <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
Christoph Hellwig <hch@infradead.org>,
john stultz <johnstul@us.ibm.com>,
Oleg Nesterov <oleg@tv-sign.ru>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Dipankar Sarma <dipankar@in.ibm.com>,
"David S. Miller" <davem@davemloft.net>,
matthew.wilcox@hp.com
Subject: Re: [RFC PATCH 0/6] Convert all tasklets to workqueues
Date: Fri, 29 Jun 2007 15:34:23 +0400 [thread overview]
Message-ID: <20070629113423.GA9042@ms2.inr.ac.ru> (raw)
In-Reply-To: <20070628160001.GA15495@elte.hu>
Hello!
> I find the 4usecs cost on a P4 interesting and a bit too high - how did
> you measure it?
Simple and stupid:
int flag;
static void do_test(unsigned long dummy)
{
flag = 1;
}
static void do_test_wq(void *dummy)
{
flag = 1;
}
static void measure_tasklet0(void)
{
int i;
int cnt = 0;
DECLARE_TASKLET(test, do_test, 0);
unsigned long start = jiffies;
for (i=0; i<1000000; i++) {
flag = 0;
local_bh_disable();
tasklet_schedule(&test);
local_bh_enable();
while (flag == 0) {
schedule();
cnt++;
} /*while (flag == 0)*/;
}
printk("tasklet0: %lu %d\n", jiffies - start, cnt);
}
static void measure_tasklet1(void)
{
int i;
int cnt = 0;
DECLARE_TASKLET(test, do_test, 0);
unsigned long start = jiffies;
for (i=0; i<1000000; i++) {
flag = 0;
local_bh_disable();
tasklet_schedule(&test);
local_bh_enable();
do {
schedule();
cnt++;
} while (flag == 0);
}
printk("tasklet1: %lu %d\n", jiffies - start, cnt);
}
static void measure_workqueue(void)
{
int i;
int cnt = 0;
unsigned long start;
DECLARE_WORK(test, do_test_wq, 0);
struct workqueue_struct * wq;
start = jiffies;
wq = create_workqueue("testq");
for (i=0; i<1000000; i++) {
flag = 0;
queue_work(wq, &test);
do {
schedule();
cnt++;
} while (flag == 0);
}
printk("wq: %lu %d\n", jiffies - start, cnt);
destroy_workqueue(wq);
}
> tasklet as an intermediary towards a softirq - what's the technological
> point in such a splitup?
"... work_struct as intermediary towards a workqueue - what's the technological
point in such a splitup?" Non-sense? Yes, but it is exactly what you said. :-)
softirq is just a context and engine to run something. Exactly like
workqueue task. struct tasklet is work_struct, it is just a thing to run.
> workqueues can be per-cpu - for tasklets to be per-cpu you have to
> open-code them into per-cpu like rcu-tasklets did
I feel I have to repeat: tasklet==work_struct, workqueue==softirq.
Essentially, you said that workqueues "scale" in direction of increasing
amount of softirqs. This is _correct_, but the word is different: "flexible"
is the word. What's about performance,scalability blah-blah, workqueues
are definitely worse. And this is OK, you do not need to conceal this.
This is the price, which we pay for flexibility and to niceness to realtime.
That's what should be said in adverticement notes instead of propaganda.
> Just look at the tasklet_disable() logic.
Do not count this.
Done this way because nobody needed that thing, except for _one_ place
in keyboard/console driver, which was very difficult to fix that time,
when vt code was utterly messy and not smp safe at all.
start_bh_atomic() was successfully killed, but we had to preserve analogue
of disable_bh() with the same semantics for some time.
It is deliberately implemented in a way, which does not impact hot paths
and is easy to remove.
It is sad that some usb drivers started to use this creepy and
useless thing.
> also, the "be afraid of the hardirq or the process context" mantra is
> overblown as well. If something is too heavy for a hardirq, _it's too
> heavy for a tasklet too_. Most hardirqs are (or should be) running with
> interrupts enabled, which makes their difference to softirqs miniscule.
Incorrect.
The difference between softirqs and hardirqs lays not in their "heavyness".
It is in reentrancy protection, which has to be done with local_irq_disable(),
unless networking is not isolated from hardirqs. That's all.
Networking is too hairy to allow to be executed with disabled hardirqs.
And moving this hairyiness to process context requires
<irony mode> a little </> more efforts than conversion tasklets to work queues.
> The most scalable workloads dont involve any (or many) softirq middlemen
> at all: you queue work straight from the hardirq context to the target
> process context.
Do you really see something common between this Holy Grail Quest and
tasklets/workqeueus? Come on. :-)
Actually, this is step backwards. Instead of execution in correct
context, you create a new dummy context. This is the place, where goals
of realtime and Holy Grail Quest split.
> true just as much: tasklets from a totally uninteresting network adapter
> can kill your latency-sensitive application too.
If I started nice --22 running process I signed to killing latency
of nice 0 processes. But I did not sign for killing network/scsi adapters.
"latency-sensitive application" use real time priority as well,
so that they will compete with tasklets fairly.
next prev parent reply other threads:[~2007-06-29 11:35 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-22 4:00 Steven Rostedt
2007-06-22 4:00 ` [RFC PATCH 1/6] Convert the RCU tasklet into a softirq Steven Rostedt
2007-06-22 7:10 ` Christoph Hellwig
2007-06-22 7:43 ` Ingo Molnar
2007-06-22 12:35 ` Steven Rostedt
2007-06-22 12:55 ` Ingo Molnar
2007-06-22 4:00 ` [RFC PATCH 2/6] Split out tasklets from softirq.c Steven Rostedt
2007-06-22 7:11 ` Christoph Hellwig
2007-06-22 12:40 ` Steven Rostedt
2007-06-22 13:45 ` Akinobu Mita
2007-06-22 13:58 ` Steven Rostedt
2007-06-22 4:00 ` [RFC PATCH 3/6] Add a tasklet is-scheduled API Steven Rostedt
2007-06-22 4:00 ` [RFC PATCH 4/6] Make DRM use the tasklet is-sched API Steven Rostedt
2007-06-22 6:36 ` Daniel Walker
2007-06-22 6:49 ` Thomas Gleixner
2007-06-22 7:08 ` Daniel Walker
2007-06-22 12:15 ` Steven Rostedt
2007-06-22 15:36 ` Daniel Walker
2007-06-22 22:38 ` Ingo Molnar
2007-06-22 23:28 ` Daniel Walker
2007-06-22 16:10 ` Arnd Bergmann
2007-06-22 16:56 ` Steven Rostedt
2007-06-22 18:24 ` Christoph Hellwig
2007-06-22 23:38 ` Dave Airlie
2007-06-22 4:00 ` [RFC PATCH 5/6] Move tasklet.h to tasklet_softirq.h Steven Rostedt
2007-06-22 4:00 ` [RFC PATCH 6/6] Convert tasklets to work queues Steven Rostedt
2007-06-22 7:06 ` Daniel Walker
2007-06-22 13:29 ` Steven Rostedt
2007-06-22 15:52 ` Oleg Nesterov
2007-06-22 16:35 ` Steven Rostedt
2007-06-23 11:15 ` Arnd Bergmann
2007-06-22 7:09 ` [RFC PATCH 0/6] Convert all tasklets to workqueues Christoph Hellwig
2007-06-22 7:51 ` Ingo Molnar
2007-06-22 7:53 ` Christoph Hellwig
2007-06-22 11:23 ` Ingo Molnar
2007-06-22 12:32 ` Steven Rostedt
2007-06-22 12:38 ` Ingo Molnar
2007-06-22 12:58 ` Steven Rostedt
2007-06-22 13:12 ` Ingo Molnar
2007-06-22 14:27 ` Steven Rostedt
2007-06-22 13:13 ` Andrew Morton
2007-06-22 13:26 ` Ingo Molnar
2007-06-22 13:41 ` Andrew Morton
2007-06-22 14:00 ` Ingo Molnar
2007-06-22 13:35 ` Steven Rostedt
2007-06-22 14:25 ` Arjan van de Ven
2007-06-22 14:42 ` Steven Rostedt
2007-06-22 14:43 ` Arjan van de Ven
2007-06-22 17:16 ` Linus Torvalds
2007-06-22 17:31 ` Steven Rostedt
2007-06-22 18:32 ` Christoph Hellwig
2007-06-22 20:40 ` Ingo Molnar
2007-06-22 21:00 ` Christoph Hellwig
2007-06-22 21:10 ` Ingo Molnar
2007-06-22 21:13 ` Thomas Gleixner
2007-06-22 21:37 ` Linus Torvalds
2007-06-22 21:59 ` Ingo Molnar
2007-06-22 22:09 ` Ingo Molnar
2007-06-22 22:43 ` Roland Dreier
2007-06-22 22:57 ` Alan Cox
2007-06-22 22:58 ` Steven Rostedt
2007-06-23 6:23 ` Dave Airlie
2007-06-24 15:16 ` Jonathan Corbet
2007-06-24 15:52 ` Steven Rostedt
2007-06-25 16:50 ` Tilman Schmidt
2007-06-25 17:06 ` Steven Rostedt
2007-06-25 20:50 ` Tilman Schmidt
2007-06-25 21:03 ` Steven Rostedt
2007-06-25 19:52 ` Stephen Hemminger
2007-06-26 0:00 ` Jonathan Corbet
2007-06-26 0:52 ` Steven Rostedt
2007-06-25 18:48 ` Kristian Høgsberg
2007-06-25 19:11 ` Steven Rostedt
2007-06-25 20:07 ` Kristian Høgsberg
2007-06-25 20:31 ` Steven Rostedt
2007-06-25 21:08 ` Kristian Høgsberg
2007-06-25 21:15 ` Ingo Molnar
2007-06-25 23:36 ` Stefan Richter
2007-06-26 0:46 ` Steven Rostedt
2007-06-26 1:46 ` Dan Williams
2007-06-26 2:01 ` Steven Rostedt
2007-06-26 2:12 ` Dan Williams
2007-06-28 12:37 ` Steven Rostedt
2007-06-28 16:37 ` Oleg Nesterov
2007-06-28 18:02 ` Dan Williams
2007-06-28 20:46 ` Steven Rostedt
2007-06-28 21:23 ` Dan Williams
2007-06-28 21:40 ` Dan Williams
2007-06-28 22:01 ` Steven Rostedt
2007-06-28 22:00 ` Steven Rostedt
2007-06-28 5:48 ` Jeff Garzik
2007-06-28 9:23 ` Ingo Molnar
2007-06-28 14:38 ` Alexey Kuznetsov
2007-06-28 15:23 ` Jeff Garzik
2007-06-28 15:54 ` Steven Rostedt
2007-06-28 16:00 ` Ingo Molnar
2007-06-28 17:26 ` Jeff Garzik
2007-06-28 17:44 ` Jeff Garzik
2007-06-28 18:19 ` Andrew Morton
2007-06-28 20:07 ` Ingo Molnar
2007-06-29 11:34 ` Alexey Kuznetsov [this message]
2007-06-29 11:48 ` Duncan Sands
2007-06-29 13:36 ` Alexey Kuznetsov
2007-06-29 14:01 ` Duncan Sands
2007-06-29 16:34 ` Alexey Kuznetsov
2007-06-29 12:29 ` Ingo Molnar
2007-06-29 13:25 ` Alexey Kuznetsov
2007-06-29 13:43 ` Ingo Molnar
2007-06-29 15:23 ` Alexey Kuznetsov
2007-06-29 13:41 ` Steven Rostedt
2007-06-29 14:24 ` Jeff Garzik
2007-06-29 14:26 ` Oleg Nesterov
2007-06-29 19:04 ` Alexey Kuznetsov
2007-06-29 14:27 ` Alexey Kuznetsov
2007-06-29 15:51 ` Oleg Nesterov
2007-06-29 16:21 ` Alexey Kuznetsov
2007-06-29 16:52 ` Oleg Nesterov
2007-06-29 17:09 ` Oleg Nesterov
2007-06-30 11:25 ` Oleg Nesterov
2007-06-28 15:17 ` Jeff Garzik
2007-06-22 21:53 ` Daniel Walker
2007-06-22 22:09 ` david
2007-06-22 22:15 ` Daniel Walker
2007-06-22 22:44 ` Ingo Molnar
2007-06-22 23:28 ` Daniel Walker
2007-06-22 22:15 ` Ingo Molnar
2007-06-23 5:14 ` Stephen Hemminger
2007-06-26 13:03 Clemens Ladisch
2007-06-26 13:15 ` Takashi Iwai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070629113423.GA9042@ms2.inr.ac.ru \
--to=kuznet@ms2.inr.ac.ru \
--cc=akpm@linux-foundation.org \
--cc=davem@davemloft.net \
--cc=dipankar@in.ibm.com \
--cc=hch@infradead.org \
--cc=jeff@garzik.org \
--cc=johnstul@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matthew.wilcox@hp.com \
--cc=mingo@elte.hu \
--cc=oleg@tv-sign.ru \
--cc=paulmck@linux.vnet.ibm.com \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®