From: Eric Farman <farman@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Alexander Graf <agraf@suse.de>,
Paolo Bonzini <pbonzini@redhat.com>, Fam Zheng <famz@redhat.com>,
Eric Farman <farman@linux.vnet.ibm.com>
Subject: [Qemu-devel] [RFC PATCH v2 3/8] pc-bios/s390-ccw: Break up virtio-scsi read into multiples
Date: Wed, 10 May 2017 17:53:54 +0200 [thread overview]
Message-ID: <20170510155359.32727-4-farman@linux.vnet.ibm.com> (raw)
In-Reply-To: <20170510155359.32727-1-farman@linux.vnet.ibm.com>
A virtio-scsi request that goes through the host sd driver and exceeds
the maximum transfer size is automatically broken up for us. But the
equivalent request going to the sg driver presumes that any length
requirements have already been honored.
Let's use the max_sectors field on the virtio-scsi controller device,
and break up all requests (both sd and sg) to avoid this problem.
Signed-off-by: Eric Farman <farman@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/s390-ccw.h | 7 +++++++
pc-bios/s390-ccw/virtio-scsi.c | 20 +++++++++++++++-----
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index 07d8cbc..2089274 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -42,6 +42,13 @@ typedef unsigned long long __u64;
#ifndef NULL
#define NULL 0
#endif
+#ifndef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#endif
+#ifndef MIN_NON_ZERO
+#define MIN_NON_ZERO(a, b) ((a) == 0 ? (b) : \
+ ((b) == 0 ? (a) : (MIN(a, b))))
+#endif
#include "cio.h"
#include "iplb.h"
diff --git a/pc-bios/s390-ccw/virtio-scsi.c b/pc-bios/s390-ccw/virtio-scsi.c
index 6d070e2..ff65e2e 100644
--- a/pc-bios/s390-ccw/virtio-scsi.c
+++ b/pc-bios/s390-ccw/virtio-scsi.c
@@ -202,6 +202,7 @@ static void virtio_scsi_locate_device(VDev *vdev)
debug_print_int("config.scsi.max_channel", vdev->config.scsi.max_channel);
debug_print_int("config.scsi.max_target ", vdev->config.scsi.max_target);
debug_print_int("config.scsi.max_lun ", vdev->config.scsi.max_lun);
+ debug_print_int("config.scsi.max_sectors", vdev->config.scsi.max_sectors);
if (vdev->scsi_device_selected) {
sdev->channel = vdev->selected_scsi_device.channel;
@@ -254,12 +255,21 @@ static void virtio_scsi_locate_device(VDev *vdev)
int virtio_scsi_read_many(VDev *vdev,
ulong sector, void *load_addr, int sec_num)
{
+ int sector_count;
int f = vdev->blk_factor;
- unsigned int data_size = sec_num * virtio_get_block_size() * f;
-
- if (!scsi_read_10(vdev, sector * f, sec_num * f, load_addr, data_size)) {
- virtio_scsi_verify_response(&resp, "virtio-scsi:read_many");
- }
+ unsigned int data_size;
+
+ do {
+ sector_count = MIN_NON_ZERO(sec_num, vdev->config.scsi.max_sectors);
+ data_size = sector_count * virtio_get_block_size() * f;
+ if (!scsi_read_10(vdev, sector * f, sector_count * f, load_addr,
+ data_size)) {
+ virtio_scsi_verify_response(&resp, "virtio-scsi:read_many");
+ }
+ load_addr += data_size;
+ sector += sector_count;
+ sec_num -= sector_count;
+ } while (sec_num > 0);
return 0;
}
--
2.10.2
next prev parent reply other threads:[~2017-05-10 15:54 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-10 15:53 [Qemu-devel] [RFC PATCH v2 0/8] s390x: Enable virtio-scsi boot from /dev/sgX Eric Farman
2017-05-10 15:53 ` [Qemu-devel] [RFC PATCH v2 1/8] pc-bios/s390-ccw: Remove duplicate blk_factor adjustment Eric Farman
2017-05-10 15:53 ` [Qemu-devel] [RFC PATCH v2 2/8] pc-bios/s390-ccw: Move SCSI block factor to outer read Eric Farman
2017-05-10 15:53 ` Eric Farman [this message]
2017-05-10 15:53 ` [Qemu-devel] [RFC PATCH v2 4/8] pc-bios/s390-ccw: Refactor scsi_inquiry function Eric Farman
2017-05-10 15:53 ` [Qemu-devel] [RFC PATCH v2 5/8] pc-bios/s390-ccw: Get list of supported VPD pages Eric Farman
2017-05-10 15:53 ` [Qemu-devel] [RFC PATCH v2 6/8] pc-bios/s390-ccw: Get Block Limits VPD device data Eric Farman
2017-05-10 15:53 ` [Qemu-devel] [RFC PATCH v2 7/8] pc-bios/s390-ccw: Build a reasonable max_sectors limit Eric Farman
2017-05-10 15:53 ` [Qemu-devel] [RFC PATCH v2 8/8] pc-bios/s390-ccw.img: rebuild image Eric Farman
2017-05-11 13:51 ` [Qemu-devel] [RFC PATCH v2 0/8] s390x: Enable virtio-scsi boot from /dev/sgX Cornelia Huck
2017-05-16 13:44 ` Christian Borntraeger
2017-05-17 11:48 ` Cornelia Huck
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=20170510155359.32727-4-farman@linux.vnet.ibm.com \
--to=farman@linux.vnet.ibm.com \
--cc=agraf@suse.de \
--cc=borntraeger@de.ibm.com \
--cc=cornelia.huck@de.ibm.com \
--cc=famz@redhat.com \
--cc=pbonzini@redhat.com \
--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).