]> www.infradead.org Git - users/mchehab/rasdaemon.git/commitdiff
The rasdaemon service may fail to be started for the first time.
authorzhuofeng <zhuofeng2@huawei.com>
Sat, 29 Jun 2024 09:27:56 +0000 (17:27 +0800)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 18 Nov 2024 13:51:48 +0000 (14:51 +0100)
The rasdaemon creates a separate instance virtual directory on first startup, like `/sys/kernel/debug/tracing/instances/rasdaemon`.

After the directory is created, the kernel generates virtual files such as `trace_clock` and `set_event` in `/sys/kernel/debug/tracing/instances/rasdaemon`.

The kernel generates virtual files and the rasdaemon accesses the virtual files at the same time. Therefore, the kernel may not generate the virtual files when the rasdaemon accesses the virtual files.

So add up to 30 seconds to give the kernel enough time to generate the files.

Signed-off-by: zhuofeng <zhuofeng2@huawei.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
ras-events.c

index db8d4c113117c9e96c6806e6f4fb7bf4958393df..a7de48d94400ac22e46243a3768e955c429ebd62 100644 (file)
@@ -100,6 +100,19 @@ static int get_debugfs_dir(char *tracing_dir, size_t len)
        return -ENOENT;
 }
 
+static int wait_access(char *path, int ms)
+{
+       int i;
+       for (i = 0; i < ms; i++) {
+               if (access(path, F_OK) == 0)
+                       return 0;
+               usleep(1000);
+       }
+
+       log(ALL, LOG_WARNING, "wait_access() failed, %s not created in %d ms\n", path, ms);
+       return -1;
+}
+
 static int open_trace(struct ras_events *ras, char *name, int flags)
 {
        char fname[MAX_PATH + 1];
@@ -115,6 +128,12 @@ static int open_trace(struct ras_events *ras, char *name, int flags)
        if (rc < 0)
                return rc;
 
+       rc = wait_access(fname, 30000);
+       if (rc != 0) {
+               /* use -1 to keep same error value with open() */
+               return -1;
+       }
+
        rc = open(fname, flags);
        if (rc < 0) {
                rc = -errno;