[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [qemu-xen-unstable] passthrough: hot-plug PCI devices at boot-time



commit 5beedb58147cbb04e206a71429198b6316217cfc
Author: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Date:   Mon Jun 1 10:45:42 2009 +0100

    passthrough: hot-plug PCI devices at boot-time
    
    Currently there are two interfaces to pass-through PCI devices:
    1. A method driven through per-device xenstore entries that is used at 
boot-time
    2. An event-based method used for hot-plug.
    
    This seems somewhat redundant and makes extending the code cumbersome
    and prone to error - often the change needs to be made twice, in
    two different ways.
    
    This patch removes support for the boot-time protocol from qemu-xen.
    
    There is a companion patch for xend which uses the hot-plug protocol
    at boot time.
    
    Cc: Edwin Zhai <edwin.zhai@xxxxxxxxx>
    Cc: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
    Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
---
 hw/pass-through.c |   61 +---------------------------------------------------
 hw/pc.c           |   11 +++------
 hw/pci.h          |    2 +-
 vl.c              |    3 --
 xenstore.c        |   58 --------------------------------------------------
 5 files changed, 7 insertions(+), 128 deletions(-)

diff --git a/hw/pass-through.c b/hw/pass-through.c
index 2af2a1c..57c2c27 100644
--- a/hw/pass-through.c
+++ b/hw/pass-through.c
@@ -4247,16 +4247,9 @@ int power_off_php_slot(int php_slot)
     return unregister_real_device(php_slot);
 }
 
-int pt_init(PCIBus *e_bus, const char *direct_pci)
+int pt_init(PCIBus *e_bus)
 {
-    int seg, b, d, f, s, status = -1;
-    struct pt_dev *pt_dev;
     struct pci_access *pci_access;
-    char *vslots;
-    char slot_str[8];
-    char *direct_pci_head = NULL;
-    char *direct_pci_p = NULL;
-    char *opt;
 
     /* Initialize libpci */
     pci_access = pci_alloc();
@@ -4272,56 +4265,6 @@ int pt_init(PCIBus *e_bus, const char *direct_pci)
     dpci_infos.pci_access = pci_access;
     dpci_infos.e_bus      = e_bus;
 
-    if ( !direct_pci || strlen(direct_pci) == 0 ) {
-        return 0;
-    }
-
-    if ( !(direct_pci_head = direct_pci_p = strdup(direct_pci)) )
-        return 0;
-
-    /* The minimal format of direct_pci: xxxx:xx:xx.x-xxxx:xx:xx.x-... It may
-     * be even longer considering the per-device opts(see the parsing for
-     * '/local/domain/0/backend/pci/XX/YY/opts-ZZ' in
-     * xenstore_parse_domain_config().
-     *
-     * The format of vslots(virtual pci slots of all pass-through devs):
-     * 0xXX;0xXX;... (see the code below).
-     *
-     * We're sure the length of direct_pci is bigger than that of vslots.
-     */
-    vslots = qemu_mallocz(strlen(direct_pci) + 1);
-    if ( vslots == NULL )
-    {
-        status = -1;
-        goto err;
-    }
-
-    /* Assign given devices to guest */
-    while ( next_bdf(&direct_pci_p, &seg, &b, &d, &f, &opt, &s) )
-    {
-        /* Register real device with the emulated bus */
-        pt_dev = register_real_device(e_bus, "DIRECT PCI", s,
-            b, d, f, PT_MACHINE_IRQ_AUTO, pci_access, opt);
-        if ( pt_dev == NULL )
-        {
-            PT_LOG("Error: Registration failed (%02x:%02x.%x)\n", b, d, f);
-            goto err;
-        }
-
-        /* Record the virtual slot info */
-        sprintf(slot_str, "0x%02x;", PCI_SLOT(pt_dev->dev.devfn));
-
-        strcat(vslots, slot_str);
-    }
-
-    /* Write virtual slots info to xenstore for Control panel use */
-    xenstore_write_vslots(vslots);
-
-    status = 0;
-err:
-    qemu_free(vslots);
-    free(direct_pci_head);
-
-    return status;
+    return 0;
 }
 
diff --git a/hw/pc.c b/hw/pc.c
index 9a5637c..129e9d9 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -787,8 +787,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
                      const char *boot_device,
                      const char *kernel_filename, const char *kernel_cmdline,
                      const char *initrd_filename,
-                     int pci_enabled, const char *cpu_model,
-                    const char *direct_pci)
+                     int pci_enabled, const char *cpu_model)
 {
     char buf[1024];
     int ret, linux_boot, i;
@@ -1017,7 +1016,7 @@ vga_bios_error:
      */
     if ( pci_enabled )
     {
-        rc = pt_init(pci_bus, direct_pci); 
+        rc = pt_init(pci_bus);
         if ( rc < 0 )
         {
             fprintf(logfile, "Error: Initialization failed for pass-through 
devices\n");
@@ -1205,8 +1204,7 @@ static void pc_init_pci(ram_addr_t ram_size, int 
vga_ram_size,
 {
     pc_init1(ram_size, vga_ram_size, boot_device,
              kernel_filename, kernel_cmdline,
-             initrd_filename, 1, cpu_model,
-             direct_pci);
+             initrd_filename, 1, cpu_model);
 }
 
 static void pc_init_isa(ram_addr_t ram_size, int vga_ram_size,
@@ -1219,8 +1217,7 @@ static void pc_init_isa(ram_addr_t ram_size, int 
vga_ram_size,
 {
     pc_init1(ram_size, vga_ram_size, boot_device,
              kernel_filename, kernel_cmdline,
-             initrd_filename, 0, cpu_model,
-             direct_pci);
+             initrd_filename, 0, cpu_model);
 }
 
 /* set CMOS shutdown status register (index 0xF) as S3_resume(0xFE)
diff --git a/hw/pci.h b/hw/pci.h
index ee13a36..d45b80c 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -337,6 +337,6 @@ PCIBus *sh_pci_register_bus(pci_set_irq_fn set_irq, 
pci_map_irq_fn map_irq,
                             qemu_irq *pic, int devfn_min, int nirq);
 
 /* pass-through.c */
-int pt_init(PCIBus *e_bus, const char *direct_pci_opt);
+int pt_init(PCIBus *e_bus);
 
 #endif
diff --git a/vl.c b/vl.c
index 3506977..7549a19 100644
--- a/vl.c
+++ b/vl.c
@@ -5829,9 +5829,6 @@ int main(int argc, char **argv, char **envp)
         }
     }
 
-    if (strlen(direct_pci_str) > 0)
-        direct_pci = direct_pci_str;
-
     machine->init(ram_size, vga_ram_size, boot_devices,
                   kernel_filename, kernel_cmdline, initrd_filename, cpu_model,
                  direct_pci);
diff --git a/xenstore.c b/xenstore.c
index 3db3531..8504610 100644
--- a/xenstore.c
+++ b/xenstore.c
@@ -301,10 +301,8 @@ static const char *xenstore_get_guest_uuid(void)
     return already_computed;
 }
 
-#define DIRECT_PCI_STR_LEN 512
 #define PT_PCI_MSITRANSLATE_DEFAULT 1
 #define PT_PCI_POWER_MANAGEMENT_DEFAULT 0
-char direct_pci_str[DIRECT_PCI_STR_LEN];
 int direct_pci_msitranslate;
 int direct_pci_power_mgmt;
 void xenstore_parse_domain_config(int hvm_domid)
@@ -567,62 +565,6 @@ void xenstore_parse_domain_config(int hvm_domid)
         goto out;
     num = atoi(params);
 
-    for ( i = 0; i < num; i++ ) {
-        if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/dev-%d",
-                    hvm_domid, pci_devid, i) != -1) {
-            free(dev);
-            dev = xs_read(xsh, XBT_NULL, buf, &len);
-
-            if ( strlen(dev) + strlen(direct_pci_str) > DIRECT_PCI_STR_LEN - 
1) {
-                fprintf(stderr, "qemu: too many pci pass-through devices\n");
-                memset(direct_pci_str, 0, DIRECT_PCI_STR_LEN);
-                goto out;
-            }
-
-
-            /* append to direct_pci_str */
-            if ( !dev )
-                continue;
-
-            strcat(direct_pci_str, dev);
-
-            if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/vslot-%d",
-                          hvm_domid, pci_devid, i) != -1) {
-                free(dev);
-                dev = xs_read(xsh, XBT_NULL, buf, &len);
-            }
-            if ( dev ) {
-                if (strlen(dev) + strlen(direct_pci_str) >
-                    DIRECT_PCI_STR_LEN - 2) {
-                    fprintf(stderr, "qemu: too many pci pass-through "
-                            "devices\n");
-                    memset(direct_pci_str, 0, DIRECT_PCI_STR_LEN);
-                    goto out;
-                }
-                strcat(direct_pci_str, "@");
-                strcat(direct_pci_str, dev);
-            }
-
-
-            if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/opts-%d",
-                          hvm_domid, pci_devid, i) != -1) {
-                free(dev);
-                dev = xs_read(xsh, XBT_NULL, buf, &len);
-            }
-            if ( dev ) {
-                if ( strlen(dev) + strlen(direct_pci_str) > DIRECT_PCI_STR_LEN 
- 2) {
-                    fprintf(stderr, "qemu: too many pci pass-through 
devices\n");
-                    memset(direct_pci_str, 0, DIRECT_PCI_STR_LEN);
-                    goto out;
-                }
-                strcat(direct_pci_str, ",");
-                strcat(direct_pci_str, dev);
-            }
-
-            strcat(direct_pci_str, "-");
-        }
-    }
-
     /* get the pci pass-through parameter */
     if (pasprintf(&buf, "/local/domain/0/backend/pci/%u/%u/msitranslate",
                   hvm_domid, pci_devid) != -1)
--
generated by git-patchbot for /home/xen/git/qemu-xen-unstable.git

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.