[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 03/21] pc-bios/s390-ccw: Break up virtio-scsi read i
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PATCH 03/21] pc-bios/s390-ccw: Break up virtio-scsi read into multiples |
Date: |
Fri, 19 May 2017 12:55:42 +0200 |
From: Eric Farman <address@hidden>
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 <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
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 07d8cbcb20..2089274842 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 6d070e2f73..ff65e2ee30 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.13.0
- [Qemu-devel] [PATCH 00/21] s390x changes, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 02/21] pc-bios/s390-ccw: Move SCSI block factor to outer read, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 01/21] pc-bios/s390-ccw: Remove duplicate blk_factor adjustment, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 03/21] pc-bios/s390-ccw: Break up virtio-scsi read into multiples,
Cornelia Huck <=
- [Qemu-devel] [PATCH 04/21] pc-bios/s390-ccw: Refactor scsi_inquiry function, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 07/21] pc-bios/s390-ccw: Build a reasonable max_sectors limit, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 06/21] pc-bios/s390-ccw: Get Block Limits VPD device data, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 05/21] pc-bios/s390-ccw: Get list of supported VPD pages, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 11/21] s390x/css: realize css_sch_build_schib, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 12/21] s390x/css: realize css_create_sch, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 08/21] pc-bios/s390-ccw.img: rebuild image, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 10/21] s390x/css: add s390-squash-mcss machine option, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 09/21] linux-headers: update, Cornelia Huck, 2017/05/19
- [Qemu-devel] [PATCH 14/21] vfio/ccw: vfio based subchannel passthrough driver, Cornelia Huck, 2017/05/19