tracing: Fix race where eprobes can be called before the event
[platform/kernel/linux-starfive.git] / kernel / rseq.c
index bda8175..d38ab94 100644 (file)
@@ -171,12 +171,27 @@ static int rseq_get_rseq_cs(struct task_struct *t, struct rseq_cs *rseq_cs)
        return 0;
 }
 
+static bool rseq_warn_flags(const char *str, u32 flags)
+{
+       u32 test_flags;
+
+       if (!flags)
+               return false;
+       test_flags = flags & RSEQ_CS_NO_RESTART_FLAGS;
+       if (test_flags)
+               pr_warn_once("Deprecated flags (%u) in %s ABI structure", test_flags, str);
+       test_flags = flags & ~RSEQ_CS_NO_RESTART_FLAGS;
+       if (test_flags)
+               pr_warn_once("Unknown flags (%u) in %s ABI structure", test_flags, str);
+       return true;
+}
+
 static int rseq_need_restart(struct task_struct *t, u32 cs_flags)
 {
        u32 flags, event_mask;
        int ret;
 
-       if (WARN_ON_ONCE(cs_flags & RSEQ_CS_NO_RESTART_FLAGS) || cs_flags)
+       if (rseq_warn_flags("rseq_cs", cs_flags))
                return -EINVAL;
 
        /* Get thread flags. */
@@ -184,7 +199,7 @@ static int rseq_need_restart(struct task_struct *t, u32 cs_flags)
        if (ret)
                return ret;
 
-       if (WARN_ON_ONCE(flags & RSEQ_CS_NO_RESTART_FLAGS) || flags)
+       if (rseq_warn_flags("rseq", flags))
                return -EINVAL;
 
        /*