All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefano Stabellini <sstabellini@kernel.org>
To: Julien Grall <julien.grall@arm.com>
Cc: Tim Deegan <tim@xen.org>,
	Stefano Stabellini <sstabellini@kernel.org>,
	Wei Liu <wei.liu2@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Stefano Stabellini <stefanos@xilinx.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	xen-devel@lists.xen.org, Jan Beulich <JBeulich@suse.com>,
	"andrii_anisov@epam.com" <andrii_anisov@epam.com>
Subject: Re: [PATCH v3 23/25] xen: support console_switching between Dom0 and DomUs on ARM
Date: Fri, 5 Oct 2018 11:39:39 -0700 (PDT)	[thread overview]
Message-ID: <alpine.DEB.2.10.1810051134080.24936@sstabellini-ThinkPad-X260> (raw)
In-Reply-To: <27f4a7e6-307e-8695-02ce-bd55a9edda28@arm.com>

On Fri, 5 Oct 2018, Julien Grall wrote:
> Hi Stefano,
> 
> On 10/04/2018 10:52 PM, Stefano Stabellini wrote:
> > On Wed, 1 Aug 2018, Jan Beulich wrote:
> > > > > > On 01.08.18 at 01:28, <sstabellini@kernel.org> wrote:
> > > > Today Ctrl-AAA is used to switch between Xen and Dom0. Extend the
> > > > mechanism to allow for switching between Xen, Dom0, and any of the
> > > > initial DomU created from Xen alongside Dom0 out of information provided
> > > > via device tree.
> > > > 
> > > > Rename xen_rx to console_rx to match the new behavior.
> > > > 
> > > > Clarify existing comment about "notify the guest", making it clear that
> > > > it is only about the hardware domain.
> > > > 
> > > > Export a function named console_input_domain() to allow others to know
> > > > which domains has input at a given time.
> > > 
> > > As always in such cases I don't think such functions should be added
> > > without any caller.
> > 
> > I'll add console_input_domain within an #if 0 and remove the #if 0 in
> > the following patch. If you are OK with it, the two patches can be
> > merged on commit (Julien already agreed to it.) They are separate only
> > to make them easier to review.
> 
> Which two patches? I agreed to merge #24 and #22. Not #23. Merging the 3 of
> them is going to make a massive patch which is not going to help understand
> patches after they get merged.

No, you are right, I got confused. That's correct #22 and #24 are the
ones to be merged, I'll add a note about this to the patches. Sorry
about that.


> > 
> > > > @@ -389,30 +392,72 @@ static void dump_console_ring_key(unsigned char
> > > > key)
> > > >       free_xenheap_pages(buf, order);
> > > >   }
> > > >   -/* CTRL-<switch_char> switches input direction between Xen and DOM0.
> > > > */
> > > > +/*
> > > > + * CTRL-<switch_char> switches input direction between Xen, Dom0 and
> > > > + * DomUs.
> > > > + */
> > > >   #define switch_code (opt_conswitch[0]-'a'+1)
> > > > -static int __read_mostly xen_rx = 1; /* FALSE => input passed to domain
> > > > 0. */
> > > > +/*
> > > > + * console_rx=0 => input to xen
> > > > + * console_rx=1 => input to dom0
> > > > + * console_rx=N => input dom(N-1)
> > > > + */
> > > > +static int __read_mostly console_rx = 0;
> > > 
> > > Originally this was supposed to be bool, but didn't get switched yet.
> > > With your current scheme it can't go negative and hence should be
> > > unsigned int. However, I still wonder whether it wouldn't be better
> > > (especially for readers of the code) is this was an actual domid_t.
> > > But as clarified before, I'm not meaning to make this a requirement.
> > 
> > I'll use unsigned int
> > 
> > 
> > > > +struct domain *console_input_domain(void)
> > > > +{
> > > > +    return get_domain_by_id(console_rx - 1);
> > > > +}
> > > 
> > > And this is exactly the reason for the above remark: This is (or at
> > > least looks) broken for console_rx == 0.
> > 
> > I'll fix
> > 
> > 
> > > >   static void switch_serial_input(void)
> > > >   {
> > > > -    static char *input_str[2] = { "DOM0", "Xen" };
> > > > -    xen_rx = !xen_rx;
> > > > -    printk("*** Serial input -> %s", input_str[xen_rx]);
> > > > +    console_rx++;
> > > > +    if ( console_rx == max_init_domid + 2 )
> > > > +        console_rx = 0;
> > > 
> > > Same here - the literal 2 at least raises questions. I think it would
> > > at least be a little less confusing if you had
> > > 
> > >      if ( console_rx++ == max_init_domid + 1 )
> > >          console_rx = 0;
> > 
> > I'll do
> > 
> > 
> > > >   static void __serial_rx(char c, struct cpu_user_regs *regs)
> > > >   {
> > > > -    if ( xen_rx )
> > > > +    if ( console_rx == 0 )
> > > >           return handle_keypress(c, regs);
> > > >   -    /* Deliver input to guest buffer, unless it is already full. */
> > > > -    if ( (serial_rx_prod-serial_rx_cons) != SERIAL_RX_SIZE )
> > > > -        serial_rx_ring[SERIAL_RX_MASK(serial_rx_prod++)] = c;
> > > > -    /* Always notify the guest: prevents receive path from getting
> > > > stuck. */
> > > 
> > > Just like you adjust "guest" in this comment, I think you'd better ...
> > > 
> > > > +    if ( console_rx == 1 )
> > > > +    {
> > > > +        /* Deliver input to guest buffer, unless it is already full. */
> > > 
> > > ... adjust it here too.
> > 
> > I'll fix
> > 
> > 
> > > > +        if ( (serial_rx_prod - serial_rx_cons) != SERIAL_RX_SIZE )
> > > > +            serial_rx_ring[SERIAL_RX_MASK(serial_rx_prod++)] = c;
> > > > +    }
> > > > +#ifdef CONFIG_SBSA_VUART_CONSOLE
> > > > +    else
> > > > +    {
> > > > +        struct domain *d = get_domain_by_id(console_rx - 1);
> > > > +
> > > > +        /*
> > > > +         * If we have a properly initialized vpl011 console for the
> > > > +         * domain, without a full PV ring to Dom0 (in that case input
> > > > +         * comes from the PV ring), then send the character to it.
> > > > +         */
> > > > +        if ( !d->arch.vpl011.backend_in_domain && d->arch.vpl011.xen !=
> > > > NULL )
> > > > +            vpl011_rx_char_xen(d, c);
> > > > +        else
> > > > +            printk("Cannot send chars to Dom%d: no UART available\n",
> > > > +                   d->domain_id);
> > > > +    }
> > > > +#endif
> > > > +    /*
> > > > +     * Always notify the hardware domain: prevents receive path from
> > > > +     * getting stuck.
> > > > +     */
> > > >       send_global_virq(VIRQ_CONSOLE);
> > > 
> > > Why does this not move into the if() body above?
> > 
> > That was a mistake, I fixed it
> > 
> > 
> > > > @@ -923,7 +968,7 @@ void __init console_endboot(void)
> > > >        * a useful 'how to switch' message.
> > > >        */
> > > >       if ( opt_conswitch[1] == 'x' )
> > > > -        xen_rx = !xen_rx;
> > > > +        console_rx = 0;
> > > 
> > > According to the comment I think you need to store
> > > max_init_domid + 1 here, so that the switch_serial_input() a few
> > > lines down would actually switch to Xen.
> > 
> > I'll fix
> > 
> > Thanks for the comments!
> > 


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

  parent reply	other threads:[~2018-10-05 18:39 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-31 23:27 [PATCH v3 00/25] dom0less step1: boot multiple domains from device tree Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 01/25] xen: allow console_io hypercalls from certain DomUs Stefano Stabellini
2018-08-17 19:33   ` Daniel De Graaf
2018-07-31 23:27 ` [PATCH v3 02/25] xen/arm: move a few DT related defines to public/device_tree_defs.h Stefano Stabellini
2018-08-01  9:31   ` Julien Grall
2018-08-22 15:25     ` Wei Liu
2018-07-31 23:27 ` [PATCH v3 03/25] xen/arm: extend device tree based multiboot protocol Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 04/25] xen/arm: document dom0less Stefano Stabellini
2018-08-01  9:46   ` Julien Grall
2018-10-03 16:47     ` Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 05/25] xen/arm: do not pass dt_host to make_memory_node and make_hypervisor_node Stefano Stabellini
2018-08-01  9:50   ` Julien Grall
2018-07-31 23:27 ` [PATCH v3 06/25] xen/arm: move evtchn_allocate call out of make_hypervisor_node Stefano Stabellini
2018-08-01  9:51   ` Julien Grall
2018-07-31 23:27 ` [PATCH v3 07/25] xen/arm: rename acpi_make_chosen_node to make_chosen_node Stefano Stabellini
2018-08-01  9:53   ` Julien Grall
2018-07-31 23:27 ` [PATCH v3 08/25] xen/arm: increase MAX_MODULES Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 09/25] xen/arm: introduce bootcmdlines Stefano Stabellini
2018-08-01 10:51   ` Julien Grall
2018-10-03 23:11     ` Stefano Stabellini
2018-10-04 17:23       ` Julien Grall
2018-10-04 21:08         ` Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 10/25] xen/arm: don't add duplicate boot modules Stefano Stabellini
2018-08-01 11:06   ` Julien Grall
2018-10-04 21:05     ` Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 11/25] xen/arm: probe domU kernels and initrds Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 12/25] xen/arm: refactor construct_dom0 Stefano Stabellini
2018-08-13 10:15   ` Julien Grall
2018-08-15 19:27     ` Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 13/25] xen/arm: introduce create_domUs Stefano Stabellini
2018-08-01  8:48   ` Jan Beulich
2018-08-13 10:23   ` Julien Grall
2018-08-15 19:37     ` Stefano Stabellini
2018-08-13 10:55   ` Julien Grall
2018-08-15 20:04     ` Stefano Stabellini
2018-08-16  9:03       ` Julien Grall
2018-08-16 18:20         ` Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 14/25] xen/arm: introduce construct_domU Stefano Stabellini
2018-08-13 10:55   ` Julien Grall
2018-08-15 20:21     ` Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 15/25] xen/arm: rename get_11_allocation_size to get_allocation_size Stefano Stabellini
2018-07-31 23:27 ` [PATCH v3 16/25] xen/arm: rename allocate_memory to allocate_memory_11 Stefano Stabellini
2018-08-13 10:57   ` Julien Grall
2018-08-15 20:26     ` Stefano Stabellini
2018-08-16  9:08       ` Julien Grall
2018-08-16 18:27         ` Stefano Stabellini
2018-07-31 23:28 ` [PATCH v3 17/25] xen/arm: introduce allocate_memory Stefano Stabellini
2018-08-01 11:28   ` Julien Grall
2018-10-03 17:46     ` Stefano Stabellini
2018-07-31 23:28 ` [PATCH v3 18/25] xen/arm: generate a simple device tree for domUs Stefano Stabellini
2018-08-13 11:07   ` Julien Grall
2018-08-15 20:47     ` Stefano Stabellini
2018-07-31 23:28 ` [PATCH v3 19/25] xen/arm: generate vpl011 node on device tree for domU Stefano Stabellini
2018-08-13 11:20   ` Julien Grall
2018-08-15 23:23     ` Stefano Stabellini
2018-07-31 23:28 ` [PATCH v3 20/25] xen/arm: introduce a union in vpl011 Stefano Stabellini
2018-08-13 11:24   ` Julien Grall
2018-08-15 23:36     ` Stefano Stabellini
2018-07-31 23:28 ` [PATCH v3 21/25] xen/arm: refactor vpl011_data_avail Stefano Stabellini
2018-08-13 13:23   ` Julien Grall
2018-07-31 23:28 ` [PATCH v3 22/25] xen/arm: Allow vpl011 to be used by DomU Stefano Stabellini
2018-08-13 13:42   ` Julien Grall
2018-08-15 23:41     ` Stefano Stabellini
2018-08-13 14:10   ` Julien Grall
2018-08-16 19:21     ` Stefano Stabellini
2018-08-22 10:19       ` Julien Grall
2018-10-03 21:21         ` Stefano Stabellini
2018-10-04 17:17           ` Julien Grall
2018-07-31 23:28 ` [PATCH v3 23/25] xen: support console_switching between Dom0 and DomUs on ARM Stefano Stabellini
2018-08-01  9:03   ` Jan Beulich
2018-10-04 21:52     ` Stefano Stabellini
2018-10-05  9:25       ` Julien Grall
2018-10-05  9:48         ` Julien Grall
2018-10-05 18:39           ` Stefano Stabellini
2018-10-05 18:39         ` Stefano Stabellini [this message]
2018-08-13 13:58   ` Julien Grall
2018-08-16 21:48     ` Stefano Stabellini
2018-07-31 23:28 ` [PATCH v3 24/25] xen/vpl011: buffer out chars when the backend is xen Stefano Stabellini
2018-08-13 14:21   ` Julien Grall
2018-08-16 19:41     ` Stefano Stabellini
2018-08-22 10:35       ` Julien Grall
2018-10-04 21:29         ` Stefano Stabellini
2018-07-31 23:28 ` [PATCH v3 25/25] xen/arm: split domain_build.c Stefano Stabellini
2018-08-13 14:29   ` Julien Grall
2018-08-16  0:25     ` Stefano Stabellini
2018-08-16  9:20       ` Julien Grall
2018-08-16 18:12         ` Stefano Stabellini
2018-08-22 15:44 ` [PATCH v3 00/25] dom0less step1: boot multiple domains from device tree 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=alpine.DEB.2.10.1810051134080.24936@sstabellini-ThinkPad-X260 \
    --to=sstabellini@kernel.org \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=andrii_anisov@epam.com \
    --cc=julien.grall@arm.com \
    --cc=konrad.wilk@oracle.com \
    --cc=stefanos@xilinx.com \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.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.