xen/pvcalls: initialize the module and register the xenbus backend
authorStefano Stabellini <sstabellini@kernel.org>
Wed, 5 Jul 2017 20:08:48 +0000 (13:08 -0700)
committerBoris Ostrovsky <boris.ostrovsky@oracle.com>
Thu, 31 Aug 2017 13:45:55 +0000 (09:45 -0400)
Keep a list of connected frontends. Use a semaphore to protect list
accesses.

Signed-off-by: Stefano Stabellini <stefano@aporeto.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
CC: boris.ostrovsky@oracle.com
CC: jgross@suse.com
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
drivers/xen/pvcalls-back.c

index f3d0daad3da6946864a3e430523f3b4740135766..9044cf21b31c2fabb911c8d1500fc23f45ec6a48 100644 (file)
 #include <xen/xenbus.h>
 #include <xen/interface/io/pvcalls.h>
 
+struct pvcalls_back_global {
+       struct list_head frontends;
+       struct semaphore frontends_lock;
+} pvcalls_back_global;
+
 static int pvcalls_back_probe(struct xenbus_device *dev,
                              const struct xenbus_device_id *id)
 {
@@ -59,3 +64,20 @@ static struct xenbus_driver pvcalls_back_driver = {
        .uevent = pvcalls_back_uevent,
        .otherend_changed = pvcalls_back_changed,
 };
+
+static int __init pvcalls_back_init(void)
+{
+       int ret;
+
+       if (!xen_domain())
+               return -ENODEV;
+
+       ret = xenbus_register_backend(&pvcalls_back_driver);
+       if (ret < 0)
+               return ret;
+
+       sema_init(&pvcalls_back_global.frontends_lock, 1);
+       INIT_LIST_HEAD(&pvcalls_back_global.frontends);
+       return 0;
+}
+module_init(pvcalls_back_init);