virtio-scsi: Add virtqueue_size parameter allowing virtqueue size to be set.
Since Linux switched to blk-mq as the default in Linux commit 5c279bd9e406 ("scsi: default to scsi-mq"), virtio-scsi LUNs consume about 10x as much guest kernel memory. This commit allows you to choose the virtqueue size for each virtio-scsi-pci controller like this: -device virtio-scsi-pci,id=scsi,virtqueue_size=16 The default is still 128 as before. Using smaller virtqueue_size allows many more disks to be added to small memory virtual machines. For a 1 vCPU, 500 MB, no swap VM I observed: With scsi-mq enabled (upstream kernel): 175 disks -"- ditto -"- virtqueue_size=64: 318 disks -"- ditto -"- virtqueue_size=16: 775 disks With scsi-mq disabled (kernel before 5c279bd9e406): 1755 disks Note that to have any effect, this requires a kernel patch: https://lkml.org/lkml/2017/8/10/689 Signed-off-by: Richard W.M. Jones <rjones@redhat.com> Message-Id: <20170810165255.20865-1-rjones@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
aa406feadf
commit
5c0919d020
|
@ -867,10 +867,10 @@ void virtio_scsi_common_realize(DeviceState *dev,
|
||||||
s->sense_size = VIRTIO_SCSI_SENSE_DEFAULT_SIZE;
|
s->sense_size = VIRTIO_SCSI_SENSE_DEFAULT_SIZE;
|
||||||
s->cdb_size = VIRTIO_SCSI_CDB_DEFAULT_SIZE;
|
s->cdb_size = VIRTIO_SCSI_CDB_DEFAULT_SIZE;
|
||||||
|
|
||||||
s->ctrl_vq = virtio_add_queue(vdev, VIRTIO_SCSI_VQ_SIZE, ctrl);
|
s->ctrl_vq = virtio_add_queue(vdev, s->conf.virtqueue_size, ctrl);
|
||||||
s->event_vq = virtio_add_queue(vdev, VIRTIO_SCSI_VQ_SIZE, evt);
|
s->event_vq = virtio_add_queue(vdev, s->conf.virtqueue_size, evt);
|
||||||
for (i = 0; i < s->conf.num_queues; i++) {
|
for (i = 0; i < s->conf.num_queues; i++) {
|
||||||
s->cmd_vqs[i] = virtio_add_queue(vdev, VIRTIO_SCSI_VQ_SIZE, cmd);
|
s->cmd_vqs[i] = virtio_add_queue(vdev, s->conf.virtqueue_size, cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -917,6 +917,8 @@ static void virtio_scsi_device_unrealize(DeviceState *dev, Error **errp)
|
||||||
|
|
||||||
static Property virtio_scsi_properties[] = {
|
static Property virtio_scsi_properties[] = {
|
||||||
DEFINE_PROP_UINT32("num_queues", VirtIOSCSI, parent_obj.conf.num_queues, 1),
|
DEFINE_PROP_UINT32("num_queues", VirtIOSCSI, parent_obj.conf.num_queues, 1),
|
||||||
|
DEFINE_PROP_UINT32("virtqueue_size", VirtIOSCSI,
|
||||||
|
parent_obj.conf.virtqueue_size, 128),
|
||||||
DEFINE_PROP_UINT32("max_sectors", VirtIOSCSI, parent_obj.conf.max_sectors,
|
DEFINE_PROP_UINT32("max_sectors", VirtIOSCSI, parent_obj.conf.max_sectors,
|
||||||
0xFFFF),
|
0xFFFF),
|
||||||
DEFINE_PROP_UINT32("cmd_per_lun", VirtIOSCSI, parent_obj.conf.cmd_per_lun,
|
DEFINE_PROP_UINT32("cmd_per_lun", VirtIOSCSI, parent_obj.conf.cmd_per_lun,
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#define VIRTIO_SCSI(obj) \
|
#define VIRTIO_SCSI(obj) \
|
||||||
OBJECT_CHECK(VirtIOSCSI, (obj), TYPE_VIRTIO_SCSI)
|
OBJECT_CHECK(VirtIOSCSI, (obj), TYPE_VIRTIO_SCSI)
|
||||||
|
|
||||||
#define VIRTIO_SCSI_VQ_SIZE 128
|
|
||||||
#define VIRTIO_SCSI_MAX_CHANNEL 0
|
#define VIRTIO_SCSI_MAX_CHANNEL 0
|
||||||
#define VIRTIO_SCSI_MAX_TARGET 255
|
#define VIRTIO_SCSI_MAX_TARGET 255
|
||||||
#define VIRTIO_SCSI_MAX_LUN 16383
|
#define VIRTIO_SCSI_MAX_LUN 16383
|
||||||
|
@ -48,6 +47,7 @@ typedef struct virtio_scsi_config VirtIOSCSIConfig;
|
||||||
|
|
||||||
struct VirtIOSCSIConf {
|
struct VirtIOSCSIConf {
|
||||||
uint32_t num_queues;
|
uint32_t num_queues;
|
||||||
|
uint32_t virtqueue_size;
|
||||||
uint32_t max_sectors;
|
uint32_t max_sectors;
|
||||||
uint32_t cmd_per_lun;
|
uint32_t cmd_per_lun;
|
||||||
#ifdef CONFIG_VHOST_SCSI
|
#ifdef CONFIG_VHOST_SCSI
|
||||||
|
|
Loading…
Reference in a new issue