From patchwork Mon Apr 18 11:43:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 8871691 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 98FC99F39D for ; Mon, 18 Apr 2016 11:44:16 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BBFB820270 for ; Mon, 18 Apr 2016 11:44:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B8D0020123 for ; Mon, 18 Apr 2016 11:44:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752509AbcDRLoN (ORCPT ); Mon, 18 Apr 2016 07:44:13 -0400 Received: from mail-lf0-f46.google.com ([209.85.215.46]:35146 "EHLO mail-lf0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751560AbcDRLoN (ORCPT ); Mon, 18 Apr 2016 07:44:13 -0400 Received: by mail-lf0-f46.google.com with SMTP id c126so213239470lfb.2 for ; Mon, 18 Apr 2016 04:44:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references; bh=z6omt0wfecyFvi7m8qU3XLHzigOcV6ShNET/zAg94KY=; b=HpJQONRfizBgY6EWXzMTfoKcThewLSp3bUo/gd6JBLIsqbqbqAOz8fePg4Tv7TgM8Q HSv6zdM2GJYT+PftREDPz8b8LKXOhI40h+9weWLWl17PtOL5Ll9YhhYvb0JuE/qtdWz+ iwAsPTsOk0X3groiDS3a4OoKvCdcLW23E4qn4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=z6omt0wfecyFvi7m8qU3XLHzigOcV6ShNET/zAg94KY=; b=LtoyfL2973xjwE8KwhGuTzaY1Ug5nKY9VkeBsszlLFpei6ZOJtndH67JHA11dvVLRu IoBFCjcKTbMbuqy3/nzwPmjc5yD7ci3xuwbivS653AD0z1FG0+onPZavSrgHNHHrpFxa 1f9ADCy5KOjUPRbQkc+1bUB8j52y7OwxRwqI23HgTDFet/bsLE54CTXHHWLb1WdYS8Kg ln3YzSkMMoyr/w2va4zjSQ6sIDraXgSHP8wWlYuQ1zZhIo63HBLw7wxswANOR128gr/l Srj5v3skyq59+y3pEO2gE7BdULl3dxVvbd6pM9XRxGdF3VwPdxHzEJZX77Icdg9uMxYI Bg6Q== X-Gm-Message-State: AOPr4FWODHOXjk8cN4GnpwxJlxysbtoEG/csZFIp0juOS8EnXDaNsHM0Zg7ciiVfa/pQNIcx X-Received: by 10.112.63.196 with SMTP id i4mr14264869lbs.93.1460979851319; Mon, 18 Apr 2016 04:44:11 -0700 (PDT) Received: from uffe-Latitude-E6430s.ideon.se ([85.235.10.227]) by smtp.gmail.com with ESMTPSA id jo1sm10010232lbc.3.2016.04.18.04.44.09 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 18 Apr 2016 04:44:10 -0700 (PDT) From: Ulf Hansson To: linux-mmc@vger.kernel.org, Ulf Hansson Subject: [PATCH 3/3] mmc: block: Convert to IDA for partition device indexes Date: Mon, 18 Apr 2016 13:43:54 +0200 Message-Id: <1460979834-24582-3-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1460979834-24582-1-git-send-email-ulf.hansson@linaro.org> References: <1460979834-24582-1-git-send-email-ulf.hansson@linaro.org> Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-7.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham 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 Instead of using an mmc specific implementation to deal with indexes through a BITMAP, let's convert to use the IDA library. Signed-off-by: Ulf Hansson --- drivers/mmc/card/block.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 9aaf22e..9ce6792 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -78,14 +79,14 @@ static int perdev_minors = CONFIG_MMC_BLOCK_MINORS; /* * We've only got one major, so number of mmcblk devices is * limited to (1 << 20) / number of minors per device. It is also - * currently limited by the size of the static bitmaps below. + * limited by the MAX_DEVICES below. */ static int max_devices; #define MAX_DEVICES 256 -/* TODO: Replace these with struct ida */ -static DECLARE_BITMAP(dev_use, MAX_DEVICES); +static DEFINE_IDA(mmc_blk_ida); +static DEFINE_SPINLOCK(mmc_blk_lock); /* * There is one mmc_blk_data per slot. @@ -178,7 +179,9 @@ static void mmc_blk_put(struct mmc_blk_data *md) int devidx = mmc_get_devidx(md->disk); blk_cleanup_queue(md->queue.queue); - __clear_bit(devidx, dev_use); + spin_lock(&mmc_blk_lock); + ida_remove(&mmc_blk_ida, devidx); + spin_unlock(&mmc_blk_lock); put_disk(md->disk); kfree(md); @@ -2189,10 +2192,23 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, struct mmc_blk_data *md; int devidx, ret; - devidx = find_first_zero_bit(dev_use, max_devices); - if (devidx >= max_devices) - return ERR_PTR(-ENOSPC); - __set_bit(devidx, dev_use); +again: + if (!ida_pre_get(&mmc_blk_ida, GFP_KERNEL)) + return ERR_PTR(-ENOMEM); + + spin_lock(&mmc_blk_lock); + ret = ida_get_new(&mmc_blk_ida, &devidx); + spin_unlock(&mmc_blk_lock); + + if (ret == -EAGAIN) + goto again; + else if (ret) + return ERR_PTR(ret); + + if (devidx >= max_devices) { + ret = -ENOSPC; + goto out; + } md = kzalloc(sizeof(struct mmc_blk_data), GFP_KERNEL); if (!md) { @@ -2289,7 +2305,9 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, err_kfree: kfree(md); out: - __clear_bit(devidx, dev_use); + spin_lock(&mmc_blk_lock); + ida_remove(&mmc_blk_ida, devidx); + spin_unlock(&mmc_blk_lock); return ERR_PTR(ret); }