From 215e47b9ea2cd7926333b7dc683024aa00e0c386 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 8 Feb 2013 14:06:14 +0100 Subject: blockdev: enable discard by default Because discard is now a host parameter, we can always fake it as enabled in the guest. This is an extension of the current choice to ignore "not supported" errors from the host when discard_granularity is set to nonzero. The default granularity is set to the logical block size or 4k, whichever is largest, because cluster sizes below 4k are rarely used and 4K is a typical block size for files. Signed-off-by: Paolo Bonzini Signed-off-by: Kevin Wolf --- hw/block-common.h | 2 +- hw/ide/qdev.c | 5 ++++- hw/scsi-disk.c | 13 ++++++++++--- 3 files changed, 15 insertions(+), 5 deletions(-) (limited to 'hw') diff --git a/hw/block-common.h b/hw/block-common.h index bb808f7..dd11532 100644 --- a/hw/block-common.h +++ b/hw/block-common.h @@ -50,7 +50,7 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf) DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0), \ DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1), \ DEFINE_PROP_UINT32("discard_granularity", _state, \ - _conf.discard_granularity, 0) + _conf.discard_granularity, -1) #define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf) \ DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0), \ diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index c436b38..fd06da7 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -143,7 +143,10 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind) IDEBus *bus = DO_UPCAST(IDEBus, qbus, dev->qdev.parent_bus); IDEState *s = bus->ifs + dev->unit; - if (dev->conf.discard_granularity && dev->conf.discard_granularity != 512) { + if (dev->conf.discard_granularity == -1) { + dev->conf.discard_granularity = 512; + } else if (dev->conf.discard_granularity && + dev->conf.discard_granularity != 512) { error_report("discard_granularity must be 512 for ide"); return -1; } diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 28e75bb..d411586 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -41,9 +41,11 @@ do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0) #include #endif -#define SCSI_DMA_BUF_SIZE 131072 -#define SCSI_MAX_INQUIRY_LEN 256 -#define SCSI_MAX_MODE_LEN 256 +#define SCSI_DMA_BUF_SIZE 131072 +#define SCSI_MAX_INQUIRY_LEN 256 +#define SCSI_MAX_MODE_LEN 256 + +#define DEFAULT_DISCARD_GRANULARITY 4096 typedef struct SCSIDiskState SCSIDiskState; @@ -2059,6 +2061,11 @@ static int scsi_initfn(SCSIDevice *dev) return -1; } + if (s->qdev.conf.discard_granularity == -1) { + s->qdev.conf.discard_granularity = + MAX(s->qdev.conf.logical_block_size, DEFAULT_DISCARD_GRANULARITY); + } + if (!s->version) { s->version = g_strdup(qemu_get_version()); } -- cgit v1.1 From bf3caa3dc17552b323cec6831301a22cfc98ecd5 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 8 Feb 2013 14:06:15 +0100 Subject: pc: add compatibility machine types for 1.4 Adds both pc-i440fx-1.4 and pc-q35-1.4. Signed-off-by: Paolo Bonzini Signed-off-by: Kevin Wolf --- hw/pc.h | 31 +++++++++++++++++++++++++++++++ hw/pc_piix.c | 18 ++++++++++++++++-- hw/pc_q35.c | 19 ++++++++++++++++--- 3 files changed, 63 insertions(+), 5 deletions(-) (limited to 'hw') diff --git a/hw/pc.h b/hw/pc.h index fbcf43d..da1b102 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -187,4 +187,35 @@ void pc_system_firmware_init(MemoryRegion *rom_memory); int e820_add_entry(uint64_t, uint64_t, uint32_t); +#define PC_COMPAT_1_4 \ + {\ + .driver = "scsi-hd",\ + .property = "discard_granularity",\ + .value = stringify(0),\ + },{\ + .driver = "scsi-cd",\ + .property = "discard_granularity",\ + .value = stringify(0),\ + },{\ + .driver = "scsi-disk",\ + .property = "discard_granularity",\ + .value = stringify(0),\ + },{\ + .driver = "ide-hd",\ + .property = "discard_granularity",\ + .value = stringify(0),\ + },{\ + .driver = "ide-cd",\ + .property = "discard_granularity",\ + .value = stringify(0),\ + },{\ + .driver = "ide-drive",\ + .property = "discard_granularity",\ + .value = stringify(0),\ + },{\ + .driver = "virtio-blk-pci",\ + .property = "discard_granularity",\ + .value = stringify(0),\ + } + #endif diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 0af436c..aa9cc81 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -294,8 +294,8 @@ static void pc_xen_hvm_init(QEMUMachineInitArgs *args) } #endif -static QEMUMachine pc_i440fx_machine_v1_4 = { - .name = "pc-i440fx-1.4", +static QEMUMachine pc_i440fx_machine_v1_5 = { + .name = "pc-i440fx-1.5", .alias = "pc", .desc = "Standard PC (i440FX + PIIX, 1996)", .init = pc_init_pci, @@ -304,7 +304,20 @@ static QEMUMachine pc_i440fx_machine_v1_4 = { DEFAULT_MACHINE_OPTIONS, }; +static QEMUMachine pc_i440fx_machine_v1_4 = { + .name = "pc-i440fx-1.4", + .desc = "Standard PC (i440FX + PIIX, 1996)", + .init = pc_init_pci, + .max_cpus = 255, + .compat_props = (GlobalProperty[]) { + PC_COMPAT_1_4, + { /* end of list */ } + }, + DEFAULT_MACHINE_OPTIONS, +}; + #define PC_COMPAT_1_3 \ + PC_COMPAT_1_4, \ {\ .driver = "usb-tablet",\ .property = "usb_version",\ @@ -679,6 +692,7 @@ static QEMUMachine xenfv_machine = { static void pc_machine_init(void) { + qemu_register_machine(&pc_i440fx_machine_v1_5); qemu_register_machine(&pc_i440fx_machine_v1_4); qemu_register_machine(&pc_machine_v1_3); qemu_register_machine(&pc_machine_v1_2); diff --git a/hw/pc_q35.c b/hw/pc_q35.c index 6f5ff8d..e22fb98 100644 --- a/hw/pc_q35.c +++ b/hw/pc_q35.c @@ -209,8 +209,8 @@ static void pc_q35_init(QEMUMachineInitArgs *args) } } -static QEMUMachine pc_q35_machine = { - .name = "pc-q35-1.4", +static QEMUMachine pc_q35_machine_v1_5 = { + .name = "pc-q35-1.5", .alias = "q35", .desc = "Standard PC (Q35 + ICH9, 2009)", .init = pc_q35_init, @@ -218,9 +218,22 @@ static QEMUMachine pc_q35_machine = { DEFAULT_MACHINE_OPTIONS, }; +static QEMUMachine pc_q35_machine_v1_4 = { + .name = "pc-q35-1.4", + .desc = "Standard PC (Q35 + ICH9, 2009)", + .init = pc_q35_init, + .max_cpus = 255, + .compat_props = (GlobalProperty[]) { + PC_COMPAT_1_4, + { /* end of list */ } + }, + DEFAULT_MACHINE_OPTIONS, +}; + static void pc_q35_machine_init(void) { - qemu_register_machine(&pc_q35_machine); + qemu_register_machine(&pc_q35_machine_v1_5); + qemu_register_machine(&pc_q35_machine_v1_4); } machine_init(pc_q35_machine_init); -- cgit v1.1