All of lore.kernel.org
 help / color / mirror / Atom feed
From: Milan Broz <mbroz@redhat.com>
To: Alasdair G Kergon <agk@redhat.com>
Cc: device-mapper development <dm-devel@redhat.com>
Subject: [RFC PATCH 0/4] dm core: full barrier support
Date: Tue, 08 Jul 2008 18:48:53 +0200	[thread overview]
Message-ID: <48739A75.1070807@redhat.com> (raw)

Hi,

there was several discussions about supporting barriers
in device-mapper.

I wrote this code some time ago, but it never reached dm-devel
tree. Take this more like RFC and experimental approach
- maybe there is better way how to handle it. 
Anyway this implementation works in my tests and is relatively simple.

[RFC PATCH 1/4] dm core: remove unused code
	- just remove never used code, already sent some time ago
	in another patchset

[RFC PATCH 2/4] dm core: add support for empty barriers
	- the core implementation of empty barrier support
	- implementation for stripe target

[RFC PATCH 3/4] dm core: add support for barrier bio with payload
	- tranform payload to sequence of data bio + empty barrier

[RFC PATCH 4/4] dm core: wait for barrier in process in suspend
	- try to solve the problem that we cannot suspend device
	during processing of barrier.


Notes to implementation:

* Patches are generated with previously applied bvec_merge
patches from dm-devel tree (but it should work even without them)
(removing unnecessary bio split was part of solution)

* ignoring multipath for now, but it should probably process
barriers correctly in multipath target

* barrier is expensive operation, so it should be used
very rarely, processing (and cost) in DM is equivalent
to suspending device

* There are several types of barrier implementation
in hw drivers (DRAIN,TAGGING, ...) but DM doesn't care about
it - I think that sending zero-sized barrier to low-lever driver
is enough to allow its internal logic to decide what to do.

* DM target is responsible for processing barrier for its devices.
  (barrier is sent per target not per device).

  - Only targets know which devices are related to barrier request,
  and dm-core have no functionality to decide which devices are used
  in specific targets (!)

  - Most of targets will probably need no special code to handle
  zero-sized barrier

  - implementation is simpler, we can e.g. disable barriers
  for some type of target (and implement it later)

  - it must process correctly mapping table reloads

* DM always send zero-sized barriers, barriers with payload
  are converted to non-barrier bios with payload
  + subsequent zero-size barrier

* All preceding IOs must be processed when barrier is issued
  - All barriers is processed with down_write(io_lock) locked.
  Because bios are internally queued per process (in *make_request)
  this is sufficient to ensuring that all previous IOs are
  submitted by DM (dm_request runs with down_read, so barrier
  request will wait till all "readers" are done).

  - Moreover, after submitting zero barrier, code waits till
  all processing IOs (per md) are finished before releasing flag.
  It waits even for reads and barrier itself now.

* After processing all requests (including all barrier clones)
  the queued IOs are flushed.
  - If there is another barrier in queue, operation continues
  without clearing BLOCK_IO flag (this flag is cleared only
  when whole queue if flushed and no new barrier is on-the-fly).

* Some targets do not need changes (linear), others need review
but should work in general (mirror, crypt, ...)

Milan
--
mbroz@redhat.com

             reply	other threads:[~2008-07-08 16:48 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-08 16:48 Milan Broz [this message]
2008-08-06 10:05 ` [RFC PATCH 0/4] dm core: full barrier support Nikola Ciprich
2008-08-06 10:33   ` Milan Broz
2008-08-07  4:38     ` Nikola Ciprich

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=48739A75.1070807@redhat.com \
    --to=mbroz@redhat.com \
    --cc=agk@redhat.com \
    --cc=dm-devel@redhat.com \
    /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.