[Xen-devel,16/27,v8] xen/arm: vpl011: Add a new handle_console_ring function in xenconsole

Message ID 1503910570-24427-17-git-send-email-bhupinder.thakur@linaro.org
State Superseded
Headers show
Series
  • SBSA UART emulation support in Xen
Related show

Commit Message

Bhupinder Thakur Aug. 28, 2017, 8:55 a.m.
This patch introduces a new handle_console_ring function. This function
reads the data from the ring buffer on receiving an event.

The initialization of event channel poll fd to -1 is moved inside the
handle_console_ring function as they are related. There should be no
change in the behavior as there is no functional change.

Signed-off-by: Bhupinder Thakur <bhupinder.thakur@linaro.org>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Acked-by: Wei Liu <wei.liu2@citrix.com>
---
CC: Ian Jackson <ian.jackson@eu.citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
CC: Stefano Stabellini <sstabellini@kernel.org>
CC: Julien Grall <julien.grall@arm.com>

Changes since v5:
- Split this change in a separate patch.

 tools/console/daemon/io.c | 40 +++++++++++++++++++++++++++-------------
 1 file changed, 27 insertions(+), 13 deletions(-)

Patch

diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c
index 2dcaee6..c361b42 100644
--- a/tools/console/daemon/io.c
+++ b/tools/console/daemon/io.c
@@ -934,17 +934,23 @@  static void console_evtchn_unmask(struct console *con, void *data)
 	}
 }
 
-static void handle_ring_read(struct domain *dom)
+static void handle_ring_read(struct console *con)
 {
 	xenevtchn_port_or_error_t port;
-	struct console *con = &dom->console;
 
-	if (dom->is_dead)
+	if (con->d->is_dead)
 		return;
 
 	if ((port = xenevtchn_pending(con->xce_handle)) == -1)
 		return;
 
+	if (port != con->local_port) {
+		dolog(LOG_ERR,
+		      "Event received for invalid port %d, Expected port is %d\n",
+		      port, con->local_port);
+		return;
+	}
+
 	con->event_count++;
 
 	buffer_append(con);
@@ -953,6 +959,21 @@  static void handle_ring_read(struct domain *dom)
 		(void)xenevtchn_unmask(con->xce_handle, port);
 }
 
+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);
+	}
+
+	con->xce_pollfd_idx = -1;
+}
+
 static void handle_xs(void)
 {
 	char **vec;
@@ -1236,15 +1257,8 @@  void handle_io(void)
 			struct console *con = &d->console;
 
 			n = d->next;
-			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(d);
-			}
+
+			handle_console_ring(con);
 
 			if (con->master_fd != -1 && con->master_pollfd_idx != -1) {
 				if (fds[con->master_pollfd_idx].revents &
@@ -1261,7 +1275,7 @@  void handle_io(void)
 				}
 			}
 
-			con->xce_pollfd_idx = con->master_pollfd_idx = -1;
+			con->master_pollfd_idx = -1;
 
 			if (d->last_seen != enum_pass)
 				shutdown_domain(d);