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

[Xen-devel] [RFC PATCH 13/16] drivers/xen: gnttab, evtchn, xenbus API changes



Mechanical changes, now most of these calls take xenhost_t *
as parameter.

Co-developed-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
Signed-off-by: Ankur Arora <ankur.a.arora@xxxxxxxxxx>
---
 drivers/xen/cpu_hotplug.c     | 14 ++++++-------
 drivers/xen/gntalloc.c        | 13 ++++++++----
 drivers/xen/gntdev.c          | 16 +++++++++++----
 drivers/xen/manage.c          | 37 ++++++++++++++++++-----------------
 drivers/xen/platform-pci.c    | 12 +++++++-----
 drivers/xen/sys-hypervisor.c  | 12 ++++++++----
 drivers/xen/xen-balloon.c     | 10 +++++++---
 drivers/xen/xenfs/xenstored.c |  7 ++++---
 8 files changed, 73 insertions(+), 48 deletions(-)

diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c
index afeb94446d34..4a05bc028956 100644
--- a/drivers/xen/cpu_hotplug.c
+++ b/drivers/xen/cpu_hotplug.c
@@ -31,13 +31,13 @@ static void disable_hotplug_cpu(int cpu)
        unlock_device_hotplug();
 }
 
-static int vcpu_online(unsigned int cpu)
+static int vcpu_online(xenhost_t *xh, unsigned int cpu)
 {
        int err;
        char dir[16], state[16];
 
        sprintf(dir, "cpu/%u", cpu);
-       err = xenbus_scanf(xh_default, XBT_NIL, dir, "availability", "%15s", 
state);
+       err = xenbus_scanf(xh, XBT_NIL, dir, "availability", "%15s", state);
        if (err != 1) {
                if (!xen_initial_domain())
                        pr_err("Unable to read cpu state\n");
@@ -52,12 +52,12 @@ static int vcpu_online(unsigned int cpu)
        pr_err("unknown state(%s) on CPU%d\n", state, cpu);
        return -EINVAL;
 }
-static void vcpu_hotplug(unsigned int cpu)
+static void vcpu_hotplug(xenhost_t *xh, unsigned int cpu)
 {
        if (!cpu_possible(cpu))
                return;
 
-       switch (vcpu_online(cpu)) {
+       switch (vcpu_online(xh, cpu)) {
        case 1:
                enable_hotplug_cpu(cpu);
                break;
@@ -78,7 +78,7 @@ static void handle_vcpu_hotplug_event(struct xenbus_watch 
*watch,
        cpustr = strstr(path, "cpu/");
        if (cpustr != NULL) {
                sscanf(cpustr, "cpu/%u", &cpu);
-               vcpu_hotplug(cpu);
+               vcpu_hotplug(watch->xh, cpu);
        }
 }
 
@@ -93,7 +93,7 @@ static int setup_cpu_watcher(struct notifier_block *notifier,
        (void)register_xenbus_watch(xh_default, &cpu_watch);
 
        for_each_possible_cpu(cpu) {
-               if (vcpu_online(cpu) == 0) {
+               if (vcpu_online(cpu_watch.xh, cpu) == 0) {
                        (void)cpu_down(cpu);
                        set_cpu_present(cpu, false);
                }
@@ -114,7 +114,7 @@ static int __init setup_vcpu_hotplug_event(void)
 #endif
                return -ENODEV;
 
-       register_xenstore_notifier(&xsn_cpu);
+       register_xenstore_notifier(xh_default, &xsn_cpu);
 
        return 0;
 }
diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index e07823886fa8..a490e4e8c854 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -79,6 +79,8 @@ static LIST_HEAD(gref_list);
 static DEFINE_MUTEX(gref_mutex);
 static int gref_size;
 
+static xenhost_t *xh;
+
 struct notify_info {
        uint16_t pgoff:12;    /* Bits 0-11: Offset of the byte to clear */
        uint16_t flags:2;     /* Bits 12-13: Unmap notification flags */
@@ -144,7 +146,7 @@ static int add_grefs(struct ioctl_gntalloc_alloc_gref *op,
                }
 
                /* Grant foreign access to the page. */
-               rc = gnttab_grant_foreign_access(op->domid,
+               rc = gnttab_grant_foreign_access(xh, op->domid,
                                                 xen_page_to_gfn(gref->page),
                                                 readonly);
                if (rc < 0)
@@ -196,13 +198,13 @@ static void __del_gref(struct gntalloc_gref *gref)
        gref->notify.flags = 0;
 
        if (gref->gref_id) {
-               if (gnttab_query_foreign_access(gref->gref_id))
+               if (gnttab_query_foreign_access(xh, gref->gref_id))
                        return;
 
-               if (!gnttab_end_foreign_access_ref(gref->gref_id, 0))
+               if (!gnttab_end_foreign_access_ref(xh, gref->gref_id, 0))
                        return;
 
-               gnttab_free_grant_reference(gref->gref_id);
+               gnttab_free_grant_reference(xh, gref->gref_id);
        }
 
        gref_size--;
@@ -586,6 +588,9 @@ static int __init gntalloc_init(void)
        if (!xen_domain())
                return -ENODEV;
 
+       /* Limit to default xenhost for now. */
+       xh = xh_default;
+
        err = misc_register(&gntalloc_miscdev);
        if (err != 0) {
                pr_err("Could not register misc gntalloc device\n");
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 0f0c951cd5b1..40a42abe2dd0 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -67,6 +67,8 @@ static atomic_t pages_mapped = ATOMIC_INIT(0);
 static int use_ptemod;
 #define populate_freeable_maps use_ptemod
 
+static xenhost_t *xh;
+
 static int unmap_grant_pages(struct gntdev_grant_map *map,
                             int offset, int pages);
 
@@ -114,7 +116,7 @@ static void gntdev_free_map(struct gntdev_grant_map *map)
        } else
 #endif
        if (map->pages)
-               gnttab_free_pages(map->count, map->pages);
+               gnttab_free_pages(xh, map->count, map->pages);
 
 #ifdef CONFIG_XEN_GRANT_DMA_ALLOC
        kfree(map->frames);
@@ -183,7 +185,7 @@ struct gntdev_grant_map *gntdev_alloc_map(struct 
gntdev_priv *priv, int count,
                add->dma_bus_addr = args.dev_bus_addr;
        } else
 #endif
-       if (gnttab_alloc_pages(count, add->pages))
+       if (gnttab_alloc_pages(xh, count, add->pages))
                goto err;
 
        for (i = 0; i < count; i++) {
@@ -339,7 +341,7 @@ int gntdev_map_grant_pages(struct gntdev_grant_map *map)
        }
 
        pr_debug("map %d+%d\n", map->index, map->count);
-       err = gnttab_map_refs(map->map_ops, use_ptemod ? map->kmap_ops : NULL,
+       err = gnttab_map_refs(xh, map->map_ops, use_ptemod ? map->kmap_ops : 
NULL,
                        map->pages, map->count);
        if (err)
                return err;
@@ -385,6 +387,7 @@ static int __unmap_grant_pages(struct gntdev_grant_map 
*map, int offset,
        unmap_data.kunmap_ops = use_ptemod ? map->kunmap_ops + offset : NULL;
        unmap_data.pages = map->pages + offset;
        unmap_data.count = pages;
+       unmap_data.xh = xh;
 
        err = gnttab_unmap_refs_sync(&unmap_data);
        if (err)
@@ -877,7 +880,7 @@ static int gntdev_copy(struct gntdev_copy_batch *batch)
 {
        unsigned int i;
 
-       gnttab_batch_copy(batch->ops, batch->nr_ops);
+       gnttab_batch_copy(xh, batch->ops, batch->nr_ops);
        gntdev_put_pages(batch);
 
        /*
@@ -1210,8 +1213,13 @@ static int __init gntdev_init(void)
        if (!xen_domain())
                return -ENODEV;
 
+       /*
+        * Use for mappings grants related to the default xenhost.
+        */
+       xh = xh_default;
        use_ptemod = !xen_feature(XENFEAT_auto_translated_physmap);
 
+
        err = misc_register(&gntdev_miscdev);
        if (err != 0) {
                pr_err("Could not register gntdev device\n");
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index 9a69d955dd5c..1655d0a039fd 100644
--- a/drivers/xen/manage.c
+++ b/drivers/xen/manage.c
@@ -227,14 +227,14 @@ static void shutdown_handler(struct xenbus_watch *watch,
                return;
 
  again:
-       err = xenbus_transaction_start(xh_default, &xbt);
+       err = xenbus_transaction_start(watch->xh, &xbt);
        if (err)
                return;
 
-       str = (char *)xenbus_read(xh_default, xbt, "control", "shutdown", NULL);
+       str = (char *)xenbus_read(watch->xh, xbt, "control", "shutdown", NULL);
        /* Ignore read errors and empty reads. */
        if (XENBUS_IS_ERR_READ(str)) {
-               xenbus_transaction_end(xh_default, xbt, 1);
+               xenbus_transaction_end(watch->xh, xbt, 1);
                return;
        }
 
@@ -245,9 +245,9 @@ static void shutdown_handler(struct xenbus_watch *watch,
 
        /* Only acknowledge commands which we are prepared to handle. */
        if (idx < ARRAY_SIZE(shutdown_handlers))
-               xenbus_write(xh_default, xbt, "control", "shutdown", "");
+               xenbus_write(watch->xh, xbt, "control", "shutdown", "");
 
-       err = xenbus_transaction_end(xh_default, xbt, 0);
+       err = xenbus_transaction_end(watch->xh, xbt, 0);
        if (err == -EAGAIN) {
                kfree(str);
                goto again;
@@ -272,10 +272,10 @@ static void sysrq_handler(struct xenbus_watch *watch, 
const char *path,
        int err;
 
  again:
-       err = xenbus_transaction_start(xh_default, &xbt);
+       err = xenbus_transaction_start(watch->xh, &xbt);
        if (err)
                return;
-       err = xenbus_scanf(xh_default, xbt, "control", "sysrq", "%c", 
&sysrq_key);
+       err = xenbus_scanf(watch->xh, xbt, "control", "sysrq", "%c", 
&sysrq_key);
        if (err < 0) {
                /*
                 * The Xenstore watch fires directly after registering it and
@@ -287,21 +287,21 @@ static void sysrq_handler(struct xenbus_watch *watch, 
const char *path,
                if (err != -ENOENT && err != -ERANGE)
                        pr_err("Error %d reading sysrq code in control/sysrq\n",
                               err);
-               xenbus_transaction_end(xh_default, xbt, 1);
+               xenbus_transaction_end(watch->xh, xbt, 1);
                return;
        }
 
        if (sysrq_key != '\0') {
-               err = xenbus_printf(xh_default, xbt, "control", "sysrq", "%c", 
'\0');
+               err = xenbus_printf(watch->xh, xbt, "control", "sysrq", "%c", 
'\0');
                if (err) {
                        pr_err("%s: Error %d writing sysrq in control/sysrq\n",
                               __func__, err);
-                       xenbus_transaction_end(xh_default, xbt, 1);
+                       xenbus_transaction_end(watch->xh, xbt, 1);
                        return;
                }
        }
 
-       err = xenbus_transaction_end(xh_default, xbt, 0);
+       err = xenbus_transaction_end(watch->xh, xbt, 0);
        if (err == -EAGAIN)
                goto again;
 
@@ -324,14 +324,14 @@ static struct notifier_block xen_reboot_nb = {
        .notifier_call = poweroff_nb,
 };
 
-static int setup_shutdown_watcher(void)
+static int setup_shutdown_watcher(xenhost_t *xh)
 {
        int err;
        int idx;
 #define FEATURE_PATH_SIZE (SHUTDOWN_CMD_SIZE + sizeof("feature-"))
        char node[FEATURE_PATH_SIZE];
 
-       err = register_xenbus_watch(xh_default, &shutdown_watch);
+       err = register_xenbus_watch(xh, &shutdown_watch);
        if (err) {
                pr_err("Failed to set shutdown watcher\n");
                return err;
@@ -339,7 +339,7 @@ static int setup_shutdown_watcher(void)
 
 
 #ifdef CONFIG_MAGIC_SYSRQ
-       err = register_xenbus_watch(xh_default, &sysrq_watch);
+       err = register_xenbus_watch(xh, &sysrq_watch);
        if (err) {
                pr_err("Failed to set sysrq watcher\n");
                return err;
@@ -351,7 +351,7 @@ static int setup_shutdown_watcher(void)
                        continue;
                snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
                         shutdown_handlers[idx].command);
-               err = xenbus_printf(xh_default, XBT_NIL, "control", node, "%u", 
1);
+               err = xenbus_printf(xh, XBT_NIL, "control", node, "%u", 1);
                if (err) {
                        pr_err("%s: Error %d writing %s\n", __func__,
                                err, node);
@@ -364,9 +364,9 @@ static int setup_shutdown_watcher(void)
 
 static int shutdown_event(struct notifier_block *notifier,
                          unsigned long event,
-                         void *data)
+                         void *xh)
 {
-       setup_shutdown_watcher();
+       setup_shutdown_watcher((xenhost_t *) xh);
        return NOTIFY_DONE;
 }
 
@@ -378,7 +378,8 @@ int xen_setup_shutdown_event(void)
 
        if (!xen_domain())
                return -ENODEV;
-       register_xenstore_notifier(&xenstore_notifier);
+
+       register_xenstore_notifier(xh_default, &xenstore_notifier);
        register_reboot_notifier(&xen_reboot_nb);
 
        return 0;
diff --git a/drivers/xen/platform-pci.c b/drivers/xen/platform-pci.c
index 5d7dcad0b0a0..8fdb01c4a610 100644
--- a/drivers/xen/platform-pci.c
+++ b/drivers/xen/platform-pci.c
@@ -154,18 +154,20 @@ static int platform_pci_probe(struct pci_dev *pdev,
                }
        }
 
-       max_nr_gframes = gnttab_max_grant_frames();
+       max_nr_gframes = gnttab_max_grant_frames(xh_default);
        grant_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes);
-       ret = gnttab_setup_auto_xlat_frames(grant_frames);
+       ret = gnttab_setup_auto_xlat_frames(xh_default, grant_frames);
        if (ret)
                goto out;
-       ret = gnttab_init();
+
+       /* HVM only, we don't need xh_remote */
+       ret = gnttab_init(xh_default);
        if (ret)
                goto grant_out;
-       xenbus_probe(NULL);
+       __xenbus_probe(xh_default->xenstore_private);
        return 0;
 grant_out:
-       gnttab_free_auto_xlat_frames();
+       gnttab_free_auto_xlat_frames(xh_default);
 out:
        pci_release_region(pdev, 0);
 mem_out:
diff --git a/drivers/xen/sys-hypervisor.c b/drivers/xen/sys-hypervisor.c
index 005a898e7a23..d69c0790692c 100644
--- a/drivers/xen/sys-hypervisor.c
+++ b/drivers/xen/sys-hypervisor.c
@@ -14,6 +14,7 @@
 #include <linux/err.h>
 
 #include <xen/interface/xen.h>
+#include <xen/xenhost.h>
 #include <asm/xen/hypervisor.h>
 #include <asm/xen/hypercall.h>
 
@@ -141,15 +142,15 @@ static ssize_t uuid_show_fallback(struct hyp_sysfs_attr 
*attr, char *buffer)
 {
        char *vm, *val;
        int ret;
-       extern int xenstored_ready;
 
+       /* Disable for now: xenstored_ready is private to xenbus
        if (!xenstored_ready)
-               return -EBUSY;
+               return -EBUSY;*/
 
-       vm = xenbus_read(XBT_NIL, "vm", "", NULL);
+       vm = xenbus_read(xh_default, XBT_NIL, "vm", "", NULL);
        if (IS_ERR(vm))
                return PTR_ERR(vm);
-       val = xenbus_read(XBT_NIL, vm, "uuid", NULL);
+       val = xenbus_read(xh_default, XBT_NIL, vm, "uuid", NULL);
        kfree(vm);
        if (IS_ERR(val))
                return PTR_ERR(val);
@@ -602,6 +603,9 @@ static struct kobj_type hyp_sysfs_kobj_type = {
        .sysfs_ops = &hyp_sysfs_ops,
 };
 
+/*
+ * For now, default xenhost only.
+ */
 static int __init hypervisor_subsys_init(void)
 {
        if (!xen_domain())
diff --git a/drivers/xen/xen-balloon.c b/drivers/xen/xen-balloon.c
index d34d9b1af7a8..9d448dd7ff17 100644
--- a/drivers/xen/xen-balloon.c
+++ b/drivers/xen/xen-balloon.c
@@ -40,6 +40,7 @@
 
 #include <xen/xen.h>
 #include <xen/interface/xen.h>
+#include <xen/xenhost.h>
 #include <xen/balloon.h>
 #include <xen/xenbus.h>
 #include <xen/features.h>
@@ -99,11 +100,11 @@ static struct xenbus_watch target_watch = {
 
 static int balloon_init_watcher(struct notifier_block *notifier,
                                unsigned long event,
-                               void *data)
+                               void *xh)
 {
        int err;
 
-       err = register_xenbus_watch(xh_default, &target_watch);
+       err = register_xenbus_watch(xh, &target_watch);
        if (err)
                pr_err("Failed to set balloon watcher\n");
 
@@ -120,7 +121,10 @@ void xen_balloon_init(void)
 
        register_xen_selfballooning(&balloon_dev);
 
-       register_xenstore_notifier(&xenstore_notifier);
+       /*
+        * ballooning is only concerned with the default xenhost.
+        */
+       register_xenstore_notifier(xh_default, &xenstore_notifier);
 }
 EXPORT_SYMBOL_GPL(xen_balloon_init);
 
diff --git a/drivers/xen/xenfs/xenstored.c b/drivers/xen/xenfs/xenstored.c
index f59235f9f8a2..1d66974ae730 100644
--- a/drivers/xen/xenfs/xenstored.c
+++ b/drivers/xen/xenfs/xenstored.c
@@ -8,6 +8,7 @@
 #include <xen/xenbus.h>
 
 #include "xenfs.h"
+#include "../xenbus/xenbus.h" /* FIXME */
 
 static ssize_t xsd_read(struct file *file, char __user *buf,
                            size_t size, loff_t *off)
@@ -25,7 +26,7 @@ static int xsd_release(struct inode *inode, struct file *file)
 static int xsd_kva_open(struct inode *inode, struct file *file)
 {
        file->private_data = (void *)kasprintf(GFP_KERNEL, "0x%p",
-                                              xen_store_interface);
+                                              
xs_priv(xh_default)->store_interface);
        if (!file->private_data)
                return -ENOMEM;
        return 0;
@@ -39,7 +40,7 @@ static int xsd_kva_mmap(struct file *file, struct 
vm_area_struct *vma)
                return -EINVAL;
 
        if (remap_pfn_range(vma, vma->vm_start,
-                           virt_to_pfn(xen_store_interface),
+                           virt_to_pfn(xs_priv(xh_default)->store_interface),
                            size, vma->vm_page_prot))
                return -EAGAIN;
 
@@ -56,7 +57,7 @@ const struct file_operations xsd_kva_file_ops = {
 static int xsd_port_open(struct inode *inode, struct file *file)
 {
        file->private_data = (void *)kasprintf(GFP_KERNEL, "%d",
-                                              xen_store_evtchn);
+                                              
xs_priv(xh_default)->store_evtchn);
        if (!file->private_data)
                return -ENOMEM;
        return 0;
-- 
2.20.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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