On 2017-01-17 13:25, Ralf Ramsauer wrote: > > > On 01/16/2017 05:07 PM, Ralf Ramsauer wrote: >> This allows us to dump messages if the hypervisor failed to start or the >> last few messages after the hypervisor was disabled. This needs some >> special treatment, as the hypervisor_memory region is unmapped after >> failures. >> >> Hook into disable an failure paths and copy the page to a dedicated >> variable. Indicate with a boolean flag that data is present. >> >> Signed-off-by: Ralf Ramsauer <[email protected]> >> --- >> driver/main.c | 40 +++++++++++++++++++++++++++++++++++++--- >> 1 file changed, 37 insertions(+), 3 deletions(-) >> >> diff --git a/driver/main.c b/driver/main.c >> index f98e63c6..807514bc 100644 >> --- a/driver/main.c >> +++ b/driver/main.c >> @@ -84,6 +84,16 @@ static int error_code; >> static struct jailhouse_console *console_page; >> static bool console_available; >> >> +/* dump_last_console_page will be true in two cases: >> + * - the jailhouse console page when disabling the hypervisor >> + * - the jailhouse console page when enabling the hypervisor fails >> + * >> + * In these cases, we must copy the console_page to last_console_page before >> + * the hypervisor_mem region is unmapped. >> + */ >> +static bool dump_last_console_page; >> +static struct jailhouse_console last_console_page; >> + >> #ifdef CONFIG_X86 >> bool jailhouse_use_vmcall; >> >> @@ -298,6 +308,9 @@ static int jailhouse_cmd_enable(struct jailhouse_system >> __user *arg) >> long max_cpus; >> int err; >> >> + /* unset the dump_last_console_page to drop pending content */ >> + dump_last_console_page = false; >> + >> fw_name = jailhouse_get_fw_name(); >> if (!fw_name) { >> pr_err("jailhouse: Missing or unsupported HVM technology\n"); >> @@ -477,6 +490,10 @@ static int jailhouse_cmd_enable(struct jailhouse_system >> __user *arg) >> return 0; >> >> error_free_cell: >> + if (console_available) { >> + copy_console_page(&last_console_page); >> + dump_last_console_page = true; >> + } >> jailhouse_cell_delete_root(); >> >> error_unmap: >> @@ -576,6 +593,11 @@ static int jailhouse_cmd_disable(void) >> if (err) >> goto unlock_out; >> >> + if (console_available) { >> + copy_console_page(&last_console_page); >> + dump_last_console_page = true; >> + } >> + >> vunmap(hypervisor_mem); >> >> jailhouse_cell_delete_root(); >> @@ -660,9 +682,21 @@ static ssize_t jailhouse_console_read(struct file >> *file, char __user *out, >> >> /* wait for new data */ >> while (1) { >> - ret = jailhouse_console_page_delta(content, user->head, &miss); >> - if ((!ret || ret == -EAGAIN) && file->f_flags & O_NONBLOCK) >> - goto console_free_out; >> + if (dump_last_console_page) { >> + ret = jailhouse_console_delta(&last_console_page, >> + content, user->head, >> + &miss); >> + if (ret == 0) { >> + dump_last_console_page = false; >> + goto console_free_out; >> + } > Just found a little regression here: > > If there is more than one reader, only one of them will dump the > last_console_page. FCFS... > > This would not be the case if we would have a threaded periodical common > consumer of the (last_)console_page.
Actually, I like the ability to read without interference and loss via separate fds. Can't we mirror the last console page into a shared buffer that is invalidated on next hypervisor enabling? Jan -- 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.
