From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
To: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 4/7] scsi-disk: introduce dma_readv and dma_writev
Date: Wed, 1 Jun 2016 20:07:23 +0100 [thread overview]
Message-ID: <574F326B.901@ilande.co.uk> (raw)
In-Reply-To: <1464008051-6429-5-git-send-email-pbonzini@redhat.com>
On 23/05/16 13:54, Paolo Bonzini wrote:
> These are replacements for blk_aio_preadv and blk_aio_pwritev that allow
> customization of the data path. They reuse the DMA helpers' DMAIOFunc
> callback type, so that the same function can be used in either the
> QEMUSGList or the bounce-buffered case.
>
> This customization will be needed in the next patch to do zero-copy
> SG_IO on scsi-block.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> hw/scsi/scsi-disk.c | 63 +++++++++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 52 insertions(+), 11 deletions(-)
>
> diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
> index eaadfd6..4b5db59 100644
> --- a/hw/scsi/scsi-disk.c
> +++ b/hw/scsi/scsi-disk.c
> @@ -55,7 +55,21 @@ do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
>
> #define TYPE_SCSI_DISK_BASE "scsi-disk-base"
>
> +#define SCSI_DISK_BASE(obj) \
> + OBJECT_CHECK(SCSIDiskState, (obj), TYPE_SCSI_DISK_BASE)
> +#define SCSI_DISK_BASE_CLASS(klass) \
> + OBJECT_CLASS_CHECK(SCSIDiskClass, (klass), TYPE_SCSI_DISK_BASE)
> +#define SCSI_DISK_BASE_GET_CLASS(obj) \
> + OBJECT_GET_CLASS(SCSIDiskClass, (obj), TYPE_SCSI_DISK_BASE)
> +
> typedef struct SCSIDiskState SCSIDiskState;
> +typedef struct SCSIDiskClass SCSIDiskClass;
> +
> +typedef struct SCSIDiskClass {
> + SCSIDeviceClass parent_class;
> + DMAIOFunc *dma_readv;
> + DMAIOFunc *dma_writev;
> +} SCSIDiskClass;
>
> typedef struct SCSIDiskReq {
> SCSIRequest req;
> @@ -317,6 +331,7 @@ done:
> static void scsi_do_read(SCSIDiskReq *r, int ret)
> {
> SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
> + SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
>
> assert (r->req.aiocb == NULL);
>
> @@ -337,16 +352,16 @@ static void scsi_do_read(SCSIDiskReq *r, int ret)
> if (r->req.sg) {
> dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ);
> r->req.resid -= r->req.sg->size;
> - r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg,
> - r->sector << BDRV_SECTOR_BITS,
> - scsi_dma_complete, r);
> + r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk),
> + r->req.sg, r->sector << BDRV_SECTOR_BITS,
> + sdc->dma_readv, r, scsi_dma_complete, r,
> + DMA_DIRECTION_FROM_DEVICE);
> } else {
> scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
> block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
> r->qiov.size, BLOCK_ACCT_READ);
> - r->req.aiocb = blk_aio_preadv(s->qdev.conf.blk,
> - r->sector << BDRV_SECTOR_BITS, &r->qiov,
> - 0, scsi_read_complete, r);
> + r->req.aiocb = sdc->dma_readv(r->sector, &r->qiov,
> + scsi_read_complete, r, r);
> }
>
> done:
> @@ -506,6 +521,7 @@ static void scsi_write_data(SCSIRequest *req)
> {
> SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
> SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
> + SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
>
> /* No data transfer may already be in progress */
> assert(r->req.aiocb == NULL);
> @@ -542,15 +558,16 @@ static void scsi_write_data(SCSIRequest *req)
> if (r->req.sg) {
> dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
> r->req.resid -= r->req.sg->size;
> - r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg,
> - r->sector << BDRV_SECTOR_BITS,
> scsi_dma_complete, r);
> + r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk),
> + r->req.sg, r->sector << BDRV_SECTOR_BITS,
> + sdc->dma_writev, r, scsi_dma_complete, r,
> + DMA_DIRECTION_TO_DEVICE);
> } else {
> block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
> r->qiov.size, BLOCK_ACCT_WRITE);
> - r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
> - r->sector << BDRV_SECTOR_BITS, &r->qiov,
> - 0, scsi_write_complete, r);
> + r->req.aiocb = sdc->dma_writev(r->sector << BDRV_SECTOR_BITS, &r->qiov,
> + scsi_write_complete, r, r);
> }
> }
>
> @@ -2658,12 +2675,35 @@ static int scsi_block_parse_cdb(SCSIDevice *d, SCSICommand *cmd,
>
> #endif
>
> +static
> +BlockAIOCB *scsi_dma_readv(int64_t offset, QEMUIOVector *iov,
> + BlockCompletionFunc *cb, void *cb_opaque,
> + void *opaque)
> +{
> + SCSIDiskReq *r = opaque;
> + SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
> + return blk_aio_preadv(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
> +}
> +
> +static
> +BlockAIOCB *scsi_dma_writev(int64_t offset, QEMUIOVector *iov,
> + BlockCompletionFunc *cb, void *cb_opaque,
> + void *opaque)
> +{
> + SCSIDiskReq *r = opaque;
> + SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
> + return blk_aio_pwritev(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
> +}
> +
> static void scsi_disk_base_class_initfn(ObjectClass *klass, void *data)
> {
> DeviceClass *dc = DEVICE_CLASS(klass);
> + SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
>
> dc->fw_name = "disk";
> dc->reset = scsi_disk_reset;
> + sdc->dma_readv = scsi_dma_readv;
> + sdc->dma_writev = scsi_dma_writev;
> }
>
> static const TypeInfo scsi_disk_base_info = {
> @@ -2671,6 +2711,7 @@ static const TypeInfo scsi_disk_base_info = {
> .parent = TYPE_SCSI_DEVICE,
> .class_init = scsi_disk_base_class_initfn,
> .instance_size = sizeof(SCSIDiskState),
> + .class_size = sizeof(SCSIDiskClass),
> };
>
> #define DEFINE_SCSI_DISK_PROPERTIES() \
Hi Paolo,
This patch appears to break qemu-system-sparc booting from CDROM with
the following command line:
./qemu-system-sparc -cdrom debian-40r4a-sparc-netinst.iso -boot d
Instead of booting straight into SILO, OpenBIOS hangs when trying to
read from the CDROM device.
ATB,
Mark.
next prev parent reply other threads:[~2016-06-01 19:08 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-23 12:54 [Qemu-devel] [PATCH v2 0/7] dma-helpers, scsi-block: use SG_IO for all I/O on scsi-block Paolo Bonzini
2016-05-23 12:54 ` [Qemu-devel] [PATCH 1/7] dma-helpers: change interface to byte-based Paolo Bonzini
2016-05-23 15:06 ` Eric Blake
2016-05-23 12:54 ` [Qemu-devel] [PATCH 2/7] dma-helpers: change BlockBackend to opaque value in DMAIOFunc Paolo Bonzini
2016-05-23 15:43 ` Eric Blake
2016-05-24 2:47 ` Fam Zheng
2016-05-24 7:05 ` Paolo Bonzini
2016-05-23 12:54 ` [Qemu-devel] [PATCH 3/7] scsi-disk: introduce a common base class Paolo Bonzini
2016-05-23 15:53 ` Eric Blake
2016-05-23 12:54 ` [Qemu-devel] [PATCH 4/7] scsi-disk: introduce dma_readv and dma_writev Paolo Bonzini
2016-05-23 16:09 ` Eric Blake
2016-06-01 19:07 ` Mark Cave-Ayland [this message]
2016-06-03 2:56 ` xiaoqiang zhao
2016-06-03 5:22 ` Mark Cave-Ayland
2016-06-03 6:07 ` xiaoqiang zhao
2016-05-23 12:54 ` [Qemu-devel] [PATCH 5/7] scsi-disk: add need_fua_emulation to SCSIDiskClass Paolo Bonzini
2016-05-23 16:34 ` Eric Blake
2016-05-24 3:04 ` Fam Zheng
2016-05-24 7:02 ` Paolo Bonzini
2016-05-23 12:54 ` [Qemu-devel] [PATCH 6/7] scsi-disk: introduce scsi_disk_req_check_error Paolo Bonzini
2016-05-23 19:16 ` Eric Blake
2016-05-23 12:54 ` [Qemu-devel] [PATCH 7/7] scsi-block: always use SG_IO Paolo Bonzini
2016-05-23 19:49 ` Eric Blake
2016-05-23 19:36 ` [Qemu-devel] [PATCH v2 0/7] dma-helpers, scsi-block: use SG_IO for all I/O on scsi-block Mark Cave-Ayland
2016-05-24 22:59 ` Mark Cave-Ayland
2016-05-25 8:45 ` Paolo Bonzini
2016-05-25 9:13 ` Mark Cave-Ayland
2016-05-25 10:11 ` Paolo Bonzini
2016-05-25 16:38 ` [Qemu-devel] [Qemu-block] " Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=574F326B.901@ilande.co.uk \
--to=mark.cave-ayland@ilande.co.uk \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.