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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user