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.

Reply via email to