From: Jan Kiszka <[email protected]>

The hypervisor's disable function will lose support for destroying
non-root cells along with the shutdown. Prepare for this by performing
an explicit non-root cell destruction prior to calling the shutdown
command.

Signed-off-by: Jan Kiszka <[email protected]>
---
 driver/cell.c | 76 +++++++++++++++++++++++++++++++++--------------------------
 driver/cell.h |  6 ++---
 driver/main.c |  8 +++++--
 3 files changed, 51 insertions(+), 39 deletions(-)

diff --git a/driver/cell.c b/driver/cell.c
index 8ec7165..fcd9426 100644
--- a/driver/cell.c
+++ b/driver/cell.c
@@ -1,7 +1,7 @@
 /*
  * Jailhouse, a Linux-based partitioning hypervisor
  *
- * Copyright (c) Siemens AG, 2013-2015
+ * Copyright (c) Siemens AG, 2013-2016
  *
  * Authors:
  *  Jan Kiszka <[email protected]>
@@ -129,29 +129,10 @@ void jailhouse_cell_register_root(void)
 
 void jailhouse_cell_delete_root(void)
 {
-       cell_delete(root_cell);
-}
-
-void jailhouse_cell_delete_all(void)
-{
-       struct cell *cell, *tmp;
-       unsigned int cpu;
-
        jailhouse_pci_do_all_devices(root_cell, JAILHOUSE_PCI_TYPE_IVSHMEM,
                                     JAILHOUSE_PCI_ACTION_DEL);
 
-       jailhouse_pci_do_all_devices(root_cell, JAILHOUSE_PCI_TYPE_DEVICE,
-                                    JAILHOUSE_PCI_ACTION_RELEASE);
-
-       list_for_each_entry_safe(cell, tmp, &cells, entry)
-               jailhouse_cell_delete(cell);
-
-       for_each_cpu(cpu, &offlined_cpus) {
-               if (cpu_up(cpu) != 0)
-                       pr_err("Jailhouse: failed to bring CPU %d back "
-                              "online\n", cpu);
-               cpumask_clear_cpu(cpu, &offlined_cpus);
-       }
+       cell_delete(root_cell);
 }
 
 int jailhouse_cmd_cell_create(struct jailhouse_cell_create __user *arg)
@@ -389,23 +370,14 @@ int jailhouse_cmd_cell_start(const char __user *arg)
        return err;
 }
 
-int jailhouse_cmd_cell_destroy(const char __user *arg)
+static int cell_destroy(struct cell *cell)
 {
-       struct jailhouse_cell_id cell_id;
-       struct cell *cell;
        unsigned int cpu;
        int err;
 
-       if (copy_from_user(&cell_id, arg, sizeof(cell_id)))
-               return -EFAULT;
-
-       err = cell_management_prologue(&cell_id, &cell);
-       if (err)
-               return err;
-
        err = jailhouse_call_arg1(JAILHOUSE_HC_CELL_DESTROY, cell->id);
        if (err)
-               goto unlock_out;
+               return err;
 
        for_each_cpu(cpu, &cell->cpus_assigned) {
                if (cpumask_test_cpu(cpu, &offlined_cpus)) {
@@ -423,10 +395,46 @@ int jailhouse_cmd_cell_destroy(const char __user *arg)
        pr_info("Destroyed Jailhouse cell \"%s\"\n",
                kobject_name(&cell->kobj));
 
-       jailhouse_cell_delete(cell);
+       cell_delete(cell);
+
+       return 0;
+}
+
+int jailhouse_cmd_cell_destroy(const char __user *arg)
+{
+       struct jailhouse_cell_id cell_id;
+       struct cell *cell;
+       int err;
+
+       if (copy_from_user(&cell_id, arg, sizeof(cell_id)))
+               return -EFAULT;
+
+       err = cell_management_prologue(&cell_id, &cell);
+       if (err)
+               return err;
+
+       err = cell_destroy(cell);
 
-unlock_out:
        mutex_unlock(&jailhouse_lock);
 
        return err;
 }
+
+int jailhouse_cmd_cell_destroy_non_root(void)
+{
+       struct cell *cell, *tmp;
+       int err;
+
+       list_for_each_entry_safe(cell, tmp, &cells, entry) {
+               if (cell == root_cell)
+                       continue;
+               err = cell_destroy(cell);
+               if (err) {
+                       pr_err("Jailhouse: failed to destroy cell \"%s\"\n",
+                              kobject_name(&cell->kobj));
+                       return err;
+               }
+       }
+
+       return 0;
+}
diff --git a/driver/cell.h b/driver/cell.h
index db8a11a..649cca0 100644
--- a/driver/cell.h
+++ b/driver/cell.h
@@ -1,7 +1,7 @@
 /*
  * Jailhouse, a Linux-based partitioning hypervisor
  *
- * Copyright (c) Siemens AG, 2014-2015
+ * Copyright (c) Siemens AG, 2014-2016
  *
  * Authors:
  *  Jan Kiszka <[email protected]>
@@ -43,11 +43,11 @@ int jailhouse_cell_prepare_root(const struct 
jailhouse_cell_desc *cell_desc);
 void jailhouse_cell_register_root(void);
 void jailhouse_cell_delete_root(void);
 
-void jailhouse_cell_delete_all(void);
-
 int jailhouse_cmd_cell_create(struct jailhouse_cell_create __user *arg);
 int jailhouse_cmd_cell_load(struct jailhouse_cell_load __user *arg);
 int jailhouse_cmd_cell_start(const char __user *arg);
 int jailhouse_cmd_cell_destroy(const char __user *arg);
 
+int jailhouse_cmd_cell_destroy_non_root(void);
+
 #endif /* !_JAILHOUSE_DRIVER_CELL_H */
diff --git a/driver/main.c b/driver/main.c
index 13154e6..0a76e18 100644
--- a/driver/main.c
+++ b/driver/main.c
@@ -1,7 +1,7 @@
 /*
  * Jailhouse, a Linux-based partitioning hypervisor
  *
- * Copyright (c) Siemens AG, 2013-2015
+ * Copyright (c) Siemens AG, 2013-2016
  * Copyright (c) Valentine Sinitsyn, 2014
  *
  * Authors:
@@ -387,6 +387,10 @@ static int jailhouse_cmd_disable(void)
                goto unlock_out;
        }
 
+       err = jailhouse_cmd_cell_destroy_non_root();
+       if (err)
+               goto unlock_out;
+
        error_code = 0;
 
        preempt_disable();
@@ -416,7 +420,7 @@ static int jailhouse_cmd_disable(void)
 
        vunmap(hypervisor_mem);
 
-       jailhouse_cell_delete_all();
+       jailhouse_cell_delete_root();
        jailhouse_enabled = false;
        module_put(THIS_MODULE);
 
-- 
2.1.4

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to