From patchwork Wed Apr 15 12:34:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Matias_Bj=C3=B8rling?= X-Patchwork-Id: 6220111 Return-Path: X-Original-To: patchwork-linux-fsdevel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id EF348BF4A6 for ; Wed, 15 Apr 2015 12:37:00 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0ABC0201BB for ; Wed, 15 Apr 2015 12:37:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 16D5820173 for ; Wed, 15 Apr 2015 12:36:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753915AbbDOMgr (ORCPT ); Wed, 15 Apr 2015 08:36:47 -0400 Received: from mail-la0-f45.google.com ([209.85.215.45]:34206 "EHLO mail-la0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752072AbbDOMgE (ORCPT ); Wed, 15 Apr 2015 08:36:04 -0400 Received: by laat2 with SMTP id t2so31521520laa.1 for ; Wed, 15 Apr 2015 05:36:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bjorling.me; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=2352/3LXj8vA5O2+CsJCyFtqUeMlKjHqVFOMHdzpWGo=; b=GipkHPVzrRhMdJMSXY0ZaYmeje1yJQo1k4obBpQ361GL3wJiTzyqBGC/L7vU5NtX4S /wIYDSMcc8YVJG4RBa2pLj7nfkYKQxp5qEfvhBbBrwNJIkFWZF+iAtLL61dBPS/fB7Y1 edGJXcNT1gybJjfDW3ewKMWXC3a1klE7k/zp8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=2352/3LXj8vA5O2+CsJCyFtqUeMlKjHqVFOMHdzpWGo=; b=DrjoBJ89NTdpYqxaumJ/MPsKht1jG3S/2ghGuLzgBO8wk2tvPaFwsQLiBoIcIJVdK8 ved5/4iKfU47p1xe0BLtVMjQbe1gisx5Lu0Sr07aG2BPWEBCGwrcolHLN6DZ5eemOxXg FQSOQfVxgIRodWkpFEkuD2ZJZSMQA5JN2VHZn4bwZQ0kathZKuMtPOgTPBDR5VsN1v0A hRv/qgjqSnsn4s+h62mHUo0meHr68GXEkrguHXjukcRVjm4WU5DmXkSq1Zi3dq/tsknz BSoGJyKkIQelu/SWkRrxD2WHsjrRrA6YoFffwzjTQLEJ0I6lxuk3hlzC6rr/wS+nf9cV YSVg== X-Gm-Message-State: ALoCoQnIA6M9U3dTiti71tV270LEX7U6tWLkV1FnTiR/rp6J2K3/srn0kqkZoTDtkSCeJ3jNBk0i X-Received: by 10.152.170.170 with SMTP id an10mr19938192lac.84.1429101362940; Wed, 15 Apr 2015 05:36:02 -0700 (PDT) Received: from MacroNinja.itu.dk ([130.226.133.111]) by mx.google.com with ESMTPSA id w10sm915663laz.6.2015.04.15.05.36.01 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 15 Apr 2015 05:36:02 -0700 (PDT) From: =?UTF-8?q?Matias=20Bj=C3=B8rling?= To: hch@infradead.org, axboe@fb.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org Cc: javier@paletta.io, keith.busch@intel.com, =?UTF-8?q?Matias=20Bj=C3=B8rling?= Subject: [PATCH 1/5 v2] blk-mq: Add prep/unprep support Date: Wed, 15 Apr 2015 14:34:40 +0200 Message-Id: <1429101284-19490-2-git-send-email-m@bjorling.me> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1429101284-19490-1-git-send-email-m@bjorling.me> References: <1429101284-19490-1-git-send-email-m@bjorling.me> MIME-Version: 1.0 Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Allow users to hook into prep/unprep functions just before an IO is dispatched to the device driver. This is necessary for request-based logic to take place at upper layers. Signed-off-by: Matias Bjørling --- block/blk-mq.c | 28 ++++++++++++++++++++++++++-- include/linux/blk-mq.h | 1 + 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 33c4285..f3dd028 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -338,6 +338,11 @@ EXPORT_SYMBOL(__blk_mq_end_request); void blk_mq_end_request(struct request *rq, int error) { + struct request_queue *q = rq->q; + + if (q->unprep_rq_fn) + q->unprep_rq_fn(q, rq); + if (blk_update_request(rq, error, blk_rq_bytes(rq))) BUG(); __blk_mq_end_request(rq, error); @@ -753,6 +758,17 @@ static void flush_busy_ctxs(struct blk_mq_hw_ctx *hctx, struct list_head *list) } } +static int blk_mq_prep_rq(struct request_queue *q, struct request *rq) +{ + if (!q->prep_rq_fn) + return 0; + + if (rq->cmd_flags & REQ_DONTPREP) + return 0; + + return q->prep_rq_fn(q, rq); +} + /* * Run this hardware queue, pulling any software queues mapped to it in. * Note that this function currently has various problems around ordering @@ -812,11 +828,15 @@ static void __blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx) bd.list = dptr; bd.last = list_empty(&rq_list); - ret = q->mq_ops->queue_rq(hctx, &bd); + ret = blk_mq_prep_rq(q, rq); + if (likely(!ret)) + ret = q->mq_ops->queue_rq(hctx, &bd); switch (ret) { case BLK_MQ_RQ_QUEUE_OK: queued++; continue; + case BLK_MQ_RQ_QUEUE_DONE: + continue; case BLK_MQ_RQ_QUEUE_BUSY: list_add(&rq->queuelist, &rq_list); __blk_mq_requeue_request(rq); @@ -1270,10 +1290,14 @@ static void blk_mq_make_request(struct request_queue *q, struct bio *bio) * error (busy), just add it to our list as we previously * would have done */ - ret = q->mq_ops->queue_rq(data.hctx, &bd); + ret = blk_mq_prep_rq(q, rq); + if (likely(!ret)) + ret = q->mq_ops->queue_rq(data.hctx, &bd); if (ret == BLK_MQ_RQ_QUEUE_OK) goto done; else { + if (ret == BLK_MQ_RQ_QUEUE_DONE) + goto done; __blk_mq_requeue_request(rq); if (ret == BLK_MQ_RQ_QUEUE_ERROR) { diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 7aec861..d7b39af 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -140,6 +140,7 @@ enum { BLK_MQ_RQ_QUEUE_OK = 0, /* queued fine */ BLK_MQ_RQ_QUEUE_BUSY = 1, /* requeue IO for later */ BLK_MQ_RQ_QUEUE_ERROR = 2, /* end IO with error */ + BLK_MQ_RQ_QUEUE_DONE = 3, /* IO is already handled */ BLK_MQ_F_SHOULD_MERGE = 1 << 0, BLK_MQ_F_TAG_SHARED = 1 << 1,