linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] LightNVM patches for next 4.5-rc
@ 2016-02-19 12:56 Matias Bjørling
  2016-02-19 12:56 ` [PATCH 1/3] lightnvm: fix up nonsensical configure overrun checking Matias Bjørling
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Matias Bjørling @ 2016-02-19 12:56 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe; +Cc: Matias Bjørling

Hi Jens,

Here is a couple of patches for the next 4.5-rc.

A patch from Alan that fixes up logic in nvm_configure_get. Another
patch from Javier that fixes a bug with multiple luns in RRPC, and at
last a patch from me that fixes the get bad block interface when
multiple planes are available on the media.

Please pick up when convenient.

Thanks,
Matias

Alan (1):
  lightnvm: fix up nonsensical configure overrun checking

Javier González (1):
  lightnvm: generalize rrpc ppa calculations

Matias Bjørling (1):
  lightnvm: fold get bb tbl when using dual/quad plane mode

 drivers/lightnvm/core.c      | 13 ++++++------
 drivers/lightnvm/rrpc.c      | 48 ++++++++++++++++++++++++++++----------------
 drivers/lightnvm/rrpc.h      |  9 +++++++++
 drivers/nvme/host/lightnvm.c | 46 +++++++++++++++++++++++++++++++++++++-----
 include/linux/lightnvm.h     |  6 +++---
 5 files changed, 90 insertions(+), 32 deletions(-)

-- 
2.1.4

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/3] lightnvm: fix up nonsensical configure overrun checking
  2016-02-19 12:56 [PATCH 0/3] LightNVM patches for next 4.5-rc Matias Bjørling
@ 2016-02-19 12:56 ` Matias Bjørling
  2016-02-19 12:56 ` [PATCH 2/3] lightnvm: fold get bb tbl when using dual/quad plane mode Matias Bjørling
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Matias Bjørling @ 2016-02-19 12:56 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe; +Cc: Alan, Alan Cox, Matias Bjørling

From: Alan <gnomes@lxorguk.ukuu.org.uk>

Instead of checking a constant 0 actually check the space available. Even
better remember to allow for the header and also check the right amount of
space is needed.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Matias Bjørling <m@bjorling.me>
---
 drivers/lightnvm/core.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index c3d4b54..b53632d 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -868,20 +868,19 @@ static int nvm_configure_by_str_event(const char *val,
 
 static int nvm_configure_get(char *buf, const struct kernel_param *kp)
 {
-	int sz = 0;
-	char *buf_start = buf;
+	int sz;
 	struct nvm_dev *dev;
 
-	buf += sprintf(buf, "available devices:\n");
+	sz = sprintf(buf, "available devices:\n");
 	down_write(&nvm_lock);
 	list_for_each_entry(dev, &nvm_devices, devices) {
-		if (sz > 4095 - DISK_NAME_LEN)
+		if (sz > 4095 - DISK_NAME_LEN - 2)
 			break;
-		buf += sprintf(buf, " %32s\n", dev->name);
+		sz += sprintf(buf + sz, " %32s\n", dev->name);
 	}
 	up_write(&nvm_lock);
 
-	return buf - buf_start - 1;
+	return sz;
 }
 
 static const struct kernel_param_ops nvm_configure_by_str_event_param_ops = {
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/3] lightnvm: fold get bb tbl when using dual/quad plane mode
  2016-02-19 12:56 [PATCH 0/3] LightNVM patches for next 4.5-rc Matias Bjørling
  2016-02-19 12:56 ` [PATCH 1/3] lightnvm: fix up nonsensical configure overrun checking Matias Bjørling
@ 2016-02-19 12:56 ` Matias Bjørling
  2016-02-19 12:56 ` [PATCH 3/3] lightnvm: generalize rrpc ppa calculations Matias Bjørling
  2016-02-19 19:15 ` [PATCH 0/3] LightNVM patches for next 4.5-rc Jens Axboe
  3 siblings, 0 replies; 6+ messages in thread
From: Matias Bjørling @ 2016-02-19 12:56 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe; +Cc: Matias Bjørling

When the media manager runs in dual or quad plane mode, lightnvm
abstracts away plane specific commands. This poses a problem for
get bad block table, as it reports bad blocks per plane, making the
table either two or four times bigger than expected. Fold the bad block
list before returning.

Signed-off-by: Matias Bjørling <m@bjorling.me>
---
 drivers/lightnvm/core.c      |  2 +-
 drivers/nvme/host/lightnvm.c | 46 +++++++++++++++++++++++++++++++++++++++-----
 include/linux/lightnvm.h     |  6 +++---
 3 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index b53632d..0d1fb6b 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -250,7 +250,7 @@ int nvm_set_rqd_ppalist(struct nvm_dev *dev, struct nvm_rq *rqd,
 		return 0;
 	}
 
-	plane_cnt = (1 << dev->plane_mode);
+	plane_cnt = dev->plane_mode;
 	rqd->nr_pages = plane_cnt * nr_ppas;
 
 	if (dev->ops->max_phys_sect < rqd->nr_pages)
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index 55dab93..513a59c 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -379,8 +379,31 @@ out:
 	return ret;
 }
 
+static void nvme_nvm_bb_tbl_fold(struct nvm_dev *nvmdev,
+						int nr_dst_blks, u8 *dst_blks,
+						int nr_src_blks, u8 *src_blks)
+{
+	int blk, offset, pl, blktype;
+
+	for (blk = 0; blk < nr_dst_blks; blk++) {
+		offset = blk * nvmdev->plane_mode;
+		blktype = src_blks[offset];
+
+		/* Bad blocks on any planes take precedence over other types */
+		for (pl = 0; pl < nvmdev->plane_mode; pl++) {
+			if (src_blks[offset + pl] &
+					(NVM_BLK_T_BAD|NVM_BLK_T_GRWN_BAD)) {
+				blktype = src_blks[offset + pl];
+				break;
+			}
+		}
+
+		dst_blks[blk] = blktype;
+	}
+}
+
 static int nvme_nvm_get_bb_tbl(struct nvm_dev *nvmdev, struct ppa_addr ppa,
-				int nr_blocks, nvm_bb_update_fn *update_bbtbl,
+				int nr_dst_blks, nvm_bb_update_fn *update_bbtbl,
 				void *priv)
 {
 	struct request_queue *q = nvmdev->q;
@@ -388,7 +411,9 @@ static int nvme_nvm_get_bb_tbl(struct nvm_dev *nvmdev, struct ppa_addr ppa,
 	struct nvme_ctrl *ctrl = ns->ctrl;
 	struct nvme_nvm_command c = {};
 	struct nvme_nvm_bb_tbl *bb_tbl;
-	int tblsz = sizeof(struct nvme_nvm_bb_tbl) + nr_blocks;
+	u8 *dst_blks = NULL;
+	int nr_src_blks = nr_dst_blks * nvmdev->plane_mode;
+	int tblsz = sizeof(struct nvme_nvm_bb_tbl) + nr_src_blks;
 	int ret = 0;
 
 	c.get_bb.opcode = nvme_nvm_admin_get_bb_tbl;
@@ -399,6 +424,12 @@ static int nvme_nvm_get_bb_tbl(struct nvm_dev *nvmdev, struct ppa_addr ppa,
 	if (!bb_tbl)
 		return -ENOMEM;
 
+	dst_blks = kzalloc(nr_dst_blks, GFP_KERNEL);
+	if (!dst_blks) {
+		ret = -ENOMEM;
+		goto out;
+	}
+
 	ret = nvme_submit_sync_cmd(ctrl->admin_q, (struct nvme_command *)&c,
 								bb_tbl, tblsz);
 	if (ret) {
@@ -420,16 +451,21 @@ static int nvme_nvm_get_bb_tbl(struct nvm_dev *nvmdev, struct ppa_addr ppa,
 		goto out;
 	}
 
-	if (le32_to_cpu(bb_tbl->tblks) != nr_blocks) {
+	if (le32_to_cpu(bb_tbl->tblks) != nr_src_blks) {
 		ret = -EINVAL;
 		dev_err(ctrl->dev, "bbt unsuspected blocks returned (%u!=%u)",
-					le32_to_cpu(bb_tbl->tblks), nr_blocks);
+				le32_to_cpu(bb_tbl->tblks), nr_src_blks);
 		goto out;
 	}
 
+	nvme_nvm_bb_tbl_fold(nvmdev, nr_dst_blks, dst_blks,
+						nr_src_blks, bb_tbl->blk);
+
 	ppa = dev_to_generic_addr(nvmdev, ppa);
-	ret = update_bbtbl(ppa, nr_blocks, bb_tbl->blk, priv);
+	ret = update_bbtbl(ppa, nr_dst_blks, dst_blks, priv);
+
 out:
+	kfree(dst_blks);
 	kfree(bb_tbl);
 	return ret;
 }
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index 08c1e14..c3c4318 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -92,9 +92,9 @@ enum {
 	NVM_ADDRMODE_CHANNEL	= 1,
 
 	/* Plane programming mode for LUN */
-	NVM_PLANE_SINGLE	= 0,
-	NVM_PLANE_DOUBLE	= 1,
-	NVM_PLANE_QUAD		= 2,
+	NVM_PLANE_SINGLE	= 1,
+	NVM_PLANE_DOUBLE	= 2,
+	NVM_PLANE_QUAD		= 4,
 
 	/* Status codes */
 	NVM_RSP_SUCCESS		= 0x0,
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/3] lightnvm: generalize rrpc ppa calculations
  2016-02-19 12:56 [PATCH 0/3] LightNVM patches for next 4.5-rc Matias Bjørling
  2016-02-19 12:56 ` [PATCH 1/3] lightnvm: fix up nonsensical configure overrun checking Matias Bjørling
  2016-02-19 12:56 ` [PATCH 2/3] lightnvm: fold get bb tbl when using dual/quad plane mode Matias Bjørling
@ 2016-02-19 12:56 ` Matias Bjørling
  2016-02-19 19:15 ` [PATCH 0/3] LightNVM patches for next 4.5-rc Jens Axboe
  3 siblings, 0 replies; 6+ messages in thread
From: Matias Bjørling @ 2016-02-19 12:56 UTC (permalink / raw)
  To: linux-block, linux-kernel, axboe
  Cc: Javier González, Javier González, Matias Bjørling

From: Javier González <jg@lightnvm.io>

In rrpc, some calculations assume a certain configuration (e.g., 1 LUN,
1 sector per page). The reason behind this was that LightNVM used a
simple configuration with QEMU to test core features in the beginning.
This patch relaxes these assumptions and generalizes calculation,
allowing multiple luns to be used.

Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <m@bjorling.me>
---
 drivers/lightnvm/rrpc.c | 48 +++++++++++++++++++++++++++++++-----------------
 drivers/lightnvm/rrpc.h |  9 +++++++++
 2 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
index 775bf6c2..8234378 100644
--- a/drivers/lightnvm/rrpc.c
+++ b/drivers/lightnvm/rrpc.c
@@ -38,7 +38,7 @@ static void rrpc_page_invalidate(struct rrpc *rrpc, struct rrpc_addr *a)
 
 	spin_lock(&rblk->lock);
 
-	div_u64_rem(a->addr, rrpc->dev->pgs_per_blk, &pg_offset);
+	div_u64_rem(a->addr, rrpc->dev->sec_per_blk, &pg_offset);
 	WARN_ON(test_and_set_bit(pg_offset, rblk->invalid_pages));
 	rblk->nr_invalid_pages++;
 
@@ -113,14 +113,24 @@ static void rrpc_discard(struct rrpc *rrpc, struct bio *bio)
 
 static int block_is_full(struct rrpc *rrpc, struct rrpc_block *rblk)
 {
-	return (rblk->next_page == rrpc->dev->pgs_per_blk);
+	return (rblk->next_page == rrpc->dev->sec_per_blk);
 }
 
+/* Calculate relative addr for the given block, considering instantiated LUNs */
+static u64 block_to_rel_addr(struct rrpc *rrpc, struct rrpc_block *rblk)
+{
+	struct nvm_block *blk = rblk->parent;
+	int lun_blk = blk->id % (rrpc->dev->blks_per_lun * rrpc->nr_luns);
+
+	return lun_blk * rrpc->dev->sec_per_blk;
+}
+
+/* Calculate global addr for the given block */
 static u64 block_to_addr(struct rrpc *rrpc, struct rrpc_block *rblk)
 {
 	struct nvm_block *blk = rblk->parent;
 
-	return blk->id * rrpc->dev->pgs_per_blk;
+	return blk->id * rrpc->dev->sec_per_blk;
 }
 
 static struct ppa_addr linear_to_generic_addr(struct nvm_dev *dev,
@@ -136,7 +146,7 @@ static struct ppa_addr linear_to_generic_addr(struct nvm_dev *dev,
 	l.g.sec = secs;
 
 	sector_div(ppa, dev->sec_per_pg);
-	div_u64_rem(ppa, dev->sec_per_blk, &pgs);
+	div_u64_rem(ppa, dev->pgs_per_blk, &pgs);
 	l.g.pg = pgs;
 
 	sector_div(ppa, dev->pgs_per_blk);
@@ -191,12 +201,12 @@ static struct rrpc_block *rrpc_get_blk(struct rrpc *rrpc, struct rrpc_lun *rlun,
 		return NULL;
 	}
 
-	rblk = &rlun->blocks[blk->id];
+	rblk = rrpc_get_rblk(rlun, blk->id);
 	list_add_tail(&rblk->list, &rlun->open_list);
 	spin_unlock(&lun->lock);
 
 	blk->priv = rblk;
-	bitmap_zero(rblk->invalid_pages, rrpc->dev->pgs_per_blk);
+	bitmap_zero(rblk->invalid_pages, rrpc->dev->sec_per_blk);
 	rblk->next_page = 0;
 	rblk->nr_invalid_pages = 0;
 	atomic_set(&rblk->data_cmnt_size, 0);
@@ -286,11 +296,11 @@ static int rrpc_move_valid_pages(struct rrpc *rrpc, struct rrpc_block *rblk)
 	struct bio *bio;
 	struct page *page;
 	int slot;
-	int nr_pgs_per_blk = rrpc->dev->pgs_per_blk;
+	int nr_sec_per_blk = rrpc->dev->sec_per_blk;
 	u64 phys_addr;
 	DECLARE_COMPLETION_ONSTACK(wait);
 
-	if (bitmap_full(rblk->invalid_pages, nr_pgs_per_blk))
+	if (bitmap_full(rblk->invalid_pages, nr_sec_per_blk))
 		return 0;
 
 	bio = bio_alloc(GFP_NOIO, 1);
@@ -306,10 +316,10 @@ static int rrpc_move_valid_pages(struct rrpc *rrpc, struct rrpc_block *rblk)
 	}
 
 	while ((slot = find_first_zero_bit(rblk->invalid_pages,
-					    nr_pgs_per_blk)) < nr_pgs_per_blk) {
+					    nr_sec_per_blk)) < nr_sec_per_blk) {
 
 		/* Lock laddr */
-		phys_addr = (rblk->parent->id * nr_pgs_per_blk) + slot;
+		phys_addr = rblk->parent->id * nr_sec_per_blk + slot;
 
 try:
 		spin_lock(&rrpc->rev_lock);
@@ -381,7 +391,7 @@ finished:
 	mempool_free(page, rrpc->page_pool);
 	bio_put(bio);
 
-	if (!bitmap_full(rblk->invalid_pages, nr_pgs_per_blk)) {
+	if (!bitmap_full(rblk->invalid_pages, nr_sec_per_blk)) {
 		pr_err("nvm: failed to garbage collect block\n");
 		return -EIO;
 	}
@@ -677,7 +687,7 @@ static void rrpc_end_io_write(struct rrpc *rrpc, struct rrpc_rq *rrqd,
 		lun = rblk->parent->lun;
 
 		cmnt_size = atomic_inc_return(&rblk->data_cmnt_size);
-		if (unlikely(cmnt_size == rrpc->dev->pgs_per_blk))
+		if (unlikely(cmnt_size == rrpc->dev->sec_per_blk))
 			rrpc_run_gc(rrpc, rblk);
 	}
 }
@@ -1014,6 +1024,7 @@ static int rrpc_l2p_update(u64 slba, u32 nlb, __le64 *entries, void *private)
 
 	for (i = 0; i < nlb; i++) {
 		u64 pba = le64_to_cpu(entries[i]);
+		unsigned int mod;
 		/* LNVM treats address-spaces as silos, LBA and PBA are
 		 * equally large and zero-indexed.
 		 */
@@ -1029,8 +1040,10 @@ static int rrpc_l2p_update(u64 slba, u32 nlb, __le64 *entries, void *private)
 		if (!pba)
 			continue;
 
+		div_u64_rem(pba, rrpc->nr_sects, &mod);
+
 		addr[i].addr = pba;
-		raddr[pba].addr = slba + i;
+		raddr[mod].addr = slba + i;
 	}
 
 	return 0;
@@ -1137,7 +1150,7 @@ static int rrpc_luns_init(struct rrpc *rrpc, int lun_begin, int lun_end)
 	struct rrpc_lun *rlun;
 	int i, j;
 
-	if (dev->pgs_per_blk > MAX_INVALID_PAGES_STORAGE * BITS_PER_LONG) {
+	if (dev->sec_per_blk > MAX_INVALID_PAGES_STORAGE * BITS_PER_LONG) {
 		pr_err("rrpc: number of pages per block too high.");
 		return -EINVAL;
 	}
@@ -1238,10 +1251,11 @@ static void rrpc_block_map_update(struct rrpc *rrpc, struct rrpc_block *rblk)
 	struct nvm_dev *dev = rrpc->dev;
 	int offset;
 	struct rrpc_addr *laddr;
-	u64 paddr, pladdr;
+	u64 bpaddr, paddr, pladdr;
 
-	for (offset = 0; offset < dev->pgs_per_blk; offset++) {
-		paddr = block_to_addr(rrpc, rblk) + offset;
+	bpaddr = block_to_rel_addr(rrpc, rblk);
+	for (offset = 0; offset < dev->sec_per_blk; offset++) {
+		paddr = bpaddr + offset;
 
 		pladdr = rrpc->rev_trans_map[paddr].addr;
 		if (pladdr == ADDR_EMPTY)
diff --git a/drivers/lightnvm/rrpc.h b/drivers/lightnvm/rrpc.h
index 3989d65..855f4a5 100644
--- a/drivers/lightnvm/rrpc.h
+++ b/drivers/lightnvm/rrpc.h
@@ -156,6 +156,15 @@ struct rrpc_rev_addr {
 	u64 addr;
 };
 
+static inline struct rrpc_block *rrpc_get_rblk(struct rrpc_lun *rlun,
+								int blk_id)
+{
+	struct rrpc *rrpc = rlun->rrpc;
+	int lun_blk = blk_id % rrpc->dev->blks_per_lun;
+
+	return &rlun->blocks[lun_blk];
+}
+
 static inline sector_t rrpc_get_laddr(struct bio *bio)
 {
 	return bio->bi_iter.bi_sector / NR_PHY_IN_LOG;
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] LightNVM patches for next 4.5-rc
  2016-02-19 12:56 [PATCH 0/3] LightNVM patches for next 4.5-rc Matias Bjørling
                   ` (2 preceding siblings ...)
  2016-02-19 12:56 ` [PATCH 3/3] lightnvm: generalize rrpc ppa calculations Matias Bjørling
@ 2016-02-19 19:15 ` Jens Axboe
  2016-02-20  3:39   ` Jens Axboe
  3 siblings, 1 reply; 6+ messages in thread
From: Jens Axboe @ 2016-02-19 19:15 UTC (permalink / raw)
  To: Matias Bjørling; +Cc: linux-block, linux-kernel

On Fri, Feb 19 2016, Matias Bjørling wrote:
> Hi Jens,
> 
> Here is a couple of patches for the next 4.5-rc.
> 
> A patch from Alan that fixes up logic in nvm_configure_get. Another
> patch from Javier that fixes a bug with multiple luns in RRPC, and at
> last a patch from me that fixes the get bad block interface when
> multiple planes are available on the media.

Applied, but you need to update your patch base, patch #3 needed to be
hand applied because your repo does not have the below applied.

commit ff0e498bfa185fad5e86c4c7a2db4f9648d2344f
Author: Javier González <jg@lightnvm.io>
Date:   Tue Jan 12 07:49:33 2016 +0100

    lightnvm: manage open and closed blocks separately

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] LightNVM patches for next 4.5-rc
  2016-02-19 19:15 ` [PATCH 0/3] LightNVM patches for next 4.5-rc Jens Axboe
@ 2016-02-20  3:39   ` Jens Axboe
  0 siblings, 0 replies; 6+ messages in thread
From: Jens Axboe @ 2016-02-20  3:39 UTC (permalink / raw)
  To: Matias Bjørling; +Cc: linux-block, linux-kernel

On 02/19/2016 12:15 PM, Jens Axboe wrote:
> On Fri, Feb 19 2016, Matias Bjørling wrote:
>> Hi Jens,
>>
>> Here is a couple of patches for the next 4.5-rc.
>>
>> A patch from Alan that fixes up logic in nvm_configure_get. Another
>> patch from Javier that fixes a bug with multiple luns in RRPC, and at
>> last a patch from me that fixes the get bad block interface when
>> multiple planes are available on the media.
>
> Applied, but you need to update your patch base, patch #3 needed to be
> hand applied because your repo does not have the below applied.
>
> commit ff0e498bfa185fad5e86c4c7a2db4f9648d2344f
> Author: Javier González <jg@lightnvm.io>
> Date:   Tue Jan 12 07:49:33 2016 +0100
>
>      lightnvm: manage open and closed blocks separately

And even after that, it's broken:

drivers/lightnvm/rrpc.c: In function ‘rrpc_l2p_update’:
drivers/lightnvm/rrpc.c:1047:24: error: ‘struct rrpc’ has no member 
named ‘nr_sects’
    div_u64_rem(pba, rrpc->nr_sects, &mod);
                         ^
I've dropped that patch. You need to step it up, that's way too lax for 
something destined for the current series at -rc4 time.

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-02-20  3:39 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-19 12:56 [PATCH 0/3] LightNVM patches for next 4.5-rc Matias Bjørling
2016-02-19 12:56 ` [PATCH 1/3] lightnvm: fix up nonsensical configure overrun checking Matias Bjørling
2016-02-19 12:56 ` [PATCH 2/3] lightnvm: fold get bb tbl when using dual/quad plane mode Matias Bjørling
2016-02-19 12:56 ` [PATCH 3/3] lightnvm: generalize rrpc ppa calculations Matias Bjørling
2016-02-19 19:15 ` [PATCH 0/3] LightNVM patches for next 4.5-rc Jens Axboe
2016-02-20  3:39   ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).