diff options
author | Dan Williams <dan.j.williams@intel.com> | 2008-06-27 18:32:09 -0400 |
---|---|---|
committer | Neil Brown <neilb@notabene.brown> | 2008-06-27 18:32:09 -0400 |
commit | 7b3a871ed995270268a481404454ceafe1a87478 (patch) | |
tree | 1d86a84bd885f6c24213dd84b5406a38597b457e | |
parent | d8ee0728b5b30d7a6f62c399a95e953616d31f23 (diff) |
md: handle operation chaining in raid5_run_ops
From: Dan Williams <dan.j.williams@intel.com>
Neil said:
> At the end of ops_run_compute5 you have:
> /* ack now if postxor is not set to be run */
> if (tx && !test_bit(STRIPE_OP_POSTXOR, &s->ops_run))
> async_tx_ack(tx);
>
> It looks odd having that test there. Would it fit in raid5_run_ops
> better?
The intended global interpretation is that raid5_run_ops can build a chain
of xor and memcpy operations. When MD registers the compute-xor it tells
async_tx to keep the operation handle around so that another item in the
dependency chain can be submitted. If we are just computing a block to
satisfy a read then we can terminate the chain immediately. raid5_run_ops
gives a better context for this test since it cares about the entire chain.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r-- | drivers/md/raid5.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c71246061c0e..456c3c2c961d 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -574,8 +574,7 @@ static void ops_complete_compute5(void *stripe_head_ref) | |||
574 | release_stripe(sh); | 574 | release_stripe(sh); |
575 | } | 575 | } |
576 | 576 | ||
577 | static struct dma_async_tx_descriptor * | 577 | static struct dma_async_tx_descriptor *ops_run_compute5(struct stripe_head *sh) |
578 | ops_run_compute5(struct stripe_head *sh, unsigned long ops_request) | ||
579 | { | 578 | { |
580 | /* kernel stack size limits the total number of disks */ | 579 | /* kernel stack size limits the total number of disks */ |
581 | int disks = sh->disks; | 580 | int disks = sh->disks; |
@@ -605,10 +604,6 @@ ops_run_compute5(struct stripe_head *sh, unsigned long ops_request) | |||
605 | ASYNC_TX_XOR_ZERO_DST, NULL, | 604 | ASYNC_TX_XOR_ZERO_DST, NULL, |
606 | ops_complete_compute5, sh); | 605 | ops_complete_compute5, sh); |
607 | 606 | ||
608 | /* ack now if postxor is not set to be run */ | ||
609 | if (tx && !test_bit(STRIPE_OP_POSTXOR, &ops_request)) | ||
610 | async_tx_ack(tx); | ||
611 | |||
612 | return tx; | 607 | return tx; |
613 | } | 608 | } |
614 | 609 | ||
@@ -813,8 +808,12 @@ static void raid5_run_ops(struct stripe_head *sh, unsigned long ops_request) | |||
813 | overlap_clear++; | 808 | overlap_clear++; |
814 | } | 809 | } |
815 | 810 | ||
816 | if (test_bit(STRIPE_OP_COMPUTE_BLK, &ops_request)) | 811 | if (test_bit(STRIPE_OP_COMPUTE_BLK, &ops_request)) { |
817 | tx = ops_run_compute5(sh, ops_request); | 812 | tx = ops_run_compute5(sh); |
813 | /* terminate the chain if postxor is not set to be run */ | ||
814 | if (tx && !test_bit(STRIPE_OP_POSTXOR, &ops_request)) | ||
815 | async_tx_ack(tx); | ||
816 | } | ||
818 | 817 | ||
819 | if (test_bit(STRIPE_OP_PREXOR, &ops_request)) | 818 | if (test_bit(STRIPE_OP_PREXOR, &ops_request)) |
820 | tx = ops_run_prexor(sh, tx); | 819 | tx = ops_run_prexor(sh, tx); |