Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 17 Apr 2015 20:03:05 +0000 (16:03 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 17 Apr 2015 20:03:05 +0000 (16:03 -0400)
Pull arch/tile updates from Chris Metcalf:
 "These are mostly nohz_full changes, plus a smattering of minor fixes
  (notably a couple for ftrace)"

* git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile:
  tile: nohz: warn if nohz_full uses hypervisor shared cores
  tile: ftrace: fix function_graph tracer issues
  tile: map data region shadow of kernel as R/W
  tile: support CONTEXT_TRACKING and thus NOHZ_FULL
  tile: support arch_irq_work_raise
  arch: tile: fix null pointer dereference on pt_regs pointer
  tile/elf: reorganize notify_exec()
  tile: use si_int instead of si_ptr for compat_siginfo

1  2 
arch/tile/Kconfig
arch/tile/include/asm/thread_info.h
arch/tile/kernel/compat_signal.c

diff --combined arch/tile/Kconfig
@@@ -27,6 -27,7 +27,7 @@@ config TIL
        select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
        select HAVE_DEBUG_STACKOVERFLOW
        select ARCH_WANT_FRAME_POINTERS
+       select HAVE_CONTEXT_TRACKING
  
  # FIXME: investigate whether we need/want these options.
  #     select HAVE_IOREMAP_PROT
@@@ -147,11 -148,6 +148,11 @@@ config ARCH_DEFCONFI
        default "arch/tile/configs/tilepro_defconfig" if !TILEGX
        default "arch/tile/configs/tilegx_defconfig" if TILEGX
  
 +config PGTABLE_LEVELS
 +      int
 +      default 3 if 64BIT
 +      default 2
 +
  source "init/Kconfig"
  
  source "kernel/Kconfig.freezer"
@@@ -26,6 -26,7 +26,6 @@@
   */
  struct thread_info {
        struct task_struct      *task;          /* main task structure */
 -      struct exec_domain      *exec_domain;   /* execution domain */
        unsigned long           flags;          /* low level flags */
        unsigned long           status;         /* thread-synchronous flags */
        __u32                   homecache_cpu;  /* CPU we are homecached on */
@@@ -50,6 -51,7 +50,6 @@@
  #define INIT_THREAD_INFO(tsk)                 \
  {                                             \
        .task           = &tsk,                 \
 -      .exec_domain    = &default_exec_domain, \
        .flags          = 0,                    \
        .cpu            = 0,                    \
        .preempt_count  = INIT_PREEMPT_COUNT,   \
@@@ -124,6 -126,7 +124,7 @@@ extern void _cpu_idle(void)
  #define TIF_NOTIFY_RESUME     8       /* callback before returning to user */
  #define TIF_SYSCALL_TRACEPOINT        9       /* syscall tracepoint instrumentation */
  #define TIF_POLLING_NRFLAG    10      /* idle is polling for TIF_NEED_RESCHED */
+ #define TIF_NOHZ              11      /* in adaptive nohz mode */
  
  #define _TIF_SIGPENDING               (1<<TIF_SIGPENDING)
  #define _TIF_NEED_RESCHED     (1<<TIF_NEED_RESCHED)
  #define _TIF_NOTIFY_RESUME    (1<<TIF_NOTIFY_RESUME)
  #define _TIF_SYSCALL_TRACEPOINT       (1<<TIF_SYSCALL_TRACEPOINT)
  #define _TIF_POLLING_NRFLAG   (1<<TIF_POLLING_NRFLAG)
+ #define _TIF_NOHZ             (1<<TIF_NOHZ)
  
  /* Work to do on any return to user space. */
  #define _TIF_ALLWORK_MASK \
-   (_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SINGLESTEP|\
-    _TIF_ASYNC_TLB|_TIF_NOTIFY_RESUME)
+       (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_SINGLESTEP | \
+        _TIF_ASYNC_TLB | _TIF_NOTIFY_RESUME | _TIF_NOHZ)
  
  /* Work to do at syscall entry. */
- #define _TIF_SYSCALL_ENTRY_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT)
+ #define _TIF_SYSCALL_ENTRY_WORK \
+       (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_NOHZ)
  
  /* Work to do at syscall exit. */
  #define _TIF_SYSCALL_EXIT_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT)
@@@ -68,7 -68,7 +68,7 @@@ int copy_siginfo_to_user32(struct compa
        if (from->si_code < 0) {
                err |= __put_user(from->si_pid, &to->si_pid);
                err |= __put_user(from->si_uid, &to->si_uid);
-               err |= __put_user(ptr_to_compat(from->si_ptr), &to->si_ptr);
+               err |= __put_user(from->si_int, &to->si_int);
        } else {
                /*
                 * First 32bits of unions are always present:
@@@ -93,8 -93,7 +93,7 @@@
                        break;
                case __SI_TIMER >> 16:
                        err |= __put_user(from->si_overrun, &to->si_overrun);
-                       err |= __put_user(ptr_to_compat(from->si_ptr),
-                                         &to->si_ptr);
+                       err |= __put_user(from->si_int, &to->si_int);
                        break;
                         /* This is not generated by the kernel as of now.  */
                case __SI_RT >> 16:
  int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)
  {
        int err;
-       u32 ptr32;
  
        if (!access_ok(VERIFY_READ, from, sizeof(struct compat_siginfo)))
                return -EFAULT;
  
+       memset(to, 0, sizeof(*to));
        err = __get_user(to->si_signo, &from->si_signo);
        err |= __get_user(to->si_errno, &from->si_errno);
        err |= __get_user(to->si_code, &from->si_code);
  
        err |= __get_user(to->si_pid, &from->si_pid);
        err |= __get_user(to->si_uid, &from->si_uid);
-       err |= __get_user(ptr32, &from->si_ptr);
-       to->si_ptr = compat_ptr(ptr32);
+       err |= __get_user(to->si_int, &from->si_int);
  
        return err;
  }
@@@ -196,12 -195,19 +195,12 @@@ int compat_setup_rt_frame(struct ksigna
        unsigned long restorer;
        struct compat_rt_sigframe __user *frame;
        int err = 0, sig = ksig->sig;
 -      int usig;
  
        frame = compat_get_sigframe(&ksig->ka, regs, sizeof(*frame));
  
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                goto err;
  
 -      usig = current_thread_info()->exec_domain
 -              && current_thread_info()->exec_domain->signal_invmap
 -              && sig < 32
 -              ? current_thread_info()->exec_domain->signal_invmap[sig]
 -              : sig;
 -
        /* Always write at least the signal number for the stack backtracer. */
        if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
                /* At sigreturn time, restore the callee-save registers too. */
        regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */
        regs->sp = ptr_to_compat_reg(frame);
        regs->lr = restorer;
 -      regs->regs[0] = (unsigned long) usig;
 +      regs->regs[0] = (unsigned long) sig;
        regs->regs[1] = ptr_to_compat_reg(&frame->info);
        regs->regs[2] = ptr_to_compat_reg(&frame->uc);
        regs->flags |= PT_FLAGS_CALLER_SAVES;