Re: [PATCH] lightnvm: physical block device (pblk) target

From
Javier González <hidden>
Date
2016-11-18 16:16:48
Also in
lkml
This patch applies on top of Matias' for-4.10/core [1]. Development is
taking place on [1]; branches named pblk.X are new releases that are
rebased on each new kernel release until merged.

A couple of extra features will be added before posting for merging, but
the core of the functionality is present. Comments on current and
missing functionality, code and style and more than welcome.

Documentation on how to instantiate a lightnvm target can be found in
[2]. After it is instantiated, pblk should behave like a normal block
device. pblk specific documentation in /Documentation will follow on the
merge patch. General information on the Open-Channel SSD project can be
seen in [3].

[1] https://github.com/OpenChannelSSD/linux
[2] http://openchannelssd.readthedocs.io/en/latest/
[3] http://lightnvm.io


Thanks,
Javier
On 18 Nov 2016, at 16.03, Javier Gonz=C3=A1lez [off-list ref] wrote:
=20
This patch introduces a new LightNVM target implementing a full
host-based Flash Translation Layer (FTL): pblk. It differs from the
existing rrpc target in that rrpc is a hybrid approach, where
the L2P table is maintained both on the host and on the device.
=20
pblk operates around a ring write buffer. Apart from buffering writes,
this buffer allows to respect controller constrains on how flash pages
must be written. The write buffer is complemented with a write context
buffer, which stores metadata for each 4KB write. With regards to the
mapping strategy, we follow a late-map approach, where the actual
mapping to flash pages is done when the write buffer is being written =
to
the media. Logical addresses are mapped physical flash pages in a
round-robin fashion in relation to the active LUNs on the target.
=20
Apart from the typical head an tail pointers, the write buffer =
maintains
a number of pointers to:
 - Submission pointer: Keeps track of the last entry submitted to the
   media.
 - Sync pointer: Keeps track of entries successfully stored on the
   flash. It acts as a backpointer that guarantees that I/Os are
   completed in order. This is necessary to guarantee that flushes are
   completed when they should. It delegates too some responsibility
   to the block layer since bios are completed in order.
 - Sync-point pointer: Guarantees that flushes are respected.
 - L2p-update pointer: Guarantees that lookups to cache entries will
   point to their cache line after L2P mapping takes place for as long
   as they remain in cache.
=20
The size of the ring buffer is the closest power-of-2 size to the
number of active LUNs in the target X the size of a flash block.
=20
pblk implements basic FTL functionality:
 - GC: A simple cost-base garbage collector.
 - Write recovery: If a block becomes bad after writes have
   successfully been committed to it, the block is garbage collected,
   marked as bad and returned to the media manager.
 - Scan recovery: The last page of each block is used to store
   metadata that allows to reconstruct the L2P table in case of a
   crash. This is the current recovery strategy until we implement L2P
   snapshoting.
 - Rate limiter: When GC starts, a rate-limiter guarantees that =
entries
   on the write buffer will be reserved to user I/O and GC I/O.
 - Sysfs integration: Information about the target and its
   state is exposed through sysfs. This includes statistics and
   open, closed and bad blocks.
---
drivers/lightnvm/Kconfig         |  16 +
drivers/lightnvm/Makefile        |   5 +
drivers/lightnvm/pblk-cache.c    | 179 ++++++++
drivers/lightnvm/pblk-core.c     | 757 +++++++++++++++++++++++++++++++
drivers/lightnvm/pblk-gc.c       | 620 ++++++++++++++++++++++++++
drivers/lightnvm/pblk-init.c     | 769 =
++++++++++++++++++++++++++++++++
drivers/lightnvm/pblk-map.c      | 414 +++++++++++++++++
drivers/lightnvm/pblk-rb.c       | 823 =
++++++++++++++++++++++++++++++++++
drivers/lightnvm/pblk-read.c     | 614 +++++++++++++++++++++++++
drivers/lightnvm/pblk-recovery.c | 792 =
++++++++++++++++++++++++++++++++
drivers/lightnvm/pblk-rl.c       | 262 +++++++++++
drivers/lightnvm/pblk-sysfs.c    | 828 =
++++++++++++++++++++++++++++++++++
drivers/lightnvm/pblk-write.c    | 530 ++++++++++++++++++++++
drivers/lightnvm/pblk.h          | 942 =
+++++++++++++++++++++++++++++++++++++++
14 files changed, 7551 insertions(+)
create mode 100644 drivers/lightnvm/pblk-cache.c
create mode 100644 drivers/lightnvm/pblk-core.c
create mode 100644 drivers/lightnvm/pblk-gc.c
create mode 100644 drivers/lightnvm/pblk-init.c
create mode 100644 drivers/lightnvm/pblk-map.c
create mode 100644 drivers/lightnvm/pblk-rb.c
create mode 100644 drivers/lightnvm/pblk-read.c
create mode 100644 drivers/lightnvm/pblk-recovery.c
create mode 100644 drivers/lightnvm/pblk-rl.c
create mode 100644 drivers/lightnvm/pblk-sysfs.c
create mode 100644 drivers/lightnvm/pblk-write.c
create mode 100644 drivers/lightnvm/pblk.h
Thread (1 message) 1 message, 1 author, last reply 2016-11-18
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help