[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1433150435-19997-1-git-send-email-david@protonic.nl>
Date: Mon, 1 Jun 2015 11:20:35 +0200
From: David Jander <david@...tonic.nl>
To: Pierre Ossman <pierre@...man.eu>,
Ulf Hansson <ulf.hansson@...aro.org>,
Sascha Hauer <s.hauer@...gutronix.de>
Cc: Johan Rudholm <johan.rudholm@...s.com>,
Adrian Hunter <adrian.hunter@...el.com>,
Javier Martinez Canillas <javier.martinez@...labora.co.uk>,
linux-mmc@...r.kernel.org, linux-kernel@...r.kernel.org,
David Jander <david@...tonic.nl>
Subject: [PATCH] mmc: core: Fix off-by-one error in mmc_do_calc_max_discard()
qty is the maximum number of discard that _do_ fit in the timeout, not
the first amount that does _not_ fit anymore.
This seemingly harmless error has a very severe performance impact when
the timeout value is enough for only 1 erase group.
Signed-off-by: David Jander <david@...tonic.nl>
---
drivers/mmc/core/core.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 92e7671..1f9573b 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -2234,16 +2234,13 @@ static unsigned int mmc_do_calc_max_discard(struct mmc_card *card,
if (!qty)
return 0;
- if (qty == 1)
- return 1;
-
/* Convert qty to sectors */
if (card->erase_shift)
- max_discard = --qty << card->erase_shift;
+ max_discard = qty << card->erase_shift;
else if (mmc_card_sd(card))
max_discard = qty;
else
- max_discard = --qty * card->erase_size;
+ max_discard = qty * card->erase_size;
return max_discard;
}
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists