[PATCH i-g-t 27/28] full drain of socketfd

Petri Latvala petri.latvala at intel.com
Mon Mar 22 11:34:19 UTC 2021


---
 runner/executor.c | 144 ++++++++++++++++++++++++----------------------
 1 file changed, 74 insertions(+), 70 deletions(-)

diff --git a/runner/executor.c b/runner/executor.c
index da874ba0..14138ff7 100644
--- a/runner/executor.c
+++ b/runner/executor.c
@@ -988,85 +988,89 @@ static int monitor_output(pid_t child,
 
 			time_last_activity = time_now;
 
-			/* Don't need flags, don't need srcaddr */
-			s = read(socketfd, buf, sizeof(buf));
-			if (s <= 0) {
-				if (s < 0) {
-					errf("Error reading from communication socket: %m\n");
-				}
+			/* Fully drain everything */
+			while (true) {
+				s = recv(socketfd, buf, sizeof(buf), MSG_DONTWAIT);
 
-				close(socketfd);
-				socketfd = -1;
-				goto socket_end;
-			}
+				if (s < 0) {
+					if (errno == EAGAIN)
+						break;
 
-			packet = (struct runnerpacket *)buf;
-			if (s < sizeof(*packet) || s != packet->size) {
-				errf("Socket communication error: Received %zd bytes, expected %zd\n",
-				     s, s >= sizeof(packet->size) ? packet->size : sizeof(*packet));
-				close(socketfd);
-				socketfd = -1;
-				goto socket_end;
-			}
+					errf("Error reading from communication socket: %m\n");
 
-			write_packet_with_canary(outputs[_F_SOCKET], packet, settings->sync);
-			disk_usage += packet->size;
+					close(socketfd);
+					socketfd = -1;
+					goto socket_end;
+				}
 
-			/*
-			 * runner sends EXEC itself before executing
-			 * the test, other types indicate the test
-			 * really uses socket comms
-			 */
-			if (packet->type != PACKETTYPE_EXEC)
-				socket_comms_used = true;
+				packet = (struct runnerpacket *)buf;
+				if (s < sizeof(*packet) || s != packet->size) {
+					errf("Socket communication error: Received %zd bytes, expected %zd\n",
+					     s, s >= sizeof(packet->size) ? packet->size : sizeof(*packet));
+					close(socketfd);
+					socketfd = -1;
+					goto socket_end;
+				}
 
-			if (packet->type == PACKETTYPE_SUBTEST_START ||
-			    packet->type == PACKETTYPE_DYNAMIC_SUBTEST_START)
-				time_last_subtest = time_now;
+				write_packet_with_canary(outputs[_F_SOCKET], packet, settings->sync);
+				disk_usage += packet->size;
 
-			if (settings->log_level >= LOG_LEVEL_VERBOSE) {
-				runnerpacket_read_helper helper = {};
-				const char *time;
+				/*
+				 * runner sends EXEC itself before executing
+				 * the test, other types indicate the test
+				 * really uses socket comms
+				 */
+				if (packet->type != PACKETTYPE_EXEC)
+					socket_comms_used = true;
 
 				if (packet->type == PACKETTYPE_SUBTEST_START ||
-				    packet->type == PACKETTYPE_SUBTEST_RESULT ||
-				    packet->type == PACKETTYPE_DYNAMIC_SUBTEST_START ||
-				    packet->type == PACKETTYPE_DYNAMIC_SUBTEST_RESULT)
-					helper = read_runnerpacket(packet);
-
-				switch (helper.type) {
-				case PACKETTYPE_SUBTEST_START:
-					if (helper.subteststart.name)
-						outf("Starting subtest: %s\n", helper.subteststart.name);
-					break;
-				case PACKETTYPE_SUBTEST_RESULT:
-					if (helper.subtestresult.name && helper.subtestresult.result) {
-						time = "<unknown>";
-						if (helper.subtestresult.timeused)
-							time = helper.subtestresult.timeused;
-						outf("Subtest %s: %s (%ss)\n",
-						     helper.subtestresult.name,
-						     helper.subtestresult.result,
-						     time);
-					}
-					break;
-				case PACKETTYPE_DYNAMIC_SUBTEST_START:
-					if (helper.dynamicsubteststart.name)
-						outf("Starting dynamic subtest: %s\n", helper.dynamicsubteststart.name);
-					break;
-				case PACKETTYPE_DYNAMIC_SUBTEST_RESULT:
-					if (helper.dynamicsubtestresult.name && helper.dynamicsubtestresult.result) {
-						time = "<unknown>";
-						if (helper.dynamicsubtestresult.timeused)
-							time = helper.dynamicsubtestresult.timeused;
-						outf("Dynamic subtest %s: %s (%ss)\n",
-						     helper.dynamicsubtestresult.name,
-						     helper.dynamicsubtestresult.result,
-						     time);
+				    packet->type == PACKETTYPE_DYNAMIC_SUBTEST_START)
+					time_last_subtest = time_now;
+
+				if (settings->log_level >= LOG_LEVEL_VERBOSE) {
+					runnerpacket_read_helper helper = {};
+					const char *time;
+
+					if (packet->type == PACKETTYPE_SUBTEST_START ||
+					    packet->type == PACKETTYPE_SUBTEST_RESULT ||
+					    packet->type == PACKETTYPE_DYNAMIC_SUBTEST_START ||
+					    packet->type == PACKETTYPE_DYNAMIC_SUBTEST_RESULT)
+						helper = read_runnerpacket(packet);
+
+					switch (helper.type) {
+					case PACKETTYPE_SUBTEST_START:
+						if (helper.subteststart.name)
+							outf("Starting subtest: %s\n", helper.subteststart.name);
+						break;
+					case PACKETTYPE_SUBTEST_RESULT:
+						if (helper.subtestresult.name && helper.subtestresult.result) {
+							time = "<unknown>";
+							if (helper.subtestresult.timeused)
+								time = helper.subtestresult.timeused;
+							outf("Subtest %s: %s (%ss)\n",
+							     helper.subtestresult.name,
+							     helper.subtestresult.result,
+							     time);
+						}
+						break;
+					case PACKETTYPE_DYNAMIC_SUBTEST_START:
+						if (helper.dynamicsubteststart.name)
+							outf("Starting dynamic subtest: %s\n", helper.dynamicsubteststart.name);
+						break;
+					case PACKETTYPE_DYNAMIC_SUBTEST_RESULT:
+						if (helper.dynamicsubtestresult.name && helper.dynamicsubtestresult.result) {
+							time = "<unknown>";
+							if (helper.dynamicsubtestresult.timeused)
+								time = helper.dynamicsubtestresult.timeused;
+							outf("Dynamic subtest %s: %s (%ss)\n",
+							     helper.dynamicsubtestresult.name,
+							     helper.dynamicsubtestresult.result,
+							     time);
+						}
+						break;
+					default:
+						break;
 					}
-					break;
-				default:
-					break;
 				}
 			}
 		}
-- 
2.29.2



More information about the Intel-gfx-trybot mailing list