perf tools: Handle read errors from ctl_fd
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 1 Sep 2020 09:37:54 +0000 (12:37 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 4 Sep 2020 17:38:15 +0000 (14:38 -0300)
Handle read errors from ctl_fd such as EINTR, EAGAIN and EWOULDBLOCK.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Alexey Budankov <alexey.budankov@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lore.kernel.org/lkml/20200901093758.32293-3-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/evlist.c

index 62e3f87..47d1045 100644 (file)
@@ -1802,6 +1802,7 @@ static int evlist__ctlfd_recv(struct evlist *evlist, enum evlist_ctl_cmd *cmd,
        char c;
        size_t bytes_read = 0;
 
+       *cmd = EVLIST_CTL_CMD_UNSUPPORTED;
        memset(cmd_data, 0, data_size);
        data_size--;
 
@@ -1813,17 +1814,22 @@ static int evlist__ctlfd_recv(struct evlist *evlist, enum evlist_ctl_cmd *cmd,
                        cmd_data[bytes_read++] = c;
                        if (bytes_read == data_size)
                                break;
-               } else {
-                       if (err == -1)
+                       continue;
+               } else if (err == -1) {
+                       if (errno == EINTR)
+                               continue;
+                       if (errno == EAGAIN || errno == EWOULDBLOCK)
+                               err = 0;
+                       else
                                pr_err("Failed to read from ctlfd %d: %m\n", evlist->ctl_fd.fd);
-                       break;
                }
+               break;
        } while (1);
 
        pr_debug("Message from ctl_fd: \"%s%s\"\n", cmd_data,
                 bytes_read == data_size ? "" : c == '\n' ? "\\n" : "\\0");
 
-       if (err > 0) {
+       if (bytes_read > 0) {
                if (!strncmp(cmd_data, EVLIST_CTL_CMD_ENABLE_TAG,
                             (sizeof(EVLIST_CTL_CMD_ENABLE_TAG)-1))) {
                        *cmd = EVLIST_CTL_CMD_ENABLE;
@@ -1833,7 +1839,7 @@ static int evlist__ctlfd_recv(struct evlist *evlist, enum evlist_ctl_cmd *cmd,
                }
        }
 
-       return err;
+       return bytes_read ? (int)bytes_read : err;
 }
 
 static int evlist__ctlfd_ack(struct evlist *evlist)