]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
Handle failure to register the xen store event channel instead of 3.0.2-branched
authorIan.Campbell@xensource.com <none@none>
Mon, 3 Apr 2006 13:34:20 +0000 (14:34 +0100)
committerIan.Campbell@xensource.com <none@none>
Mon, 3 Apr 2006 13:34:20 +0000 (14:34 +0100)
just not initialising xenbus/store when the supervisor_mode_kernel
feature flag is enabled.

When initialising grant tables only -ENOSYS is a valid reason
to fail so BUG_ON anything else like we did prior to changeset
9498.

Signed-off-by: Ian Campbell <ian.campbell@xensource.com>
linux-2.6-xen-sparse/drivers/xen/core/gnttab.c
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c

index fa12e701d4222c46d53d40d762fd743cd0a5792e..71da6c4df9b406d63aec10f6a28680b88bede272 100644 (file)
@@ -395,10 +395,10 @@ gnttab_resume(void)
        setup.frame_list = frames;
 
        rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
-       if (rc < 0)
-               return rc;
+       if (rc == -ENOSYS)
+               return -ENOSYS;
 
-       BUG_ON(setup.status);
+       BUG_ON(rc || setup.status);
 
 #ifndef __ia64__
        if (shared == NULL) {
index db1492d0503e55a9d420977a5ef4a92ed7d7f9c1..e9c8315856072f556d3bb5e8f166577cf6a9c0da 100644 (file)
@@ -984,6 +984,7 @@ static int xsd_port_read(char *page, char **start, off_t off,
 static int __init xenbus_probe_init(void)
 {
        int err = 0, dom0;
+       unsigned long page = 0;
 
        DPRINTK("");
 
@@ -992,19 +993,9 @@ static int __init xenbus_probe_init(void)
                return -ENODEV;
        }
 
-       /* Register ourselves with the kernel bus & device subsystems */
+       /* Register ourselves with the kernel bus subsystem */
        bus_register(&xenbus_frontend.bus);
        bus_register(&xenbus_backend.bus);
-       device_register(&xenbus_frontend.dev);
-       device_register(&xenbus_backend.dev);
-
-       /*
-         * The supervisor_mode_kernel feature only allows a single
-         * domain so there is no need to initialise event channels
-         * etc.
-         */
-       if (xen_feature(XENFEAT_supervisor_mode_kernel))
-               return -ENODEV;
 
        /*
         * Domain0 doesn't have a store_evtchn or store_mfn yet.
@@ -1012,11 +1003,7 @@ static int __init xenbus_probe_init(void)
        dom0 = (xen_start_info->store_evtchn == 0);
 
        if (dom0) {
-
-               unsigned long page;
                evtchn_op_t op = { 0 };
-               int ret;
-
 
                /* Allocate page. */
                page = get_zeroed_page(GFP_KERNEL);
@@ -1032,8 +1019,10 @@ static int __init xenbus_probe_init(void)
                op.u.alloc_unbound.dom        = DOMID_SELF;
                op.u.alloc_unbound.remote_dom = 0;
 
-               ret = HYPERVISOR_event_channel_op(&op);
-               BUG_ON(ret);
+               err = HYPERVISOR_event_channel_op(&op);
+               if (err == -ENOSYS)
+                       goto err;
+               BUG_ON(err);
                xen_start_info->store_evtchn = op.u.alloc_unbound.port;
 
                /* And finally publish the above info in /proc/xen */
@@ -1056,13 +1045,29 @@ static int __init xenbus_probe_init(void)
        if (err) {
                printk(KERN_WARNING
                       "XENBUS: Error initializing xenstore comms: %i\n", err);
-               return err;
+               goto err;
        }
 
+       /* Register ourselves with the kernel device subsystem */
+       device_register(&xenbus_frontend.dev);
+       device_register(&xenbus_backend.dev);
+
        if (!dom0)
                xenbus_probe(NULL);
 
        return 0;
+
+ err:
+       if (page)
+               free_page(page);
+
+       /*
+         * Do not unregister the xenbus front/backend buses here. The
+         * buses must exist because front/backend drivers will use
+         * them when they are registered.
+         */
+
+       return err;
 }
 
 postcore_initcall(xenbus_probe_init);