From patchwork Sun Apr 17 22:19:22 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: NeilBrown X-Patchwork-Id: 714131 Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3HMLnR5030211 for ; Sun, 17 Apr 2011 22:22:10 GMT Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p3HMJg4v028900; Sun, 17 Apr 2011 18:19:44 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p3HMJf6G012441 for ; Sun, 17 Apr 2011 18:19:41 -0400 Received: from mx1.redhat.com (ext-mx12.extmail.prod.ext.phx2.redhat.com [10.5.110.17]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p3HMJZtR022309; Sun, 17 Apr 2011 18:19:35 -0400 Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p3HMJWu2028243; Sun, 17 Apr 2011 18:19:32 -0400 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 344A2945D6; Mon, 18 Apr 2011 00:19:31 +0200 (CEST) Date: Mon, 18 Apr 2011 08:19:22 +1000 From: NeilBrown To: Jens Axboe Message-ID: <20110418081922.1651474a@notabene.brown> In-Reply-To: <4DA2F00E.6010907@fusionio.com> References: <1295659049-2688-1-git-send-email-jaxboe@fusionio.com> <1295659049-2688-6-git-send-email-jaxboe@fusionio.com> <20110303221353.GA10366@redhat.com> <4D761E0D.8050200@fusionio.com> <20110308202100.GA31744@redhat.com> <4D76912C.9040705@fusionio.com> <20110308220526.GA393@redhat.com> <20110310005810.GA17911@redhat.com> <20110405130541.6c2b5f86@notabene.brown> <20110411145022.710c30e9@notabene.brown> <4DA2C7BE.6060804@fusionio.com> <20110411205928.13915719@notabene.brown> <4DA2E03A.2080607@fusionio.com> <20110411212635.7959de70@notabene.brown> <4DA2E7F0.9010904@fusionio.com> <20110411220505.1028816e@notabene.brown> <4DA2F00E.6010907@fusionio.com> Mime-Version: 1.0 X-RedHat-Spam-Score: -5.01 (RCVD_IN_DNSWL_HI,T_RP_MATCHES_RCVD) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Scanned-By: MIMEDefang 2.68 on 10.5.110.17 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id p3HMJf6G012441 X-loop: dm-devel@redhat.com Cc: "hch@infradead.org" , "linux-raid@vger.kernel.org" , "dm-devel@redhat.com" , "linux-kernel@vger.kernel.org" , Mike Snitzer Subject: Re: [dm-devel] [PATCH 05/10] block: remove per-queue plugging X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk Reply-To: device-mapper development List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Sun, 17 Apr 2011 22:22:10 +0000 (UTC) On Mon, 11 Apr 2011 14:11:58 +0200 Jens Axboe wrote: > > Yes. But I need to know when to release the requests that I have stored. > > I need to know when ->write_pages or ->read_pages or whatever has finished > > submitting a pile of pages so that I can start processing the request that I > > have put aside. So I need a callback from blk_finish_plug. > > OK fair enough, I'll add your callback patch. > But you didn't did you? You added a completely different patch which is completely pointless. If you don't like my patch I would really prefer you said so rather than silently replace it with something completely different (and broken). I'll try to explain again. md does not use __make_request. At all. md does not use 'struct request'. At all. The 'list' in 'struct blk_plug' is a list of 'struct request'. Therefore md cannot put anything useful on the list in 'struct blk_plug'. So when blk_flush_plug_list calls queue_unplugged() on a queue that belonged to a request found on the blk_plug list, that queue cannot possibly ever be for an 'md' device (because no 'struct request' ever belongs to an md device, because md doesn't not use 'struct request'). So your patch (commit f75664570d8b) doesn't help MD at all. For md, I need to attach something to blk_plug which somehow identifies an md device, so that blk_finish_plug can get to that device and let it unplug. The most sensible thing to have is a completely generic callback. That way different block devices (which choose not to use __make_request) can attach different sorts of things to blk_plug. So can we please have my original patch applied? (Revised version using list_splice_init included below). Or if not, a clear explanation of why not? Thanks, NeilBrown >From 6a2aa888b855fd298c174bcee130cf43db0b3f7b Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 18 Apr 2011 08:15:45 +1000 Subject: [PATCH] Enhance new plugging support to support general callbacks. md/raid requires an unplug callback, but as it does not uses requests the current code cannot provide one. So allow arbitrary callbacks to be attached to the blk_plug. Cc: Jens Axboe Signed-off-by: NeilBrown --- block/blk-core.c | 20 ++++++++++++++++++++ include/linux/blkdev.h | 7 ++++++- 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 78b7b0c..c2b8006 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -2638,6 +2638,7 @@ void blk_start_plug(struct blk_plug *plug) plug->magic = PLUG_MAGIC; INIT_LIST_HEAD(&plug->list); + INIT_LIST_HEAD(&plug->cb_list); plug->should_sort = 0; /* @@ -2742,9 +2743,28 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) } EXPORT_SYMBOL(blk_flush_plug_list); +static void flush_plug_callbacks(struct blk_plug *plug) +{ + LIST_HEAD(callbacks); + + if (list_empty(&plug->cb_list)) + return; + + list_splice_init(&plug->cb_list, &callbacks); + + while (!list_empty(&callbacks)) { + struct blk_plug_cb *cb = list_first_entry(&callbacks, + struct blk_plug_cb, + list); + list_del(&cb->list); + cb->callback(cb); + } +} + void blk_finish_plug(struct blk_plug *plug) { blk_flush_plug_list(plug, false); + flush_plug_callbacks(plug); if (plug == current->plug) current->plug = NULL; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index ec0357d..f3f7879 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -860,8 +860,13 @@ extern void blk_put_queue(struct request_queue *); struct blk_plug { unsigned long magic; struct list_head list; + struct list_head cb_list; unsigned int should_sort; }; +struct blk_plug_cb { + struct list_head list; + void (*callback)(struct blk_plug_cb *); +}; extern void blk_start_plug(struct blk_plug *); extern void blk_finish_plug(struct blk_plug *); @@ -887,7 +892,7 @@ static inline bool blk_needs_flush_plug(struct task_struct *tsk) { struct blk_plug *plug = tsk->plug; - return plug && !list_empty(&plug->list); + return plug && (!list_empty(&plug->list) || !list_empty(&plug->cb_list)); } /*