07 Jul, 2016

5 commits

  • The gen_mark_blk_bad function marks the wrong block when a block is on
    a different channel. Fix the index calculation, so that it updates the
    correct block.

    Reported-by: Javier Gonzalez
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • The [get/put]_blk API enables targets to get ownership of blocks at
    runtime. This information is currently not recorded on disk, and the
    information is therefore lost on power failure. To restore the
    metadata, the [get/put]_blk must persist its metadata. In that case,
    we need to control the outer lock, so that we can disable them while
    updating the on-disk metadata. Fortunately, the _unlocked versions can
    be removed, which allows us to move the lock into the [get/put]_blk
    functions.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • To enable persistent block management to easily control creation and
    removal of targets, we move target management into the media
    manager. The LightNVM core continues to maintain which target types are
    registered, while the media manager now keeps track of its initialized
    targets.

    Two new callbacks for the media manager are introduced. create_tgt and
    remove_tgt. Note that remove_tgt returns 0 on successfully removing a
    target, and returns 1 if the target was not found.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • The generic manager should be called the general media manager, and
    instead of using the rather long name of "gennvm" in front of each data
    structures, use "gen" instead to shorten it. Update the description of
    the media manager as well to make the media manager purpose clearer.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • 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
    Signed-off-by: Jens Axboe

    Matias Bjørling
     

07 May, 2016

6 commits

  • The number of ppas contained on a request is not necessarily the number
    of pages that it maps to neither on the target nor on the device side.
    In order to avoid confusion, rename nr_pages to nr_ppas since it is what
    the variable actually contains.

    Signed-off-by: Javier González
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Javier González
     
  • Targets can update a block state when having a reference to an
    in-memory virtual block. In the case that a target does not keep the
    block metadata in memory, it does not have a way to update this
    structure.

    Therefore, expose gennvm_mark_blk() through the media managers
    ->mark_blk() callback and let targets update the state structure through
    this callback.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • The ppa configured for retrieving the bad block table uses the internal
    lun id to setup the get bad block ppa. This increases monotonically
    with the number luns available. When configuring a ppa, the channel and
    lun must be specified separately, leading to an out of bound memory
    access in gennvm_block_bb when lun id goes beyond the luns available
    within a channel.

    Additional, remove out of bound check in gennvm_block_bb(), as it was a
    buggy to begin with.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • We move the responsibility of managing the persistent bad block table to
    the target. The target may choose to mark a block bad or retry writing
    to it. Never the less, it should be the target that makes the decision
    and not the media manager.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • The device ops->get_bb_tbl() takes a callback, that allows the caller
    to use its own callback function to update its data structures in the
    returning function.

    This makes it difficult to send parameters to the callback, and usually
    is circumvented by small private structures, that both carry the callers
    state and any flags needed to fulfill the update.

    Refactor ops->get_bb_tbl() to fill a data buffer with the status of the
    blocks returned, and let the user call the callback function manually.
    That will provide the necessary flags and data structures and simplify
    the logic around ops->get_bb_tbl().

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • The get block table command returns a list of blocks and planes
    with their associated state. Users, such as gennvm and sysblk,
    manages all planes as a single virtual block.

    It was therefore natural to fold the bad block list before it is
    returned. However, to allow users, which manages on a per-plane
    block level, to also use the interface, the get_bb_tbl interface is
    changed to not fold by default and instead let the caller fold if
    necessary.

    Reviewed by: Johannes Thumshirn
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     

19 Mar, 2016

4 commits

  • An Open-Channel SSD can work on two modes: (i) hybrid mode, where the
    L2P table is maintained both by the host and by the device; and (ii)
    full host-based, where the L2P table is uniquely maintained by the host.

    In the advent of a new target implementing the full host-based mode, do
    not assume that the L2P table must be loaded on the generic media
    manager; check device properties loaded on the identify command instead.

    Signed-off-by: Javier González
    Moved into the following statement.
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Javier González
     
  • When the l2p table is loaded, addresses are checked for the lun they
    belong to and luns are reserved accordingly. This assumes that metadata
    is being stored in the backend device to recover the previous target
    configuration. Since this is not yet implemented, this check collides
    with some of the core initialization (e.g., sysblock initialization when
    a page is formed by several sectors).

    We take this check out and for now rely on that the right target will be
    created instead. When metadata is stored to recover a target, this check
    will come natural as part of the recovery strategy.

    Signed-off-by: Javier González
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Javier González
     
  • Add a bitmap of luns to indicate the status
    of luns: inuse/available. When create targets
    do the necessary check to avoid allocating luns
    that are already allocated.

    Signed-off-by: Wenwei Tao
    Freed dev->lun_map if nvm_core_init later failed in the init process.
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Wenwei Tao
     
  • We can create more than one target on a lightnvm
    device by specifying its begin lun and end lun.

    But only specify the physical address area is not
    enough, we need to get the corresponding non-
    intersection logical address area division from
    the backend device's logcial address space.
    Otherwise the targets on the device might use
    the same logical addresses cause incorrect
    information in the device's l2p table.

    Signed-off-by: Wenwei Tao
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Wenwei Tao
     

04 Mar, 2016

1 commit


12 Jan, 2016

7 commits

  • LightNVM targets need to know the state of the flash block when doing
    flash optimizations. An example is implementing a write buffer to
    respect the flash page size. Currently, block state is not accounted
    for; the media manager only differentiates among free, bad and in-use
    blocks.

    This patch adds the logic in the generic media manager to enable
    targets manage blocks into open and close separately, and it implements
    such management in rrpc. It also adds a set of flags to describe the
    state of the block (open, closed, free, bad).

    In order to avoid taking two locks (nvm_lun and rrpc_lun) consecutively,
    we introduce lockless get_/put_block primitives so that the open and
    close list locks and future common logic is handled within the nvm_lun
    lock.

    Signed-off-by: Javier González
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Javier González
     
  • Instead of passing request error into the LightNVM modules, incorporate
    it into the nvm_rq.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • Sometimes a user want to erase multiple PPAs at the same time. Extend
    nvm_erase_ppa to take multiple ppas and number of ppas to be erased.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • To implement sync I/O support within the LightNVM core, the end_io
    functions are refactored to take an end_io function pointer instead of
    testing for initialized media manager, followed by calling its end_io
    function.

    Sync I/O can then be implemented using a callback that signal I/O
    completion. This is similar to the logic found in blk_to_execute_io().
    By implementing it this way, the underlying device I/Os submission logic
    is abstracted away from core, targets, and media managers.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • A device may function in single, dual or quad plane mode. The gennvm
    media manager manages this with explicit helpers. They convert a single
    ppa to 1, 2 or 4 separate ppas in a ppa list. To aid implementation of
    recovery and system blocks, this functionality can be moved directly
    into the core.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • When initing bad block list in gennvm_block_bb, once we move bad block
    from free_list to bb_list, we should maintain both stat info
    nr_free_blocks and nr_bad_blocks. So this patch fixes to add missing
    operation related to nr_free_blocks.

    Signed-off-by: Chao Yu
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Chao Yu
     
  • Put bio when submission fails, since we get it
    before submission. And return error when backend
    device driver doesn't provide a submit_io method,
    thus we can end IO properly.

    Signed-off-by: Wenwei Tao
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Wenwei Tao
     

29 Dec, 2015

1 commit

  • dev->nr_luns reports the total number of luns available in a device
    while dev->luns_per_chnl is the number of luns per channel.

    When multiple channels are available, the offset is calculated from a
    channel and lun id into a linear array. As it multiplies with
    the total number of luns, we go out of bound when channel id > 0 and
    causes the kernel to panic when we read a protected kernel memory area.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     

08 Dec, 2015

3 commits


30 Nov, 2015

2 commits


20 Nov, 2015

2 commits

  • Add free block, used block, and bad block information to the show debug
    interface. This information is used to debug how targets track blocks.

    Also, change debug function name to make it more generic.

    Signed-off-by: Javier Gonzalez
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Javier Gonzalez
     
  • 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
    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Javier Gonzalez
     

17 Nov, 2015

2 commits

  • The linear and device specific address modes can be replaced with a
    simple offset and bit length conversion that is generic across all
    devices.

    This both simplifies the specification and removes the special case for
    qemu nvme, that previously relied on the linear address mapping.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     
  • The specification was changed to reflect a multi-value bad block table.
    Instead of bit-based bad block table, the bad block table now allows
    eight bad block categories. Currently four are defined:

    * Factory bad blocks
    * Grown bad blocks
    * Device-side reserved blocks
    * Host-side reserved blocks

    The factory and grown bad blocks are the regular bad blocks. The
    reserved blocks are either for internal use or external use. In
    particular, the device-side reserved blocks allows the host to
    bootstrap from a limited number of flash blocks. Reducing the flash
    blocks to scan upon super block initialization.

    Support for both get bad block table and set bad block table is added.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling
     

29 Oct, 2015

1 commit

  • The implementation for Open-Channel SSDs is divided into media
    management and targets. This patch implements a generic media manager
    for open-channel SSDs. After a media manager has been initialized,
    single or multiple targets can be instantiated with the media managed as
    the backend.

    Signed-off-by: Matias Bjørling
    Signed-off-by: Jens Axboe

    Matias Bjørling