[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 13/17 v5] xen/arm: vpl011: Modify xenconsole to support multiple consoles
On Thu, Jun 22, 2017 at 01:08:48PM +0530, Bhupinder Thakur wrote: > This patch adds the support for multiple consoles and introduces the iterator > functions to operate on multiple consoles. > > This patch is in preparation to support a new vuart console. > > Signed-off-by: Bhupinder Thakur <bhupinder.thakur@xxxxxxxxxx> > --- > CC: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> > CC: Wei Liu <wei.liu2@xxxxxxxxxx> > CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> > CC: Julien Grall <julien.grall@xxxxxxx> > > Changes since v4: > - Changes to make event channel handling per console rather than per domain. > > Changes since v3: > - The changes in xenconsole have been split into four patches. This is the > third patch. > > tools/console/daemon/io.c | 435 > ++++++++++++++++++++++++++++++++-------------- > 1 file changed, 302 insertions(+), 133 deletions(-) > > diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c > index a2a3496..baf0e2e 100644 > --- a/tools/console/daemon/io.c > +++ b/tools/console/daemon/io.c > @@ -90,12 +90,14 @@ struct buffer { > }; > > struct console { > + char *ttyname; > int master_fd; > int master_pollfd_idx; > int slave_fd; > int log_fd; > struct buffer buffer; > char *xspath; > + char *log_suffix; I suppose both new fields can be const. > int ring_ref; > xenevtchn_handle *xce_handle; > int xce_pollfd_idx; > @@ -107,16 +109,112 @@ struct console { > struct domain *d; > }; > > +struct console_data { > + char *xsname; > + char *ttyname; > + char *log_suffix; const for all three. > +}; > + > +static struct console_data console_data[] = { > + Stray line. > + { > + .xsname = "/console", > + .ttyname = "tty", > + .log_suffix = "", > + }, > +}; > + > +#define MAX_CONSOLE (sizeof(console_data)/sizeof(struct console_data)) > + > struct domain { > int domid; > bool is_dead; > unsigned last_seen; > struct domain *next; > - struct console console; > + struct console console[MAX_CONSOLE]; > }; > > static struct domain *dom_head; > > +typedef void (*VOID_ITER_FUNC_ARG1)(struct console *); > +typedef bool (*BOOL_ITER_FUNC_ARG1)(struct console *); > +typedef int (*INT_ITER_FUNC_ARG1)(struct console *); > +typedef void (*VOID_ITER_FUNC_ARG2)(struct console *, void *); > +typedef int (*INT_ITER_FUNC_ARG3)(struct console *, > + struct domain *dom, void **); > + > +static inline bool console_enabled(struct console *con) > +{ > + return con->local_port != -1; > +} > + > +static inline void console_iter_void_arg1(struct domain *d, > + > VOID_ITER_FUNC_ARG1 iter_func) Too many tabs here and below? You might want to configure your editor to display tab as 8 spaces. > +{ > + int i = 0; > + struct console *con = &(d->console[0]); > + No need to have the (), I think. > -static struct domain *create_domain(int domid) > +static int console_init(struct console *con, struct domain *dom, void **data) > { > - struct domain *dom; > char *s; > + int err = -1; > struct timespec ts; > - struct console *con; > + struct console_data **con_data = (struct console_data **)data; > + char *xsname; > > if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) { > dolog(LOG_ERR, "Cannot get time of day %s:%s:L%d", > __FILE__, __FUNCTION__, __LINE__); > - return NULL; > + return err; > + } > + There is a danger that you return at this point, the cleanup path in caller will free garbage. I suggest you at least initialise all pointers to NULL at the beginning. > + con->master_fd = -1; > + con->master_pollfd_idx = -1; > + con->slave_fd = -1; > + con->log_fd = -1; > + con->ring_ref = -1; > + con->local_port = -1; > + con->remote_port = -1; > + con->xce_pollfd_idx = -1; > + con->next_period = ((long long)ts.tv_sec * 1000) + (ts.tv_nsec / > 1000000) + RATE_LIMIT_PERIOD; > + con->d = dom; > + con->ttyname = (*con_data)->ttyname; > + con->log_suffix = (*con_data)->log_suffix; > + xsname = (*con_data)->xsname; > + con->xspath = xs_get_domain_path(xs, dom->domid); > + s = realloc(con->xspath, strlen(con->xspath) + > + strlen(xsname) + 1); > + if (s) > + { > + con->xspath = s; > + strcat(con->xspath, xsname); > + err = 0; > } > > + (*con_data)++; > + > + return err; > +} > + > + [...] > +static void handle_console_ring(struct console *con) > +{ > + if (con->event_count < RATE_LIMIT_ALLOWANCE) { > + if (con->xce_handle != NULL && > + con->xce_pollfd_idx != -1 && > + !(fds[con->xce_pollfd_idx].revents & > + ~(POLLIN|POLLOUT|POLLPRI)) && > + (fds[con->xce_pollfd_idx].revents & > + POLLIN)) > + handle_ring_read(con); > + } Refactoring like this should go to its own patch(es). It is currently very hard to review this patch because refactoring is mixed with all the iterator changes. I can't really continue at this point. Sorry. Please split the refactoring of all the buffer_* and handle_console_* functions to separate patches. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |