Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp675984imm; Fri, 1 Jun 2018 07:45:10 -0700 (PDT) X-Google-Smtp-Source: ADUXVKI31ojc7ULHBGLyzOzcWKEWccVz8qPXn9TMr4Dxqn4GmwEXK2Et1oSm+wEIxuINX3KQQOq9 X-Received: by 2002:a63:7419:: with SMTP id p25-v6mr9391504pgc.24.1527864310104; Fri, 01 Jun 2018 07:45:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527864310; cv=none; d=google.com; s=arc-20160816; b=q2Txok1SDLMl8OzUe68bZ0xkdq/EwFJ1A1Hy3jBt1u53FXxaqvktocTmBDcEPw3AIv M/aQiyb+XuXZk4q6JmlwQ9e6k4m4jZDYWcWfoV986YUyZc5o/kZq4pR7exK/XBskX9va XEJMtf2eZ9AHs6Vz1IGncQ+Uq++GDvKrIswgdODXo6rUa39UBuM9dnDlwqlJM82XlIse N/s3w+8NC9pBnvO9lE4yGDSaWXwZnqam0hw/2XuCEMxC/ePeWIqVNz2D5mdH5iFdDLIG 7K5acmz5y29z4Jb6h8EjKIupO5tb0a18UJXd6h4oFN8joduM1FqNnJI8CKxDc3a/FqW2 TiaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=+whTR88LAuwZRtqrxdWv+/rGI2QyrfoJIIrZBNJ7qXI=; b=whQ7DWzird/XdtxtN5QfrDOOp+DA4yBPmaRFq+XB8HRT2EYeEYP6MgaFQi1d4pEmXG T0nAkBUu2E4pkilxAgY2AJg0N3q6OEMEi+9ikRphQ70M3UBtW1quDllvTjSQE1cH4QbN sM1JAXNE7DeM1wLohHmSBlmU7zuco4xwGZ7wj/qWuz7eGTXwdaxriBbdNz4drUBxgFvJ fHEPm7nHTaxpnC+NnV02EBo/QZUx4TFodzhiwcNqQ8p9lrpOdxaL+PnrT4Hmq9CItLG9 NXriqr9L/ENxGFL8HPCNTcUT2tzBf1XUoqgvG5yom7t3DXi0NJyza/BTAZZ6b/JY3ZJy 2tHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=BHzAzOee; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u2-v6si17987975plr.598.2018.06.01.07.44.55; Fri, 01 Jun 2018 07:45:10 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=BHzAzOee; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752659AbeFAOoX (ORCPT + 99 others); Fri, 1 Jun 2018 10:44:23 -0400 Received: from mail-lf0-f67.google.com ([209.85.215.67]:33634 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752525AbeFAOoI (ORCPT ); Fri, 1 Jun 2018 10:44:08 -0400 Received: by mail-lf0-f67.google.com with SMTP id y20-v6so15208883lfy.0 for ; Fri, 01 Jun 2018 07:44:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lightnvm-io.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+whTR88LAuwZRtqrxdWv+/rGI2QyrfoJIIrZBNJ7qXI=; b=BHzAzOeesLcT5Ps6uPTnkXoksYtJOGjyDJddTxdQrLyxX+6d+sC3GdVcDckmeViGrT +kLcCJOj5ldhO7+q1QpG7/qmX5Hju8CTKtLfaiuobFZzNxrcV/KQdUGlEUTOkpwNC80Q HGkIeBipSHnrwV66WTSzgVEHsWcZkn0kzUISPv+PVOOcqwC5YXsMfZXxigIP36/KjK9G pesEdFKl3/5RnKtEyEt8lxhYoVm8s4oAnr9wHt+7ek3N28VclIt+wJYOOkFBY8Q0dI+4 BL8oxrBR14m9MOEuw70nXbi8DCxsrjjXmQdp4Y999oizTRTnZXJxr+WZ9d06wfcTgHOx vdCg== 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:mime-version:content-transfer-encoding; bh=+whTR88LAuwZRtqrxdWv+/rGI2QyrfoJIIrZBNJ7qXI=; b=lD/n5jc5+89lNJ01R6JXyOATdKqRuxfDndg33LPHIHGCneEWqDGfSqxG2UtmBnulkT XiAwmVpu/2pkrulUGpf8+OHGkH2r0y3OLDf7Ddt7nzNlqWXRyaf7tHeyNF1RYJzpzJpN ALd0YDwDv8SXGxFcGqdu7mGnkm17p/LUNZwDakpigltHTvixuCrt0ovBFL28nHygML7s pDpbIxJj9wLjHy5kBFVAbmW7DvGSt6OEi8uz1UUCQpj/xSjjmRtN7iQJw295Rhg6QOZq IsEaCtPwVsNTJrd0mNC3dXuuHmyPwuwSysAsn4awVScTGe6kQS5rrW8cnFt8Xct4PD4B xz+A== X-Gm-Message-State: ALKqPwdBfEkXzj67XjJ+ZyWA9VEeqhtr8WlIYhfMPElIuoX2jZUKbCPR d4rMCS45uwvhKmIdkxZxiZ+Lsw== X-Received: by 2002:a2e:8350:: with SMTP id l16-v6mr8341823ljh.28.1527864246137; Fri, 01 Jun 2018 07:44:06 -0700 (PDT) Received: from Macroninja.cnexlabs.com (95-166-82-66-cable.dk.customer.tdc.net. [95.166.82.66]) by smtp.gmail.com with ESMTPSA id e65-v6sm356488lff.13.2018.06.01.07.44.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Jun 2018 07:44:05 -0700 (PDT) From: =?UTF-8?q?Matias=20Bj=C3=B8rling?= To: axboe@fb.com Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, javier@cnexlabs.com, igor.j.konopko@intel.com, marcin.dziegielewski@intel.com, =?UTF-8?q?Javier=20Gonz=C3=A1lez?= , =?UTF-8?q?Matias=20Bj=C3=B8rling?= Subject: [GIT PULL 10/10] lightnvm: pblk: take bitmap alloc. out of critical section Date: Fri, 1 Jun 2018 16:41:14 +0200 Message-Id: <20180601144114.17490-11-mb@lightnvm.io> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180601144114.17490-1-mb@lightnvm.io> References: <20180601144114.17490-1-mb@lightnvm.io> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Javier González pblk allocates line bitmaps within the line lock unnecessarily. In order to take pressure out of the fast patch, allocate line bitmaps outside of this lock and refactor accordingly. Signed-off-by: Javier González Signed-off-by: Matias Bjørling --- drivers/lightnvm/pblk-core.c | 97 +++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 41 deletions(-) diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c index a5750534efed..ed9cc977c8b3 100644 --- a/drivers/lightnvm/pblk-core.c +++ b/drivers/lightnvm/pblk-core.c @@ -1067,6 +1067,25 @@ static int pblk_line_init_metadata(struct pblk *pblk, struct pblk_line *line, return 1; } +static int pblk_line_alloc_bitmaps(struct pblk *pblk, struct pblk_line *line) +{ + struct pblk_line_meta *lm = &pblk->lm; + + line->map_bitmap = kzalloc(lm->sec_bitmap_len, GFP_KERNEL); + if (!line->map_bitmap) + return -ENOMEM; + + /* will be initialized using bb info from map_bitmap */ + line->invalid_bitmap = kmalloc(lm->sec_bitmap_len, GFP_KERNEL); + if (!line->invalid_bitmap) { + kfree(line->map_bitmap); + line->map_bitmap = NULL; + return -ENOMEM; + } + + return 0; +} + /* For now lines are always assumed full lines. Thus, smeta former and current * lun bitmaps are omitted. */ @@ -1171,18 +1190,7 @@ static int pblk_line_prepare(struct pblk *pblk, struct pblk_line *line) { struct pblk_line_meta *lm = &pblk->lm; int blk_in_line = atomic_read(&line->blk_in_line); - int blk_to_erase, ret; - - line->map_bitmap = kzalloc(lm->sec_bitmap_len, GFP_ATOMIC); - if (!line->map_bitmap) - return -ENOMEM; - - /* will be initialized using bb info from map_bitmap */ - line->invalid_bitmap = kmalloc(lm->sec_bitmap_len, GFP_ATOMIC); - if (!line->invalid_bitmap) { - ret = -ENOMEM; - goto fail_free_map_bitmap; - } + int blk_to_erase; /* Bad blocks do not need to be erased */ bitmap_copy(line->erase_bitmap, line->blk_bitmap, lm->blk_per_line); @@ -1200,15 +1208,15 @@ static int pblk_line_prepare(struct pblk *pblk, struct pblk_line *line) } if (blk_in_line < lm->min_blk_line) { - ret = -EAGAIN; - goto fail_free_invalid_bitmap; + spin_unlock(&line->lock); + return -EAGAIN; } if (line->state != PBLK_LINESTATE_FREE) { WARN(1, "pblk: corrupted line %d, state %d\n", line->id, line->state); - ret = -EINTR; - goto fail_free_invalid_bitmap; + spin_unlock(&line->lock); + return -EINTR; } line->state = PBLK_LINESTATE_OPEN; @@ -1222,16 +1230,6 @@ static int pblk_line_prepare(struct pblk *pblk, struct pblk_line *line) kref_init(&line->ref); return 0; - -fail_free_invalid_bitmap: - spin_unlock(&line->lock); - kfree(line->invalid_bitmap); - line->invalid_bitmap = NULL; -fail_free_map_bitmap: - kfree(line->map_bitmap); - line->map_bitmap = NULL; - - return ret; } int pblk_line_recov_alloc(struct pblk *pblk, struct pblk_line *line) @@ -1251,13 +1249,16 @@ int pblk_line_recov_alloc(struct pblk *pblk, struct pblk_line *line) } spin_unlock(&l_mg->free_lock); - pblk_rl_free_lines_dec(&pblk->rl, line, true); + ret = pblk_line_alloc_bitmaps(pblk, line); + if (ret) + return ret; if (!pblk_line_init_bb(pblk, line, 0)) { list_add(&line->list, &l_mg->free_list); return -EINTR; } + pblk_rl_free_lines_dec(&pblk->rl, line, true); return 0; } @@ -1269,6 +1270,24 @@ void pblk_line_recov_close(struct pblk *pblk, struct pblk_line *line) line->emeta = NULL; } +static void pblk_line_reinit(struct pblk_line *line) +{ + *line->vsc = cpu_to_le32(EMPTY_ENTRY); + + line->map_bitmap = NULL; + line->invalid_bitmap = NULL; + line->smeta = NULL; + line->emeta = NULL; +} + +void pblk_line_free(struct pblk_line *line) +{ + kfree(line->map_bitmap); + kfree(line->invalid_bitmap); + + pblk_line_reinit(line); +} + struct pblk_line *pblk_line_get(struct pblk *pblk) { struct pblk_line_mgmt *l_mg = &pblk->l_mg; @@ -1335,11 +1354,14 @@ static struct pblk_line *pblk_line_retry(struct pblk *pblk, return NULL; } + retry_line->map_bitmap = line->map_bitmap; + retry_line->invalid_bitmap = line->invalid_bitmap; retry_line->smeta = line->smeta; retry_line->emeta = line->emeta; retry_line->meta_line = line->meta_line; - pblk_line_free(line); + pblk_line_reinit(line); + l_mg->data_line = retry_line; spin_unlock(&l_mg->free_lock); @@ -1392,6 +1414,9 @@ struct pblk_line *pblk_line_get_first_data(struct pblk *pblk) } spin_unlock(&l_mg->free_lock); + if (pblk_line_alloc_bitmaps(pblk, line)) + return NULL; + if (pblk_line_erase(pblk, line)) { line = pblk_line_retry(pblk, line); if (!line) @@ -1536,6 +1561,9 @@ struct pblk_line *pblk_line_replace_data(struct pblk *pblk) goto retry_erase; } + if (pblk_line_alloc_bitmaps(pblk, new)) + return NULL; + retry_setup: if (!pblk_line_init_metadata(pblk, new, cur)) { new = pblk_line_retry(pblk, new); @@ -1575,19 +1603,6 @@ struct pblk_line *pblk_line_replace_data(struct pblk *pblk) return new; } -void pblk_line_free(struct pblk_line *line) -{ - kfree(line->map_bitmap); - kfree(line->invalid_bitmap); - - *line->vsc = cpu_to_le32(EMPTY_ENTRY); - - line->map_bitmap = NULL; - line->invalid_bitmap = NULL; - line->smeta = NULL; - line->emeta = NULL; -} - static void __pblk_line_put(struct pblk *pblk, struct pblk_line *line) { struct pblk_line_mgmt *l_mg = &pblk->l_mg; -- 2.11.0