mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
d8ee0728b5
commit
7b3a871ed9
|
@ -574,8 +574,7 @@ static void ops_complete_compute5(void *stripe_head_ref)
|
|||
release_stripe(sh);
|
||||
}
|
||||
|
||||
static struct dma_async_tx_descriptor *
|
||||
ops_run_compute5(struct stripe_head *sh, unsigned long ops_request)
|
||||
static struct dma_async_tx_descriptor *ops_run_compute5(struct stripe_head *sh)
|
||||
{
|
||||
/* kernel stack size limits the total number of disks */
|
||||
int disks = sh->disks;
|
||||
|
@ -605,10 +604,6 @@ ops_run_compute5(struct stripe_head *sh, unsigned long ops_request)
|
|||
ASYNC_TX_XOR_ZERO_DST, NULL,
|
||||
ops_complete_compute5, sh);
|
||||
|
||||
/* ack now if postxor is not set to be run */
|
||||
if (tx && !test_bit(STRIPE_OP_POSTXOR, &ops_request))
|
||||
async_tx_ack(tx);
|
||||
|
||||
return tx;
|
||||
}
|
||||
|
||||
|
@ -813,8 +808,12 @@ static void raid5_run_ops(struct stripe_head *sh, unsigned long ops_request)
|
|||
overlap_clear++;
|
||||
}
|
||||
|
||||
if (test_bit(STRIPE_OP_COMPUTE_BLK, &ops_request))
|
||||
tx = ops_run_compute5(sh, ops_request);
|
||||
if (test_bit(STRIPE_OP_COMPUTE_BLK, &ops_request)) {
|
||||
tx = ops_run_compute5(sh);
|
||||
/* terminate the chain if postxor is not set to be run */
|
||||
if (tx && !test_bit(STRIPE_OP_POSTXOR, &ops_request))
|
||||
async_tx_ack(tx);
|
||||
}
|
||||
|
||||
if (test_bit(STRIPE_OP_PREXOR, &ops_request))
|
||||
tx = ops_run_prexor(sh, tx);
|
||||
|
|
Loading…
Reference in New Issue