[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 03/21] pc-bios/s390-ccw: Break up virtio-scsi read in
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PULL 03/21] pc-bios/s390-ccw: Break up virtio-scsi read into multiples |
Date: |
Tue, 23 May 2017 13:12:48 +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] [PULL 00/21] s390x patches, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 01/21] pc-bios/s390-ccw: Remove duplicate blk_factor adjustment, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 02/21] pc-bios/s390-ccw: Move SCSI block factor to outer read, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 04/21] pc-bios/s390-ccw: Refactor scsi_inquiry function, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 05/21] pc-bios/s390-ccw: Get list of supported VPD pages, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 06/21] pc-bios/s390-ccw: Get Block Limits VPD device data, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 07/21] pc-bios/s390-ccw: Build a reasonable max_sectors limit, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 03/21] pc-bios/s390-ccw: Break up virtio-scsi read into multiples,
Cornelia Huck <=
- [Qemu-devel] [PULL 08/21] pc-bios/s390-ccw.img: rebuild image, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 09/21] linux-headers: update, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 10/21] s390x/css: add s390-squash-mcss machine option, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 13/21] s390x/css: device support for s390-ccw passthrough, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 12/21] s390x/css: realize css_create_sch, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 14/21] vfio/ccw: vfio based subchannel passthrough driver, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 11/21] s390x/css: realize css_sch_build_schib, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 20/21] MAINTAINERS: Add vfio-ccw maintainer, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 16/21] vfio/ccw: get irqs info and set the eventfd fd, Cornelia Huck, 2017/05/23
- [Qemu-devel] [PULL 18/21] s390x/css: ccw translation infrastructure, Cornelia Huck, 2017/05/23