Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatchin...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jul 2019 22:30:05 +0000 (15:30 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jul 2019 22:30:05 +0000 (15:30 -0700)
Pull livepatching updates from Jiri Kosina:

 - stacktrace handling improvements from Miroslav benes

 - debug output improvements from Petr Mladek

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching:
  livepatch: Remove duplicate warning about missing reliable stacktrace support
  Revert "livepatch: Remove reliable stacktrace check in klp_try_switch_task()"
  stacktrace: Remove weak version of save_stack_trace_tsk_reliable()
  livepatch: Use static buffer for debugging messages under rq lock
  livepatch: Remove stale kobj_added entries from kernel-doc descriptions

1  2 
include/linux/livepatch.h
kernel/livepatch/transition.c
kernel/stacktrace.c

@@@ -1,9 -1,21 +1,9 @@@
 +/* SPDX-License-Identifier: GPL-2.0-or-later */
  /*
   * livepatch.h - Kernel Live Patching Core
   *
   * Copyright (C) 2014 Seth Jennings <sjenning@redhat.com>
   * Copyright (C) 2014 SUSE
 - *
 - * This program is free software; you can redistribute it and/or
 - * modify it under the terms of the GNU General Public License
 - * as published by the Free Software Foundation; either version 2
 - * of the License, or (at your option) any later version.
 - *
 - * This program is distributed in the hope that it will be useful,
 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - * GNU General Public License for more details.
 - *
 - * You should have received a copy of the GNU General Public License
 - * along with this program; if not, see <http://www.gnu.org/licenses/>.
   */
  
  #ifndef _LINUX_LIVEPATCH_H_
@@@ -35,7 -47,6 +35,6 @@@
   * @stack_node:       list node for klp_ops func_stack list
   * @old_size: size of the old function
   * @new_size: size of the new function
-  * @kobj_added: @kobj has been added and needs freeing
   * @nop:        temporary patch to use the original code again; dyn. allocated
   * @patched:  the func has been added to the klp_ops list
   * @transition:       the func is currently being applied or reverted
@@@ -113,7 -124,6 +112,6 @@@ struct klp_callbacks 
   * @node:     list node for klp_patch obj_list
   * @mod:      kernel module associated with the patched object
   *            (NULL for vmlinux)
-  * @kobj_added: @kobj has been added and needs freeing
   * @dynamic:    temporary object for nop functions; dynamically allocated
   * @patched:  the object's funcs have been added to the klp_ops list
   */
@@@ -140,7 -150,6 +138,6 @@@ struct klp_object 
   * @list:     list node for global list of actively used patches
   * @kobj:     kobject for sysfs resources
   * @obj_list: dynamic list of the object entries
-  * @kobj_added: @kobj has been added and needs freeing
   * @enabled:  the patch is enabled (but operation may be incomplete)
   * @forced:   was involved in a forced transition
   * @free_work:        patch cleanup from workqueue-context
@@@ -1,8 -1,20 +1,8 @@@
 +// SPDX-License-Identifier: GPL-2.0-or-later
  /*
   * transition.c - Kernel Live Patching transition functions
   *
   * Copyright (C) 2015-2016 Josh Poimboeuf <jpoimboe@redhat.com>
 - *
 - * This program is free software; you can redistribute it and/or
 - * modify it under the terms of the GNU General Public License
 - * as published by the Free Software Foundation; either version 2
 - * of the License, or (at your option) any later version.
 - *
 - * This program is distributed in the hope that it will be useful,
 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - * GNU General Public License for more details.
 - *
 - * You should have received a copy of the GNU General Public License
 - * along with this program; if not, see <http://www.gnu.org/licenses/>.
   */
  
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@@@ -247,7 -259,6 +247,6 @@@ static int klp_check_stack(struct task_
        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",
   */
  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';
  
        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 -346,6 +334,6 @@@ done
                pr_debug("%s", err_buf);
  
        return success;
  }
  
  /*
diff --combined kernel/stacktrace.c
@@@ -1,4 -1,3 +1,4 @@@
 +// SPDX-License-Identifier: GPL-2.0-only
  /*
   * kernel/stacktrace.c
   *
@@@ -207,7 -206,7 +207,7 @@@ int stack_trace_save_tsk_reliable(struc
  
        ret = arch_stack_walk_reliable(consume_entry, &c, tsk);
        put_task_stack(tsk);
 -      return ret;
 +      return ret ? ret : c.len;
  }
  #endif
  
@@@ -228,7 -227,7 +228,7 @@@ unsigned int stack_trace_save_user(unsi
        };
  
        /* Trace user stack if not a kernel thread */
 -      if (!current->mm)
 +      if (current->flags & PF_KTHREAD)
                return 0;
  
        arch_stack_walk_user(consume_entry, &c, task_pt_regs(current));
@@@ -255,14 -254,6 +255,6 @@@ save_stack_trace_regs(struct pt_regs *r
        WARN_ONCE(1, KERN_INFO "save_stack_trace_regs() not implemented yet.\n");
  }
  
- __weak int
- save_stack_trace_tsk_reliable(struct task_struct *tsk,
-                             struct stack_trace *trace)
- {
-       WARN_ONCE(1, KERN_INFO "save_stack_tsk_reliable() not implemented yet.\n");
-       return -ENOSYS;
- }
  /**
   * stack_trace_save - Save a stack trace into a storage array
   * @store:    Pointer to storage array