1. 05 3月, 2020 1 次提交
    • B
      workqueue: implement NUMA affinity for single thread workqueue · df86cc94
      Biaoxiang Ye 提交于
      euleros inclusion
      category: feature
      feature: Implement NUMA affinity for order workqueue
      
      -------------------------------------------------
      
      Currently, single thread workqueue only have single pwq, all of
      works are queued the same workerpool. This is not optimal on
      NUMA machines, will cause workers jump around across node.
      
      This patch add a new wq flags __WQ_DYNAMIC,  this new kind of
      single thread workqueue creates a separate pwq covering the
      intersecting CPUS for each NUMA node which has online CPUS
      in @attrs->cpumask instead of mapping all entries of numa_pwq_tbl[]
      to the same pwq. After this, we can specify the @cpu of
      queue_work_on, so the work can be executed on the same NUMA
      node of the specified @cpu.
      This kind of wq only support single work, multi works can't guarantee
      the work's order.
      Signed-off-by: NBiaoxiang Ye <yebiaoxiang@huawei.com>
      Acked-by: NHanjun Guo <guohanjun@huawei.com>
      Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
      df86cc94
  2. 27 12月, 2019 5 次提交
    • T
      workqueue: Fix missing kfree(rescuer) in destroy_workqueue() · 897d54ae
      Tejun Heo 提交于
      commit 8efe1223d73c218ce7e8b2e0e9aadb974b582d7f upstream.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Reported-by: NQian Cai <cai@lca.pw>
      Fixes: def98c84b6cd ("workqueue: Fix spurious sanity check failures in destroy_workqueue()")
      Cc: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
      897d54ae
    • T
      workqueue: Fix pwq ref leak in rescuer_thread() · 1fe8f4ae
      Tejun Heo 提交于
      commit e66b39af00f426b3356b96433d620cb3367ba1ff upstream.
      
      008847f6 ("workqueue: allow rescuer thread to do more work.") made
      the rescuer worker requeue the pwq immediately if there may be more
      work items which need rescuing instead of waiting for the next mayday
      timer expiration.  Unfortunately, it doesn't check whether the pwq is
      already on the mayday list and unconditionally gets the ref and moves
      it onto the list.  This doesn't corrupt the list but creates an
      additional reference to the pwq.  It got queued twice but will only be
      removed once.
      
      This leak later can trigger pwq refcnt warning on workqueue
      destruction and prevent freeing of the workqueue.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: "Williams, Gerald S" <gerald.s.williams@intel.com>
      Cc: NeilBrown <neilb@suse.de>
      Cc: stable@vger.kernel.org # v3.19+
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
      1fe8f4ae
    • T
      workqueue: Fix spurious sanity check failures in destroy_workqueue() · aba999d4
      Tejun Heo 提交于
      commit def98c84b6cdf2eeea19ec5736e90e316df5206b upstream.
      
      Before actually destrying a workqueue, destroy_workqueue() checks
      whether it's actually idle.  If it isn't, it prints out a bunch of
      warning messages and leaves the workqueue dangling.  It unfortunately
      has a couple issues.
      
      * Mayday list queueing increments pwq's refcnts which gets detected as
        busy and fails the sanity checks.  However, because mayday list
        queueing is asynchronous, this condition can happen without any
        actual work items left in the workqueue.
      
      * Sanity check failure leaves the sysfs interface behind too which can
        lead to init failure of newer instances of the workqueue.
      
      This patch fixes the above two by
      
      * If a workqueue has a rescuer, disable and kill the rescuer before
        sanity checks.  Disabling and killing is guaranteed to flush the
        existing mayday list.
      
      * Remove sysfs interface before sanity checks.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Reported-by: NMarcin Pawlowski <mpawlowski@fb.com>
      Reported-by: N"Williams, Gerald S" <gerald.s.williams@intel.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
      aba999d4
    • D
      workqueue, ktask: renice helper threads to prevent starvation · cdc79c13
      Daniel Jordan 提交于
      hulk inclusion
      category: feature
      bugzilla: 13228
      CVE: NA
      ---------------------------
      
      With ktask helper threads running at MAX_NICE, it's possible for one or
      more of them to begin chunks of the task and then have their CPU time
      constrained by higher priority threads.  The main ktask thread, running
      at normal priority, may finish all available chunks of the task and then
      wait on the MAX_NICE helpers to finish the last in-progress chunks, for
      longer than it would have if no helpers were used.
      
      Avoid this by having the main thread assign its priority to each
      unfinished helper one at a time so that on a heavily loaded system,
      exactly one thread in a given ktask call is running at the main thread's
      priority.  At least one thread to ensure forward progress, and at most
      one thread to limit excessive multithreading.
      
      Since the workqueue interface, on which ktask is built, does not provide
      access to worker threads, ktask can't adjust their priorities directly,
      so add a new interface to allow a previously-queued work item to run at
      a different priority than the one controlled by the corresponding
      workqueue's 'nice' attribute.  The worker assigned to the work item will
      run the work at the given priority, temporarily overriding the worker's
      priority.
      
      The interface is flush_work_at_nice, which ensures the given work item's
      assigned worker runs at the specified nice level and waits for the work
      item to finish.
      
      An alternative choice would have been to simply requeue the work item to
      a pool with workers of the new priority, but this doesn't seem feasible
      because a worker may have already started executing the work and there's
      currently no way to interrupt it midway through.  The proposed interface
      solves this issue because a worker's priority can be adjusted while it's
      executing the work.
      
      TODO:  flush_work_at_nice is a proof-of-concept only, and it may be
      desired to have the interface set the work's nice without also waiting
      for it to finish.  It's implemented in the flush path for this RFC
      because it was fairly simple to write ;-)
      
      I ran tests similar to the ones in the last patch with a couple of
      differences:
       - The non-ktask workload uses 8 CPUs instead of 7 to compete with the
         main ktask thread as well as the ktask helpers, so that when the main
         thread finishes, its CPU is completely occupied by the non-ktask
         workload, meaning MAX_NICE helpers can't run as often.
       - The non-ktask workload starts before the ktask workload, rather
         than after, to maximize the chance that it starves helpers.
      
      Runtimes in seconds.
      
      Case 1: Synthetic, worst-case CPU contention
      
       ktask_test - a tight loop doing integer multiplication to max out on CPU;
                    used for testing only, does not appear in this series
       stress-ng  - cpu stressor ("-c --cpu-method ackerman --cpu-ops 1200");
      
                   8_ktask_thrs           8_ktask_thrs
                   w/o_renice(stdev)   with_renice  (stdev)  1_ktask_thr(stdev)
                   ------------------------------------------------------------
        ktask_test    41.98  ( 0.22)         25.15  ( 2.98)      30.40  ( 0.61)
        stress-ng     44.79  ( 1.11)         46.37  ( 0.69)      53.29  ( 1.91)
      
      Without renicing, ktask_test finishes just after stress-ng does because
      stress-ng needs to free up CPUs for the helpers to finish (ktask_test
      shows a shorter runtime than stress-ng because ktask_test was started
      later).  Renicing lets ktask_test finish 40% sooner, and running the
      same amount of work in ktask_test with 1 thread instead of 8 finishes in
      a comparable amount of time, though longer than "with_renice" because
      MAX_NICE threads still get some CPU time, and the effect over 8 threads
      adds up.
      
      stress-ng's total runtime gets a little longer going from no renicing to
      renicing, as expected, because each reniced ktask thread takes more CPU
      time than before when the helpers were starved.
      
      Running with one ktask thread, stress-ng's reported walltime goes up
      because that single thread interferes with fewer stress-ng threads,
      but with more impact, causing a greater spread in the time it takes for
      individual stress-ng threads to finish.  Averages of the per-thread
      stress-ng times from "with_renice" to "1_ktask_thr" come out roughly
      the same, though, 43.81 and 43.89 respectively.  So the total runtime of
      stress-ng across all threads is unaffected, but the time stress-ng takes
      to finish running its threads completely actually improves by spreading
      the ktask_test work over more threads.
      
      Case 2: Real-world CPU contention
      
       ktask_vfio - VFIO page pin a 32G kvm guest
       usemem     - faults in 86G of anonymous THP per thread, PAGE_SIZE stride;
                    used to mimic the page clearing that dominates in ktask_vfio
                    so that usemem competes for the same system resources
      
                   8_ktask_thrs           8_ktask_thrs
                   w/o_renice  (stdev)   with_renice  (stdev)  1_ktask_thr(stdev)
                   --------------------------------------------------------------
        ktask_vfio    18.59  ( 0.19)         14.62  ( 2.03)      16.24  ( 0.90)
            usemem    47.54  ( 0.89)         48.18  ( 0.77)      49.70  ( 1.20)
      
      These results are similar to case 1's, though the differences between
      times are not quite as pronounced because ktask_vfio ran shorter
      compared to usemem.
      Signed-off-by: NDaniel Jordan <daniel.m.jordan@oracle.com>
      Signed-off-by: NHongbo Yao <yaohongbo@huawei.com>
      Reviewed-by: NXie XiuQi <xiexiuqi@huawei.com>
      Tested-by: NHongbo Yao <yaohongbo@huawei.com>
      Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
      cdc79c13
    • T
      workqueue: Try to catch flush_work() without INIT_WORK(). · 0711f016
      Tetsuo Handa 提交于
      commit 4d43d395fed124631ca02356c711facb90185175 upstream.
      
      syzbot found a flush_work() caller who forgot to call INIT_WORK()
      because that work_struct was allocated by kzalloc() [1]. But the message
      
        INFO: trying to register non-static key.
        the code is fine but needs lockdep annotation.
        turning off the locking correctness validator.
      
      by lock_map_acquire() is failing to tell that INIT_WORK() is missing.
      
      Since flush_work() without INIT_WORK() is a bug, and INIT_WORK() should
      set ->func field to non-zero, let's warn if ->func field is zero.
      
      [1] https://syzkaller.appspot.com/bug?id=a5954455fcfa51c29ca2ab55b203076337e1c770Signed-off-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
      0711f016
  3. 30 8月, 2018 1 次提交
  4. 22 8月, 2018 2 次提交
    • J
      workqueue: re-add lockdep dependencies for flushing · 87915adc
      Johannes Berg 提交于
      In flush_work(), we need to create a lockdep dependency so that
      the following scenario is appropriately tagged as a problem:
      
        work_function()
        {
          mutex_lock(&mutex);
          ...
        }
      
        other_function()
        {
          mutex_lock(&mutex);
          flush_work(&work); // or cancel_work_sync(&work);
        }
      
      This is a problem since the work might be running and be blocked
      on trying to acquire the mutex.
      
      Similarly, in flush_workqueue().
      
      These were removed after cross-release partially caught these
      problems, but now cross-release was reverted anyway. IMHO the
      removal was erroneous anyway though, since lockdep should be
      able to catch potential problems, not just actual ones, and
      cross-release would only have caught the problem when actually
      invoking wait_for_completion().
      
      Fixes: fd1a5b04 ("workqueue: Remove now redundant lock acquisitions wrt. workqueue flushes")
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      87915adc
    • J
      workqueue: skip lockdep wq dependency in cancel_work_sync() · d6e89786
      Johannes Berg 提交于
      In cancel_work_sync(), we can only have one of two cases, even
      with an ordered workqueue:
       * the work isn't running, just cancelled before it started
       * the work is running, but then nothing else can be on the
         workqueue before it
      
      Thus, we need to skip the lockdep workqueue dependency handling,
      otherwise we get false positive reports from lockdep saying that
      we have a potential deadlock when the workqueue also has other
      work items with locking, e.g.
      
        work1_function() { mutex_lock(&mutex); ... }
        work2_function() { /* nothing */ }
      
        other_function() {
          queue_work(ordered_wq, &work1);
          queue_work(ordered_wq, &work2);
          mutex_lock(&mutex);
          cancel_work_sync(&work2);
        }
      
      As described above, this isn't a problem, but lockdep will
      currently flag it as if cancel_work_sync() was flush_work(),
      which *is* a problem.
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      d6e89786
  5. 13 6月, 2018 1 次提交
    • K
      treewide: kzalloc() -> kcalloc() · 6396bb22
      Kees Cook 提交于
      The kzalloc() function has a 2-factor argument form, kcalloc(). This
      patch replaces cases of:
      
              kzalloc(a * b, gfp)
      
      with:
              kcalloc(a * b, gfp)
      
      as well as handling cases of:
      
              kzalloc(a * b * c, gfp)
      
      with:
      
              kzalloc(array3_size(a, b, c), gfp)
      
      as it's slightly less ugly than:
      
              kzalloc_array(array_size(a, b), c, gfp)
      
      This does, however, attempt to ignore constant size factors like:
      
              kzalloc(4 * 1024, gfp)
      
      though any constants defined via macros get caught up in the conversion.
      
      Any factors with a sizeof() of "unsigned char", "char", and "u8" were
      dropped, since they're redundant.
      
      The Coccinelle script used for this was:
      
      // Fix redundant parens around sizeof().
      @@
      type TYPE;
      expression THING, E;
      @@
      
      (
        kzalloc(
      -	(sizeof(TYPE)) * E
      +	sizeof(TYPE) * E
        , ...)
      |
        kzalloc(
      -	(sizeof(THING)) * E
      +	sizeof(THING) * E
        , ...)
      )
      
      // Drop single-byte sizes and redundant parens.
      @@
      expression COUNT;
      typedef u8;
      typedef __u8;
      @@
      
      (
        kzalloc(
      -	sizeof(u8) * (COUNT)
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(__u8) * (COUNT)
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(char) * (COUNT)
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(unsigned char) * (COUNT)
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(u8) * COUNT
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(__u8) * COUNT
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(char) * COUNT
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(unsigned char) * COUNT
      +	COUNT
        , ...)
      )
      
      // 2-factor product with sizeof(type/expression) and identifier or constant.
      @@
      type TYPE;
      expression THING;
      identifier COUNT_ID;
      constant COUNT_CONST;
      @@
      
      (
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * (COUNT_ID)
      +	COUNT_ID, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * COUNT_ID
      +	COUNT_ID, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * (COUNT_CONST)
      +	COUNT_CONST, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * COUNT_CONST
      +	COUNT_CONST, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * (COUNT_ID)
      +	COUNT_ID, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * COUNT_ID
      +	COUNT_ID, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * (COUNT_CONST)
      +	COUNT_CONST, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * COUNT_CONST
      +	COUNT_CONST, sizeof(THING)
        , ...)
      )
      
      // 2-factor product, only identifiers.
      @@
      identifier SIZE, COUNT;
      @@
      
      - kzalloc
      + kcalloc
        (
      -	SIZE * COUNT
      +	COUNT, SIZE
        , ...)
      
      // 3-factor product with 1 sizeof(type) or sizeof(expression), with
      // redundant parens removed.
      @@
      expression THING;
      identifier STRIDE, COUNT;
      type TYPE;
      @@
      
      (
        kzalloc(
      -	sizeof(TYPE) * (COUNT) * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE) * (COUNT) * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE) * COUNT * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE) * COUNT * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kzalloc(
      -	sizeof(THING) * (COUNT) * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kzalloc(
      -	sizeof(THING) * (COUNT) * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kzalloc(
      -	sizeof(THING) * COUNT * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kzalloc(
      -	sizeof(THING) * COUNT * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      )
      
      // 3-factor product with 2 sizeof(variable), with redundant parens removed.
      @@
      expression THING1, THING2;
      identifier COUNT;
      type TYPE1, TYPE2;
      @@
      
      (
        kzalloc(
      -	sizeof(TYPE1) * sizeof(TYPE2) * COUNT
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
        , ...)
      |
        kzalloc(
      -	sizeof(THING1) * sizeof(THING2) * COUNT
      +	array3_size(COUNT, sizeof(THING1), sizeof(THING2))
        , ...)
      |
        kzalloc(
      -	sizeof(THING1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(THING1), sizeof(THING2))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * COUNT
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
        , ...)
      )
      
      // 3-factor product, only identifiers, with redundant parens removed.
      @@
      identifier STRIDE, SIZE, COUNT;
      @@
      
      (
        kzalloc(
      -	(COUNT) * STRIDE * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	COUNT * (STRIDE) * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	COUNT * STRIDE * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	(COUNT) * (STRIDE) * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	COUNT * (STRIDE) * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	(COUNT) * STRIDE * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	(COUNT) * (STRIDE) * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	COUNT * STRIDE * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      )
      
      // Any remaining multi-factor products, first at least 3-factor products,
      // when they're not all constants...
      @@
      expression E1, E2, E3;
      constant C1, C2, C3;
      @@
      
      (
        kzalloc(C1 * C2 * C3, ...)
      |
        kzalloc(
      -	(E1) * E2 * E3
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kzalloc(
      -	(E1) * (E2) * E3
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kzalloc(
      -	(E1) * (E2) * (E3)
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kzalloc(
      -	E1 * E2 * E3
      +	array3_size(E1, E2, E3)
        , ...)
      )
      
      // And then all remaining 2 factors products when they're not all constants,
      // keeping sizeof() as the second factor argument.
      @@
      expression THING, E1, E2;
      type TYPE;
      constant C1, C2, C3;
      @@
      
      (
        kzalloc(sizeof(THING) * C2, ...)
      |
        kzalloc(sizeof(TYPE) * C2, ...)
      |
        kzalloc(C1 * C2 * C3, ...)
      |
        kzalloc(C1 * C2, ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * (E2)
      +	E2, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * E2
      +	E2, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * (E2)
      +	E2, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * E2
      +	E2, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	(E1) * E2
      +	E1, E2
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	(E1) * (E2)
      +	E1, E2
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	E1 * E2
      +	E1, E2
        , ...)
      )
      Signed-off-by: NKees Cook <keescook@chromium.org>
      6396bb22
  6. 07 6月, 2018 1 次提交
    • K
      treewide: Use struct_size() for kmalloc()-family · acafe7e3
      Kees Cook 提交于
      One of the more common cases of allocation size calculations is finding
      the size of a structure that has a zero-sized array at the end, along
      with memory for some number of elements for that array. For example:
      
      struct foo {
          int stuff;
          void *entry[];
      };
      
      instance = kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);
      
      Instead of leaving these open-coded and prone to type mistakes, we can
      now use the new struct_size() helper:
      
      instance = kmalloc(struct_size(instance, entry, count), GFP_KERNEL);
      
      This patch makes the changes for kmalloc()-family (and kvmalloc()-family)
      uses. It was done via automatic conversion with manual review for the
      "CHECKME" non-standard cases noted below, using the following Coccinelle
      script:
      
      // pkey_cache = kmalloc(sizeof *pkey_cache + tprops->pkey_tbl_len *
      //                      sizeof *pkey_cache->table, GFP_KERNEL);
      @@
      identifier alloc =~ "kmalloc|kzalloc|kvmalloc|kvzalloc";
      expression GFP;
      identifier VAR, ELEMENT;
      expression COUNT;
      @@
      
      - alloc(sizeof(*VAR) + COUNT * sizeof(*VAR->ELEMENT), GFP)
      + alloc(struct_size(VAR, ELEMENT, COUNT), GFP)
      
      // mr = kzalloc(sizeof(*mr) + m * sizeof(mr->map[0]), GFP_KERNEL);
      @@
      identifier alloc =~ "kmalloc|kzalloc|kvmalloc|kvzalloc";
      expression GFP;
      identifier VAR, ELEMENT;
      expression COUNT;
      @@
      
      - alloc(sizeof(*VAR) + COUNT * sizeof(VAR->ELEMENT[0]), GFP)
      + alloc(struct_size(VAR, ELEMENT, COUNT), GFP)
      
      // Same pattern, but can't trivially locate the trailing element name,
      // or variable name.
      @@
      identifier alloc =~ "kmalloc|kzalloc|kvmalloc|kvzalloc";
      expression GFP;
      expression SOMETHING, COUNT, ELEMENT;
      @@
      
      - alloc(sizeof(SOMETHING) + COUNT * sizeof(ELEMENT), GFP)
      + alloc(CHECKME_struct_size(&SOMETHING, ELEMENT, COUNT), GFP)
      Signed-off-by: NKees Cook <keescook@chromium.org>
      acafe7e3
  7. 24 5月, 2018 1 次提交
    • M
      workqueue: move function definitions within CONFIG_SMP block · 66448bc2
      Mathieu Malaterre 提交于
      In commit 7ee681b2 ("workqueue: Convert to state machine callbacks"),
      three new function definitions were added: ‘workqueue_prepare_cpu’,
      ‘workqueue_online_cpu’ and ‘workqueue_offline_cpu’.
      
      Move these function definitions within a CONFIG_SMP block since they are
      not used outside of it. This will match function declarations in header
      <include/linux/workqueue.h>, and silence the following gcc warning (W=1):
      
        kernel/workqueue.c:4743:5: warning: no previous prototype for ‘workqueue_prepare_cpu’ [-Wmissing-prototypes]
        kernel/workqueue.c:4756:5: warning: no previous prototype for ‘workqueue_online_cpu’ [-Wmissing-prototypes]
        kernel/workqueue.c:4783:5: warning: no previous prototype for ‘workqueue_offline_cpu’ [-Wmissing-prototypes]
      Signed-off-by: NMathieu Malaterre <malat@debian.org>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      66448bc2
  8. 21 5月, 2018 1 次提交
  9. 18 5月, 2018 5 次提交
    • T
      workqueue: Show the latest workqueue name in /proc/PID/{comm,stat,status} · 6b59808b
      Tejun Heo 提交于
      There can be a lot of workqueue workers and they all show up with the
      cryptic kworker/* names making it difficult to understand which is
      doing what and how they came to be.
      
        # ps -ef | grep kworker
        root           4       2  0 Feb25 ?        00:00:00 [kworker/0:0H]
        root           6       2  0 Feb25 ?        00:00:00 [kworker/u112:0]
        root          19       2  0 Feb25 ?        00:00:00 [kworker/1:0H]
        root          25       2  0 Feb25 ?        00:00:00 [kworker/2:0H]
        root          31       2  0 Feb25 ?        00:00:00 [kworker/3:0H]
        ...
      
      This patch makes workqueue workers report the latest workqueue it was
      executing for through /proc/PID/{comm,stat,status}.  The extra
      information is appended to the kthread name with intervening '+' if
      currently executing, otherwise '-'.
      
        # cat /proc/25/comm
        kworker/2:0-events_power_efficient
        # cat /proc/25/stat
        25 (kworker/2:0-events_power_efficient) I 2 0 0 0 -1 69238880 0 0...
        # grep Name /proc/25/status
        Name:   kworker/2:0-events_power_efficient
      
      Unfortunately, ps(1) truncates comm to 15 characters,
      
        # ps 25
          PID TTY      STAT   TIME COMMAND
           25 ?        I      0:00 [kworker/2:0-eve]
      
      making it a lot less useful; however, this should be an easy fix from
      ps(1) side.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Suggested-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Cc: Craig Small <csmall@enc.com.au>
      6b59808b
    • T
      workqueue: Set worker->desc to workqueue name by default · 8bf89593
      Tejun Heo 提交于
      Work functions can use set_worker_desc() to improve the visibility of
      what the worker task is doing.  Currently, the desc field is unset at
      the beginning of each execution and there is a separate field to track
      the field is set during the current execution.
      
      Instead of leaving empty till desc is set, worker->desc can be used to
      remember the last workqueue the worker worked on by default and users
      that use set_worker_desc() can override it to something more
      informative as necessary.
      
      This simplifies desc handling and helps tracking the last workqueue
      that the worker exected on to improve visibility.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      8bf89593
    • T
      workqueue: Make worker_attach/detach_pool() update worker->pool · a2d812a2
      Tejun Heo 提交于
      For historical reasons, the worker attach/detach functions don't
      currently manage worker->pool and the callers are manually and
      inconsistently updating it.
      
      This patch moves worker->pool updates into the worker attach/detach
      functions.  This makes worker->pool consistent and clearly defines how
      worker->pool updates are synchronized.
      
      This will help later workqueue visibility improvements by allowing
      safe access to workqueue information from worker->task.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      a2d812a2
    • T
      workqueue: Replace pool->attach_mutex with global wq_pool_attach_mutex · 1258fae7
      Tejun Heo 提交于
      To improve workqueue visibility, we want to be able to access
      workqueue information from worker tasks.  The per-pool attach mutex
      makes that difficult because there's no way of stabilizing task ->
      worker pool association without knowing the pool first.
      
      Worker attach/detach is a slow path and there's no need for different
      pools to be able to perform them concurrently.  This patch replaces
      the per-pool attach_mutex with global wq_pool_attach_mutex to prepare
      for visibility improvement changes.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      1258fae7
    • S
      scsi: zfcp: workqueue: set description for port work items with their WWPN as context · 5c750d58
      Steffen Maier 提交于
      As a prerequisite, complement commit 3d1cb205 ("workqueue: include
      workqueue info when printing debug dump of a worker task") to be usable with
      kernel modules by exporting the symbol set_worker_desc().  Current built-in
      user was introduced with commit ef3b1019 ("writeback: set worker desc to
      identify writeback workers in task dumps").
      
      Can help distinguishing work items which do not have adapter scope.
      Description is printed out with task dump for debugging on WARN, BUG, panic,
      or magic-sysrq [show-task-states(t)].
      
      Example:
      $ echo 0 >| /sys/bus/ccw/drivers/zfcp/0.0.1880/0x50050763031bd327/failed &
      $ echo 't' >| /proc/sysrq-trigger
      $ dmesg
      sysrq: SysRq : Show State
        task                        PC stack   pid father
      ...
      zfcp_q_0.0.1880 S14640  2165      2 0x02000000
      Call Trace:
      ([<00000000009df464>] __schedule+0xbf4/0xc78)
       [<00000000009df57c>] schedule+0x94/0xc0
       [<0000000000168654>] rescuer_thread+0x33c/0x3a0
       [<000000000016f8be>] kthread+0x166/0x178
       [<00000000009e71f2>] kernel_thread_starter+0x6/0xc
       [<00000000009e71ec>] kernel_thread_starter+0x0/0xc
      no locks held by zfcp_q_0.0.1880/2165.
      ...
      kworker/u512:2  D11280  2193      2 0x02000000
      Workqueue: zfcp_q_0.0.1880 zfcp_scsi_rport_work [zfcp] (zrpd-50050763031bd327)
                                                              ^^^^^^^^^^^^^^^^^^^^^
      Call Trace:
      ([<00000000009df464>] __schedule+0xbf4/0xc78)
       [<00000000009df57c>] schedule+0x94/0xc0
       [<00000000009e50c0>] schedule_timeout+0x488/0x4d0
       [<00000000001e425c>] msleep+0x5c/0x78                  >>test code only<<
       [<000003ff8008a21e>] zfcp_scsi_rport_work+0xbe/0x100 [zfcp]
       [<0000000000167154>] process_one_work+0x3b4/0x718
       [<000000000016771c>] worker_thread+0x264/0x408
       [<000000000016f8be>] kthread+0x166/0x178
       [<00000000009e71f2>] kernel_thread_starter+0x6/0xc
       [<00000000009e71ec>] kernel_thread_starter+0x0/0xc
      2 locks held by kworker/u512:2/2193:
       #0:  (name){++++.+}, at: [<0000000000166f4e>] process_one_work+0x1ae/0x718
       #1:  ((&(&port->rport_work)->work)){+.+.+.}, at: [<0000000000166f4e>] process_one_work+0x1ae/0x718
      ...
      
      =============================================
      Showing busy workqueues and worker pools:
      workqueue zfcp_q_0.0.1880: flags=0x2000a
        pwq 512: cpus=0-255 flags=0x4 nice=0 active=1/1
          in-flight: 2193:zfcp_scsi_rport_work [zfcp]
      pool 512: cpus=0-255 flags=0x4 nice=0 hung=0s workers=4 idle: 5 2354 2311
      
      Work items with adapter scope are already identified by the workqueue name
      "zfcp_q_<devbusid>" and the work item function name.
      Signed-off-by: NSteffen Maier <maier@linux.ibm.com>
      Cc: Tejun Heo <tj@kernel.org>
      Cc: Lai Jiangshan <jiangshanlai@gmail.com>
      Reviewed-by: NBenjamin Block <bblock@linux.ibm.com>
      Acked-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
      5c750d58
  10. 21 3月, 2018 2 次提交
  11. 20 3月, 2018 1 次提交
    • T
      RCU, workqueue: Implement rcu_work · 05f0fe6b
      Tejun Heo 提交于
      There are cases where RCU callback needs to be bounced to a sleepable
      context.  This is currently done by the RCU callback queueing a work
      item, which can be cumbersome to write and confusing to read.
      
      This patch introduces rcu_work, a workqueue work variant which gets
      executed after a RCU grace period, and converts the open coded
      bouncing in fs/aio and kernel/cgroup.
      
      v3: Dropped queue_rcu_work_on().  Documented rcu grace period behavior
          after queue_rcu_work().
      
      v2: Use rcu_barrier() instead of synchronize_rcu() to wait for
          completion of previously queued rcu callback as per Paul.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Acked-by: N"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      05f0fe6b
  12. 14 3月, 2018 2 次提交
  13. 21 2月, 2018 1 次提交
  14. 17 2月, 2018 1 次提交
  15. 15 1月, 2018 1 次提交
    • N
      staging: lustre: lnet: convert selftest to use workqueues · 6106c0f8
      NeilBrown 提交于
      Instead of the cfs workitem library, use workqueues.
      
      As lnet wants to provide a cpu mask of allowed cpus, it
      needs to be a WQ_UNBOUND work queue so that tasks can
      run on cpus other than where they were submitted.
      
      This patch also exported apply_workqueue_attrs() which is
      a documented part of the workqueue API, that isn't currently
      exported.  lustre needs it to allow workqueue thread to be limited
      to a subset of CPUs.
      
      Acked-by: Tejun Heo <tj@kernel.org> (for export of apply_workqueue_attrs)
      Signed-off-by: NNeilBrown <neilb@suse.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6106c0f8
  16. 13 1月, 2018 1 次提交
  17. 08 1月, 2018 2 次提交
    • T
      workqueue: allow WQ_MEM_RECLAIM on early init workqueues · 40c17f75
      Tejun Heo 提交于
      Workqueues can be created early during boot before workqueue subsystem
      in fully online - work items are queued waiting for later full
      initialization.  However, early init wasn't supported for
      WQ_MEM_RECLAIM workqueues causing unnecessary annoyances for a subset
      of users.  Expand early init support to include WQ_MEM_RECLAIM
      workqueues.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
      40c17f75
    • T
      workqueue: separate out init_rescuer() · 983c7515
      Tejun Heo 提交于
      Separate out init_rescuer() from __alloc_workqueue_key() to prepare
      for early init support for WQ_MEM_RECLAIM.  This patch doesn't
      introduce any functional changes.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
      983c7515
  18. 11 12月, 2017 1 次提交
  19. 05 12月, 2017 3 次提交
  20. 28 11月, 2017 1 次提交
  21. 22 11月, 2017 1 次提交
    • K
      treewide: Remove TIMER_FUNC_TYPE and TIMER_DATA_TYPE casts · 841b86f3
      Kees Cook 提交于
      With all callbacks converted, and the timer callback prototype
      switched over, the TIMER_FUNC_TYPE cast is no longer needed,
      so remove it. Conversion was done with the following scripts:
      
          perl -pi -e 's|\(TIMER_FUNC_TYPE\)||g' \
              $(git grep TIMER_FUNC_TYPE | cut -d: -f1 | sort -u)
      
          perl -pi -e 's|\(TIMER_DATA_TYPE\)||g' \
              $(git grep TIMER_DATA_TYPE | cut -d: -f1 | sort -u)
      
      The now unused macros are also dropped from include/linux/timer.h.
      Signed-off-by: NKees Cook <keescook@chromium.org>
      841b86f3
  22. 08 11月, 2017 1 次提交
  23. 06 11月, 2017 1 次提交
  24. 03 11月, 2017 1 次提交
  25. 25 10月, 2017 2 次提交
    • B
      workqueue: Remove now redundant lock acquisitions wrt. workqueue flushes · fd1a5b04
      Byungchul Park 提交于
      The workqueue code added manual lock acquisition annotations to catch
      deadlocks.
      
      After lockdepcrossrelease was introduced, some of those became redundant,
      since wait_for_completion() already does the acquisition and tracking.
      
      Remove the duplicate annotations.
      Signed-off-by: NByungchul Park <byungchul.park@lge.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: amir73il@gmail.com
      Cc: axboe@kernel.dk
      Cc: darrick.wong@oracle.com
      Cc: david@fromorbit.com
      Cc: hch@infradead.org
      Cc: idryomov@gmail.com
      Cc: johan@kernel.org
      Cc: johannes.berg@intel.com
      Cc: kernel-team@lge.com
      Cc: linux-block@vger.kernel.org
      Cc: linux-fsdevel@vger.kernel.org
      Cc: linux-mm@kvack.org
      Cc: linux-xfs@vger.kernel.org
      Cc: oleg@redhat.com
      Cc: tj@kernel.org
      Link: http://lkml.kernel.org/r/1508921765-15396-9-git-send-email-byungchul.park@lge.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
      fd1a5b04
    • M
      locking/atomics, workqueue: Convert ACCESS_ONCE() to READ_ONCE()/WRITE_ONCE() · c95491ed
      Mark Rutland 提交于
      For several reasons, it is desirable to use {READ,WRITE}_ONCE() in
      preference to ACCESS_ONCE(), and new code is expected to use one of the
      former. So far, there's been no reason to change most existing uses of
      ACCESS_ONCE(), as these aren't currently harmful.
      
      However, for some features it is necessary to instrument reads and
      writes separately, which is not possible with ACCESS_ONCE(). This
      distinction is critical to correct operation.
      
      It's possible to transform the bulk of kernel code using the Coccinelle
      script below. However, this doesn't handle comments, leaving references
      to ACCESS_ONCE() instances which have been removed. As a preparatory
      step, this patch converts the workqueue code and comments to use
      {READ,WRITE}_ONCE() consistently.
      
      ----
      virtual patch
      
      @ depends on patch @
      expression E1, E2;
      @@
      
      - ACCESS_ONCE(E1) = E2
      + WRITE_ONCE(E1, E2)
      
      @ depends on patch @
      expression E;
      @@
      
      - ACCESS_ONCE(E)
      + READ_ONCE(E)
      ----
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Acked-by: NTejun Heo <tj@kernel.org>
      Cc: Lai Jiangshan <jiangshanlai@gmail.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: davem@davemloft.net
      Cc: linux-arch@vger.kernel.org
      Cc: mpe@ellerman.id.au
      Cc: shuah@kernel.org
      Cc: snitzer@redhat.com
      Cc: thor.thayer@linux.intel.com
      Cc: viro@zeniv.linux.org.uk
      Cc: will.deacon@arm.com
      Link: http://lkml.kernel.org/r/1508792849-3115-12-git-send-email-paulmck@linux.vnet.ibm.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
      c95491ed