forked from Minki/linux
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);
|
release_stripe(sh);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dma_async_tx_descriptor *
|
static struct dma_async_tx_descriptor *ops_run_compute5(struct stripe_head *sh)
|
||||||
ops_run_compute5(struct stripe_head *sh, unsigned long ops_request)
|
|
||||||
{
|
{
|
||||||
/* kernel stack size limits the total number of disks */
|
/* kernel stack size limits the total number of disks */
|
||||||
int disks = sh->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,
|
ASYNC_TX_XOR_ZERO_DST, NULL,
|
||||||
ops_complete_compute5, sh);
|
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;
|
return tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -813,8 +808,12 @@ static void raid5_run_ops(struct stripe_head *sh, unsigned long ops_request)
|
|||||||
overlap_clear++;
|
overlap_clear++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_bit(STRIPE_OP_COMPUTE_BLK, &ops_request))
|
if (test_bit(STRIPE_OP_COMPUTE_BLK, &ops_request)) {
|
||||||
tx = ops_run_compute5(sh, 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))
|
if (test_bit(STRIPE_OP_PREXOR, &ops_request))
|
||||||
tx = ops_run_prexor(sh, tx);
|
tx = ops_run_prexor(sh, tx);
|
||||||
|
Loading…
Reference in New Issue
Block a user