From patchwork Fri Nov 20 09:01:24 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Javier_Gonz=C3=A1lez?= X-Patchwork-Id: 7666111 X-Patchwork-Delegate: axboe@kernel.dk Return-Path: X-Original-To: patchwork-linux-block@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 23D339F392 for ; Fri, 20 Nov 2015 09:02:01 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 367082043C for ; Fri, 20 Nov 2015 09:02:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4503C20435 for ; Fri, 20 Nov 2015 09:01:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934867AbbKTJBe (ORCPT ); Fri, 20 Nov 2015 04:01:34 -0500 Received: from mail-wm0-f48.google.com ([74.125.82.48]:33338 "EHLO mail-wm0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934844AbbKTJBd (ORCPT ); Fri, 20 Nov 2015 04:01:33 -0500 Received: by wmec201 with SMTP id c201so62145390wme.0 for ; Fri, 20 Nov 2015 01:01:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=rsFtaF318OlrCip5eNdcy1dVMBPOlbp1pine5OfnbJ0=; b=TC1eDYL284bXjtbKGsCyIvzkpteCTdA/g1vaLsW4Et6iz0CtmagTXCFQzJ1EwVqsV7 H5S2w62SYBfVaVp79mSWQLr3eyzchp5vwMorfFptzUfx0b7A823RwMvC4DMTCd1x/0V2 19odJ3cjddLPWGQQ789NsO+bo3XHA7TIT744YVmdu2TJhRzQpTuYSy5nhbWZRMJi2eoH rbdI94oLyctA27mI9aocTfEspkUe463MxmD+/4HhAW9pt2Wcr5e+rrUEwd0e0YUbFofk jdfXII4rfcxARbO0fi1tzvwfey6Q6TEDpMc1004RDnGvL0tzLoSsMuEL68Hkf+VS2KYv aODA== 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; bh=rsFtaF318OlrCip5eNdcy1dVMBPOlbp1pine5OfnbJ0=; b=bBjOK3drybYgtfGboXRl1OZ7ezAwkXJ0tXE/ulkEgX8UAD9IfSAjx6BtNYPhuYcMz/ TseWMUzjxRh/Xd8GlXJzpItMwx+mdqvyEJg0BaJ+Hs44Q9OHzAKwiKdPynGZ0NnWqJ7G FOkdbdCR8pGDYEShM4EMyYUwTvAByC9C50oPTrTokOjprbFP5+EGWhsHKNgp/bP+ySnc fHmJHUqmXTXOpbIFZDmoWOU72K/7tGv8Uugw+yTWARPyLEAzvLvuU6SlmREMtJRhVuCV lPhnBIURVuRxLQgIWEJuIiPSEI3maozxK0brUs/7ihmPBh3CUefDCGArwiRzloQZamBP FD1g== X-Gm-Message-State: ALoCoQk12GyjqQCZv2YgHyyqucROAXDdXZ87TK5Ey+aVyKwX/A3/DGBaN022ht0fa0/N2PfmLmWT X-Received: by 10.28.170.19 with SMTP id t19mr953228wme.65.1448010092038; Fri, 20 Nov 2015 01:01:32 -0800 (PST) Received: from localhost.localdomain (6164198-cl69.boa.fiberby.dk. [193.106.164.198]) by smtp.gmail.com with ESMTPSA id c194sm1763826wmd.13.2015.11.20.01.01.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 20 Nov 2015 01:01:31 -0800 (PST) From: Javier Gonzalez To: m@bjorling.me, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Cc: javier@javigon.com, Javier Gonzalez Subject: [PATCH 1/2] lightnvm: keep track of block counts Date: Fri, 20 Nov 2015 10:01:24 +0100 Message-Id: <1448010085-31281-1-git-send-email-javier@javigon.com> X-Mailer: git-send-email 2.1.4 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable 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 Maintain number of in use blocks, free blocks, and bad blocks in a per lun basis. This allows the upper layers to get information about the state of each lun. Also, account for blocks reserved to the device on the free block count. nr_free_blocks matches now the actual number of blocks on the free list when the device is booted. Signed-off-by: Javier Gonzalez --- drivers/lightnvm/gennvm.c | 14 +++++++++++++- include/linux/lightnvm.h | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c index c0d0eb2..43c01e0 100644 --- a/drivers/lightnvm/gennvm.c +++ b/drivers/lightnvm/gennvm.c @@ -60,6 +60,8 @@ static int gennvm_luns_init(struct nvm_dev *dev, struct gen_nvm *gn) lun->vlun.lun_id = i % dev->luns_per_chnl; lun->vlun.chnl_id = i / dev->luns_per_chnl; lun->vlun.nr_free_blocks = dev->blks_per_lun; + lun->vlun.nr_inuse_blocks = 0; + lun->vlun.nr_bad_blocks = 0; } return 0; } @@ -87,6 +89,7 @@ static int gennvm_block_bb(struct ppa_addr ppa, int nr_blocks, u8 *blks, } list_move_tail(&blk->list, &lun->bb_list); + lun->vlun.nr_bad_blocks++; } return 0; @@ -139,6 +142,7 @@ static int gennvm_block_map(u64 slba, u32 nlb, __le64 *entries, void *private) list_move_tail(&blk->list, &lun->used_list); blk->type = 1; lun->vlun.nr_free_blocks--; + lun->vlun.nr_inuse_blocks++; } } @@ -167,8 +171,10 @@ static int gennvm_blocks_init(struct nvm_dev *dev, struct gen_nvm *gn) block->id = cur_block_id++; /* First block is reserved for device */ - if (unlikely(lun_iter == 0 && blk_iter == 0)) + if (unlikely(lun_iter == 0 && blk_iter == 0)) { + lun->vlun.nr_free_blocks--; continue; + } list_add_tail(&block->list, &lun->free_list); } @@ -266,6 +272,7 @@ static struct nvm_block *gennvm_get_blk(struct nvm_dev *dev, blk->type = 1; lun->vlun.nr_free_blocks--; + lun->vlun.nr_inuse_blocks++; spin_unlock(&vlun->lock); out: @@ -283,16 +290,21 @@ static void gennvm_put_blk(struct nvm_dev *dev, struct nvm_block *blk) case 1: list_move_tail(&blk->list, &lun->free_list); lun->vlun.nr_free_blocks++; + lun->vlun.nr_inuse_blocks--; blk->type = 0; break; case 2: list_move_tail(&blk->list, &lun->bb_list); + lun->vlun.nr_bad_blocks++; + lun->vlun.nr_inuse_blocks--; break; default: WARN_ON_ONCE(1); pr_err("gennvm: erroneous block type (%lu -> %u)\n", blk->id, blk->type); list_move_tail(&blk->list, &lun->bb_list); + lun->vlun.nr_bad_blocks++; + lun->vlun.nr_inuse_blocks--; } spin_unlock(&vlun->lock); diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h index 2581cea..76acd15 100644 --- a/include/linux/lightnvm.h +++ b/include/linux/lightnvm.h @@ -213,7 +213,9 @@ struct nvm_lun { int lun_id; int chnl_id; + unsigned int nr_inuse_blocks; /* Number of used blocks */ unsigned int nr_free_blocks; /* Number of unused blocks */ + unsigned int nr_bad_blocks; /* Number of bad blocks */ struct nvm_block *blocks; spinlock_t lock;