On 01/17/2017 04:09 PM, Jan Kiszka wrote: > 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. Ok. > > Can't we mirror the last console page into a shared buffer that is > invalidated on next hypervisor enabling? That's possible. Then I only have to store a per-fd flag that indicates if the last console page has been read. That's it.
Ralf > > Jan > -- 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.
