aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-06-27 18:32:09 -0400
committerNeil Brown <neilb@notabene.brown>2008-06-27 18:32:09 -0400
commit7b3a871ed995270268a481404454ceafe1a87478 (patch)
tree1d86a84bd885f6c24213dd84b5406a38597b457e /drivers/md
parentd8ee0728b5b30d7a6f62c399a95e953616d31f23 (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>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/raid5.c15
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
577static struct dma_async_tx_descriptor * 577static struct dma_async_tx_descriptor *ops_run_compute5(struct stripe_head *sh)
578ops_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);