lkml.org 
[lkml]   [2020]   [Apr]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v12 03/12] scs: add support for stack usage debugging
    From
    Implements CONFIG_DEBUG_STACK_USAGE for shadow stacks. When enabled,
    also prints out the highest shadow stack usage per process.

    Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    ---
    kernel/scs.c | 38 ++++++++++++++++++++++++++++++++++++++
    1 file changed, 38 insertions(+)

    diff --git a/kernel/scs.c b/kernel/scs.c
    index 7eea2d97bd2d..147917e31adf 100644
    --- a/kernel/scs.c
    +++ b/kernel/scs.c
    @@ -68,6 +68,43 @@ int scs_prepare(struct task_struct *tsk, int node)
    return 0;
    }

    +#ifdef CONFIG_DEBUG_STACK_USAGE
    +static unsigned long __scs_used(struct task_struct *tsk)
    +{
    + unsigned long *p = __scs_base(tsk);
    + unsigned long *end = __scs_magic(p);
    + unsigned long s = (unsigned long)p;
    +
    + while (p < end && READ_ONCE_NOCHECK(*p))
    + p++;
    +
    + return (unsigned long)p - s;
    +}
    +
    +static void scs_check_usage(struct task_struct *tsk)
    +{
    + static unsigned long highest;
    + unsigned long used = __scs_used(tsk);
    + unsigned long prev;
    + unsigned long curr = highest;
    +
    + while (used > curr) {
    + prev = cmpxchg(&highest, curr, used);
    +
    + if (prev == curr) {
    + pr_info("%s (%d): highest shadow stack usage: "
    + "%lu bytes\n",
    + tsk->comm, task_pid_nr(tsk), used);
    + break;
    + }
    +
    + curr = prev;
    + }
    +}
    +#else
    +static inline void scs_check_usage(struct task_struct *tsk) {}
    +#endif
    +
    void scs_release(struct task_struct *tsk)
    {
    void *s;
    @@ -77,6 +114,7 @@ void scs_release(struct task_struct *tsk)
    return;

    WARN_ON(scs_corrupted(tsk));
    + scs_check_usage(tsk);

    scs_account(tsk, -1);
    scs_free(s);
    --
    2.26.1.301.g55bc3eb7cb9-goog
    \
     
     \ /
      Last update: 2020-04-21 04:16    [W:2.193 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site