From nobody Mon Apr 27 08:41:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B824FC43334 for ; Wed, 15 Jun 2022 06:04:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345913AbiFOGEE (ORCPT ); Wed, 15 Jun 2022 02:04:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51364 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233741AbiFOGEC (ORCPT ); Wed, 15 Jun 2022 02:04:02 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CE32119C02 for ; Tue, 14 Jun 2022 23:03:59 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id p143-20020a25d895000000b006648c7235a6so8691612ybg.1 for ; Tue, 14 Jun 2022 23:03:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc; bh=nYlvKc+Gkd9+GKK1TSgvDboGyr/kQ+xJt3x8WJ82Oks=; b=DwX3Xh0Cilc5YtnUSNb7wYsNzLpi6oa+UR5eeelLiRSLUPC7g3PaiiJHlFR9eOpZA6 SLte3LSowANQ0B66bpir6froJiVAz3tWJ+pEdTddjYAPLDtZnjwtqM5qk5Bbzz7xdy/U Gt6+d71WStgNZXw9GMwmaAHZebKEU8PaW7xkRGPej3blrqzL0jFV+7VVIS1zx5v+PSaz LABKfALF/0GVYi3+fWoPm0FUB//ccSCxkmh9BHI1y1lo/dCUoe3qAxsFiNl4u7ZWPHcO oMcYSXgUi5AkFaocj9lTn+HZbaFsJOmrR3VZ9eunPWsh3uMZW2nz2qUSWoYtwG1BgfuE M/fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=nYlvKc+Gkd9+GKK1TSgvDboGyr/kQ+xJt3x8WJ82Oks=; b=7Vv61IFB9t1Bojslgwy9aP/enH+zyAnrx2zh4saIaHgUo7IajvvbWLPoOrG24NrWrb ZxVv4BHd6Vr7VuS7XyQ6ui9COuL4yoBY2vjuCr3LCUw8qkmUpaZ3zR3ZL2Otu0nF3Z1h Kyk9IdRX+SIJpdNZEmCo29/hwwJoirWI48NxR2qh673Xl1h5tzrVxo6gLSamZew006Ck yVdl3Vxy+VJMSXu/KgDoZaXxIW1WdYV1YcuLEqCdzk+26ZXe0b2V5K04Ek9yjARQq+3H CrqwyL1GrhHcBva6T8h03baVRK4XFv6pL01Q7pU31T03E5YqzJ3Cl4nuE1AfGLYwJUD8 WkXA== X-Gm-Message-State: AJIora9QBKfzLkFvdTvx8GWzNPJX4N41tdFQEMJlSNXB6/q5W+1Tkv1S AH4TJGKDhW9g2TOahpKsnETfpdwBFdW/ X-Google-Smtp-Source: AGRyM1vowvHpNK7ibek1HowIAl0XXd3IXpKKGr4jtiN3S1yOCoGnDpR0wWwI8+WB0InpXfGCZAeCXiExHHwS X-Received: from irogers.svl.corp.google.com ([2620:15c:2cd:202:b55a:aaa7:a:1b17]) (user=irogers job=sendgmr) by 2002:a25:47d4:0:b0:662:18f1:4aae with SMTP id u203-20020a2547d4000000b0066218f14aaemr8996263yba.309.1655273038979; Tue, 14 Jun 2022 23:03:58 -0700 (PDT) Date: Tue, 14 Jun 2022 23:03:54 -0700 Message-Id: <20220615060354.1763693-1-irogers@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.36.1.476.g0c4daa206d-goog Subject: [PATCH] perf io: Make open and read calls more robust From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexey Bayduraev , Riccardo Mancini , Adrian Hunter , Dave Marchevsky , Song Liu , Leo Yan , John Garry , Florian Fischer , Andi Kleen , Kan Liang , Masami Hiramatsu , Zechuan Chen , Yang Jihong , German Gomez , Thomas Richter , James Clark , Denis Nikitin , Lexi Shao , Michael Petlan , Remi Bernon , Fangrui Song , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Cc: Stephane Eranian , Ian Rogers Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Wrap open and read calls with TEMP_FAILURE_RETRY in case a signal causes the syscall to need to restart. Signed-off-by: Ian Rogers --- tools/lib/api/io.h | 3 ++- tools/lib/symbol/kallsyms.c | 4 ++- tools/perf/builtin-daemon.c | 19 +++++++------- tools/perf/builtin-ftrace.c | 18 ++++++------- tools/perf/builtin-inject.c | 2 +- tools/perf/builtin-kvm.c | 2 +- tools/perf/builtin-record.c | 6 ++--- tools/perf/builtin-sched.c | 2 +- tools/perf/builtin-script.c | 2 +- tools/perf/util/copyfile.c | 2 +- tools/perf/util/data.c | 11 ++++---- tools/perf/util/dso.c | 6 ++--- tools/perf/util/evlist.c | 6 ++--- tools/perf/util/lzma.c | 4 +-- tools/perf/util/namespaces.c | 5 ++-- tools/perf/util/parse-events.c | 6 ++--- tools/perf/util/pmu.c | 12 ++++----- tools/perf/util/probe-event.c | 4 +-- tools/perf/util/probe-file.c | 10 ++++---- tools/perf/util/session.c | 2 +- tools/perf/util/symbol-elf.c | 32 ++++++++++++------------ tools/perf/util/symbol-minimal.c | 6 ++--- tools/perf/util/symbol.c | 4 +-- tools/perf/util/synthetic-events.c | 7 +++--- tools/perf/util/trace-event-info.c | 6 ++--- tools/perf/util/trace-event-read.c | 5 ++-- tools/perf/util/unwind-libunwind-local.c | 4 +-- tools/perf/util/zlib.c | 5 ++-- 28 files changed, 102 insertions(+), 93 deletions(-) diff --git a/tools/lib/api/io.h b/tools/lib/api/io.h index 777c20f6b604..b292bbd39fb0 100644 --- a/tools/lib/api/io.h +++ b/tools/lib/api/io.h @@ -7,6 +7,7 @@ #ifndef __API_IO__ #define __API_IO__ =20 +#include #include #include =20 @@ -45,7 +46,7 @@ static inline int io__get_char(struct io *io) return -1; =20 if (ptr =3D=3D io->end) { - ssize_t n =3D read(io->fd, io->buf, io->buf_len); + ssize_t n =3D TEMP_FAILURE_RETRY(read(io->fd, io->buf, io->buf_len)); =20 if (n <=3D 0) { io->eof =3D true; diff --git a/tools/lib/symbol/kallsyms.c b/tools/lib/symbol/kallsyms.c index e335ac2b9e19..5436c038c379 100644 --- a/tools/lib/symbol/kallsyms.c +++ b/tools/lib/symbol/kallsyms.c @@ -3,7 +3,9 @@ #include "api/io.h" #include #include +#include #include +#include =20 u8 kallsyms2elf_type(char type) { @@ -36,7 +38,7 @@ int kallsyms__parse(const char *filename, void *arg, char bf[BUFSIZ]; int err; =20 - io.fd =3D open(filename, O_RDONLY, 0); + io.fd =3D TEMP_FAILURE_RETRY(open(filename, O_RDONLY, 0)); =20 if (io.fd < 0) return -1; diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c index 6cb3f6cc36d0..d4e1a5636056 100644 --- a/tools/perf/builtin-daemon.c +++ b/tools/perf/builtin-daemon.c @@ -351,7 +351,7 @@ static int daemon_session__run(struct daemon_session *s= ession, return -1; } =20 - fd =3D open("/dev/null", O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open("/dev/null", O_RDONLY)); if (fd < 0) { perror("failed: open /dev/null"); return -1; @@ -360,7 +360,7 @@ static int daemon_session__run(struct daemon_session *s= ession, dup2(fd, 0); close(fd); =20 - fd =3D open(SESSION_OUTPUT, O_RDWR|O_CREAT|O_TRUNC, 0644); + fd =3D TEMP_FAILURE_RETRY(open(SESSION_OUTPUT, O_RDWR|O_CREAT|O_TRUNC, 06= 44)); if (fd < 0) { perror("failed: open session output"); return -1; @@ -405,7 +405,8 @@ static pid_t handle_signalfd(struct daemon *daemon) * coalesced in kernel and we can receive only single signal even * if multiple SIGCHLD were generated. */ - err =3D read(daemon->signal_fd, &si, sizeof(struct signalfd_siginfo)); + err =3D TEMP_FAILURE_RETRY(read(daemon->signal_fd, &si, + sizeof(struct signalfd_siginfo))); if (err !=3D sizeof(struct signalfd_siginfo)) { pr_err("failed to read signal fd\n"); return -1; @@ -522,7 +523,7 @@ static int daemon_session__control(struct daemon_sessio= n *session, scnprintf(control_path, sizeof(control_path), "%s/%s", session->base, SESSION_CONTROL); =20 - control =3D open(control_path, O_WRONLY|O_NONBLOCK); + control =3D TEMP_FAILURE_RETRY(open(control_path, O_WRONLY|O_NONBLOCK)); if (!control) return -1; =20 @@ -531,7 +532,7 @@ static int daemon_session__control(struct daemon_sessio= n *session, scnprintf(ack_path, sizeof(ack_path), "%s/%s", session->base, SESSION_ACK); =20 - ack =3D open(ack_path, O_RDONLY, O_NONBLOCK); + ack =3D TEMP_FAILURE_RETRY(open(ack_path, O_RDONLY, O_NONBLOCK)); if (!ack) { close(control); return -1; @@ -564,7 +565,7 @@ static int daemon_session__control(struct daemon_sessio= n *session, goto out; } =20 - err =3D read(ack, buf, sizeof(buf)); + err =3D TEMP_FAILURE_RETRY(read(ack, buf, sizeof(buf))); if (err > 0) ret =3D strcmp(buf, "ack\n"); else @@ -1078,7 +1079,7 @@ static int handle_config_changes(struct daemon *daemo= n, int conf_fd, ssize_t len; =20 while (!(*config_changed)) { - len =3D read(conf_fd, buf, sizeof(buf)); + len =3D TEMP_FAILURE_RETRY(read(conf_fd, buf, sizeof(buf))); if (len =3D=3D -1) { if (errno !=3D EAGAIN) { perror("failed: read"); @@ -1147,7 +1148,7 @@ static int check_lock(struct daemon *daemon) =20 scnprintf(path, sizeof(path), "%s/lock", daemon->base); =20 - fd =3D open(path, O_RDWR|O_CREAT|O_CLOEXEC, 0640); + fd =3D TEMP_FAILURE_RETRY(open(path, O_RDWR|O_CREAT|O_CLOEXEC, 0640)); if (fd < 0) return -1; =20 @@ -1201,7 +1202,7 @@ static int go_background(struct daemon *daemon) return -1; } =20 - fd =3D open("output", O_RDWR|O_CREAT|O_TRUNC, 0644); + fd =3D TEMP_FAILURE_RETRY(open("output", O_RDWR|O_CREAT|O_TRUNC, 0644)); if (fd < 0) { perror("failed: open"); return -1; diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c index 7de07bb16d23..7553e20f38b2 100644 --- a/tools/perf/builtin-ftrace.c +++ b/tools/perf/builtin-ftrace.c @@ -79,7 +79,7 @@ static int __write_tracing_file(const char *name, const c= har *val, bool append) else flags |=3D O_TRUNC; =20 - fd =3D open(file, flags); + fd =3D TEMP_FAILURE_RETRY(open(file, flags)); if (fd < 0) { pr_debug("cannot open tracing file: %s: %s\n", name, str_error_r(errno, errbuf, sizeof(errbuf))); @@ -132,7 +132,7 @@ static int read_tracing_file_to_stdout(const char *name) return -1; } =20 - fd =3D open(file, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(file, O_RDONLY)); if (fd < 0) { pr_debug("cannot open tracing file: %s: %s\n", name, str_error_r(errno, buf, sizeof(buf))); @@ -141,7 +141,7 @@ static int read_tracing_file_to_stdout(const char *name) =20 /* read contents to stdout */ while (true) { - int n =3D read(fd, buf, sizeof(buf)); + int n =3D TEMP_FAILURE_RETRY(read(fd, buf, sizeof(buf))); if (n =3D=3D 0) break; else if (n < 0) @@ -608,7 +608,7 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace) goto out_reset; } =20 - trace_fd =3D open(trace_file, O_RDONLY); + trace_fd =3D TEMP_FAILURE_RETRY(open(trace_file, O_RDONLY)); =20 put_tracing_file(trace_file); =20 @@ -645,7 +645,7 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace) break; =20 if (pollfd.revents & POLLIN) { - int n =3D read(trace_fd, buf, sizeof(buf)); + int n =3D TEMP_FAILURE_RETRY(read(trace_fd, buf, sizeof(buf))); if (n < 0) break; if (fwrite(buf, n, 1, stdout) !=3D 1) @@ -665,7 +665,7 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace) =20 /* read remaining buffer contents */ while (true) { - int n =3D read(trace_fd, buf, sizeof(buf)); + int n =3D TEMP_FAILURE_RETRY(read(trace_fd, buf, sizeof(buf))); if (n <=3D 0) break; if (fwrite(buf, n, 1, stdout) !=3D 1) @@ -826,7 +826,7 @@ static int prepare_func_latency(struct perf_ftrace *ftr= ace) return -1; } =20 - fd =3D open(trace_file, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(trace_file, O_RDONLY)); if (fd < 0) pr_err("failed to open trace_pipe\n"); =20 @@ -913,7 +913,7 @@ static int __cmd_latency(struct perf_ftrace *ftrace) break; =20 if (pollfd.revents & POLLIN) { - int n =3D read(trace_fd, buf, sizeof(buf) - 1); + int n =3D TEMP_FAILURE_RETRY(read(trace_fd, buf, sizeof(buf) - 1)); if (n < 0) break; =20 @@ -931,7 +931,7 @@ static int __cmd_latency(struct perf_ftrace *ftrace) =20 /* read remaining buffer contents */ while (!ftrace->target.use_bpf) { - int n =3D read(trace_fd, buf, sizeof(buf) - 1); + int n =3D TEMP_FAILURE_RETRY(read(trace_fd, buf, sizeof(buf) - 1)); if (n <=3D 0) break; make_histogram(buckets, buf, n, line, ftrace->use_nsec); diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index a75bf11585b5..960b4a50583e 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -155,7 +155,7 @@ static int copy_bytes(struct perf_inject *inject, int f= d, off_t size) int ret; =20 while (size > 0) { - ssz =3D read(fd, buf, min(size, (off_t)sizeof(buf))); + ssz =3D TEMP_FAILURE_RETRY(read(fd, buf, min(size, (off_t)sizeof(buf)))); if (ssz < 0) return -errno; ret =3D output_bytes(inject, buf, ssz); diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 3696ae97f149..4dd8292d1941 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -880,7 +880,7 @@ static int perf_kvm__handle_timerfd(struct perf_kvm_sta= t *kvm) uint64_t c; int rc; =20 - rc =3D read(kvm->timerfd, &c, sizeof(uint64_t)); + rc =3D TEMP_FAILURE_RETRY(read(kvm->timerfd, &c, sizeof(uint64_t))); if (rc < 0) { if (errno =3D=3D EAGAIN) return 0; diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 9a71f0330137..361610bc96b6 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -902,7 +902,7 @@ static bool record__kcore_readable(struct machine *mach= ine) =20 scnprintf(kcore, sizeof(kcore), "%s/proc/kcore", machine->root_dir); =20 - fd =3D open(kcore, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(kcore, O_RDONLY)); if (fd < 0) return false; =20 @@ -2049,7 +2049,7 @@ static int record__terminate_thread(struct record_thr= ead *thread_data) =20 close(thread_data->pipes.msg[1]); thread_data->pipes.msg[1] =3D -1; - err =3D read(thread_data->pipes.ack[0], &ack, sizeof(ack)); + err =3D TEMP_FAILURE_RETRY(read(thread_data->pipes.ack[0], &ack, sizeof(a= ck))); if (err > 0) pr_debug2("threads[%d]: sent %s\n", tid, thread_msg_tags[ack]); else @@ -2097,7 +2097,7 @@ static int record__start_threads(struct record *rec) goto out_err; } =20 - err =3D read(thread_data[t].pipes.ack[0], &msg, sizeof(msg)); + err =3D TEMP_FAILURE_RETRY(read(thread_data[t].pipes.ack[0], &msg, sizeo= f(msg))); if (err > 0) pr_debug2("threads[%d]: sent %s\n", rec->thread_data[t].tid, thread_msg_tags[msg]); diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 646bd938927a..149787268d02 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -604,7 +604,7 @@ static u64 get_cpu_usage_nsec_self(int fd) u64 runtime; int ret; =20 - ret =3D read(fd, &runtime, sizeof(runtime)); + ret =3D TEMP_FAILURE_RETRY(read(fd, &runtime, sizeof(runtime))); BUG_ON(ret !=3D sizeof(runtime)); =20 return runtime; diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index c689054002cc..844f5350bfdf 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -4207,7 +4207,7 @@ int cmd_script(int argc, const char **argv) goto out_delete; } =20 - input =3D open(data.path, O_RDONLY); /* input_name */ + input =3D TEMP_FAILURE_RETRY(open(data.path, O_RDONLY)); /* input_name */ if (input < 0) { err =3D -errno; perror("failed to open file"); diff --git a/tools/perf/util/copyfile.c b/tools/perf/util/copyfile.c index 47e03de7c235..c7bff4943936 100644 --- a/tools/perf/util/copyfile.c +++ b/tools/perf/util/copyfile.c @@ -112,7 +112,7 @@ static int copyfile_mode_ns(const char *from, const cha= r *to, mode_t mode, goto out_close_to; =20 nsinfo__mountns_enter(nsi, &nsc); - fromfd =3D open(from, O_RDONLY); + fromfd =3D TEMP_FAILURE_RETRY(open(from, O_RDONLY)); nsinfo__mountns_exit(&nsc); if (fromfd < 0) goto out_close_to; diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c index caabeac24c69..a9066a3d914f 100644 --- a/tools/perf/util/data.c +++ b/tools/perf/util/data.c @@ -53,7 +53,8 @@ int perf_data__create_dir(struct perf_data *data, int nr) goto out_err; } =20 - ret =3D open(file->path, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR); + ret =3D TEMP_FAILURE_RETRY(open(file->path, O_RDWR|O_CREAT|O_TRUNC, + S_IRUSR|S_IWUSR)); if (ret < 0) { ret =3D -errno; goto out_err; @@ -123,7 +124,7 @@ int perf_data__open_dir(struct perf_data *data) if (!file->path) goto out_err; =20 - ret =3D open(file->path, O_RDONLY); + ret =3D TEMP_FAILURE_RETRY(open(file->path, O_RDONLY)); if (ret < 0) goto out_err; =20 @@ -248,7 +249,7 @@ static int open_file_read(struct perf_data *data) int fd; char sbuf[STRERR_BUFSIZE]; =20 - fd =3D open(data->file.path, flags); + fd =3D TEMP_FAILURE_RETRY(open(data->file.path, flags)); if (fd < 0) { int err =3D errno; =20 @@ -288,8 +289,8 @@ static int open_file_write(struct perf_data *data) int fd; char sbuf[STRERR_BUFSIZE]; =20 - fd =3D open(data->file.path, O_CREAT|O_RDWR|O_TRUNC|O_CLOEXEC, - S_IRUSR|S_IWUSR); + fd =3D TEMP_FAILURE_RETRY(open(data->file.path, O_CREAT|O_RDWR|O_TRUNC|O_= CLOEXEC, + S_IRUSR|S_IWUSR)); =20 if (fd < 0) pr_err("failed to open %s : %s\n", data->file.path, diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 5ac13958d1bd..40befa2429f9 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -300,7 +300,7 @@ int filename__decompress(const char *name, char *pathna= me, * descriptor to the uncompressed file. */ if (!compressions[comp].is_compressed(name)) - return open(name, O_RDONLY); + return TEMP_FAILURE_RETRY(open(name, O_RDONLY)); =20 fd =3D mkstemp(tmpbuf); if (fd < 0) { @@ -476,7 +476,7 @@ static int do_open(char *name) char sbuf[STRERR_BUFSIZE]; =20 do { - fd =3D open(name, O_RDONLY|O_CLOEXEC); + fd =3D TEMP_FAILURE_RETRY(open(name, O_RDONLY|O_CLOEXEC)); if (fd >=3D 0) return fd; =20 @@ -898,7 +898,7 @@ static ssize_t file_read(struct dso *dso, struct machin= e *machine, goto out; } =20 - ret =3D pread(dso->data.fd, data, DSO__DATA_CACHE_SIZE, offset); + ret =3D TEMP_FAILURE_RETRY(pread(dso->data.fd, data, DSO__DATA_CACHE_SIZE= , offset)); out: pthread_mutex_unlock(&dso__data_open_lock); return ret; diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 48af7d379d82..ba0dcdf91120 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -1440,7 +1440,7 @@ int evlist__prepare_workload(struct evlist *evlist, s= truct target *target, const /* * Wait until the parent tells us to go. */ - ret =3D read(go_pipe[0], &bf, 1); + ret =3D TEMP_FAILURE_RETRY(read(go_pipe[0], &bf, 1)); /* * The parent will ask for the execvp() to be performed by * writing exactly one byte, in workload.cork_fd, usually via @@ -1837,7 +1837,7 @@ static int evlist__parse_control_fifo(const char *str= , int *ctl_fd, int *ctl_fd_ * O_RDWR avoids POLLHUPs which is necessary to allow the other * end of a FIFO to be repeatedly opened and closed. */ - fd =3D open(s, O_RDWR | O_NONBLOCK | O_CLOEXEC); + fd =3D TEMP_FAILURE_RETRY(open(s, O_RDWR | O_NONBLOCK | O_CLOEXEC)); if (fd < 0) { pr_err("Failed to open '%s'\n", s); ret =3D -errno; @@ -1848,7 +1848,7 @@ static int evlist__parse_control_fifo(const char *str= , int *ctl_fd, int *ctl_fd_ =20 if (p && *++p) { /* O_RDWR | O_NONBLOCK means the other end need not be open */ - fd =3D open(p, O_RDWR | O_NONBLOCK | O_CLOEXEC); + fd =3D TEMP_FAILURE_RETRY(open(p, O_RDWR | O_NONBLOCK | O_CLOEXEC)); if (fd < 0) { pr_err("Failed to open '%s'\n", p); ret =3D -errno; diff --git a/tools/perf/util/lzma.c b/tools/perf/util/lzma.c index 51424cdc3b68..93e0a6a53e28 100644 --- a/tools/perf/util/lzma.c +++ b/tools/perf/util/lzma.c @@ -109,7 +109,7 @@ int lzma_decompress_to_file(const char *input, int outp= ut_fd) =20 bool lzma_is_compressed(const char *input) { - int fd =3D open(input, O_RDONLY); + int fd =3D TEMP_FAILURE_RETRY(open(input, O_RDONLY)); const uint8_t magic[6] =3D { 0xFD, '7', 'z', 'X', 'Z', 0x00 }; char buf[6] =3D { 0 }; ssize_t rc; @@ -117,7 +117,7 @@ bool lzma_is_compressed(const char *input) if (fd < 0) return -1; =20 - rc =3D read(fd, buf, sizeof(buf)); + rc =3D TEMP_FAILURE_RETRY(read(fd, buf, sizeof(buf))); close(fd); return rc =3D=3D sizeof(buf) ? memcmp(buf, magic, sizeof(buf)) =3D=3D 0 : false; diff --git a/tools/perf/util/namespaces.c b/tools/perf/util/namespaces.c index dd536220cdb9..89edfba6af06 100644 --- a/tools/perf/util/namespaces.c +++ b/tools/perf/util/namespaces.c @@ -9,6 +9,7 @@ #include "get_current_dir_name.h" #include #include +#include #include #include #include @@ -266,11 +267,11 @@ void nsinfo__mountns_enter(struct nsinfo *nsi, if (!oldcwd) return; =20 - oldns =3D open(curpath, O_RDONLY); + oldns =3D TEMP_FAILURE_RETRY(open(curpath, O_RDONLY)); if (oldns < 0) goto errout; =20 - newns =3D open(nsi->mntns_path, O_RDONLY); + newns =3D TEMP_FAILURE_RETRY(open(nsi->mntns_path, O_RDONLY)); if (newns < 0) goto errout; =20 diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 7ed235740431..75f8f2e44195 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -189,7 +189,7 @@ static int tp_event_has_id(const char *dir_path, struct= dirent *evt_dir) int fd; =20 snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dir->d_name); - fd =3D open(evt_path, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(evt_path, O_RDONLY)); if (fd < 0) return -EINVAL; close(fd); @@ -233,10 +233,10 @@ struct tracepoint_path *tracepoint_id_to_path(u64 con= fig) =20 scnprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path, evt_dirent->d_name); - fd =3D open(evt_path, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(evt_path, O_RDONLY)); if (fd < 0) continue; - if (read(fd, id_buf, sizeof(id_buf)) < 0) { + if (TEMP_FAILURE_RETRY(read(fd, id_buf, sizeof(id_buf))) < 0) { close(fd); continue; } diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 9a1c7e63e663..59252cfc2b5b 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -154,14 +154,14 @@ static int perf_pmu__parse_scale(struct perf_pmu_alia= s *alias, char *dir, char * =20 scnprintf(path, PATH_MAX, "%s/%s.scale", dir, name); =20 - fd =3D open(path, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(path, O_RDONLY)); if (fd =3D=3D -1) return -1; =20 if (fstat(fd, &st) < 0) goto error; =20 - sret =3D read(fd, scale, sizeof(scale)-1); + sret =3D TEMP_FAILURE_RETRY(read(fd, scale, sizeof(scale)-1)); if (sret < 0) goto error; =20 @@ -184,11 +184,11 @@ static int perf_pmu__parse_unit(struct perf_pmu_alias= *alias, char *dir, char *n =20 scnprintf(path, PATH_MAX, "%s/%s.unit", dir, name); =20 - fd =3D open(path, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(path, O_RDONLY)); if (fd =3D=3D -1) return -1; =20 - sret =3D read(fd, alias->unit, UNIT_MAX_LEN); + sret =3D TEMP_FAILURE_RETRY(read(fd, alias->unit, UNIT_MAX_LEN)); if (sret < 0) goto error; =20 @@ -214,7 +214,7 @@ perf_pmu__parse_per_pkg(struct perf_pmu_alias *alias, c= har *dir, char *name) =20 scnprintf(path, PATH_MAX, "%s/%s.per-pkg", dir, name); =20 - fd =3D open(path, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(path, O_RDONLY)); if (fd =3D=3D -1) return -1; =20 @@ -232,7 +232,7 @@ static int perf_pmu__parse_snapshot(struct perf_pmu_ali= as *alias, =20 scnprintf(path, PATH_MAX, "%s/%s.snapshot", dir, name); =20 - fd =3D open(path, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(path, O_RDONLY)); if (fd =3D=3D -1) return -1; =20 diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 062b5cbe67af..7838889f55df 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -276,7 +276,7 @@ static char *find_module_name(const char *module) char *mod_name =3D NULL; int name_offset; =20 - fd =3D open(module, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(module, O_RDONLY)); if (fd < 0) return NULL; =20 @@ -598,7 +598,7 @@ static int get_text_start_address(const char *exec, u64= *address, struct nscookie nsc; =20 nsinfo__mountns_enter(nsi, &nsc); - fd =3D open(exec, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(exec, O_RDONLY)); nsinfo__mountns_exit(&nsc); if (fd < 0) return -errno; diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index 3d50de3217d5..b788932656e8 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -115,9 +115,9 @@ int open_trace_file(const char *trace_file, bool readwr= ite) if (ret >=3D 0) { pr_debug("Opening %s write=3D%d\n", buf, readwrite); if (readwrite && !probe_event_dry_run) - ret =3D open(buf, O_RDWR | O_APPEND, 0); + ret =3D TEMP_FAILURE_RETRY(open(buf, O_RDWR | O_APPEND, 0)); else - ret =3D open(buf, O_RDONLY, 0); + ret =3D TEMP_FAILURE_RETRY(open(buf, O_RDONLY, 0)); =20 if (ret < 0) ret =3D -errno; @@ -180,7 +180,7 @@ struct strlist *probe_file__get_rawlist(int fd) if (sl =3D=3D NULL) return NULL; =20 - fddup =3D dup(fd); + fddup =3D TEMP_FAILURE_RETRY(dup(fd)); if (fddup < 0) goto out_free_sl; =20 @@ -498,7 +498,7 @@ static int probe_cache__open(struct probe_cache *pcache= , const char *target, } =20 snprintf(cpath, PATH_MAX, "%s/probes", dir_name); - fd =3D open(cpath, O_CREAT | O_RDWR, 0644); + fd =3D TEMP_FAILURE_RETRY(open(cpath, O_CREAT | O_RDWR, 0644)); if (fd < 0) pr_debug("Failed to open cache(%d): %s\n", fd, cpath); free(dir_name); @@ -514,7 +514,7 @@ static int probe_cache__load(struct probe_cache *pcache) int ret =3D 0, fddup; FILE *fp; =20 - fddup =3D dup(pcache->fd); + fddup =3D TEMP_FAILURE_RETRY(dup(pcache->fd)); if (fddup < 0) return -errno; fp =3D fdopen(fddup, "r"); diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 0acb9de54b06..b2fc389cc530 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -384,7 +384,7 @@ static int skipn(int fd, off_t n) ssize_t ret; =20 while (n > 0) { - ret =3D read(fd, buf, min(n, (off_t)sizeof(buf))); + ret =3D TEMP_FAILURE_RETRY(read(fd, buf, min(n, (off_t)sizeof(buf)))); if (ret <=3D 0) return ret; n -=3D ret; diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index ecd377938eea..02556070a2ce 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -577,7 +577,7 @@ static int read_build_id(const char *filename, struct b= uild_id *bid) if (size < BUILD_ID_SIZE) goto out; =20 - fd =3D open(filename, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(filename, O_RDONLY)); if (fd < 0) goto out; =20 @@ -638,7 +638,7 @@ int sysfs__read_build_id(const char *filename, struct b= uild_id *bid) size_t size =3D sizeof(bid->data); int fd, err =3D -1; =20 - fd =3D open(filename, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(filename, O_RDONLY)); if (fd < 0) goto out; =20 @@ -647,24 +647,24 @@ int sysfs__read_build_id(const char *filename, struct= build_id *bid) GElf_Nhdr nhdr; size_t namesz, descsz; =20 - if (read(fd, &nhdr, sizeof(nhdr)) !=3D sizeof(nhdr)) + if (TEMP_FAILURE_RETRY(read(fd, &nhdr, sizeof(nhdr))) !=3D sizeof(nhdr)) break; =20 namesz =3D NOTE_ALIGN(nhdr.n_namesz); descsz =3D NOTE_ALIGN(nhdr.n_descsz); if (nhdr.n_type =3D=3D NT_GNU_BUILD_ID && nhdr.n_namesz =3D=3D sizeof("GNU")) { - if (read(fd, bf, namesz) !=3D (ssize_t)namesz) + if (TEMP_FAILURE_RETRY(read(fd, bf, namesz)) !=3D (ssize_t)namesz) break; if (memcmp(bf, "GNU", sizeof("GNU")) =3D=3D 0) { size_t sz =3D min(descsz, size); - if (read(fd, bid->data, sz) =3D=3D (ssize_t)sz) { + if (TEMP_FAILURE_RETRY(read(fd, bid->data, sz)) =3D=3D (ssize_t)sz) { memset(bid->data + sz, 0, size - sz); bid->size =3D sz; err =3D 0; break; } - } else if (read(fd, bf, descsz) !=3D (ssize_t)descsz) + } else if (TEMP_FAILURE_RETRY(read(fd, bf, descsz)) !=3D (ssize_t)descs= z) break; } else { int n =3D namesz + descsz; @@ -674,7 +674,7 @@ int sysfs__read_build_id(const char *filename, struct b= uild_id *bid) pr_debug("%s: truncating reading of build id in sysfs file %s: n_names= z=3D%u, n_descsz=3D%u.\n", __func__, filename, nhdr.n_namesz, nhdr.n_descsz); } - if (read(fd, bf, n) !=3D n) + if (TEMP_FAILURE_RETRY(read(fd, bf, n)) !=3D n) break; } } @@ -732,7 +732,7 @@ int filename__read_debuglink(const char *filename, char= *debuglink, Elf_Scn *sec; Elf_Kind ek; =20 - fd =3D open(filename, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(filename, O_RDONLY)); if (fd < 0) goto out; =20 @@ -844,7 +844,7 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, co= nst char *name, =20 type =3D dso->symtab_type; } else { - fd =3D open(name, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(name, O_RDONLY)); if (fd < 0) { dso->load_errno =3D errno; return -1; @@ -1454,7 +1454,7 @@ static int copy_bytes(int from, off_t from_offs, int = to, off_t to_offs, u64 len) if (len < n) n =3D len; /* Use read because mmap won't work on proc files */ - r =3D read(from, buf, n); + r =3D TEMP_FAILURE_RETRY(read(from, buf, n)); if (r < 0) goto out; if (!r) @@ -1485,7 +1485,7 @@ static int kcore__open(struct kcore *kcore, const cha= r *filename) { GElf_Ehdr *ehdr; =20 - kcore->fd =3D open(filename, O_RDONLY); + kcore->fd =3D TEMP_FAILURE_RETRY(open(filename, O_RDONLY)); if (kcore->fd =3D=3D -1) return -1; =20 @@ -1518,7 +1518,7 @@ static int kcore__init(struct kcore *kcore, char *fil= ename, int elfclass, if (temp) kcore->fd =3D mkstemp(filename); else - kcore->fd =3D open(filename, O_WRONLY | O_CREAT | O_EXCL, 0400); + kcore->fd =3D TEMP_FAILURE_RETRY(open(filename, O_WRONLY | O_CREAT | O_E= XCL, 0400)); if (kcore->fd =3D=3D -1) return -1; =20 @@ -1966,7 +1966,7 @@ static int kcore_copy__compare_fds(int from, int to) =20 while (1) { /* Use read because mmap won't work on proc files */ - ret =3D read(from, buf_from, page_size); + ret =3D TEMP_FAILURE_RETRY(read(from, buf_from, page_size)); if (ret < 0) goto out; =20 @@ -1994,11 +1994,11 @@ static int kcore_copy__compare_files(const char *fr= om_filename, { int from, to, err =3D -1; =20 - from =3D open(from_filename, O_RDONLY); + from =3D TEMP_FAILURE_RETRY(open(from_filename, O_RDONLY)); if (from < 0) return -1; =20 - to =3D open(to_filename, O_RDONLY); + to =3D TEMP_FAILURE_RETRY(open(to_filename, O_RDONLY)); if (to < 0) goto out_close_from; =20 @@ -2419,7 +2419,7 @@ int get_sdt_note_list(struct list_head *head, const c= har *target) Elf *elf; int fd, ret; =20 - fd =3D open(target, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(target, O_RDONLY)); if (fd < 0) return -EBADF; =20 diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-mini= mal.c index f9eb0bee7f15..7e25d476b1b2 100644 --- a/tools/perf/util/symbol-minimal.c +++ b/tools/perf/util/symbol-minimal.c @@ -230,7 +230,7 @@ int sysfs__read_build_id(const char *filename, struct b= uild_id *bid) size_t buf_size; void *buf; =20 - fd =3D open(filename, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(filename, O_RDONLY)); if (fd < 0) return -1; =20 @@ -242,7 +242,7 @@ int sysfs__read_build_id(const char *filename, struct b= uild_id *bid) if (buf =3D=3D NULL) goto out; =20 - if (read(fd, buf, buf_size) !=3D (ssize_t) buf_size) + if (TEMP_FAILURE_RETRY(read(fd, buf, buf_size)) !=3D (ssize_t) buf_size) goto out_free; =20 ret =3D read_build_id(buf, buf_size, bid, false); @@ -256,7 +256,7 @@ int sysfs__read_build_id(const char *filename, struct b= uild_id *bid) int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name, enum dso_binary_type type) { - int fd =3D open(name, O_RDONLY); + int fd =3D TEMP_FAILURE_RETRY(open(name, O_RDONLY)); if (fd < 0) goto out_errno; =20 diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index f72baf636724..5212667ea67d 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1335,7 +1335,7 @@ static int dso__load_kcore(struct dso *dso, struct ma= p *map, md.dso =3D dso; INIT_LIST_HEAD(&md.maps); =20 - fd =3D open(kcore_filename, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(kcore_filename, O_RDONLY)); if (fd < 0) { pr_debug("Failed to open %s. Note /proc/kcore requires CAP_SYS_RAWIO cap= ability to access.\n", kcore_filename); @@ -2156,7 +2156,7 @@ static int find_matching_kcore(struct map *map, char = *dir, size_t dir_sz) */ static bool filename__readable(const char *file) { - int fd =3D open(file, O_RDONLY); + int fd =3D TEMP_FAILURE_RETRY(open(file, O_RDONLY)); if (fd < 0) return false; close(fd); diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 76beda3e1a10..9dcc268bd69c 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include =20 @@ -86,13 +87,13 @@ static int perf_event__get_comm_ids(pid_t pid, pid_t ti= d, char *comm, size_t len else snprintf(bf, sizeof(bf), "/proc/%d/status", tid); =20 - fd =3D open(bf, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(bf, O_RDONLY)); if (fd < 0) { pr_debug("couldn't open %s\n", bf); return -1; } =20 - n =3D read(fd, bf, sizeof(bf) - 1); + n =3D TEMP_FAILURE_RETRY(read(fd, bf, sizeof(bf) - 1)); close(fd); if (n <=3D 0) { pr_warning("Couldn't get COMM, tigd and ppid for pid %d\n", @@ -410,7 +411,7 @@ int perf_event__synthesize_mmap_events(struct perf_tool= *tool, snprintf(bf, sizeof(bf), "%s/proc/%d/task/%d/maps", machine->root_dir, pid, pid); =20 - io.fd =3D open(bf, O_RDONLY, 0); + io.fd =3D TEMP_FAILURE_RETRY(open(bf, O_RDONLY, 0)); if (io.fd < 0) { /* * We raced with a task exiting - just return: diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-eve= nt-info.c index a65f65d0857e..c917a4217c6f 100644 --- a/tools/perf/util/trace-event-info.c +++ b/tools/perf/util/trace-event-info.c @@ -48,7 +48,7 @@ static int record_file(const char *file, ssize_t hdr_sz) int r, fd; int err =3D -EIO; =20 - fd =3D open(file, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(file, O_RDONLY)); if (fd < 0) { pr_debug("Can't read '%s'", file); return -errno; @@ -61,7 +61,7 @@ static int record_file(const char *file, ssize_t hdr_sz) } =20 do { - r =3D read(fd, buf, BUFSIZ); + r =3D TEMP_FAILURE_RETRY(read(fd, buf, BUFSIZ)); if (r > 0) { size +=3D r; if (write(output_fd, buf, r) !=3D r) @@ -519,7 +519,7 @@ struct tracing_data *tracing_data_get(struct list_head = *pattrs, return NULL; } =20 - temp_fd =3D open(tdata->temp_file, O_RDWR); + temp_fd =3D TEMP_FAILURE_RETRY(open(tdata->temp_file, O_RDWR)); if (temp_fd < 0) { pr_debug("Can't read '%s'", tdata->temp_file); free(tdata); diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-eve= nt-read.c index 8a01af783310..7086770ec225 100644 --- a/tools/perf/util/trace-event-read.c +++ b/tools/perf/util/trace-event-read.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -28,7 +29,7 @@ static int __do_read(int fd, void *buf, int size) int rsize =3D size; =20 while (size) { - int ret =3D read(fd, buf, size); + int ret =3D TEMP_FAILURE_RETRY(read(fd, buf, size)); =20 if (ret <=3D 0) return -1; @@ -105,7 +106,7 @@ static char *read_string(void) char c; =20 for (;;) { - r =3D read(input_fd, &c, 1); + r =3D TEMP_FAILURE_RETRY(read(input_fd, &c, 1)); if (r < 0) { pr_debug("reading input file"); goto out; diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unw= ind-libunwind-local.c index 37622699c91a..2ece387a73c6 100644 --- a/tools/perf/util/unwind-libunwind-local.c +++ b/tools/perf/util/unwind-libunwind-local.c @@ -362,7 +362,7 @@ static int read_unwind_spec_debug_frame(struct dso *dso, } =20 if (ofs <=3D 0) { - fd =3D open(dso->symsrc_filename, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(dso->symsrc_filename, O_RDONLY)); if (fd >=3D 0) { ofs =3D elf_section_offset(fd, ".debug_frame"); close(fd); @@ -377,7 +377,7 @@ static int read_unwind_spec_debug_frame(struct dso *dso, dso, DSO_BINARY_TYPE__DEBUGLINK, machine->root_dir, debuglink, PATH_MAX); if (!ret) { - fd =3D open(debuglink, O_RDONLY); + fd =3D TEMP_FAILURE_RETRY(open(debuglink, O_RDONLY)); if (fd >=3D 0) { ofs =3D elf_section_offset(fd, ".debug_frame"); diff --git a/tools/perf/util/zlib.c b/tools/perf/util/zlib.c index 78d2297c1b67..f4563ea094c8 100644 --- a/tools/perf/util/zlib.c +++ b/tools/perf/util/zlib.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +#include #include #include #include @@ -82,7 +83,7 @@ int gzip_decompress_to_file(const char *input, int output= _fd) =20 bool gzip_is_compressed(const char *input) { - int fd =3D open(input, O_RDONLY); + int fd =3D TEMP_FAILURE_RETRY(open(input, O_RDONLY)); const uint8_t magic[2] =3D { 0x1f, 0x8b }; char buf[2] =3D { 0 }; ssize_t rc; @@ -90,7 +91,7 @@ bool gzip_is_compressed(const char *input) if (fd < 0) return -1; =20 - rc =3D read(fd, buf, sizeof(buf)); + rc =3D TEMP_FAILURE_RETRY(read(fd, buf, sizeof(buf))); close(fd); return rc =3D=3D sizeof(buf) ? memcmp(buf, magic, sizeof(buf)) =3D=3D 0 : false; --=20 2.36.1.476.g0c4daa206d-goog