Path: csiph.com!news.mixmin.net!news.unit0.net!news.panservice.it!bofh.it!news.nic.it!robomod From: Baolin Wang Newsgroups: linux.kernel Subject: [PATCH v5 2/2] mmc: core: Optimize the mmc erase size alignment Date: Wed, 07 Sep 2016 04:40:02 +0200 Message-ID: References: X-Original-To: ulf.hansson@linaro.org 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 :in-reply-to:references; bh=+YM5zwd8o6RT52LaPsTYXZa5R1xEx3TxemBKIXtJz5I=; b=MYW5VVzzSla19BHDC4OzwDHX7ND6JuXO52hdQiIzPWrFDap2OpIEmfnnEYdMQK98gz NqYTgFH2UrksNaRf4eyQoO1NPyOcrXUd/GfMiaZJEHudBABz8Z/FHj648FZpja01kkBl 0Xgx/Y07+WOBik0VdxIhk7YQiiBs7KV1dLQew= 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:in-reply-to:references; bh=+YM5zwd8o6RT52LaPsTYXZa5R1xEx3TxemBKIXtJz5I=; b=CQBYCng7rnTWFCAkF/+F1/g8CYHby85NMMyvL5dEBV/MaoaBv2rSI66yW59aKgEiI1 Ve8Y7BlxgnekpFWSQRinjTe+PlSF/lrx80A2HlTmAlzy8c+oF3fXNMy/0Acrp775rtuw dDGYxjj+54QFWvp024zUwo/+5R6sOzujL76+GV4gvgaQEoe3aqh1x3kzqwfkC7NeOHDI zD1CqN+VyAwtaW3UgpKkOx1YVGOGST5REezUHPfSDSWpiUWjIydNkGK7wh7m9h3aItN2 USQsNZRZzoAt7RNs6UtvUvVzS2wcY3CCuoKuhor72nZUKPuJEWzw/ggKYRcvwIQXuPgE cUPg== X-Gm-Message-State: AE9vXwOEa1S7OxtI5yzov2DmS6BS9QRK1RW3wngM8K5V71gE2frxAjdqEIJdg6+38YspiE2S X-Received: by 10.98.11.65 with SMTP id t62mr46286589pfi.51.1473215958404; Tue, 06 Sep 2016 19:39:18 -0700 (PDT) X-Mailer: git-send-email 1.7.9.5 Sender: robomod@news.nic.it List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Approved: robomod@news.nic.it Lines: 62 Organization: linux.* mail to news gateway X-Original-Cc: adrian.hunter@intel.com, rmk+kernel@arm.linux.org.uk, shawn.lin@rock-chips.com, dianders@chromium.org, heiko@sntech.de, david@protonic.nl, hdegoede@redhat.com, linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, broonie@kernel.org, linus.walleij@linaro.org, baolin.wang@linaro.org X-Original-Date: Wed, 7 Sep 2016 10:38:25 +0800 X-Original-Message-ID: X-Original-References: <48ff46b96e01df36aa5d1c2daf1091d2ec2e729f.1473215578.git.baolin.wang@linaro.org> X-Original-Sender: linux-kernel-owner@vger.kernel.org Xref: csiph.com linux.kernel:1477939 In most cases the 'card->erase_size' is power of 2, then the round_up/down() function is more efficient than '%' operation when the 'card->erase_size' is power of 2. Signed-off-by: Baolin Wang Tested-by: Shawn Lin --- drivers/mmc/core/core.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 11b4897..4264ac6 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -2209,19 +2209,37 @@ static unsigned int mmc_align_erase_size(struct mmc_card *card, { unsigned int from_new = *from, nr_new = nr, rem; - rem = from_new % card->erase_size; - if (rem) { - rem = card->erase_size - rem; - from_new += rem; + /* + * When the 'card->erase_size' is power of 2, we can use round_up/down() + * to align the erase size efficiently. + */ + if (is_power_of_2(card->erase_size)) { + unsigned int temp = from_new; + + from_new = round_up(temp, card->erase_size); + rem = from_new - temp; + if (nr_new > rem) nr_new -= rem; else return 0; - } - rem = nr_new % card->erase_size; - if (rem) - nr_new -= rem; + nr_new = round_down(nr_new, card->erase_size); + } else { + rem = from_new % card->erase_size; + if (rem) { + rem = card->erase_size - rem; + from_new += rem; + if (nr_new > rem) + nr_new -= rem; + else + return 0; + } + + rem = nr_new % card->erase_size; + if (rem) + nr_new -= rem; + } if (nr_new == 0) return 0; -- 1.7.9.5