From patchwork Wed May 10 08:24:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 98972 Delivered-To: patch@linaro.org Received: by 10.140.96.100 with SMTP id j91csp105649qge; Wed, 10 May 2017 01:25:23 -0700 (PDT) X-Received: by 10.98.205.65 with SMTP id o62mr4684154pfg.105.1494404722920; Wed, 10 May 2017 01:25:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1494404722; cv=none; d=google.com; s=arc-20160816; b=kbhYnlaGfIWV79LSRmopFtul49AtuX4w0CN2tsL8N9BtmTpBYxt2i2Q9dIBShpWkm9 EBm8idJGR9qak+wEVeaaA3EuE+x3v2VtH5XZfVtRSASKR1IXzvE83dwe7ZGCOJ0W9CVD Mg/DFNxHuwQl2o/HseNUWfFEFI99gMWvckfrFHSBXIEcK2GuDpVedN4chqHeeWPsax1f m4MCe++K1bTYUPvMdA9qmWNGTQlDbGZH9+2K2Z9dPv9gTPL8Yl4qWoff9wtq7A4R4xrv OSv9a0c+X+ta7/Ip3ihE3CEKv/KAQILNdVVJD1Luj8A1UbhWRHd6+9dnJF6RjyyFskmy xR7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=GHUrpngEbLZ6nthdWh54/IgdgMc77zK7lTxXLgFQCPA=; b=Q/VGQVY9jVUPCubEZ6IBQxYt1N/ldJ6LDmFi8sMT01Q8cCaiZqw+h7iRYF5QGxMarm 0xJOF0T4WxNGD7ToADcnuNBUk5DwEBgFmuCUCgKAnSZU3F8TRu07jag3xPPitkcFaSvK PR9rq7tp5D4BlhY5UMWVKWUS0n26g7ogn4IRCYTuROlYneVDQPzoTSySxppZP8rwgobM hbPKq5G0YXskri0GaewaE5Po9qMrbVDUff/aadoz8NLbWse096t57IG3W/Ny1xZiW6ps iyIlO4dLPrC9RUYsTZa+1ezTeXD91eLeHLMmMqGvnq2KQZTBqsWHFoLsLYYoqB1DMnKD YtSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of linux-mmc-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-mmc-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f132si2315878pgc.250.2017.05.10.01.25.22; Wed, 10 May 2017 01:25:22 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-mmc-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of linux-mmc-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-mmc-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752624AbdEJIZV (ORCPT + 6 others); Wed, 10 May 2017 04:25:21 -0400 Received: from mail-qt0-f174.google.com ([209.85.216.174]:33985 "EHLO mail-qt0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752613AbdEJIZT (ORCPT ); Wed, 10 May 2017 04:25:19 -0400 Received: by mail-qt0-f174.google.com with SMTP id j29so20345300qtj.1 for ; Wed, 10 May 2017 01:25:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kBuGPI1Gf+ex9EiGKyCFmJrHAqkXpuGGp97Tt8W3Sf0=; b=JWkdJOsZk/Ag3bUR8Fh5bjimvr005klaFhaifNBNVZkjOPbV0oBuSZtSWSao+B0URd +k2MZKWztk1lZaHrpbiZFeKqlMl60yDkEtYDR3GoidV/imql+utxfyai5AFMwmzpPA1m FKcVb9Y8w7/UXWylsVlA9oFyYfeYZLXFcHMj0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kBuGPI1Gf+ex9EiGKyCFmJrHAqkXpuGGp97Tt8W3Sf0=; b=Qbff1cq0YM6N5jkJTqFxWoVwIbz0dnbLZxIdhEstyBggJ0WOuoqoYx+JaMllkhW7+P 1eI+vCSrXZqYW7anqK0dvEam59K9+ZRzdiFllol9i+9G+e0+udxKQQUlfmINlz2+RKUO q2UGjKV5N5rU0lEHy9fBpkZA6FxFCU63MRHn9mn2gDwbV6WYm2+MxYL8wHZgceFUcU9/ 95L1/3LqoDNAVRTq7Oy+ZJbm/7Xx+bCmgClPv/9VmS83EnO3wBc4iQjlOms97GjfJzB0 zjnBbVKjlDzfyGaU3SPO5Qkaz3ArMCMZgooJH+CQoKrmXXJY24bmCzTI/jPWtXCGjPp4 luVQ== X-Gm-Message-State: AODbwcD7WbhFE3LCR2RcSeinV5hdZKt0J2PkVOIHcUXyY4E/kIVeobL7 fELaxbrNkrpew6uY X-Received: by 10.25.193.1 with SMTP id r1mr2078297lff.127.1494404718679; Wed, 10 May 2017 01:25:18 -0700 (PDT) Received: from genomnajs.ideon.se ([85.235.10.227]) by smtp.gmail.com with ESMTPSA id 17sm401500ljo.56.2017.05.10.01.25.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 May 2017 01:25:17 -0700 (PDT) From: Linus Walleij To: linux-mmc@vger.kernel.org, Ulf Hansson , Adrian Hunter Cc: linux-block@vger.kernel.org, Jens Axboe , Christoph Hellwig , Arnd Bergmann , Bartlomiej Zolnierkiewicz , Paolo Valente , Linus Walleij Subject: [PATCH 5/5] mmc: block: move multi-ioctl() to use block layer Date: Wed, 10 May 2017 10:24:18 +0200 Message-Id: <20170510082418.10513-6-linus.walleij@linaro.org> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170510082418.10513-1-linus.walleij@linaro.org> References: <20170510082418.10513-1-linus.walleij@linaro.org> Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org This switches also the multiple-command ioctl() call to issue all ioctl()s through the block layer instead of going directly to the device. We extend the passed argument with an argument count and loop over all passed commands in the ioctl() issue function called from the block layer. By doing this we are again loosening the grip on the big host lock, since two calls to mmc_get_card()/mmc_put_card() are removed. Signed-off-by: Linus Walleij --- drivers/mmc/core/block.c | 38 +++++++++++++++++++++++++------------- drivers/mmc/core/queue.h | 3 ++- 2 files changed, 27 insertions(+), 14 deletions(-) -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Tested-by: Avri Altman diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 640db4f57a31..152de904d5e4 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -563,6 +563,7 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, struct mmc_ioc_cmd __user *ic_ptr) { struct mmc_blk_ioc_data *idata; + struct mmc_blk_ioc_data *idatas[1]; struct mmc_blk_data *md; struct mmc_queue *mq; struct mmc_card *card; @@ -600,7 +601,9 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, req = blk_get_request(mq->queue, idata->ic.write_flag ? REQ_OP_DRV_OUT : REQ_OP_DRV_IN, __GFP_RECLAIM); - req_to_mq_rq(req)->idata = idata; + idatas[0] = idata; + req_to_mq_rq(req)->idata = idatas; + req_to_mq_rq(req)->ioc_count = 1; blk_execute_rq(mq->queue, NULL, req, 0); ioc_err = req_to_mq_rq(req)->ioc_result; err = mmc_blk_ioctl_copy_to_user(ic_ptr, idata); @@ -622,14 +625,17 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, static void mmc_blk_ioctl_cmd_issue(struct mmc_queue *mq, struct request *req) { struct mmc_queue_req *mq_rq; - struct mmc_blk_ioc_data *idata; struct mmc_card *card = mq->card; struct mmc_blk_data *md = mq->blkdata; int ioc_err; + int i; mq_rq = req_to_mq_rq(req); - idata = mq_rq->idata; - ioc_err = __mmc_blk_ioctl_cmd(card, md, idata); + for (i = 0; i < mq_rq->ioc_count; i++) { + ioc_err = __mmc_blk_ioctl_cmd(card, md, mq_rq->idata[i]); + if (ioc_err) + break; + } mq_rq->ioc_result = ioc_err; /* Always switch back to main area after RPMB access */ @@ -646,8 +652,10 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev, struct mmc_ioc_cmd __user *cmds = user->cmds; struct mmc_card *card; struct mmc_blk_data *md; + struct mmc_queue *mq; int i, err = 0, ioc_err = 0; __u64 num_of_cmds; + struct request *req; /* * The caller must have CAP_SYS_RAWIO, and must be calling this on the @@ -689,21 +697,25 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev, goto cmd_done; } - mmc_get_card(card); - - for (i = 0; i < num_of_cmds && !ioc_err; i++) - ioc_err = __mmc_blk_ioctl_cmd(card, md, idata[i]); - - /* Always switch back to main area after RPMB access */ - if (md->area_type & MMC_BLK_DATA_AREA_RPMB) - mmc_blk_part_switch(card, dev_get_drvdata(&card->dev)); - mmc_put_card(card); + /* + * Dispatch the ioctl()s into the block request queue. + */ + mq = &md->queue; + req = blk_get_request(mq->queue, + idata[0]->ic.write_flag ? REQ_OP_DRV_OUT : REQ_OP_DRV_IN, + __GFP_RECLAIM); + req_to_mq_rq(req)->idata = idata; + req_to_mq_rq(req)->ioc_count = num_of_cmds; + blk_execute_rq(mq->queue, NULL, req, 0); + ioc_err = req_to_mq_rq(req)->ioc_result; /* copy to user if data and response */ for (i = 0; i < num_of_cmds && !err; i++) err = mmc_blk_ioctl_copy_to_user(&cmds[i], idata[i]); + blk_put_request(req); + cmd_done: mmc_blk_put(md); cmd_err: diff --git a/drivers/mmc/core/queue.h b/drivers/mmc/core/queue.h index aeb3408dc85e..7015df6681c3 100644 --- a/drivers/mmc/core/queue.h +++ b/drivers/mmc/core/queue.h @@ -42,7 +42,8 @@ struct mmc_queue_req { unsigned int bounce_sg_len; struct mmc_async_req areq; int ioc_result; - struct mmc_blk_ioc_data *idata; + struct mmc_blk_ioc_data **idata; + unsigned int ioc_count; }; struct mmc_queue {