Support addr=... in option argument of -drive if=virtio
Make drive_init() accept addr=, put the value into struct DriveInfo. Use it in all the places that create virtio-blk-pci devices: pc_init1(), bamboo_init(), mpc8544ds_init(). Don't support addr= in third argument of monitor command pci_add and second argument of drive_add, because that clashes with their first arguments. Admittedly unelegant. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
1f5f6638c0
commit
c2cc47a449
5
hw/pc.c
5
hw/pc.c
@ -848,6 +848,7 @@ static void pc_init1(ram_addr_t ram_size,
|
|||||||
ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
|
ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
|
||||||
int bios_size, isa_bios_size, oprom_area_size;
|
int bios_size, isa_bios_size, oprom_area_size;
|
||||||
PCIBus *pci_bus;
|
PCIBus *pci_bus;
|
||||||
|
PCIDevice *pci_dev;
|
||||||
int piix3_devfn = -1;
|
int piix3_devfn = -1;
|
||||||
CPUState *env;
|
CPUState *env;
|
||||||
qemu_irq *cpu_irq;
|
qemu_irq *cpu_irq;
|
||||||
@ -1161,7 +1162,9 @@ static void pc_init1(ram_addr_t ram_size,
|
|||||||
int unit_id = 0;
|
int unit_id = 0;
|
||||||
|
|
||||||
while ((index = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
|
while ((index = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
|
||||||
pci_create_simple(pci_bus, -1, "virtio-blk-pci");
|
pci_dev = pci_create("virtio-blk-pci",
|
||||||
|
drives_table[index].devaddr);
|
||||||
|
qdev_init(&pci_dev->qdev);
|
||||||
unit_id++;
|
unit_id++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,10 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
|
|||||||
drive_idx = add_init_drive(opts);
|
drive_idx = add_init_drive(opts);
|
||||||
if (drive_idx < 0)
|
if (drive_idx < 0)
|
||||||
return;
|
return;
|
||||||
|
if (drives_table[drive_idx].devaddr) {
|
||||||
|
monitor_printf(mon, "Parameter addr not supported\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
type = drives_table[drive_idx].type;
|
type = drives_table[drive_idx].type;
|
||||||
bus = drive_get_max_bus (type);
|
bus = drive_get_max_bus (type);
|
||||||
|
|
||||||
@ -116,6 +120,10 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
|
|||||||
drive_idx = add_init_drive(opts);
|
drive_idx = add_init_drive(opts);
|
||||||
if (drive_idx < 0)
|
if (drive_idx < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
if (drives_table[drive_idx].devaddr) {
|
||||||
|
monitor_printf(mon, "Parameter addr not supported\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
} else if (type == IF_VIRTIO) {
|
} else if (type == IF_VIRTIO) {
|
||||||
monitor_printf(mon, "virtio requires a backing file/device.\n");
|
monitor_printf(mon, "virtio requires a backing file/device.\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -90,6 +90,7 @@ static void bamboo_init(ram_addr_t ram_size,
|
|||||||
{
|
{
|
||||||
unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 };
|
unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 };
|
||||||
PCIBus *pcibus;
|
PCIBus *pcibus;
|
||||||
|
PCIDevice *pci_dev;
|
||||||
CPUState *env;
|
CPUState *env;
|
||||||
uint64_t elf_entry;
|
uint64_t elf_entry;
|
||||||
uint64_t elf_lowaddr;
|
uint64_t elf_lowaddr;
|
||||||
@ -110,7 +111,8 @@ static void bamboo_init(ram_addr_t ram_size,
|
|||||||
|
|
||||||
/* Add virtio block devices. */
|
/* Add virtio block devices. */
|
||||||
while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
|
while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
|
||||||
pci_create_simple(pcibus, -1, "virtio-blk-pci");
|
pci_dev = pci_create("virtio-blk-pci", drives_table[i].devaddr);
|
||||||
|
qdev_init(&pci_dev->qdev);
|
||||||
unit_id++;
|
unit_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,6 +157,7 @@ static void mpc8544ds_init(ram_addr_t ram_size,
|
|||||||
const char *cpu_model)
|
const char *cpu_model)
|
||||||
{
|
{
|
||||||
PCIBus *pci_bus;
|
PCIBus *pci_bus;
|
||||||
|
PCIDevice *pci_dev;
|
||||||
CPUState *env;
|
CPUState *env;
|
||||||
uint64_t elf_entry;
|
uint64_t elf_entry;
|
||||||
uint64_t elf_lowaddr;
|
uint64_t elf_lowaddr;
|
||||||
@ -219,7 +220,8 @@ static void mpc8544ds_init(ram_addr_t ram_size,
|
|||||||
|
|
||||||
/* Add virtio block devices. */
|
/* Add virtio block devices. */
|
||||||
while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
|
while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) {
|
||||||
pci_create_simple(pci_bus, -1, "virtio-blk-pci");
|
pci_dev = pci_create("virtio-blk-pci", drives_table[i].devaddr);
|
||||||
|
qdev_init(&pci_dev->qdev);
|
||||||
unit_id++;
|
unit_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +92,7 @@ DEF("drive", HAS_ARG, QEMU_OPTION_drive,
|
|||||||
"-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
|
"-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
|
||||||
" [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
|
" [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
|
||||||
" [,cache=writethrough|writeback|none][,format=f][,serial=s]\n"
|
" [,cache=writethrough|writeback|none][,format=f][,serial=s]\n"
|
||||||
|
" [,addr=A]\n"
|
||||||
" use 'file' as a drive image\n")
|
" use 'file' as a drive image\n")
|
||||||
STEXI
|
STEXI
|
||||||
@item -drive @var{option}[,@var{option}[,@var{option}[,...]]]
|
@item -drive @var{option}[,@var{option}[,@var{option}[,...]]]
|
||||||
@ -126,6 +127,8 @@ the format. Can be used to specifiy format=raw to avoid interpreting
|
|||||||
an untrusted format header.
|
an untrusted format header.
|
||||||
@item serial=@var{serial}
|
@item serial=@var{serial}
|
||||||
This option specifies the serial number to assign to the device.
|
This option specifies the serial number to assign to the device.
|
||||||
|
@item addr=@var{addr}
|
||||||
|
Specify the controller's PCI address (if=virtio only).
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
By default, writethrough caching is used for all block device. This means that
|
By default, writethrough caching is used for all block device. This means that
|
||||||
|
1
sysemu.h
1
sysemu.h
@ -156,6 +156,7 @@ typedef enum {
|
|||||||
|
|
||||||
typedef struct DriveInfo {
|
typedef struct DriveInfo {
|
||||||
BlockDriverState *bdrv;
|
BlockDriverState *bdrv;
|
||||||
|
const char *devaddr;
|
||||||
BlockInterfaceType type;
|
BlockInterfaceType type;
|
||||||
int bus;
|
int bus;
|
||||||
int unit;
|
int unit;
|
||||||
|
14
vl.c
14
vl.c
@ -2209,12 +2209,14 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
|
|||||||
int index;
|
int index;
|
||||||
int cache;
|
int cache;
|
||||||
int bdrv_flags, onerror;
|
int bdrv_flags, onerror;
|
||||||
|
const char *devaddr;
|
||||||
int drives_table_idx;
|
int drives_table_idx;
|
||||||
char *str = arg->opt;
|
char *str = arg->opt;
|
||||||
static const char * const params[] = { "bus", "unit", "if", "index",
|
static const char * const params[] = { "bus", "unit", "if", "index",
|
||||||
"cyls", "heads", "secs", "trans",
|
"cyls", "heads", "secs", "trans",
|
||||||
"media", "snapshot", "file",
|
"media", "snapshot", "file",
|
||||||
"cache", "format", "serial", "werror",
|
"cache", "format", "serial",
|
||||||
|
"werror", "addr",
|
||||||
NULL };
|
NULL };
|
||||||
|
|
||||||
if (check_params(buf, sizeof(buf), params, str) < 0) {
|
if (check_params(buf, sizeof(buf), params, str) < 0) {
|
||||||
@ -2428,6 +2430,15 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
devaddr = NULL;
|
||||||
|
if (get_param_value(buf, sizeof(buf), "addr", str)) {
|
||||||
|
if (type != IF_VIRTIO) {
|
||||||
|
fprintf(stderr, "addr is not supported by in '%s'\n", str);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
devaddr = strdup(buf);
|
||||||
|
}
|
||||||
|
|
||||||
/* compute bus and unit according index */
|
/* compute bus and unit according index */
|
||||||
|
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
@ -2489,6 +2500,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque)
|
|||||||
bdrv = bdrv_new(buf);
|
bdrv = bdrv_new(buf);
|
||||||
drives_table_idx = drive_get_free_idx();
|
drives_table_idx = drive_get_free_idx();
|
||||||
drives_table[drives_table_idx].bdrv = bdrv;
|
drives_table[drives_table_idx].bdrv = bdrv;
|
||||||
|
drives_table[drives_table_idx].devaddr = devaddr;
|
||||||
drives_table[drives_table_idx].type = type;
|
drives_table[drives_table_idx].type = type;
|
||||||
drives_table[drives_table_idx].bus = bus_id;
|
drives_table[drives_table_idx].bus = bus_id;
|
||||||
drives_table[drives_table_idx].unit = unit_id;
|
drives_table[drives_table_idx].unit = unit_id;
|
||||||
|
Loading…
Reference in New Issue
Block a user