[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen/blkback: Don't let in-flight requests defer pending ones.



On Sat, May 28, 2011 at 01:21:10PM -0700, Daniel Stodden wrote:
> Running RING_FINAL_CHECK_FOR_REQUESTS from make_response is a bad
> idea. It means that in-flight I/O is essentially blocking continued
> batches. This essentially kills throughput on frontends which unplug
> (or even just notify) early and rightfully assume addtional requests

You have any perf numbers?

> will be picked up on time, not synchronously.
> 
> Signed-off-by: Daniel Stodden <daniel.stodden@xxxxxxxxxx>
> ---
>  drivers/block/xen-blkback/blkback.c |   36 ++++++++++++++++++----------------
>  1 files changed, 19 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/block/xen-blkback/blkback.c 
> b/drivers/block/xen-blkback/blkback.c
> index 9dee545..48ad7fa 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -451,7 +451,8 @@ static void end_block_io_op(struct bio *bio, int error)
>   * (which has the sectors we want, number of them, grant references, etc),
>   * and transmute  it to the block API to hand it over to the proper block 
> disk.
>   */
> -static int do_block_io_op(struct xen_blkif *blkif)
> +static int
> +__do_block_io_op(struct xen_blkif *blkif)
>  {
>       union blkif_back_rings *blk_rings = &blkif->blk_rings;
>       struct blkif_request req;
> @@ -508,6 +509,23 @@ static int do_block_io_op(struct xen_blkif *blkif)
>       return more_to_do;
>  }
>  
> +static int
> +do_block_io_op(blkif_t *blkif)
> +{
> +     blkif_back_rings_t *blk_rings = &blkif->blk_rings;
> +     int more_to_do;
> +
> +     do {
> +             more_to_do = __do_block_io_op(blkif);
> +             if (more_to_do)
> +                     break;
> +
> +             RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, more_to_do);
> +     } while (more_to_do);
> +
> +     return more_to_do;
> +}
> +
>  /*
>   * Transmutation of the 'struct blkif_request' to a proper 'struct bio'
>   * and call the 'submit_bio' to pass it to the underlying storage.
> @@ -698,7 +716,6 @@ static void make_response(struct xen_blkif *blkif, u64 id,
>       struct blkif_response  resp;
>       unsigned long     flags;
>       union blkif_back_rings *blk_rings = &blkif->blk_rings;
> -     int more_to_do = 0;
>       int notify;
>  
>       resp.id        = id;
> @@ -725,22 +742,7 @@ static void make_response(struct xen_blkif *blkif, u64 
> id,
>       }
>       blk_rings->common.rsp_prod_pvt++;
>       RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blk_rings->common, notify);
> -     if (blk_rings->common.rsp_prod_pvt == blk_rings->common.req_cons) {
> -             /*
> -              * Tail check for pending requests. Allows frontend to avoid
> -              * notifications if requests are already in flight (lower
> -              * overheads and promotes batching).
> -              */
> -             RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, more_to_do);
> -
> -     } else if (RING_HAS_UNCONSUMED_REQUESTS(&blk_rings->common)) {
> -             more_to_do = 1;
> -     }
> -
>       spin_unlock_irqrestore(&blkif->blk_ring_lock, flags);
> -
> -     if (more_to_do)
> -             blkif_notify_work(blkif);
>       if (notify)
>               notify_remote_via_irq(blkif->irq);
>  }
> -- 
> 1.7.4.1
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.