[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3] xen/console: Skip switching serial input to non existing domains
On 20/03/2023 12:17, Jan Beulich wrote: > > > On 20.03.2023 09:19, Michal Orzel wrote: >> @@ -483,15 +485,34 @@ struct domain *console_input_domain(void) >> >> static void switch_serial_input(void) >> { >> - if ( console_rx == max_init_domid + 1 ) >> - { >> - console_rx = 0; >> - printk("*** Serial input to Xen"); >> - } >> - else >> + unsigned int next_rx = console_rx + 1; >> + >> + /* >> + * Rotate among Xen, dom0 and boot-time created domUs while skipping >> + * switching serial input to non existing domains. >> + */ >> + while ( next_rx <= max_console_rx + 1 ) >> { >> - console_rx++; >> - printk("*** Serial input to DOM%d", console_rx - 1); >> + if ( next_rx == max_console_rx + 1 ) > > Part of the earlier problems stemmed from the comparison being == here. > Could I talk you into using >= instead? With the loop condition unmodified it would not make sense as it would be impossible. However, because of what you wrote below, I will do this together with other modifications. > >> + { >> + console_rx = 0; >> + printk("*** Serial input to Xen"); >> + break; >> + } >> + else > > No need for "else" after "break" (or alike). Omitting it will not only > decrease indentation, but also make more visible that the earlier if() > won't "fall through". > ok. >> + { >> + struct domain *d = rcu_lock_domain_by_id(next_rx - 1); >> + >> + if ( d ) >> + { >> + rcu_unlock_domain(d); >> + console_rx = next_rx; >> + printk("*** Serial input to DOM%d", console_rx - 1); > > While I expect the compiler will transform this to using "next_rx" > here anyway, I think it would be nice if it was written like this > right away. ok. > > Since you touch the printk() anyway, please also switch to using the > more applicable %u. ok. > > With the adjustments > Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> > > One other transformation for you to consider is to switch to a base > layout like > > unsigned int next_rx = console_rx; > while ( next_rx++ <= max_console_rx ) > { > ... > } > > i.e. without a separate increment at the bottom of the loop. Which, > now that I've spelled it out, raises the question of why the outer > loop needs a condition in the first place (because as written above > it clearly is always true). So perhaps better (and more directly > showing what's going on) > > unsigned int next_rx = console_rx; > for ( ; ; ) > { > if ( next_rx++ >= max_console_rx ) > ... > } Makes sense to me so I will do this assuming that you agree on adding your Rb tag also for this approach. ~Michal
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |