linux/include
Dan Williams 91c0092484 md: raid5_run_ops - run stripe operations outside sh->lock
When the raid acceleration work was proposed, Neil laid out the following
attack plan:

1/ move the xor and copy operations outside spin_lock(&sh->lock)
2/ find/implement an asynchronous offload api

The raid5_run_ops routine uses the asynchronous offload api (async_tx) and
the stripe_operations member of a stripe_head to carry out xor+copy
operations asynchronously, outside the lock.

To perform operations outside the lock a new set of state flags is needed
to track new requests, in-flight requests, and completed requests.  In this
new model handle_stripe is tasked with scanning the stripe_head for work,
updating the stripe_operations structure, and finally dropping the lock and
calling raid5_run_ops for processing.  The following flags outline the
requests that handle_stripe can make of raid5_run_ops:

STRIPE_OP_BIOFILL
 - copy data into request buffers to satisfy a read request
STRIPE_OP_COMPUTE_BLK
 - generate a missing block in the cache from the other blocks
STRIPE_OP_PREXOR
 - subtract existing data as part of the read-modify-write process
STRIPE_OP_BIODRAIN
 - copy data out of request buffers to satisfy a write request
STRIPE_OP_POSTXOR
 - recalculate parity for new data that has entered the cache
STRIPE_OP_CHECK
 - verify that the parity is correct
STRIPE_OP_IO
 - submit i/o to the member disks (note this was already performed outside
   the stripe lock, but it made sense to add it as an operation type

The flow is:
1/ handle_stripe sets STRIPE_OP_* in sh->ops.pending
2/ raid5_run_ops reads sh->ops.pending, sets sh->ops.ack, and submits the
   operation to the async_tx api
3/ async_tx triggers the completion callback routine to set
   sh->ops.complete and release the stripe
4/ handle_stripe runs again to finish the operation and optionally submit
   new operations that were previously blocked

Note this patch just defines raid5_run_ops, subsequent commits (one per
major operation type) modify handle_stripe to take advantage of this
routine.

Changelog:
* removed ops_complete_biodrain in favor of ops_complete_postxor and
  ops_complete_write.
* removed the raid5_run_ops workqueue
* call bi_end_io for reads in ops_complete_biofill, saves a call to
  handle_stripe
* explicitly handle the 2-disk raid5 case (xor becomes memcpy), Neil Brown
* fix race between async engines and bi_end_io call for reads, Neil Brown
* remove unnecessary spin_lock from ops_complete_biofill
* remove test_and_set/test_and_clear BUG_ONs, Neil Brown
* remove explicit interrupt handling for channel switching, this feature
  was absorbed (i.e. it is now implicit) by the async_tx api
* use return_io in ops_complete_biofill

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Acked-By: NeilBrown <neilb@suse.de>
2007-07-13 08:06:15 -07:00
..
acpi Pull osi-now into release branch 2007-06-02 01:02:09 -04:00
asm-alpha ALPHA: misc fixes 2007-06-01 08:18:29 -07:00
asm-arm Introduce fixed sys_sync_file_range2() syscall, implement on PowerPC and ARM 2007-06-28 11:38:30 -07:00
asm-arm26 [ARM] use __used attribute 2007-05-30 13:15:06 +01:00
asm-avr32 [AVR32] Define ARCH_KMALLOC_MINALIGN to L1_CACHE_BYTES 2007-06-14 18:30:50 +02:00
asm-blackfin Blackfin arch: remove zero-sized include/asm-blackfin/macros.h 2007-07-03 08:25:50 +08:00
asm-cris Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
asm-frv frv: fix fallout from "remove sched.h from mm.h" patch 2007-07-01 12:29:44 -07:00
asm-generic Rework ptep_set_access_flags and fix sun4c 2007-06-16 13:16:16 -07:00
asm-h8300 h8300 trival patches 2007-06-01 08:18:29 -07:00
asm-i386 i386: es7000 build breakage fix 2007-07-06 10:23:43 -07:00
asm-ia64 [IA64] change sh_change_coherence oemcall to use nolock 2007-06-26 13:33:58 -07:00
asm-m32r m32r: __xchg() should be always_inline 2007-05-15 18:56:37 -07:00
asm-m68k m68k: discontinuous memory support 2007-05-31 07:58:14 -07:00
asm-m68knommu
asm-mips [MIPS] Fix scheduling latency issue on 24K, 34K and 74K cores 2007-07-06 16:17:11 +01:00
asm-parisc [PARISC] Fix unwinder on 64-bit kernels 2007-06-21 17:46:21 -04:00
asm-powerpc [POWERPC] Uninline and export virq_to_hw() for the pasemi_mac driver 2007-07-02 13:29:21 +10:00
asm-ppc Rework ptep_set_access_flags and fix sun4c 2007-06-16 13:16:16 -07:00
asm-s390 [S390] Move psw_set_key. 2007-06-19 13:10:20 +02:00
asm-sh sh: Fix se73180 platform device registration. 2007-06-04 11:07:23 +09:00
asm-sh64 sh64: generic quicklist support. 2007-05-14 09:55:35 +09:00
asm-sparc Rework ptep_set_access_flags and fix sun4c 2007-06-16 13:16:16 -07:00
asm-sparc64 [SPARC64]: Add linux/pagemap.h to asm/tlb.h 2007-06-28 21:25:31 -07:00
asm-um uml: add asm/paravirt.h 2007-06-24 08:59:11 -07:00
asm-v850 Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
asm-x86_64 x86_64: Fix eventd/timerfd syscalls 2007-06-20 14:27:25 -07:00
asm-xtensa Xtensa: use asm-generic/fcntl.h 2007-05-31 20:18:25 -07:00
crypto
keys
linux md: raid5_run_ops - run stripe operations outside sh->lock 2007-07-13 08:06:15 -07:00
math-emu
media
mtd
net [SCTP] Flag a pmtu change request 2007-06-13 20:44:42 +00:00
pcmcia
rdma Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband 2007-05-21 16:19:32 -07:00
rxrpc
scsi
sound [ALSA] version 1.0.14 2007-05-31 11:03:27 +02:00
video atmel_lcdfb: AT91/AT32 LCD Controller framebuffer driver 2007-05-11 08:29:37 -07:00
Kbuild