All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@arm.com>
To: Wei Liu <wei.liu2@citrix.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Jan Beulich <jbeulich@suse.com>,
	Andre Przywara <andre.przywara@arm.com>,
	Bhupinder Thakur <bhupinder.thakur@linaro.org>,
	xen-devel@lists.xenproject.org
Subject: Re: [PATCH 00/25 v7] SBSA UART emulation support in Xen
Date: Thu, 10 Aug 2017 18:51:24 +0100	[thread overview]
Message-ID: <403e0242-4c4c-a95d-114b-aebac9cc7461@arm.com> (raw)
In-Reply-To: <20170810163827.jsgmva2f4vabwrqd@citrix.com>



On 10/08/17 17:38, Wei Liu wrote:
> On Thu, Aug 10, 2017 at 05:11:52PM +0100, Julien Grall wrote:
>>
>>
>> On 10/08/17 17:00, Wei Liu wrote:
>>> On Thu, Aug 10, 2017 at 03:26:07PM +0100, Julien Grall wrote:
>>>>
>>>>
>>>> On 09/08/17 11:58, Bhupinder Thakur wrote:
>>>>> Hi Julien,
>>>>
>>>> Hi Bhupinder,
>>>>
>>>>> Thanks for the testing.
>>>>>
>>>>> On 8 August 2017 at 21:29, Julien Grall <julien.grall@arm.com> wrote:
>>>>>> Hi Bhupinder,
>>>>>>
>>>>>> I gave another and I have a couple of comments.
>>>>>>
>>>>>> Booting Linux with earlycon enabled take quite a while. I can see the
>>>>>> characters coming slower than on the minitel. It seems to be a bit better
>>>>>> after switching off the bootconsole. Overall Linux is taking ~20 times to
>>>>>> boot with pl011 vs HVC console.
>>>>>>
>>>>>> I do agree that pl011 is emulated and therefore you have to trap after each
>>>>>> character. But 20 times sounds far too much.
>>>>>>
>>>>> I think this slowness could be due to ratelimiting of the pl011 events
>>>>> in xenconosle. Currently, the rate limit is
>>>>> set to 30 events per 200 msecs (see RATE_LIMIT_ALLOWANCE/RATE_LIMIT_PERIOD).
>>>>>
>>>>> I increased the rate limit to 600 events (30 * 20) per 200 msecs. With
>>>>> this change,
>>>>> I see that the the find command is running faster and smoother.
>>>>> Earlier the find output would be jerky.
>>>>
>>>> I think there might be another solution avoiding increasing the rate limit.
>>>>
>>>> If you look at the earlycon code for pl011 in Linux:
>>>>
>>>> static void pl011_putc(struct uart_port *port, int c)
>>>> {
>>>> 	while (readl(port->membase + UART01x_FR) & UART01x_FR_TXFF)
>>>> 		cpu_relax();
>>>> 	if (port->iotype == UPIO_MEM32)
>>>> 		writel(c, port->membase + UART01x_DR);
>>>> 	else
>>>> 		writeb(c, port->membase + UART01x_DR);
>>>> 	while (readl(port->membase + UART01x_FR) & UART01x_FR_BUSY)
>>>> 		cpu_relax();
>>>> }
>>>>
>>>> Linux will wait the UART to be idle before sending a new character.
>>>>
>>>> Now looking at vpl011 emulation, the busy bit set when a new character is
>>>> queued (see vpl011_write_data). This bit will only be cleared when the
>>>> console daemon will raise an event and the queue is empty (see
>>>> vpl011_data_avail).
>>>>
>>>> This means for earlycon, you will need a round trip Guest -> Xen -> Dom0 ->
>>>> Xen -> Guest for each single character. This is a bit counterproductive and
>>>> combined with the limit it makes it worse.
>>>>
>>>> I would take a different approach on the BUSY bit. We can consider the queue
>>>> between Xen and xenconsoled as outside of the UART. If the character is
>>>> queued, then job done. I think this would improve quite a lot of the
>>>> performance.
>>>
>>> Yes. This.
>>>
>>> The guest sees a register, which is essentially a synchronous interface
>>> to the guest. The current code, as you already see, will issue one event
>>> for every character. That's excessive.
>>
>> I am actually not suggesting to modify that at the moment. I think you may
>> have other trouble with the interaction between the user and th console by
>> doing that. Imagine you want to print the prompt, it may lag a bit before
>> getting it.
>>
>> The only thing I suggest is to not set the BUSY bit in the UART everytime a
>> character is queued.
>>
>
> Did you come to that conclusion that this would work by looking at the
> spec or Linux source code? I think it should conform to the spec, not a
> specific guest. But you're the maintainer, you have the final say.

I read both the spec and the code. From the spec:

"UART busy. If this bit is set to 1, the UART is busy transmitting data. 
This bit remains set until the
complete byte, including all the stop bits, has been sent from the shift 
register.
This bit is set as soon as the transmit FIFO becomes non-empty, 
regardless of whether the UART is
enabled or not."

Currently, we considered that the shared ring is the FIFO of the UART. 
Meaning that the BUSY bit is set until xenconsoled read everything.

I don't think implementing a FIFO is highly critical in an emulation 
(QEMU does not implement it for instance). And definitely using the 
shared ring brings slow down (involve multiple context switch).

I would suggest to take a different approach where the BUSY is only set 
if we can't add more data in the shared ring. This would be clear as 
soon as the ring has space.

If we really we could implement is small FIFO (the SBSA requested a 
least 32-entry separate for transmit and receive). But I don't think 
this is critically for a first approach.

>
>>>
>>> The interface between Xen and xenconsoled can be asynchronous, it can
>>> opt to queue X characters before sending an event, also setup a oneshot
>>> timer to avoid hanging.
>>>
>>> This however has some other implications -- it might not be as reliable
>>> as the original method because data is not guaranteed to hit backend. If
>>> the guest crashes very early on, depending the actual implementation you
>>> might not be able get the data.
>>
>> Would it be possible to ask xenconsoled to dump everything on domain crash?
>> Some kind of synchronization.
>>
>
> No, not at the moment. If the data is still in Xen and destroyed,
> xenconsoled can't do anything.

The vUART emulation is directly queuing the data, there are no 
intermediate buffer. So all the data would be in the shared ring 
available for xenconsoled to go through.

It would be quite a useful enhancement for when the guest crash.

Cheers,

-- 
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  reply	other threads:[~2017-08-10 17:51 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-07  8:52 [PATCH 00/25 v7] SBSA UART emulation support in Xen Bhupinder Thakur
2017-08-07  8:52 ` [PATCH 01/25 v7] xen/arm: vpl011: Define common ring buffer helper functions in console.h Bhupinder Thakur
2017-08-07  8:52 ` [PATCH 02/25 v7] xen/arm: vpl011: Add SBSA UART emulation in Xen Bhupinder Thakur
2017-08-07  8:52 ` [PATCH 03/25 v7] xen/arm: vpl011: Allocate a new GFN in the toolstack for vuart Bhupinder Thakur
2017-08-07  8:52 ` [PATCH 04/25 v7] xen/arm: vpl011: Add support for vuart in libxl Bhupinder Thakur
2017-08-08 13:38   ` Julien Grall
2017-08-08 13:42     ` Julien Grall
2017-08-07  8:52 ` [PATCH 05/25 v7] xen/arm: vpl011: Rearrange xen header includes in alphabetical order in domctl.c Bhupinder Thakur
2017-08-07  8:52 ` [PATCH 06/25 v7] xen/arm: vpl011: Add a new domctl API to initialize vpl011 Bhupinder Thakur
2017-08-07  9:14   ` Jan Beulich
2017-08-21 10:28     ` Bhupinder Thakur
2017-08-21 11:56       ` Jan Beulich
2017-08-08 13:11   ` Wei Liu
2017-08-08 13:30     ` Wei Liu
2017-08-08 13:47       ` Julien Grall
2017-08-08 13:56   ` Julien Grall
2017-08-07  8:52 ` [PATCH 07/25 v7] xen/arm: vpl011: Add a new vuart node in the xenstore Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 08/25 v7] xen/arm: vpl011: Modify xenconsole to define and use a new console structure Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 09/25 v7] xen/arm: vpl011: Rename the console structure field conspath to xspath Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 10/25 v7] xen/arm: vpl011: Modify xenconsole functions to take console structure as input Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 11/25 v7] xen/arm: vpl011: Add a new console_init function in xenconsole Bhupinder Thakur
2017-08-08 13:11   ` Wei Liu
2017-08-07  8:53 ` [PATCH 12/25 v7] xen/arm: vpl011: Add a new buffer_available " Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 13/25 v7] xen/arm: vpl011: Add a new maybe_add_console_evtchn_fd " Bhupinder Thakur
2017-08-08 13:12   ` Wei Liu
2017-08-07  8:53 ` [PATCH 14/25 v7] xen/arm: vpl011: Add a new maybe_add_console_tty_fd " Bhupinder Thakur
2017-08-08 13:12   ` Wei Liu
2017-08-07  8:53 ` [PATCH 15/25 v7] xen/arm: vpl011: Add a new console_evtchn_unmask " Bhupinder Thakur
2017-08-08 13:15   ` Wei Liu
2017-08-07  8:53 ` [PATCH 16/25 v7] xen/arm: vpl011: Add a new handle_console_ring " Bhupinder Thakur
2017-08-08 13:16   ` Wei Liu
2017-08-07  8:53 ` [PATCH 17/25 v7] xen/arm: vpl011: Add a new handle_console_tty " Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 18/25 v7] xen/arm: vpl011: Add a new console_cleanup " Bhupinder Thakur
2017-08-08 13:29   ` Wei Liu
2017-08-07  8:53 ` [PATCH 19/25 v7] xen/arm: vpl011: Add a new console_open_log " Bhupinder Thakur
2017-08-08 13:31   ` Wei Liu
2017-08-07  8:53 ` [PATCH 20/25 v7] xen/arm: vpl011: Add a new console_close_evtchn " Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 21/25 v7] xen/arm: vpl011: Add support for multiple consoles " Bhupinder Thakur
2017-08-08 13:48   ` Wei Liu
2017-08-07  8:53 ` [PATCH 22/25 v7] xen/arm: vpl011: Add support for vuart console " Bhupinder Thakur
2017-08-08 13:52   ` Wei Liu
2017-08-07  8:53 ` [PATCH 23/25 v7] xen/arm: vpl011: Add a new vuart console type to xenconsole client Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 24/25 v7] xen/arm: vpl011: Add a pl011 uart DT node in the guest device tree Bhupinder Thakur
2017-08-08 14:12   ` Julien Grall
2017-08-08 14:53     ` Bhupinder Thakur
2017-08-07  8:53 ` [PATCH 25/25 v7] xen/arm: vpl011: Update documentation for vuart console support Bhupinder Thakur
2017-08-08 14:15   ` Julien Grall
2017-08-08 15:59 ` [PATCH 00/25 v7] SBSA UART emulation support in Xen Julien Grall
2017-08-09 10:58   ` Bhupinder Thakur
2017-08-09 11:03     ` Wei Liu
2017-08-10  7:59       ` Bhupinder Thakur
2017-08-10 11:40         ` Wei Liu
2017-08-10 12:40           ` Julien Grall
2017-08-10 13:01             ` Wei Liu
2017-08-10 14:31               ` Julien Grall
2017-08-10 15:36                 ` Wei Liu
2017-08-10 14:26     ` Julien Grall
2017-08-10 16:00       ` Wei Liu
2017-08-10 16:11         ` Julien Grall
2017-08-10 16:38           ` Wei Liu
2017-08-10 17:51             ` Julien Grall [this message]
2017-08-15  9:49               ` Wei Liu
2017-08-18 13:30                 ` Julien Grall
2017-08-18 13:48                   ` Wei Liu
2017-08-14  7:52     ` Bhupinder Thakur
2017-08-14 13:54       ` Julien Grall
2017-08-22 14:35         ` Julien Grall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=403e0242-4c4c-a95d-114b-aebac9cc7461@arm.com \
    --to=julien.grall@arm.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=andre.przywara@arm.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=bhupinder.thakur@linaro.org \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=sstabellini@kernel.org \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.