lkml.org 
[lkml]   [2008]   [Jun]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 028 of 29] md: 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 output
    ./drivers/md/raid5.c | 15 +++++++--------
    1 file changed, 7 insertions(+), 8 deletions(-)

    diff .prev/drivers/md/raid5.c ./drivers/md/raid5.c
    --- .prev/drivers/md/raid5.c 2008-06-27 16:42:56.000000000 +1000
    +++ ./drivers/md/raid5.c 2008-06-27 16:42:56.000000000 +1000
    @@ -574,8 +574,7 @@ static void ops_complete_compute5(void *
    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,
    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_
    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);

    \
     
     \ /
      Last update: 2008-06-27 09:05    [W:0.024 / U:0.132 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site