Prev: [Regression] mm: Huge swapout performance regression on recent kernels
Next: cpufreq: fix memory leak in cpufreq_add_dev
From: Artem Bityutskiy on 20 Jul 2010 08:40 On Sun, 2010-07-18 at 03:02 -0400, Christoph Hellwig wrote: > > + if (wakeup_default) { > > trace_writeback_nothread(bdi, work); > > wake_up_process(default_backing_dev_info.wb.task); > > Why not simply do the defaul thread wakeup under wb_lock, too? > It keeps the code a lot simpler, and this is not a typical path anyway. Will address. > > if (dirty_writeback_interval) { > > + unsigned long wait_jiffies; > > + > > wait_jiffies = msecs_to_jiffies(dirty_writeback_interval * 10); > > schedule_timeout(wait_jiffies); > > No real need for a local variable here. Will address. > > @@ -364,7 +395,7 @@ static int bdi_forker_thread(void *ptr) > > if (!list_empty(&me->bdi->work_list)) > > __set_current_state(TASK_RUNNING); > > > > - if (!fork) { > > + if (!fork && !kill) { > > I think the code here would be a lot cleaner if you implement the > suggestion I have for the forking restructuring. As I replied earlier, to fork/kill the the thread from inside list walk we'd need to drop the spinlock, which is not very nice. So I am keeping this part intact so far. -- Best Regards, Artem Bityutskiy (Артём Битюцкий) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Artem Bityutskiy on 20 Jul 2010 09:10
On Sun, 2010-07-18 at 03:02 -0400, Christoph Hellwig wrote: > Yes, only killing threads from the caller is much better, that's how > the kthread API is supposed to be used anyway. > > > static void bdi_queue_work(struct backing_dev_info *bdi, > > struct wb_writeback_work *work) > > { > > + bool wakeup_default = false; > > + > > trace_writeback_queue(bdi, work); > > > > spin_lock(&bdi->wb_lock); > > list_add_tail(&work->list, &bdi->work_list); > > - spin_unlock(&bdi->wb_lock); > > - > > /* > > * If the default thread isn't there, make sure we add it. When > > * it gets created and wakes up, we'll run this work. > > */ > > - if (unlikely(!bdi->wb.task)) { > > + if (unlikely(!bdi->wb.task)) > > + wakeup_default = true; > > + else > > + wake_up_process(bdi->wb.task); > > + spin_unlock(&bdi->wb_lock); > > + > > + if (wakeup_default) { > > trace_writeback_nothread(bdi, work); > > wake_up_process(default_backing_dev_info.wb.task); > > Why not simply do the defaul thread wakeup under wb_lock, too? > It keeps the code a lot simpler, and this is not a typical path anyway. Hmm, actually, I want to take this lock in __mark_inode_dirty() as well, so it makes sense to micro-optimize this. Also, can 'trace_writeback_nothread()' be called under a spinlock? If no, then a variable is needed anyway. -- Best Regards, Artem Bityutskiy (Артём Битюцкий) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |