23 Aug, 2013

3 commits

  • Reorder members in the cache structure to eliminate 6 out of 7 holes
    (reclaiming 24 bytes). Also, the 'worker' and 'waker' members no longer
    straddle cachelines.

    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon
    Acked-by: Joe Thornber

    Mike Snitzer
     
  • Do not blindly override the queue limits (specifically io_min and
    io_opt). Allow traditional stacking of these limits if io_opt is a
    factor of the cache's data block size.

    Without this patch mkfs.xfs does not recognize the cache device's
    provided limits as a useful geometry (e.g. raid) so these hints are
    ignored. This was due to setting io_min to a useless value.

    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon
    Acked-by: Joe Thornber

    Mike Snitzer
     
  • Place upper bound on the cache's data block size (1GB).

    Inform users that the data block size can't be any arbitrary number,
    i.e. its value must be between 32KB and 1GB. Also, it should be a
    multiple of 32KB.

    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon
    Acked-by: Joe Thornber

    Mike Snitzer
     

11 Jul, 2013

1 commit

  • Use __always_inline to avoid a link failure with gcc 4.6 on ARM.
    gcc 4.7 is OK.

    It creates a function block_div.part.8, it references __udivdi3 and
    __umoddi3 and it is never called. The references to __udivdi3 and
    __umoddi3 cause a link failure.

    Reported-by: Rob Herring
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Alasdair G Kergon

    Mikulas Patocka
     

10 May, 2013

6 commits


05 Apr, 2013

2 commits

  • A recent patch to fix the dm cache target's writethrough mode extended
    the bio's front_pad to include a 1056-byte struct dm_bio_details.
    Writeback mode doesn't need this, so this patch reduces the
    per_bio_data_size to 16 bytes in this case instead of 1096.

    The dm_bio_details structure was added in "dm cache: fix writes to
    cache device in writethrough mode" which fixed commit e2e74d617e ("dm
    cache: fix race in writethrough implementation"). In writeback mode
    we avoid allocating the writethrough-specific members of the
    per_bio_data structure (the dm_bio_details structure included).

    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon

    Mike Snitzer
     
  • The dm-cache writethrough strategy introduced by commit e2e74d617eadc15
    ("dm cache: fix race in writethrough implementation") issues a bio to
    the origin device, remaps and then issues the bio to the cache device.
    This more conservative in-series approach was selected to favor
    correctness over performance (of the previous parallel writethrough).
    However, this in-series implementation that reuses the same bio to write
    both the origin and cache device didn't take into account that the block
    layer's req_bio_endio() modifies a completing bio's bi_sector and
    bi_size. So the new writethrough strategy needs to preserve these bio
    fields, and restore them before submission to the cache device,
    otherwise nothing gets written to the cache (because bi_size is 0).

    This patch adds a struct dm_bio_details field to struct per_bio_data,
    and uses dm_bio_record() and dm_bio_restore() to ensure the bio is
    restored before reissuing to the cache device. Adding such a large
    structure to the per_bio_data is not ideal but we can improve this
    later, for now correctness is the important thing.

    This problem initially went unnoticed because the dm-cache test-suite
    uses a linear DM device for the dm-cache device's origin device.
    Writethrough worked as expected because DM submits a *clone* of the
    original bio, so the original bio which was reused for the cache was
    never touched.

    Signed-off-by: Darrick J. Wong
    Signed-off-by: Joe Thornber
    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon

    Darrick J. Wong
     

21 Mar, 2013

5 commits

  • When reading the dm cache metadata from disk, ignore the policy hints
    unless they were generated by the same major version number of the same
    policy module.

    The hints are considered to be private data belonging to the specific
    module that generated them and there is no requirement for them to make
    sense to different versions of the policy that generated them.
    Policy modules are all required to work fine if no previous hints are
    supplied (or if existing hints are lost).

    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon

    Mike Snitzer
     
  • We have found a race in the optimisation used in the dm cache
    writethrough implementation. Currently, dm core sends the cache target
    two bios, one for the origin device and one for the cache device and
    these are processed in parallel. This patch avoids the race by
    changing the code back to a simpler (slower) implementation which
    processes the two writes in series, one after the other, until we can
    develop a complete fix for the problem.

    When the cache is in writethrough mode it needs to send WRITE bios to
    both the origin and cache devices.

    Previously we've been implementing this by having dm core query the
    cache target on every write to find out how many copies of the bio it
    wants. The cache will ask for two bios if the block is in the cache,
    and one otherwise.

    Then main problem with this is it's racey. At the time this check is
    made the bio hasn't yet been submitted and so isn't being taken into
    account when quiescing a block for migration (promotion or demotion).
    This means a single bio may be submitted when two were needed because
    the block has since been promoted to the cache (catastrophic), or two
    bios where only one is needed (harmless).

    I really don't want to start entering bios into the quiescing system
    (deferred_set) in the get_num_write_bios callback. Instead this patch
    simplifies things; only one bio is submitted by the core, this is
    first written to the origin and then the cache device in series.
    Obviously this will have a latency impact.

    deferred_writethrough_bios is introduced to record bios that must be
    later issued to the cache device from the worker thread. This deferred
    submission, after the origin bio completes, is required given that we're
    in interrupt context (writethrough_endio).

    Signed-off-by: Joe Thornber
    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon

    Joe Thornber
     
  • If the cache policy's config values are not able to be set we must
    set the policy to NULL after destroying it in create_cache_policy()
    so we don't attempt to destroy it a second time later.

    Signed-off-by: Heinz Mauelshagen
    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon

    Heinz Mauelshagen
     
  • Return error if cache_create() fails.

    A missing return check made cache_ctr continue even after an error in
    cache_create() resulting in the cache object being destroyed. So a
    simple failure like an odd number of cache policy config value arguments
    would result in an oops.

    Signed-off-by: Heinz Mauelshagen
    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon

    Heinz Mauelshagen
     
  • Squash various 32bit link errors.

    >> on i386:
    >> drivers/built-in.o: In function `is_discarded_oblock':
    >> dm-cache-target.c:(.text+0x1ea28e): undefined reference to `__udivdi3'
    ...

    Reported-by: Randy Dunlap
    Signed-off-by: Joe Thornber
    Signed-off-by: Alasdair G Kergon

    Joe Thornber
     

02 Mar, 2013

1 commit

  • Add a target that allows a fast device such as an SSD to be used as a
    cache for a slower device such as a disk.

    A plug-in architecture was chosen so that the decisions about which data
    to migrate and when are delegated to interchangeable tunable policy
    modules. The first general purpose module we have developed, called
    "mq" (multiqueue), follows in the next patch. Other modules are
    under development.

    Signed-off-by: Joe Thornber
    Signed-off-by: Heinz Mauelshagen
    Signed-off-by: Mike Snitzer
    Signed-off-by: Alasdair G Kergon

    Joe Thornber