Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Dec 2019 09:38:42 -0800
From:      John Baldwin <jhb@FreeBSD.org>
To:        Ian Lepore <ian@freebsd.org>, rgrimes@freebsd.org
Cc:        Vincenzo Maffione <vmaffione@freebsd.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r355301 - head/usr.sbin/bhyve
Message-ID:  <d22ae631-e9c9-1ea9-9adc-a162f17e0b11@FreeBSD.org>
In-Reply-To: <8044a2f1096df626368183dd1ae77f5ac2e43b70.camel@freebsd.org>
References:  <201912030722.xB37MdrZ033595@gndrsh.dnsmgr.net> <8044a2f1096df626368183dd1ae77f5ac2e43b70.camel@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 12/3/19 7:14 AM, Ian Lepore wrote:
> On Mon, 2019-12-02 at 23:22 -0800, Rodney W. Grimes wrote:
>>> On Mon, 2019-12-02 at 20:51 +0000, Vincenzo Maffione wrote:
>>>> Author: vmaffione
>>>> Date: Mon Dec  2 20:51:46 2019
>>>> New Revision: 355301
>>>> URL: https://svnweb.freebsd.org/changeset/base/355301
>>>>
>>>> Log:
>>>>   bhyve: uniform printf format string newlines
>>>>   
>>>>   Some of the printf statements only use LF to get a newline.
>>>> However, a CR character is also required for the serial console to
>>>> print debug logs in a nice way.
>>>>   Fix those code locations that only use LF, by adding a CR
>>>> character.
>>>>   
>>>>   Reviewed by:	markj, aleksandr.fedorov@itglobal.com
>>>>   MFC after:	1 week
>>>>   Differential Revision:	https://reviews.freebsd.org/D22552
>>>>
>>>> Modified:
>>>>   head/usr.sbin/bhyve/audio.c
>>>>   head/usr.sbin/bhyve/hda_codec.c
>>>>   head/usr.sbin/bhyve/net_backends.c
>>>>   head/usr.sbin/bhyve/pci_ahci.c
>>>>   head/usr.sbin/bhyve/pci_e82545.c
>>>>   head/usr.sbin/bhyve/pci_hda.c
>>>>   head/usr.sbin/bhyve/pci_nvme.c
>>>>   head/usr.sbin/bhyve/pci_virtio_block.c
>>>>   head/usr.sbin/bhyve/pci_virtio_console.c
>>>>   head/usr.sbin/bhyve/pci_virtio_net.c
>>>>   head/usr.sbin/bhyve/pci_virtio_rnd.c
>>>>   head/usr.sbin/bhyve/pci_virtio_scsi.c
>>>>   head/usr.sbin/bhyve/pci_xhci.c
>>>>   head/usr.sbin/bhyve/rfb.c
>>>>
>>>
>>> These changes seem wrong in a couple ways...
>>>
>>>  - Lines are terminated by linefeeds in unix-like systems.  If
>>> linefeeds need to be translated to include carriage returns, that's the
>>> responsibility of the terminal/line-discipline layer, not the source
>>> strings being printed.
>>
>> Fully agree, this change seems wrong to me for Ian's stated reason here.
>>
>>>
>>>  - The sequence \n\r is very strange.  For systems that do prefer
>>> carriage returns, the \r always comes before the \n (or stands alone on
>>> Mac systems), not after.
>>>
>>> I have a feeling that the root of this is something like "lots of
>>> people use bhyve for Windows, so they use Windows apps to look at logs,
>>> so the logs should be formatted for Windows."  If that's the reasoning,
>>> then why shouldn't we convert EVERY printf in the source base to
>>> include carriage returns, just in case a windows user wants to browse a
>>> log file?
>>
>> This is not that issue, it is something going on with the line
>> discipline when using the bhyve console device.  I believe the
>> line displine being different from what bhyve itself is expecting
>> so when console output is intermixed with output from bhyve itself
>> things go wrong.
>>
>> The printf's in this patch are coming from the bhyve process that
>> has a fd open to the launching tty, the line discipline on that tty
>> is changed to something different after you open the
>> console device from that same controlling tty, or that is my hypothosis
>> on what is going wrong.
> 
> There is a cfmakeraw() call in usr.sbin/bhyve/consport.c; that would
> definitely turn off nl->crnl translations.  I think that is the other
> end of the bhyve console that I posted a patch for yesterday, and I
> think the console driver is probably still the right place to do that
> translation (because other console drivers do it that way).  But I'm
> not set up to run bhyve here, so I can't test my theory.

That patch won't work alone.  Most people don't use bvmcons, most people
running bhyve use a standard uart as the console (bvmcons was an early
console devices before bhyve had a ns8250 uart device model).  When using
the uart as the device model you still have raw output in the bhyve
process itself.  (See cfmakeraw() in uart_emul.c as well).  We don't
get to change how guest OS's use a uart, so any changes have to be in
usr.sbin/bhyve, not in sys/.

However, to do that you have to actually do something more complicated to
turn \r\n and \n\r sequences from the guest into plain \n to stdout while
still DTRT for "bare" \r and \n characters.  You also have to make sure
you do the right thing for input and not just output in the device models.

I'm not quite a fan of this commit as-is since you will get spurious new
lines now if you don't use a serial console.  I would perhaps rather have
a custom printf() wrapper in bhyve that outputs the \r as needed for
debug and error printfs only when stdio has been changed to be raw.  I
was busy with family stuff and thanksgiving last week so didn't have time
to review it before it was committed unfortunately.

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d22ae631-e9c9-1ea9-9adc-a162f17e0b11>