Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatchin...
[muen/linux.git] / kernel / livepatch / transition.c
index abb2a4a..cdf318d 100644 (file)
@@ -247,7 +247,6 @@ static int klp_check_stack(struct task_struct *task, char *err_buf)
        int ret, nr_entries;
 
        ret = stack_trace_save_tsk_reliable(task, entries, ARRAY_SIZE(entries));
-       WARN_ON_ONCE(ret == -ENOSYS);
        if (ret < 0) {
                snprintf(err_buf, STACK_ERR_BUF_SIZE,
                         "%s: %s:%d has an unreliable stack\n",
@@ -281,11 +280,11 @@ static int klp_check_stack(struct task_struct *task, char *err_buf)
  */
 static bool klp_try_switch_task(struct task_struct *task)
 {
+       static char err_buf[STACK_ERR_BUF_SIZE];
        struct rq *rq;
        struct rq_flags flags;
        int ret;
        bool success = false;
-       char err_buf[STACK_ERR_BUF_SIZE];
 
        err_buf[0] = '\0';
 
@@ -293,6 +292,13 @@ static bool klp_try_switch_task(struct task_struct *task)
        if (task->patch_state == klp_target_state)
                return true;
 
+       /*
+        * For arches which don't have reliable stack traces, we have to rely
+        * on other methods (e.g., switching tasks at kernel exit).
+        */
+       if (!klp_have_reliable_stack())
+               return false;
+
        /*
         * Now try to check the stack for any to-be-patched or to-be-unpatched
         * functions.  If all goes well, switch the task to the target patch
@@ -328,7 +334,6 @@ done:
                pr_debug("%s", err_buf);
 
        return success;
-
 }
 
 /*