1. 20 10月, 2016 1 次提交
    • T
      workqueue: move wq_numa_init() to workqueue_init() · 2186d9f9
      Tejun Heo 提交于
      While splitting up workqueue initialization into two parts,
      ac8f73400782 ("workqueue: make workqueue available early during boot")
      put wq_numa_init() into workqueue_init_early().  Unfortunately, on
      some archs including power and arm64, cpu to node mapping isn't yet
      established by the time the early init is called leading to incorrect
      NUMA initialization and subsequently the following oops due to zero
      cpumask on node-specific unbound pools.
      
        Unable to handle kernel paging request for data at address 0x00000038
        Faulting instruction address: 0xc0000000000fc0cc
        Oops: Kernel access of bad area, sig: 11 [#1]
        SMP NR_CPUS=2048 NUMA PowerNV
        Modules linked in:
        CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.8.0-compiler_gcc-6.2.0-next-20161005 #94
        task: c0000007f5400000 task.stack: c000001ffc084000
        NIP: c0000000000fc0cc LR: c0000000000ed928 CTR: c0000000000fbfd0
        REGS: c000001ffc087780 TRAP: 0300   Not tainted  (4.8.0-compiler_gcc-6.2.0-next-20161005)
        MSR: 9000000002009033 <SF,HV,VEC,EE,ME,IR,DR,RI,LE>  CR: 48000424  XER: 00000000
        CFAR: c0000000000089dc DAR: 0000000000000038 DSISR: 40000000 SOFTE: 0
        GPR00: c0000000000ed928 c000001ffc087a00 c000000000e63200 c000000010d6d600
        GPR04: c0000007f5409200 0000000000000021 000000000748e08c 000000000000001f
        GPR08: 0000000000000000 0000000000000021 000000000748f1f8 0000000000000000
        GPR12: 0000000028000422 c00000000fb80000 c00000000000e0c8 0000000000000000
        GPR16: 0000000000000000 0000000000000000 0000000000000021 0000000000000001
        GPR20: ffffffffafb50401 0000000000000000 c000000010d6d600 000000000000ba7e
        GPR24: 000000000000ba7e c000000000d8bc58 afb504000afb5041 0000000000000001
        GPR28: 0000000000000000 0000000000000004 c0000007f5409280 0000000000000000
        NIP [c0000000000fc0cc] enqueue_task_fair+0xfc/0x18b0
        LR [c0000000000ed928] activate_task+0x78/0xe0
        Call Trace:
        [c000001ffc087a00] [c0000007f5409200] 0xc0000007f5409200 (unreliable)
        [c000001ffc087b10] [c0000000000ed928] activate_task+0x78/0xe0
        [c000001ffc087b50] [c0000000000ede58] ttwu_do_activate+0x68/0xc0
        [c000001ffc087b90] [c0000000000ef1b8] try_to_wake_up+0x208/0x4f0
        [c000001ffc087c10] [c0000000000d3484] create_worker+0x144/0x250
        [c000001ffc087cb0] [c000000000cd72d0] workqueue_init+0x124/0x150
        [c000001ffc087d00] [c000000000cc0e74] kernel_init_freeable+0x158/0x360
        [c000001ffc087dc0] [c00000000000e0e4] kernel_init+0x24/0x160
        [c000001ffc087e30] [c00000000000bfa0] ret_from_kernel_thread+0x5c/0xbc
        Instruction dump:
        62940401 3b800000 3aa00000 7f17c378 3a600001 3b600001 60000000 60000000
        60420000 72490021 ebfe0150 2f890001 <ebbf0038> 419e0de0 7fbee840 419e0e58
        ---[ end trace 0000000000000000 ]---
      
      Fix it by moving wq_numa_init() to workqueue_init().  As this means
      that the early intialization may not have full NUMA info for per-cpu
      pools and ignores NUMA affinity for unbound pools, fix them up from
      workqueue_init() after wq_numa_init().
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Reported-by: NMichael Ellerman <mpe@ellerman.id.au>
      Link: http://lkml.kernel.org/r/87twck5wqo.fsf@concordia.ellerman.id.au
      Fixes: ac8f73400782 ("workqueue: make workqueue available early during boot")
      Signed-off-by: NTejun Heo <tj@kernel.org>
      2186d9f9
  2. 18 9月, 2016 7 次提交
    • T
      workqueue: remove keventd_up() · 863b710b
      Tejun Heo 提交于
      keventd_up() no longer has in-kernel users.  Remove it and make
      wq_online static.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      863b710b
    • T
      debugobj, workqueue: remove keventd_up() usage · 7092dff2
      Tejun Heo 提交于
      Now that workqueue can handle work item queueing from very early
      during boot, there is no need to gate schedule_work() while
      !keventd_up().  Remove it.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Acked-by: NThomas Gleixner <tglx@linutronix.de>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      7092dff2
    • T
      slab, workqueue: remove keventd_up() usage · eac0337a
      Tejun Heo 提交于
      Now that workqueue can handle work item queueing from very early
      during boot, there is no need to gate schedule_delayed_work_on() while
      !keventd_up().  Remove it.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Pekka Enberg <penberg@kernel.org>
      Cc: David Rientjes <rientjes@google.com>
      Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: linux-mm@kvack.org
      eac0337a
    • T
      power, workqueue: remove keventd_up() usage · a81f80f3
      Tejun Heo 提交于
      Now that workqueue can handle work item queueing/cancelling from very
      early during boot, there is no need to gate cancel_delayed_work_sync()
      while !keventd_up().  Remove it.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Cc: Qiao Zhou <qiaozhou@asrmicro.com>
      a81f80f3
    • T
      tty, workqueue: remove keventd_up() usage · 1bb08024
      Tejun Heo 提交于
      Now that workqueue can handle work item queueing from very early
      during boot, there is no need to delay schedule_work() while
      !keventd_up().  Remove it.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Jiri Slaby <jslaby@suse.cz>
      Cc: Alan Cox <alan@linux.intel.com>
      1bb08024
    • T
      mce, workqueue: remove keventd_up() usage · a2c2727d
      Tejun Heo 提交于
      Now that workqueue can handle work item queueing from very early
      during boot, there is no need to gate schedule_work() with
      keventd_up().  Remove it.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Tony Luck <tony.luck@intel.com>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: linux-edac@vger.kernel.org
      a2c2727d
    • T
      workqueue: make workqueue available early during boot · 3347fa09
      Tejun Heo 提交于
      Workqueue is currently initialized in an early init call; however,
      there are cases where early boot code has to be split and reordered to
      come after workqueue initialization or the same code path which makes
      use of workqueues is used both before workqueue initailization and
      after.  The latter cases have to gate workqueue usages with
      keventd_up() tests, which is nasty and easy to get wrong.
      
      Workqueue usages have become widespread and it'd be a lot more
      convenient if it can be used very early from boot.  This patch splits
      workqueue initialization into two steps.  workqueue_init_early() which
      sets up the basic data structures so that workqueues can be created
      and work items queued, and workqueue_init() which actually brings up
      workqueues online and starts executing queued work items.  The former
      step can be done very early during boot once memory allocation,
      cpumasks and idr are initialized.  The latter right after kthreads
      become available.
      
      This allows work item queueing and canceling from very early boot
      which is what most of these use cases want.
      
      * As systemd_wq being initialized doesn't indicate that workqueue is
        fully online anymore, update keventd_up() to test wq_online instead.
        The follow-up patches will get rid of all its usages and the
        function itself.
      
      * Flushing doesn't make sense before workqueue is fully initialized.
        The flush functions trigger WARN and return immediately before fully
        online.
      
      * Work items are never in-flight before fully online.  Canceling can
        always succeed by skipping the flush step.
      
      * Some code paths can no longer assume to be called with irq enabled
        as irq is disabled during early boot.  Use irqsave/restore
        operations instead.
      
      v2: Watchdog init, which requires timer to be running, moved from
          workqueue_init_early() to workqueue_init().
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Suggested-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Link: http://lkml.kernel.org/r/CA+55aFx0vPuMuxn00rBSM192n-Du5uxy+4AvKa0SBSOVJeuCGg@mail.gmail.com
      3347fa09
  3. 16 9月, 2016 1 次提交
  4. 15 9月, 2016 1 次提交
    • L
      Merge branch 'uaccess-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs · 77e5bdf9
      Linus Torvalds 提交于
      Pull uaccess fixes from Al Viro:
       "Fixes for broken uaccess primitives - mostly lack of proper zeroing
        in copy_from_user()/get_user()/__get_user(), but for several
        architectures there's more (broken clear_user() on frv and
        strncpy_from_user() on hexagon)"
      
      * 'uaccess-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (28 commits)
        avr32: fix copy_from_user()
        microblaze: fix __get_user()
        microblaze: fix copy_from_user()
        m32r: fix __get_user()
        blackfin: fix copy_from_user()
        sparc32: fix copy_from_user()
        sh: fix copy_from_user()
        sh64: failing __get_user() should zero
        score: fix copy_from_user() and friends
        score: fix __get_user/get_user
        s390: get_user() should zero on failure
        ppc32: fix copy_from_user()
        parisc: fix copy_from_user()
        openrisc: fix copy_from_user()
        nios2: fix __get_user()
        nios2: copy_from_user() should zero the tail of destination
        mn10300: copy_from_user() should zero on access_ok() failure...
        mn10300: failing __get_user() and get_user() should zero
        mips: copy_from_user() must zero the destination on access_ok() failure
        ARC: uaccess: get_user to zero out dest in cause of fault
        ...
      77e5bdf9
  5. 14 9月, 2016 30 次提交