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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).