From mboxrd@z Thu Jan 1 00:00:00 1970 From: Artem Bityutskiy Subject: bdi forker Date: Wed, 07 Jul 2010 14:30:27 +0300 Message-ID: <1278502227.29620.161.camel@localhost> Reply-To: dedekind1@gmail.com Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: Christoph Hellwig To: Jens Axboe , linux-fsdevel Return-path: Received: from smtp.nokia.com ([192.100.122.233]:47314 "EHLO mgw-mx06.nokia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754593Ab0GGLeY (ORCPT ); Wed, 7 Jul 2010 07:34:24 -0400 Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Hi Jens, in your current design you have: 1. bdi_forker_task() which wakes up every 5 seconds just to check whether it has to fork a per-bdi thread or not. 2. per-bdi threads which wake up when there are bdi works or every 5 seconds to do kupdated style write-back. These threads also die after 5 minutes of "inactivity", and will be forked by the bdi_forker_task() if needed. This is bad from the power management POW, and I'd like to fix this. If you have any ideas/directions for me, please, share. I was looking at the code and and found it to bee more complex that it has to be. I'd suggest to: 1. Stop exiting per-bdi flushers after 5 minutes of inactivity. 2. Kill the forker thread and make the default bdi us the same flusher thread as every other bdi uses. This will simplify many things, I believe. Various lists and locks and will go away, the code will become more readable. Also, I noticed the following code fragment: static void bdi_queue_work(struct backing_dev_info *bdi, struct wb_writeback_work *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)) { wake_up_process(default_backing_dev_info.wb.task); } else { struct bdi_writeback *wb =3D &bdi->wb; if (wb->task) wake_up_process(wb->task); } } What prevents the flusher task from deciding to commit suicide, set wb->task to NULL, and make this code to do wake_up_process(NULL)? --=20 Best Regards, Artem Bityutskiy (=D0=90=D1=80=D1=82=D1=91=D0=BC =D0=91=D0=B8=D1=82=D1=8E= =D1=86=D0=BA=D0=B8=D0=B9) -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel= " in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html