Messages in this thread | | | Date | Thu, 22 Jul 2010 10:41:55 +1000 | From | Dave Chinner <> | Subject | Re: [PATCHv2 11/11] writeback: prevent unnecessary bdi threads wakeups |
| |
On Wed, Jul 21, 2010 at 02:45:41PM +0300, Artem Bityutskiy wrote: > On Wed, 2010-07-21 at 12:31 +0300, Artem Bityutskiy wrote: > > spin_unlock(&inode_lock); > > + > > + if (wakeup_bdi) { > > + spin_lock(&bdi->wb_lock); > > + if (!bdi->wb.task) > > + wake_up_process(default_backing_dev_info.wb.task); > > + else > > + wake_up_process(bdi->wb.task); > > + spin_unlock(&bdi->wb_lock); > > + } > > } > > Dave, > > I do not know whether this stuff will end up in upstream, I did not get > any feed back from Jens so far. But if it will, I'd like to let you know > that the code quoted above is similar to the 'bdi_queue_work()' > function. And the purpose is very similar. But you added a > 'trace_writeback_nothread()' call to 'bdi_queue_work()', and I think a > similar call has to be here.
Yes, that seems like a sane thing to do ;)
> Can I call 'trace_writeback_nothread()'? I guess not. Should I create > another trace point? Any hints/instructions?
The bdi_queue_work() tracepoints expect a work structure to be passed in, so you can't use them (or that class of event) if you don't have a struct wb_writeback_work.
For __mark_inode_dirty(), I'd add two new tracepoints like:
DEFINE_WRITEBACK_EVENT(writeback_wakeup); DEFINE_WRITEBACK_EVENT(writeback_wakeup_nothread);
and place them as:
if (wakeup_bdi) { trace_writeback_wakeup(bdi) spin_lock(&bdi->wb_lock); if (!bdi->wb.task) {{ trace_writeback_wakeup_nothread(bdi); wake_up_process(default_backing_dev_info.wb.task); } else wake_up_process(bdi->wb.task); spin_unlock(&bdi->wb_lock); }
Cheers,
Dave. -- Dave Chinner david@fromorbit.com
| |