forked from Minki/linux
lightnvm: remove open/close statistics for gennvm
The responsibility of the media manager is not to keep track of open/closed blocks. This is better maintained within a target, that already manages this information on writes. Remove the statistics and merge the states NVM_BLK_ST_OPEN and NVM_BLK_ST_CLOSED. Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
12624af26e
commit
077d238999
@ -122,9 +122,6 @@ static int gennvm_luns_init(struct nvm_dev *dev, struct gen_nvm *gn)
|
|||||||
lun->vlun.lun_id = i % dev->luns_per_chnl;
|
lun->vlun.lun_id = i % dev->luns_per_chnl;
|
||||||
lun->vlun.chnl_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_free_blocks = dev->blks_per_lun;
|
||||||
lun->vlun.nr_open_blocks = 0;
|
|
||||||
lun->vlun.nr_closed_blocks = 0;
|
|
||||||
lun->vlun.nr_bad_blocks = 0;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -149,7 +146,6 @@ static int gennvm_block_bb(struct gen_nvm *gn, struct ppa_addr ppa,
|
|||||||
|
|
||||||
blk = &lun->vlun.blocks[i];
|
blk = &lun->vlun.blocks[i];
|
||||||
list_move_tail(&blk->list, &lun->bb_list);
|
list_move_tail(&blk->list, &lun->bb_list);
|
||||||
lun->vlun.nr_bad_blocks++;
|
|
||||||
lun->vlun.nr_free_blocks--;
|
lun->vlun.nr_free_blocks--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,9 +196,8 @@ static int gennvm_block_map(u64 slba, u32 nlb, __le64 *entries, void *private)
|
|||||||
* block state. The block is assumed to be open.
|
* block state. The block is assumed to be open.
|
||||||
*/
|
*/
|
||||||
list_move_tail(&blk->list, &lun->used_list);
|
list_move_tail(&blk->list, &lun->used_list);
|
||||||
blk->state = NVM_BLK_ST_OPEN;
|
blk->state = NVM_BLK_ST_TGT;
|
||||||
lun->vlun.nr_free_blocks--;
|
lun->vlun.nr_free_blocks--;
|
||||||
lun->vlun.nr_open_blocks++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,11 +341,10 @@ static struct nvm_block *gennvm_get_blk_unlocked(struct nvm_dev *dev,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
blk = list_first_entry(&lun->free_list, struct nvm_block, list);
|
blk = list_first_entry(&lun->free_list, struct nvm_block, list);
|
||||||
list_move_tail(&blk->list, &lun->used_list);
|
|
||||||
blk->state = NVM_BLK_ST_OPEN;
|
|
||||||
|
|
||||||
|
list_move_tail(&blk->list, &lun->used_list);
|
||||||
|
blk->state = NVM_BLK_ST_TGT;
|
||||||
lun->vlun.nr_free_blocks--;
|
lun->vlun.nr_free_blocks--;
|
||||||
lun->vlun.nr_open_blocks++;
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return blk;
|
return blk;
|
||||||
@ -374,27 +368,18 @@ static void gennvm_put_blk_unlocked(struct nvm_dev *dev, struct nvm_block *blk)
|
|||||||
|
|
||||||
assert_spin_locked(&vlun->lock);
|
assert_spin_locked(&vlun->lock);
|
||||||
|
|
||||||
if (blk->state & NVM_BLK_ST_OPEN) {
|
if (blk->state & NVM_BLK_ST_TGT) {
|
||||||
list_move_tail(&blk->list, &lun->free_list);
|
list_move_tail(&blk->list, &lun->free_list);
|
||||||
lun->vlun.nr_open_blocks--;
|
|
||||||
lun->vlun.nr_free_blocks++;
|
|
||||||
blk->state = NVM_BLK_ST_FREE;
|
|
||||||
} else if (blk->state & NVM_BLK_ST_CLOSED) {
|
|
||||||
list_move_tail(&blk->list, &lun->free_list);
|
|
||||||
lun->vlun.nr_closed_blocks--;
|
|
||||||
lun->vlun.nr_free_blocks++;
|
lun->vlun.nr_free_blocks++;
|
||||||
blk->state = NVM_BLK_ST_FREE;
|
blk->state = NVM_BLK_ST_FREE;
|
||||||
} else if (blk->state & NVM_BLK_ST_BAD) {
|
} else if (blk->state & NVM_BLK_ST_BAD) {
|
||||||
list_move_tail(&blk->list, &lun->bb_list);
|
list_move_tail(&blk->list, &lun->bb_list);
|
||||||
lun->vlun.nr_bad_blocks++;
|
|
||||||
blk->state = NVM_BLK_ST_BAD;
|
blk->state = NVM_BLK_ST_BAD;
|
||||||
} else {
|
} else {
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
pr_err("gennvm: erroneous block type (%lu -> %u)\n",
|
pr_err("gennvm: erroneous block type (%lu -> %u)\n",
|
||||||
blk->id, blk->state);
|
blk->id, blk->state);
|
||||||
list_move_tail(&blk->list, &lun->bb_list);
|
list_move_tail(&blk->list, &lun->bb_list);
|
||||||
lun->vlun.nr_bad_blocks++;
|
|
||||||
blk->state = NVM_BLK_ST_BAD;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -516,12 +501,8 @@ static void gennvm_lun_info_print(struct nvm_dev *dev)
|
|||||||
gennvm_for_each_lun(gn, lun, i) {
|
gennvm_for_each_lun(gn, lun, i) {
|
||||||
spin_lock(&lun->vlun.lock);
|
spin_lock(&lun->vlun.lock);
|
||||||
|
|
||||||
pr_info("%s: lun%8u\t%u\t%u\t%u\t%u\n",
|
pr_info("%s: lun%8u\t%u\n", dev->name, i,
|
||||||
dev->name, i,
|
lun->vlun.nr_free_blocks);
|
||||||
lun->vlun.nr_free_blocks,
|
|
||||||
lun->vlun.nr_open_blocks,
|
|
||||||
lun->vlun.nr_closed_blocks,
|
|
||||||
lun->vlun.nr_bad_blocks);
|
|
||||||
|
|
||||||
spin_unlock(&lun->vlun.lock);
|
spin_unlock(&lun->vlun.lock);
|
||||||
}
|
}
|
||||||
|
@ -512,17 +512,12 @@ static void rrpc_gc_queue(struct work_struct *work)
|
|||||||
struct rrpc_block *rblk = gcb->rblk;
|
struct rrpc_block *rblk = gcb->rblk;
|
||||||
struct rrpc_lun *rlun = rblk->rlun;
|
struct rrpc_lun *rlun = rblk->rlun;
|
||||||
struct nvm_lun *lun = rblk->parent->lun;
|
struct nvm_lun *lun = rblk->parent->lun;
|
||||||
struct nvm_block *blk = rblk->parent;
|
|
||||||
|
|
||||||
spin_lock(&rlun->lock);
|
spin_lock(&rlun->lock);
|
||||||
list_add_tail(&rblk->prio, &rlun->prio_list);
|
list_add_tail(&rblk->prio, &rlun->prio_list);
|
||||||
spin_unlock(&rlun->lock);
|
spin_unlock(&rlun->lock);
|
||||||
|
|
||||||
spin_lock(&lun->lock);
|
spin_lock(&lun->lock);
|
||||||
lun->nr_open_blocks--;
|
|
||||||
lun->nr_closed_blocks++;
|
|
||||||
blk->state &= ~NVM_BLK_ST_OPEN;
|
|
||||||
blk->state |= NVM_BLK_ST_CLOSED;
|
|
||||||
list_move_tail(&rblk->list, &rlun->closed_list);
|
list_move_tail(&rblk->list, &rlun->closed_list);
|
||||||
spin_unlock(&lun->lock);
|
spin_unlock(&lun->lock);
|
||||||
|
|
||||||
|
@ -269,24 +269,15 @@ struct nvm_lun {
|
|||||||
int lun_id;
|
int lun_id;
|
||||||
int chnl_id;
|
int chnl_id;
|
||||||
|
|
||||||
/* It is up to the target to mark blocks as closed. If the target does
|
|
||||||
* not do it, all blocks are marked as open, and nr_open_blocks
|
|
||||||
* represents the number of blocks in use
|
|
||||||
*/
|
|
||||||
unsigned int nr_open_blocks; /* Number of used, writable blocks */
|
|
||||||
unsigned int nr_closed_blocks; /* Number of used, read-only blocks */
|
|
||||||
unsigned int nr_free_blocks; /* Number of unused blocks */
|
|
||||||
unsigned int nr_bad_blocks; /* Number of bad blocks */
|
|
||||||
|
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
|
|
||||||
|
unsigned int nr_free_blocks; /* Number of unused blocks */
|
||||||
struct nvm_block *blocks;
|
struct nvm_block *blocks;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NVM_BLK_ST_FREE = 0x1, /* Free block */
|
NVM_BLK_ST_FREE = 0x1, /* Free block */
|
||||||
NVM_BLK_ST_OPEN = 0x2, /* Open block - read-write */
|
NVM_BLK_ST_TGT = 0x2, /* Block in use by target */
|
||||||
NVM_BLK_ST_CLOSED = 0x4, /* Closed block - read-only */
|
|
||||||
NVM_BLK_ST_BAD = 0x8, /* Bad block */
|
NVM_BLK_ST_BAD = 0x8, /* Bad block */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user