On 2016-08-01 19:23, Antonios Motakis wrote: > That's pretty neat, now we don't need to worry about the broken PSCI on the > Seattle board as much :)
Broken? Can't we fix it? Oh, yeah, proprietary firmware... Shiny new ARM64 world... > And it simplifies the arch ports as well. I like this approach. In fact, the PSCI-less vexpress and the mess in Jailhouse to deal with it motivated this cleanup. And I've another v7 target here that has no PSCI... BTW, our emulated PSCI is also seriously broken (racy), but we can fix this, I'm (still) preparing patches. Jan > > Cheers, > Tony > > On 31-Jul-16 10:39, Jan Kiszka wrote: >> 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); >> >> > -- Siemens AG, Corporate Technology, CT RDA ITP SES-DE Corporate Competence Center Embedded Linux -- 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.
