All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Matias Bjørling" <m@bjorling.me>
To: axboe@fb.com
Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Javier González" <javier@cnexlabs.com>,
	"Matias Bjørling" <m@bjorling.me>
Subject: [GIT PULL 18/58] lightnvm: pblk: simplify work_queue mempool
Date: Fri, 13 Oct 2017 14:46:07 +0200	[thread overview]
Message-ID: <20171013124647.32668-19-m@bjorling.me> (raw)
In-Reply-To: <20171013124647.32668-1-m@bjorling.me>

From: Javier González <javier@cnexlabs.com>

In pblk, we have a mempool to allocate a generic structure that we
pass along workqueues. This is heavily used in the GC path in order
to have enough inflight reads and fully utilize the GC bandwidth.

However, the current GC path copies data to the host memory and puts it
back into the write buffer. This requires a vmalloc allocation for the
data and a memory copy. Thus, guaranteeing the allocation by using a
mempool for the structure in itself does not give us much. Until we
implement support for vector copy to avoid moving data through the host,
just allocate the workqueue structure using kmalloc.

This allows us to have a much smaller mempool.

Reported-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <m@bjorling.me>
---
 drivers/lightnvm/pblk-core.c  | 13 +++++++------
 drivers/lightnvm/pblk-gc.c    | 32 ++++++++++++++++----------------
 drivers/lightnvm/pblk-init.c  | 32 ++++++++++++++++----------------
 drivers/lightnvm/pblk-write.c |  4 ++--
 drivers/lightnvm/pblk.h       | 11 ++++++-----
 5 files changed, 47 insertions(+), 45 deletions(-)

diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index f5fbb9a..b925322 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -33,7 +33,8 @@ static void pblk_mark_bb(struct pblk *pblk, struct pblk_line *line,
 		pr_err("pblk: attempted to erase bb: line:%d, pos:%d\n",
 							line->id, pos);
 
-	pblk_line_run_ws(pblk, NULL, ppa, pblk_line_mark_bb, pblk->bb_wq);
+	pblk_gen_run_ws(pblk, NULL, ppa, pblk_line_mark_bb,
+						GFP_ATOMIC, pblk->bb_wq);
 }
 
 static void __pblk_end_io_erase(struct pblk *pblk, struct nvm_rq *rqd)
@@ -1623,7 +1624,7 @@ void pblk_line_close_ws(struct work_struct *work)
 	struct pblk_line *line = line_ws->line;
 
 	pblk_line_close(pblk, line);
-	mempool_free(line_ws, pblk->line_ws_pool);
+	mempool_free(line_ws, pblk->gen_ws_pool);
 }
 
 void pblk_line_mark_bb(struct work_struct *work)
@@ -1648,16 +1649,16 @@ void pblk_line_mark_bb(struct work_struct *work)
 	}
 
 	kfree(ppa);
-	mempool_free(line_ws, pblk->line_ws_pool);
+	mempool_free(line_ws, pblk->gen_ws_pool);
 }
 
-void pblk_line_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv,
-		      void (*work)(struct work_struct *),
+void pblk_gen_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv,
+		      void (*work)(struct work_struct *), gfp_t gfp_mask,
 		      struct workqueue_struct *wq)
 {
 	struct pblk_line_ws *line_ws;
 
-	line_ws = mempool_alloc(pblk->line_ws_pool, GFP_ATOMIC);
+	line_ws = mempool_alloc(pblk->gen_ws_pool, gfp_mask);
 	if (!line_ws)
 		return;
 
diff --git a/drivers/lightnvm/pblk-gc.c b/drivers/lightnvm/pblk-gc.c
index 6090d28..f163829 100644
--- a/drivers/lightnvm/pblk-gc.c
+++ b/drivers/lightnvm/pblk-gc.c
@@ -136,12 +136,12 @@ static void pblk_put_line_back(struct pblk *pblk, struct pblk_line *line)
 
 static void pblk_gc_line_ws(struct work_struct *work)
 {
-	struct pblk_line_ws *line_rq_ws = container_of(work,
+	struct pblk_line_ws *gc_rq_ws = container_of(work,
 						struct pblk_line_ws, ws);
-	struct pblk *pblk = line_rq_ws->pblk;
+	struct pblk *pblk = gc_rq_ws->pblk;
 	struct pblk_gc *gc = &pblk->gc;
-	struct pblk_line *line = line_rq_ws->line;
-	struct pblk_gc_rq *gc_rq = line_rq_ws->priv;
+	struct pblk_line *line = gc_rq_ws->line;
+	struct pblk_gc_rq *gc_rq = gc_rq_ws->priv;
 
 	up(&gc->gc_sem);
 
@@ -151,7 +151,7 @@ static void pblk_gc_line_ws(struct work_struct *work)
 						gc_rq->nr_secs);
 	}
 
-	mempool_free(line_rq_ws, pblk->line_ws_pool);
+	kfree(gc_rq_ws);
 }
 
 static void pblk_gc_line_prepare_ws(struct work_struct *work)
@@ -164,7 +164,7 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work)
 	struct pblk_line_meta *lm = &pblk->lm;
 	struct pblk_gc *gc = &pblk->gc;
 	struct line_emeta *emeta_buf;
-	struct pblk_line_ws *line_rq_ws;
+	struct pblk_line_ws *gc_rq_ws;
 	struct pblk_gc_rq *gc_rq;
 	__le64 *lba_list;
 	int sec_left, nr_secs, bit;
@@ -223,19 +223,19 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work)
 	gc_rq->nr_secs = nr_secs;
 	gc_rq->line = line;
 
-	line_rq_ws = mempool_alloc(pblk->line_ws_pool, GFP_KERNEL);
-	if (!line_rq_ws)
+	gc_rq_ws = kmalloc(sizeof(struct pblk_line_ws), GFP_KERNEL);
+	if (!gc_rq_ws)
 		goto fail_free_gc_rq;
 
-	line_rq_ws->pblk = pblk;
-	line_rq_ws->line = line;
-	line_rq_ws->priv = gc_rq;
+	gc_rq_ws->pblk = pblk;
+	gc_rq_ws->line = line;
+	gc_rq_ws->priv = gc_rq;
 
 	down(&gc->gc_sem);
 	kref_get(&line->ref);
 
-	INIT_WORK(&line_rq_ws->ws, pblk_gc_line_ws);
-	queue_work(gc->gc_line_reader_wq, &line_rq_ws->ws);
+	INIT_WORK(&gc_rq_ws->ws, pblk_gc_line_ws);
+	queue_work(gc->gc_line_reader_wq, &gc_rq_ws->ws);
 
 	sec_left -= nr_secs;
 	if (sec_left > 0)
@@ -243,7 +243,7 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work)
 
 out:
 	pblk_mfree(emeta_buf, l_mg->emeta_alloc_type);
-	mempool_free(line_ws, pblk->line_ws_pool);
+	kfree(line_ws);
 
 	kref_put(&line->ref, pblk_line_put);
 	atomic_dec(&gc->inflight_gc);
@@ -256,7 +256,7 @@ static void pblk_gc_line_prepare_ws(struct work_struct *work)
 	pblk_mfree(emeta_buf, l_mg->emeta_alloc_type);
 	pblk_put_line_back(pblk, line);
 	kref_put(&line->ref, pblk_line_put);
-	mempool_free(line_ws, pblk->line_ws_pool);
+	kfree(line_ws);
 	atomic_dec(&gc->inflight_gc);
 
 	pr_err("pblk: Failed to GC line %d\n", line->id);
@@ -269,7 +269,7 @@ static int pblk_gc_line(struct pblk *pblk, struct pblk_line *line)
 
 	pr_debug("pblk: line '%d' being reclaimed for GC\n", line->id);
 
-	line_ws = mempool_alloc(pblk->line_ws_pool, GFP_KERNEL);
+	line_ws = kmalloc(sizeof(struct pblk_line_ws), GFP_KERNEL);
 	if (!line_ws)
 		return -ENOMEM;
 
diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c
index 7b1f29c..3405522 100644
--- a/drivers/lightnvm/pblk-init.c
+++ b/drivers/lightnvm/pblk-init.c
@@ -20,7 +20,7 @@
 
 #include "pblk.h"
 
-static struct kmem_cache *pblk_blk_ws_cache, *pblk_rec_cache, *pblk_g_rq_cache,
+static struct kmem_cache *pblk_ws_cache, *pblk_rec_cache, *pblk_g_rq_cache,
 				*pblk_w_rq_cache, *pblk_line_meta_cache;
 static DECLARE_RWSEM(pblk_lock);
 struct bio_set *pblk_bio_set;
@@ -184,9 +184,9 @@ static int pblk_init_global_caches(struct pblk *pblk)
 	char cache_name[PBLK_CACHE_NAME_LEN];
 
 	down_write(&pblk_lock);
-	pblk_blk_ws_cache = kmem_cache_create("pblk_blk_ws",
+	pblk_ws_cache = kmem_cache_create("pblk_blk_ws",
 				sizeof(struct pblk_line_ws), 0, 0, NULL);
-	if (!pblk_blk_ws_cache) {
+	if (!pblk_ws_cache) {
 		up_write(&pblk_lock);
 		return -ENOMEM;
 	}
@@ -194,7 +194,7 @@ static int pblk_init_global_caches(struct pblk *pblk)
 	pblk_rec_cache = kmem_cache_create("pblk_rec",
 				sizeof(struct pblk_rec_ctx), 0, 0, NULL);
 	if (!pblk_rec_cache) {
-		kmem_cache_destroy(pblk_blk_ws_cache);
+		kmem_cache_destroy(pblk_ws_cache);
 		up_write(&pblk_lock);
 		return -ENOMEM;
 	}
@@ -202,7 +202,7 @@ static int pblk_init_global_caches(struct pblk *pblk)
 	pblk_g_rq_cache = kmem_cache_create("pblk_g_rq", pblk_g_rq_size,
 				0, 0, NULL);
 	if (!pblk_g_rq_cache) {
-		kmem_cache_destroy(pblk_blk_ws_cache);
+		kmem_cache_destroy(pblk_ws_cache);
 		kmem_cache_destroy(pblk_rec_cache);
 		up_write(&pblk_lock);
 		return -ENOMEM;
@@ -211,7 +211,7 @@ static int pblk_init_global_caches(struct pblk *pblk)
 	pblk_w_rq_cache = kmem_cache_create("pblk_w_rq", pblk_w_rq_size,
 				0, 0, NULL);
 	if (!pblk_w_rq_cache) {
-		kmem_cache_destroy(pblk_blk_ws_cache);
+		kmem_cache_destroy(pblk_ws_cache);
 		kmem_cache_destroy(pblk_rec_cache);
 		kmem_cache_destroy(pblk_g_rq_cache);
 		up_write(&pblk_lock);
@@ -223,7 +223,7 @@ static int pblk_init_global_caches(struct pblk *pblk)
 	pblk_line_meta_cache = kmem_cache_create(cache_name,
 				pblk->lm.sec_bitmap_len, 0, 0, NULL);
 	if (!pblk_line_meta_cache) {
-		kmem_cache_destroy(pblk_blk_ws_cache);
+		kmem_cache_destroy(pblk_ws_cache);
 		kmem_cache_destroy(pblk_rec_cache);
 		kmem_cache_destroy(pblk_g_rq_cache);
 		kmem_cache_destroy(pblk_w_rq_cache);
@@ -246,20 +246,20 @@ static int pblk_core_init(struct pblk *pblk)
 	if (pblk_init_global_caches(pblk))
 		return -ENOMEM;
 
-	/* internal bios can be at most the sectors signaled by the device. */
+	/* Internal bios can be at most the sectors signaled by the device. */
 	pblk->page_bio_pool = mempool_create_page_pool(nvm_max_phys_sects(dev),
 									0);
 	if (!pblk->page_bio_pool)
 		return -ENOMEM;
 
-	pblk->line_ws_pool = mempool_create_slab_pool(PBLK_WS_POOL_SIZE,
-							pblk_blk_ws_cache);
-	if (!pblk->line_ws_pool)
+	pblk->gen_ws_pool = mempool_create_slab_pool(PBLK_GEN_WS_POOL_SIZE,
+							pblk_ws_cache);
+	if (!pblk->gen_ws_pool)
 		goto free_page_bio_pool;
 
 	pblk->rec_pool = mempool_create_slab_pool(geo->nr_luns, pblk_rec_cache);
 	if (!pblk->rec_pool)
-		goto free_blk_ws_pool;
+		goto free_gen_ws_pool;
 
 	pblk->g_rq_pool = mempool_create_slab_pool(PBLK_READ_REQ_POOL_SIZE,
 							pblk_g_rq_cache);
@@ -308,8 +308,8 @@ static int pblk_core_init(struct pblk *pblk)
 	mempool_destroy(pblk->g_rq_pool);
 free_rec_pool:
 	mempool_destroy(pblk->rec_pool);
-free_blk_ws_pool:
-	mempool_destroy(pblk->line_ws_pool);
+free_gen_ws_pool:
+	mempool_destroy(pblk->gen_ws_pool);
 free_page_bio_pool:
 	mempool_destroy(pblk->page_bio_pool);
 	return -ENOMEM;
@@ -324,13 +324,13 @@ static void pblk_core_free(struct pblk *pblk)
 		destroy_workqueue(pblk->bb_wq);
 
 	mempool_destroy(pblk->page_bio_pool);
-	mempool_destroy(pblk->line_ws_pool);
+	mempool_destroy(pblk->gen_ws_pool);
 	mempool_destroy(pblk->rec_pool);
 	mempool_destroy(pblk->g_rq_pool);
 	mempool_destroy(pblk->w_rq_pool);
 	mempool_destroy(pblk->line_meta_pool);
 
-	kmem_cache_destroy(pblk_blk_ws_cache);
+	kmem_cache_destroy(pblk_ws_cache);
 	kmem_cache_destroy(pblk_rec_cache);
 	kmem_cache_destroy(pblk_g_rq_cache);
 	kmem_cache_destroy(pblk_w_rq_cache);
diff --git a/drivers/lightnvm/pblk-write.c b/drivers/lightnvm/pblk-write.c
index d82ca8b..c73b17b 100644
--- a/drivers/lightnvm/pblk-write.c
+++ b/drivers/lightnvm/pblk-write.c
@@ -198,8 +198,8 @@ static void pblk_end_io_write_meta(struct nvm_rq *rqd)
 
 	sync = atomic_add_return(rqd->nr_ppas, &emeta->sync);
 	if (sync == emeta->nr_entries)
-		pblk_line_run_ws(pblk, line, NULL, pblk_line_close_ws,
-								pblk->close_wq);
+		pblk_gen_run_ws(pblk, line, NULL, pblk_line_close_ws,
+						GFP_ATOMIC, pblk->close_wq);
 
 	bio_put(rqd->bio);
 	nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list);
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h
index 229f602..efaa781 100644
--- a/drivers/lightnvm/pblk.h
+++ b/drivers/lightnvm/pblk.h
@@ -40,7 +40,6 @@
 #define PBLK_MAX_REQ_ADDRS (64)
 #define PBLK_MAX_REQ_ADDRS_PW (6)
 
-#define PBLK_WS_POOL_SIZE (128)
 #define PBLK_META_POOL_SIZE (128)
 #define PBLK_READ_REQ_POOL_SIZE (1024)
 
@@ -61,6 +60,8 @@
 
 #define ERASE 2 /* READ = 0, WRITE = 1 */
 
+#define PBLK_GEN_WS_POOL_SIZE (2)
+
 enum {
 	/* IO Types */
 	PBLK_IOTYPE_USER	= 1 << 0,
@@ -621,7 +622,7 @@ struct pblk {
 	struct list_head compl_list;
 
 	mempool_t *page_bio_pool;
-	mempool_t *line_ws_pool;
+	mempool_t *gen_ws_pool;
 	mempool_t *rec_pool;
 	mempool_t *g_rq_pool;
 	mempool_t *w_rq_pool;
@@ -725,9 +726,9 @@ void pblk_line_close_meta_sync(struct pblk *pblk);
 void pblk_line_close_ws(struct work_struct *work);
 void pblk_pipeline_stop(struct pblk *pblk);
 void pblk_line_mark_bb(struct work_struct *work);
-void pblk_line_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv,
-		      void (*work)(struct work_struct *),
-		      struct workqueue_struct *wq);
+void pblk_gen_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv,
+		     void (*work)(struct work_struct *), gfp_t gfp_mask,
+		     struct workqueue_struct *wq);
 u64 pblk_line_smeta_start(struct pblk *pblk, struct pblk_line *line);
 int pblk_line_read_smeta(struct pblk *pblk, struct pblk_line *line);
 int pblk_line_read_emeta(struct pblk *pblk, struct pblk_line *line,
-- 
2.9.3

  parent reply	other threads:[~2017-10-13 12:47 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-13 12:45 [GIT PULL 00/58] LightNVM updates for 4.15 Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 01/58] lightnvm: prevent target type module removal when in use Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 02/58] lightnvm: prevent bd removal if busy Matias Bjørling
2017-10-13 14:58   ` Christoph Hellwig
2017-10-13 14:58     ` Christoph Hellwig
2017-10-13 15:35     ` Rakesh Pandit
2017-10-13 15:35       ` Rakesh Pandit
2017-10-13 15:58       ` Javier González
2017-10-13 15:58         ` Javier González
2017-10-14  6:04         ` Javier González
2017-10-14  6:04           ` Javier González
2017-10-16 15:14       ` Matias Bjørling
2017-10-16 15:14         ` Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 03/58] lightnvm: protect target type list with correct locks Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 04/58] lightnvm: remove already calculated nr_chnls Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 05/58] lightnvm: pblk: fix error path in pblk_lines_alloc_metadata Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 06/58] lightnvm: include NVM Express driver if OCSSD is selected for build Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 07/58] lightnvm: pblk: protect line bitmap while submitting meta io Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 08/58] lightnvm: pblk: fix message if L2P MAP is in device Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 09/58] lightnvm: pblk: improve error message if down_timeout fails Matias Bjørling
2017-10-13 12:45 ` [GIT PULL 10/58] lightnvm: pblk: print incompatible line version correctly Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 11/58] lightnvm: pblk: reuse pblk_gc_should_kick Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 12/58] lightnvm: pblk: initialize debug stat counter Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 13/58] lightnvm: pblk: use right flag for GC allocation Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 14/58] lightnvm: pblk: free padded entries in write buffer Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 15/58] lightnvm: pblk: fix write I/O sync stat Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 16/58] lightnvm: pblk: avoid deadlock on low LUN config Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 17/58] lightnvm: pblk: fix min size for page mempool Matias Bjørling
2017-10-13 12:46 ` Matias Bjørling [this message]
2017-10-13 12:46 ` [GIT PULL 19/58] lightnvm: pblk: decouple read/erase mempools Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 20/58] lightnvm: pblk: do not use a mempool for line bitmaps Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 21/58] lightnvm: pblk: remove checks on mempool alloc Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 22/58] lightnvm: pblk: use constant for GC max inflight Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 23/58] lightnvm: pblk: normalize ppa namings Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 24/58] lightnvm: pblk: refactor read lba sanity check Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 25/58] lightnvm: pblk: simplify data validity check on GC Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 26/58] lightnvm: pblk: refactor read path " Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 27/58] lightnvm: pblk: put bio on bio completion Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 28/58] lightnvm: pblk: simplify path on REQ_PREFLUSH Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 29/58] lightnvm: pblk: allocate bio size more accurately Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 30/58] lightnvm: pblk: improve naming for internal req Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 31/58] lightnvm: pblk: refactor rqd alloc/free Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 32/58] lightnvm: pblk: use rqd->end_io for completion Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 33/58] lightnvm: pblk: check lba sanity on read path Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 34/58] lightnvm: pblk: guarantee line integrity on reads Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 35/58] lightnvm: pblk: remove redundant check on read path Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 36/58] lightnvm: pblk: remove I/O dependency on write path Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 37/58] lightnvm: pblk: enable 1 LUN configuration Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 38/58] lightnvm: pblk: ensure right bad block calculation Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 39/58] lightnvm: pblk: fix changing GC group list for a line Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 40/58] lightnvm: pblk: remove useless line Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 41/58] lightnvm: remove unused argument from nvm_set_tgt_bb_tbl Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 42/58] lightnvm: remove stale extern and unused exported symbols Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 43/58] lightnvm: pblk: reduce arguments in __pblk_rb_update_l2p Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 44/58] lightnvm: pblk: fix releases of kmem cache in error path Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 45/58] lightnvm: pblk: prevent gc kicks when gc is not operational Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 46/58] lightnvm: pblk: recover partially written lines correctly Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 47/58] lightnvm: pblk: free full lines during recovery Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 48/58] lightnvm: pblk: start gc if needed during init Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 49/58] lightnvm: pblk: consider bad sectors in emeta during recovery Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 50/58] lightnvm: pblk: shut down gc gracefully during exit Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 51/58] lightnvm: pblk: add l2p crc debug printouts Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 52/58] lightnvm: pblk: gc all lines in the pipeline before exit Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 53/58] lightnvm: pblk: correct valid lba count calculation Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 54/58] lightnvm: pblk: remove spinlock when freeing line metadata Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 55/58] lightnvm: pblk: cleanup unused and static functions Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 56/58] lightnvm: pblk: avoid being reported as hung on rated GC Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 57/58] lightnvm: fail fast on passthrough commands Matias Bjørling
2017-10-13 12:46 ` [GIT PULL 58/58] lightnvm: implement generic path for sync I/O Matias Bjørling
2017-10-13 14:36 ` [GIT PULL 00/58] LightNVM updates for 4.15 Jens Axboe
2017-10-13 14:36   ` Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171013124647.32668-19-m@bjorling.me \
    --to=m@bjorling.me \
    --cc=axboe@fb.com \
    --cc=javier@cnexlabs.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.