qemu-block
[Top][All Lists]
Advanced

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

Re: [Qemu-block] [Qemu-devel] [PATCH 2/7] dma-helpers: change BlockBacke


From: Fam Zheng
Subject: Re: [Qemu-block] [Qemu-devel] [PATCH 2/7] dma-helpers: change BlockBackend to opaque value in DMAIOFunc
Date: Tue, 24 May 2016 10:47:09 +0800
User-agent: Mutt/1.6.1 (2016-04-27)

On Mon, 05/23 14:54, Paolo Bonzini wrote:
> Callers of dma_blk_io have no way to pass extra data to the DMAIOFunc,
> because the original callback and opaque are gone by the time DMAIOFunc
> is called.  On the other hand, the BlockBackend is usually derived
> from those extra data that you could pass to the DMAIOFunc (in the
> next patch, that would be the SCSIRequest).
> 
> So change DMAIOFunc's prototype, decoupling it from blk_aio_readv
> and blk_aio_writev's.  The new prototype loses the BlockBackend
> and gains an extra opaque value which, in the case of dma_blk_readv
> and dma_blk_writev, is of course used for the BlockBackend.
> 
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
>  dma-helpers.c        | 48 +++++++++++++++++++++++++++++++++++-------------
>  hw/ide/core.c        | 14 ++++++++------
>  hw/ide/internal.h    |  6 +++---
>  hw/ide/macio.c       |  2 +-
>  include/sysemu/dma.h | 12 ++++++------
>  5 files changed, 53 insertions(+), 29 deletions(-)
> 
> diff --git a/dma-helpers.c b/dma-helpers.c
> index af07aab..92c5d55 100644
> --- a/dma-helpers.c
> +++ b/dma-helpers.c
> @@ -70,7 +70,7 @@ void qemu_sglist_destroy(QEMUSGList *qsg)
>  
>  typedef struct {
>      BlockAIOCB common;
> -    BlockBackend *blk;
> +    AioContext *ctx;
>      BlockAIOCB *acb;
>      QEMUSGList *sg;
>      uint64_t offset;
> @@ -80,6 +80,7 @@ typedef struct {
>      QEMUIOVector iov;
>      QEMUBH *bh;
>      DMAIOFunc *io_func;
> +    void *io_func_opaque;
>  } DMAAIOCB;
>  
>  static void dma_blk_cb(void *opaque, int ret);
> @@ -154,8 +155,7 @@ static void dma_blk_cb(void *opaque, int ret)
>  
>      if (dbs->iov.size == 0) {
>          trace_dma_map_wait(dbs);
> -        dbs->bh = aio_bh_new(blk_get_aio_context(dbs->blk),
> -                             reschedule_dma, dbs);
> +        dbs->bh = aio_bh_new(dbs->ctx, reschedule_dma, dbs);
>          cpu_register_map_client(dbs->bh);
>          return;
>      }
> @@ -164,8 +164,8 @@ static void dma_blk_cb(void *opaque, int ret)
>          qemu_iovec_discard_back(&dbs->iov, dbs->iov.size & 
> ~BDRV_SECTOR_MASK);
>      }
>  
> -    dbs->acb = dbs->io_func(dbs->blk, dbs->offset, &dbs->iov, 0,
> -                            dma_blk_cb, dbs);
> +    dbs->acb = dbs->io_func(dbs->offset, &dbs->iov,
> +                            dma_blk_cb, dbs, dbs->io_func_opaque);
>      assert(dbs->acb);
>  }
>  
> @@ -191,23 +191,25 @@ static const AIOCBInfo dma_aiocb_info = {
>      .cancel_async       = dma_aio_cancel,
>  };
>  
> -BlockAIOCB *dma_blk_io(
> -    BlockBackend *blk, QEMUSGList *sg, uint64_t offset,
> -    DMAIOFunc *io_func, BlockCompletionFunc *cb,
> +BlockAIOCB *dma_blk_io(AioContext *ctx,
> +    QEMUSGList *sg, uint64_t opaque,

As pointed out by Mark, s/opaque/offset/

> +    DMAIOFunc *io_func, void *io_func_opaque,
> +    BlockCompletionFunc *cb,
>      void *opaque, DMADirection dir)
>  {
> -    DMAAIOCB *dbs = blk_aio_get(&dma_aiocb_info, blk, cb, opaque);
> +    DMAAIOCB *dbs = qemu_aio_get(&dma_aiocb_info, NULL, cb, opaque);
>  
> -    trace_dma_blk_io(dbs, blk, offset, (dir == DMA_DIRECTION_TO_DEVICE));
> +    trace_dma_blk_io(dbs, io_func_opaque, offset, (dir == 
> DMA_DIRECTION_TO_DEVICE));
>  
>      dbs->acb = NULL;
> -    dbs->blk = blk;
>      dbs->sg = sg;
> +    dbs->ctx = ctx;
>      dbs->offset = offset;
>      dbs->sg_cur_index = 0;
>      dbs->sg_cur_byte = 0;
>      dbs->dir = dir;
>      dbs->io_func = io_func;
> +    dbs->io_func_opaque = io_func_opaque;
>      dbs->bh = NULL;
>      qemu_iovec_init(&dbs->iov, sg->nsg);
>      dma_blk_cb(dbs, 0);
> @@ -215,19 +217,39 @@ BlockAIOCB *dma_blk_io(
>  }
>  
>  
> +static
> +BlockAIOCB *dma_blk_read_io_func(int64_t offset, QEMUIOVector *iov,
> +                                 BlockCompletionFunc *cb, void *cb_opaque,
> +                                 void *opaque)
> +{
> +    BlockBackend *blk = opaque;
> +    return blk_aio_preadv(blk, offset, iov, 0, cb, cb_opaque);
> +}
> +
>  BlockAIOCB *dma_blk_read(BlockBackend *blk,
>                           QEMUSGList *sg, uint64_t offset,
>                           void (*cb)(void *opaque, int ret), void *opaque)
>  {
> -    return dma_blk_io(blk, sg, offset, blk_aio_preadv, cb, opaque,
> +    return dma_blk_io(blk_get_aio_context(blk),
> +                      sg, offset, dma_blk_read_io_func, blk, cb, opaque,
>                        DMA_DIRECTION_FROM_DEVICE);
>  }
>  
> +static
> +BlockAIOCB *dma_blk_write_io_func(int64_t offset, QEMUIOVector *iov,
> +                                  BlockCompletionFunc *cb, void *cb_opaque,
> +                                  void *opaque)
> +{
> +    BlockBackend *blk = opaque;
> +    return blk_aio_pwritev(blk, offset, iov, 0, cb, cb_opaque);
> +}
> +
>  BlockAIOCB *dma_blk_write(BlockBackend *blk,
>                            QEMUSGList *sg, uint64_t offset,
>                            void (*cb)(void *opaque, int ret), void *opaque)
>  {
> -    return dma_blk_io(blk, sg, offset, blk_aio_pwritev, cb, opaque,
> +    return dma_blk_io(blk_get_aio_context(blk),
> +                      sg, offset, dma_blk_write_io_func, blk, cb, opaque,
>                        DMA_DIRECTION_TO_DEVICE);
>  }
>  
> diff --git a/hw/ide/core.c b/hw/ide/core.c
> index 7326189..029f6b9 100644
> --- a/hw/ide/core.c
> +++ b/hw/ide/core.c
> @@ -441,13 +441,14 @@ static void ide_issue_trim_cb(void *opaque, int ret)
>      }
>  }
>  
> -BlockAIOCB *ide_issue_trim(BlockBackend *blk,
> -        int64_t offset, QEMUIOVector *qiov, BdrvRequestFlags flags,
> -        BlockCompletionFunc *cb, void *opaque)
> +BlockAIOCB *ide_issue_trim(
> +        int64_t offset, QEMUIOVector *qiov,
> +        BlockCompletionFunc *cb, void *cb_opaque, void *opaque)
>  {
> +    BlockBackend *blk = opaque;
>      TrimAIOCB *iocb;
>  
> -    iocb = blk_aio_get(&trim_aiocb_info, blk, cb, opaque);
> +    iocb = blk_aio_get(&trim_aiocb_info, blk, cb, cb_opaque);
>      iocb->blk = blk;
>      iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
>      iocb->ret = 0;
> @@ -871,8 +872,9 @@ static void ide_dma_cb(void *opaque, int ret)
>                                             ide_dma_cb, s);
>          break;
>      case IDE_DMA_TRIM:
> -        s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, offset,
> -                                        ide_issue_trim, ide_dma_cb, s,
> +        s->bus->dma->aiocb = dma_blk_io(blk_get_aio_context(s->blk),
> +                                        &s->sg, offset,
> +                                        ide_issue_trim, s->blk, ide_dma_cb, 
> s,
>                                          DMA_DIRECTION_TO_DEVICE);
>          break;
>      default:
> diff --git a/hw/ide/internal.h b/hw/ide/internal.h
> index ceb9e59..773928a 100644
> --- a/hw/ide/internal.h
> +++ b/hw/ide/internal.h
> @@ -613,9 +613,9 @@ void ide_transfer_start(IDEState *s, uint8_t *buf, int 
> size,
>                          EndTransferFunc *end_transfer_func);
>  void ide_transfer_stop(IDEState *s);
>  void ide_set_inactive(IDEState *s, bool more);
> -BlockAIOCB *ide_issue_trim(BlockBackend *blk,
> -        int64_t offset, QEMUIOVector *qiov, BdrvRequestFlags flags,
> -        BlockCompletionFunc *cb, void *opaque);
> +BlockAIOCB *ide_issue_trim(
> +        int64_t offset, QEMUIOVector *qiov,
> +        BlockCompletionFunc *cb, void *cb_opaque, void *opaque);
>  BlockAIOCB *ide_buffered_readv(IDEState *s, int64_t sector_num,
>                                 QEMUIOVector *iov, int nb_sectors,
>                                 BlockCompletionFunc *cb, void *opaque);
> diff --git a/hw/ide/macio.c b/hw/ide/macio.c
> index d7d9c0f..42ad68a 100644
> --- a/hw/ide/macio.c
> +++ b/hw/ide/macio.c
> @@ -230,7 +230,7 @@ static void pmac_dma_trim(BlockBackend *blk,
>      s->io_buffer_index += io->len;
>      io->len = 0;
>  
> -    s->bus->dma->aiocb = ide_issue_trim(blk, offset, &io->iov, 0, cb, io);
> +    s->bus->dma->aiocb = ide_issue_trim(offset, &io->iov, cb, io, blk);
>  }
>  
>  static void pmac_ide_atapi_transfer_cb(void *opaque, int ret)
> diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
> index f0e0c30..34c8eaf 100644
> --- a/include/sysemu/dma.h
> +++ b/include/sysemu/dma.h
> @@ -194,14 +194,14 @@ void qemu_sglist_add(QEMUSGList *qsg, dma_addr_t base, 
> dma_addr_t len);
>  void qemu_sglist_destroy(QEMUSGList *qsg);
>  #endif
>  
> -typedef BlockAIOCB *DMAIOFunc(BlockBackend *blk, int64_t offset,
> -                              QEMUIOVector *iov, BdrvRequestFlags flags,
> -                              BlockCompletionFunc *cb, void *opaque);

Wasn't flags parameter added for a reason in d4f510eb3f? Would it be useful for
things like offloading FUA?

Fam

> +typedef BlockAIOCB *DMAIOFunc(int64_t offset, QEMUIOVector *iov,
> +                              BlockCompletionFunc *cb, void *cb_opaque,
> +                              void *opaque);
>  
> -BlockAIOCB *dma_blk_io(BlockBackend *blk,
> +BlockAIOCB *dma_blk_io(AioContext *ctx,
>                         QEMUSGList *sg, uint64_t offset,
> -                       DMAIOFunc *io_func, BlockCompletionFunc *cb,
> -                       void *opaque, DMADirection dir);
> +                       DMAIOFunc *io_func, void *io_func_opaque,
> +                       BlockCompletionFunc *cb, void *opaque, DMADirection 
> dir);
>  BlockAIOCB *dma_blk_read(BlockBackend *blk,
>                           QEMUSGList *sg, uint64_t offset,
>                           BlockCompletionFunc *cb, void *opaque);
> -- 
> 2.5.5
> 
> 
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]