On 07/27/2010 06:07 AM, Daniel P. Berrange wrote:
On Mon, Jul 26, 2010 at 03:11:36PM -0400, Cole Robinson wrote:
> On 07/19/2010 11:42 AM, Daniel P. Berrange wrote:
>> On Wed, Jul 14, 2010 at 03:44:55PM -0400, Cole Robinson wrote:
>>> Change console handling to a proper device list, as done for other
>>> character devices. Even though certain drivers can actually handle multiple
>>> consoles, for now just maintain existing behavior where possible.
>>>
>>> Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
>>
>> [snip]
>>
>>> - chr->target.port = 0;
>>> - /*
>>> - * For HVM console actually created a serial device
>>> - * while for non-HVM it was a parvirt console
>>> - */
>>> - if (STREQ(def->os.type, "hvm")) {
>>> - if (def->nserials != 0) {
>>> - virDomainChrDefFree(chr);
>>> - } else {
>>> - if (VIR_ALLOC_N(def->serials, 1) < 0) {
>>> + chr->target.port = i;
>>> +
>>> + /* Back compat handling for the first console device */
>>> + if (i == 0) {
>>> + /*
>>> + * For HVM console actually created a serial device
>>> + * while for non-HVM it was a parvirt console
>>> + */
>>> + if (STREQ(def->os.type, "hvm")) {
>>> + if (def->nserials != 0) {
>>> virDomainChrDefFree(chr);
>>> - goto no_memory;
>>> + } else {
>>> + if (VIR_ALLOC_N(def->serials, 1) < 0) {
>>> + virDomainChrDefFree(chr);
>>> + goto no_memory;
>>> + }
>>> + def->nserials = 1;
>>> + def->serials[0] = chr;
>>> + chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
>>> }
>>> - def->nserials = 1;
>>> - def->serials[0] = chr;
>>> - chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
>>> + } else {
>>> + def->consoles[def->nconsoles++] = chr;
>>> }
>>> } else {
>>> - def->console = chr;
>>> + def->consoles[def->nconsoles++] = chr;
>>> }
>>> }
>>
>> This is where we get into a bit of a mess with back compatability,
>> when combined with the later DefFormat code.
>>
>> The original requirement is that a <console> element generates
>> a <serial> element for HVM guests. In the original code we throw
>> away the virDomainChrDef for the console, since we re-generate
>> it at format time if nconsoles==0. This hack can't work anymore
>> with multiple consoles. Since if we have 2 consoles in the XML
>> and throw away console 0, we have nconsoles==1 during DefFormat
>> and thus won't re-generate the original console 0. To further
>> complicate life, we don't want todo any of this <serial> compat
>> code this at all if console 0 is a virtio console.
>>
>>
>>> @@ -5496,9 +5512,10 @@ virDomainChrDefFormat(virBufferPtr buf,
>>> return -1;
>>> }
>>>
>>> - /* Compat with legacy <console tty='/dev/pts/5'/> syntax
*/
>>> virBufferVSprintf(buf, " <%s type='%s'",
>>> elementName, type);
>>> +
>>> + /* Compat with legacy <console tty='/dev/pts/5'/> syntax
*/
>>> if (def->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
>>> def->type == VIR_DOMAIN_CHR_TYPE_PTY &&
>>> !(flags & VIR_DOMAIN_XML_INACTIVE) &&
>>
>> Since we're allowing multiple <console> now, we should restrict this
>> hack to just the first one.
>>
>>> @@ -6213,9 +6230,10 @@ char *virDomainDefFormat(virDomainDefPtr def,
>>> goto cleanup;
>>>
>>> /* If there's a PV console that's preferred.. */
>>> - if (def->console) {
>>> - if (virDomainChrDefFormat(&buf, def->console, flags) < 0)
>>> - goto cleanup;
>>> + if (def->nconsoles) {
>>> + for (n = 0 ; n < def->nconsoles ; n++)
>>> + if (virDomainChrDefFormat(&buf, def->consoles[n], flags)
< 0)
>>> + goto cleanup;
>>> } else if (def->nserials != 0) {
>>> /* ..else for legacy compat duplicate the first serial device as a
>>> * console */
>>
>> This logic can't work anymore.
>>
>>
>> What I think we need todo is to remove the hacks in both the Parse and
>> Format methods. Then add one single hack for the parse method which
>> simply adds a matching <serial> device if nserial==0 and the console
>> device type is serial.
>>
>
> I poked at this for a while, and it's a big pain. Adding a single hack
> in the XML parse step isn't enough, because drivers like xen and esx
> build up a domain def manually in certain cases, so wouldn't gain the
> benefit of a hack in the parse function.
Can't we just manually add an equivalent hack in those drivers where
necessary ? We used to that in Xen in the past at least.
Yeah that would work too, I didn't try it though.
- Cole